diff --git a/.DS_Store b/.DS_Store index 63e0d1d..ccab015 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/.Rhistory b/.Rhistory index 772cbdd..03e7a24 100644 --- a/.Rhistory +++ b/.Rhistory @@ -1,388 +1,16 @@ -error = function(e) { -# handle the error -print(paste("An error occurred:", e$message)) -}) -data$shot <- data$shot %>% select(-freeze_frame, -statsbomb_xg, -key_pass_id) -data$shot$body_part <- data$shot$body_part %>% select(-id) -data$shot$technique <- data$shot$technique %>% select(-id) -data$shot$type <- data$shot$type %>% select(-id) -data$position <- data$position %>% select(-id) -data$shot <- data$shot %>% select(-end_location) -tryCatch({ # TODO reduce error cases -if ("one_on_one" %in% colnames(data$shot)) { -data[is.na(data$shot$one_on_one), ]$shot$one_on_one <- FALSE -} else { -data$shot$one_on_one <- FALSE -} -if ("first_time" %in% colnames(data$shot)) { -data[is.na(data$shot$first_time), ]$shot$first_time <- FALSE -} else { -data$shot$first_time <- FALSE -} -if ("aerial_won" %in% colnames(data$shot)) { -data[is.na(data$shot$aerial_won), ]$shot$aerial_won <- FALSE -} else { -data$shot$aerial_won <- FALSE -} -if ("saved_to_post" %in% colnames(data$shot)) { -data[is.na(data$shot$saved_to_post), ]$shot$saved_to_post <- FALSE -} else { -data$shot$saved_to_post <- FALSE -} -if ("deflected" %in% colnames(data$shot)) { -data[is.na(data$shot$deflected), ]$shot$deflected <- FALSE -} else { -data$shot$deflected <- FALSE -} -if ("saved_off_target" %in% colnames(data$shot)) { -data[is.na(data$shot$saved_off_target), ]$shot$saved_off_target <- FALSE -} else { -data$shot$saved_off_target <- FALSE -} -if ("open_goal" %in% colnames(data$shot)) { -data[is.na(data$shot$open_goal), ]$shot$open_goal <- FALSE -} else { -data$shot$open_goal <- FALSE -} -if ("follows_dribble" %in% colnames(data$shot)) { -data[is.na(data$shot$follows_dribble), ]$shot$follows_dribble <- FALSE -} else { -data$shot$follows_dribble <- FALSE -} -if ("redirect" %in% colnames(data$shot)) { -data[is.na(data$shot$redirect), ]$shot$redirect <- FALSE -} else { -data$shot$redirect <- FALSE -} -if ("kick_off" %in% colnames(data$kick_off)) { -data[is.na(data$kick_off$kick_off), ]$kick_off$kick_off <- FALSE -} else { -data$kick_off$kick_off <- FALSE -} -}, -error = function(e) { -# handle the error -print(paste("An error occurred:", e$message)) -}) -data <- data %>% mutate(angle = atan(7.32 * x1 / (x1^2 + y1^2 - (7.32/2)^2)), -is_goal = ifelse(shot$outcome$id == 97, 1, 0)) %>% -select(-location) -data$shot$outcome <- data$shot$outcome %>% select(-id) -data <- data %>% unnest(shot, names_sep = "_") -data$angle <- ifelse(data$angle<0, base::pi + data$angle, data$angle) -data -} -data_test <- get_shots2("data/la_liga_events/303377.json") -View(data_test) -# TODO not all json data have these same keys/fields, customize function to cover all cases -get_shots2 <- function(json_file) { -data <- fromJSON(json_file) %>% filter(type$name == "Shot") %>% dplyr::select(c(minute, position, location, shot)) -df_temp <- do.call(rbind, data$location) -colnames(df_temp) <- c("x1", "y1") -data$x1 <- df_temp[,1] -data$y1 <- df_temp[,2] -tryCatch({ # TODO reduce error cases -data$number_of_players <- mapply(function(sublist, x1_threshold) { -# Extracting the first location value and converting it to numeric -first_location_values <- sapply(sublist$location, function(loc) as.numeric(loc[1])) -if ("teammate" %in% names(sublist)) { -# Filtering and counting -res <- sum(!sublist$teammate & first_location_values > x1_threshold) # error here -} else { -res <- 0 -} -res -}, data$shot$freeze_frame, data$x1) -}, -error = function(e) { -# handle the error -print(paste("An error occurred:", e$message)) -}) -data$shot <- data$shot %>% select(-freeze_frame, -statsbomb_xg, -key_pass_id) -data$shot$body_part <- data$shot$body_part %>% select(-id) -data$shot$technique <- data$shot$technique %>% select(-id) -data$shot$type <- data$shot$type %>% select(-id) -data$position <- data$position %>% select(-id) -data$shot <- data$shot %>% select(-end_location) -tryCatch({ # TODO reduce error cases -if ("one_on_one" %in% colnames(data$shot)) { -data[is.na(data$shot$one_on_one), ]$shot$one_on_one <- FALSE -} else { -data$shot$one_on_one <- FALSE -} -if ("first_time" %in% colnames(data$shot)) { -data[is.na(data$shot$first_time), ]$shot$first_time <- FALSE -} else { -data$shot$first_time <- FALSE -} -if ("aerial_won" %in% colnames(data$shot)) { -data[is.na(data$shot$aerial_won), ]$shot$aerial_won <- FALSE -} else { -data$shot$aerial_won <- FALSE -} -if ("saved_to_post" %in% colnames(data$shot)) { -data[is.na(data$shot$saved_to_post), ]$shot$saved_to_post <- FALSE -} else { -data$shot$saved_to_post <- FALSE -} -if ("deflected" %in% colnames(data$shot)) { -data[is.na(data$shot$deflected), ]$shot$deflected <- FALSE -} else { -data$shot$deflected <- FALSE -} -if ("saved_off_target" %in% colnames(data$shot)) { -data[is.na(data$shot$saved_off_target), ]$shot$saved_off_target <- FALSE -} else { -data$shot$saved_off_target <- FALSE -} -if ("open_goal" %in% colnames(data$shot)) { -data[is.na(data$shot$open_goal), ]$shot$open_goal <- FALSE -} else { -data$shot$open_goal <- FALSE -} -if ("follows_dribble" %in% colnames(data$shot)) { -data[is.na(data$shot$follows_dribble), ]$shot$follows_dribble <- FALSE -} else { -data$shot$follows_dribble <- FALSE -} -if ("redirect" %in% colnames(data$shot)) { -data[is.na(data$shot$redirect), ]$shot$redirect <- FALSE -} else { -data$shot$redirect <- FALSE -} -if ("kick_off" %in% colnames(data$kick_off)) { -data[is.na(data$kick_off$kick_off), ]$kick_off$kick_off <- FALSE -} else { -data$kick_off$kick_off <- FALSE -} -}, -error = function(e) { -# handle the error -print(paste("An error occurred:", e$message)) -}) -data <- data %>% mutate(angle = atan(7.32 * x1 / (x1^2 + y1^2 - (7.32/2)^2)), -is_goal = ifelse(shot$outcome$id == 97, 1, 0)) %>% -select(-location) -data$angle <- ifelse(data$angle<0, base::pi + data$angle, data$angle) -data$shot$outcome <- data$shot$outcome %>% select(-id) -data <- data %>% unnest(shot, names_sep = "_") -%>% unnest(position, names_sep = "_") -# TODO not all json data have these same keys/fields, customize function to cover all cases -get_shots2 <- function(json_file) { -data <- fromJSON(json_file) %>% filter(type$name == "Shot") %>% dplyr::select(c(minute, position, location, shot)) -df_temp <- do.call(rbind, data$location) -colnames(df_temp) <- c("x1", "y1") -data$x1 <- df_temp[,1] -data$y1 <- df_temp[,2] -tryCatch({ # TODO reduce error cases -data$number_of_players <- mapply(function(sublist, x1_threshold) { -# Extracting the first location value and converting it to numeric -first_location_values <- sapply(sublist$location, function(loc) as.numeric(loc[1])) -if ("teammate" %in% names(sublist)) { -# Filtering and counting -res <- sum(!sublist$teammate & first_location_values > x1_threshold) # error here -} else { -res <- 0 -} -res -}, data$shot$freeze_frame, data$x1) -}, -error = function(e) { -# handle the error -print(paste("An error occurred:", e$message)) -}) -data$shot <- data$shot %>% select(-freeze_frame, -statsbomb_xg, -key_pass_id) -data$shot$body_part <- data$shot$body_part %>% select(-id) -data$shot$technique <- data$shot$technique %>% select(-id) -data$shot$type <- data$shot$type %>% select(-id) -data$position <- data$position %>% select(-id) -data$shot <- data$shot %>% select(-end_location) -tryCatch({ # TODO reduce error cases -if ("one_on_one" %in% colnames(data$shot)) { -data[is.na(data$shot$one_on_one), ]$shot$one_on_one <- FALSE -} else { -data$shot$one_on_one <- FALSE -} -if ("first_time" %in% colnames(data$shot)) { -data[is.na(data$shot$first_time), ]$shot$first_time <- FALSE -} else { -data$shot$first_time <- FALSE -} -if ("aerial_won" %in% colnames(data$shot)) { -data[is.na(data$shot$aerial_won), ]$shot$aerial_won <- FALSE -} else { -data$shot$aerial_won <- FALSE -} -if ("saved_to_post" %in% colnames(data$shot)) { -data[is.na(data$shot$saved_to_post), ]$shot$saved_to_post <- FALSE -} else { -data$shot$saved_to_post <- FALSE -} -if ("deflected" %in% colnames(data$shot)) { -data[is.na(data$shot$deflected), ]$shot$deflected <- FALSE -} else { -data$shot$deflected <- FALSE -} -if ("saved_off_target" %in% colnames(data$shot)) { -data[is.na(data$shot$saved_off_target), ]$shot$saved_off_target <- FALSE -} else { -data$shot$saved_off_target <- FALSE -} -if ("open_goal" %in% colnames(data$shot)) { -data[is.na(data$shot$open_goal), ]$shot$open_goal <- FALSE -} else { -data$shot$open_goal <- FALSE -} -if ("follows_dribble" %in% colnames(data$shot)) { -data[is.na(data$shot$follows_dribble), ]$shot$follows_dribble <- FALSE -} else { -data$shot$follows_dribble <- FALSE -} -if ("redirect" %in% colnames(data$shot)) { -data[is.na(data$shot$redirect), ]$shot$redirect <- FALSE -} else { -data$shot$redirect <- FALSE -} -if ("kick_off" %in% colnames(data$kick_off)) { -data[is.na(data$kick_off$kick_off), ]$kick_off$kick_off <- FALSE -} else { -data$kick_off$kick_off <- FALSE -} -}, -error = function(e) { -# handle the error -print(paste("An error occurred:", e$message)) -}) -data <- data %>% mutate(angle = atan(7.32 * x1 / (x1^2 + y1^2 - (7.32/2)^2)), -is_goal = ifelse(shot$outcome$id == 97, 1, 0)) %>% -select(-location) -data$angle <- ifelse(data$angle<0, base::pi + data$angle, data$angle) -data$shot$outcome <- data$shot$outcome %>% select(-id) -data <- data %>% unnest(shot, names_sep = "_") %>% -unnest(position, names_sep = "_") %>% -unnest(shot_type, names_sep = "_") %>% -unnest(shot_outcome, names_sep = "_") %>% -unnest(shot_technique, names_sep = "_") -data -} -data_test <- get_shots2("data/la_liga_events/303377.json") -View(data_test) -write.csv(data_test, file = "data/data_test.csv") -colnames(data_test) -data_test$kick_off -data_test$shot_body_part -data_df <- as.data.frame(data_test) -# TODO not all json data have these same keys/fields, customize function to cover all cases -get_shots2 <- function(json_file) { -data <- fromJSON(json_file) %>% filter(type$name == "Shot") %>% dplyr::select(c(minute, position, location, shot)) -df_temp <- do.call(rbind, data$location) -colnames(df_temp) <- c("x1", "y1") -data$x1 <- df_temp[,1] -data$y1 <- df_temp[,2] -tryCatch({ # TODO reduce error cases -data$number_of_players <- mapply(function(sublist, x1_threshold) { -# Extracting the first location value and converting it to numeric -first_location_values <- sapply(sublist$location, function(loc) as.numeric(loc[1])) -if ("teammate" %in% names(sublist)) { -# Filtering and counting -res <- sum(!sublist$teammate & first_location_values > x1_threshold) # error here -} else { -res <- 0 -} -res -}, data$shot$freeze_frame, data$x1) -}, -error = function(e) { -# handle the error -print(paste("An error occurred:", e$message)) -}) -data$shot <- data$shot %>% select(-freeze_frame, -statsbomb_xg, -key_pass_id) -data$shot$body_part <- data$shot$body_part %>% select(-id) -data$shot$technique <- data$shot$technique %>% select(-id) -data$shot$type <- data$shot$type %>% select(-id) -data$position <- data$position %>% select(-id) -data$shot <- data$shot %>% select(-end_location) -tryCatch({ # TODO reduce error cases -if ("one_on_one" %in% colnames(data$shot)) { -data[is.na(data$shot$one_on_one), ]$shot$one_on_one <- FALSE -} else { -data$shot$one_on_one <- FALSE -} -if ("first_time" %in% colnames(data$shot)) { -data[is.na(data$shot$first_time), ]$shot$first_time <- FALSE -} else { -data$shot$first_time <- FALSE -} -if ("aerial_won" %in% colnames(data$shot)) { -data[is.na(data$shot$aerial_won), ]$shot$aerial_won <- FALSE -} else { -data$shot$aerial_won <- FALSE -} -if ("saved_to_post" %in% colnames(data$shot)) { -data[is.na(data$shot$saved_to_post), ]$shot$saved_to_post <- FALSE -} else { -data$shot$saved_to_post <- FALSE -} -if ("deflected" %in% colnames(data$shot)) { -data[is.na(data$shot$deflected), ]$shot$deflected <- FALSE -} else { -data$shot$deflected <- FALSE -} -if ("saved_off_target" %in% colnames(data$shot)) { -data[is.na(data$shot$saved_off_target), ]$shot$saved_off_target <- FALSE -} else { -data$shot$saved_off_target <- FALSE -} -if ("open_goal" %in% colnames(data$shot)) { -data[is.na(data$shot$open_goal), ]$shot$open_goal <- FALSE -} else { -data$shot$open_goal <- FALSE -} -if ("follows_dribble" %in% colnames(data$shot)) { -data[is.na(data$shot$follows_dribble), ]$shot$follows_dribble <- FALSE -} else { -data$shot$follows_dribble <- FALSE -} -if ("redirect" %in% colnames(data$shot)) { -data[is.na(data$shot$redirect), ]$shot$redirect <- FALSE -} else { -data$shot$redirect <- FALSE -} -if ("kick_off" %in% colnames(data$kick_off)) { -data[is.na(data$shot$kick_off), ]$shotf$kick_off <- FALSE -} else { -data$kick_off <- FALSE -} -}, -error = function(e) { -# handle the error -print(paste("An error occurred:", e$message)) -}) -data <- data %>% mutate(angle = atan(7.32 * x1 / (x1^2 + y1^2 - (7.32/2)^2)), -is_goal = ifelse(shot$outcome$id == 97, 1, 0)) %>% -select(-location) -data$angle <- ifelse(data$angle<0, base::pi + data$angle, data$angle) -data$shot$outcome <- data$shot$outcome %>% select(-id) -data <- data %>% unnest(shot, names_sep = "_") %>% -unnest(position, names_sep = "_") %>% -unnest(shot_type, names_sep = "_") %>% -unnest(shot_outcome, names_sep = "_") %>% -unnest(shot_technique, names_sep = "_") %>% -unnest(shot_body_part, names_sep = "_") -data -} -data_test <- get_shots2("data/la_liga_events/303377.json") -write.csv(data_test, file = "data/data_test.csv") +data4 <- read.csv("data/data4.csv") +setwd("~/Desktop/fantastyczne_gole") +data4 <- read.csv("data/data4.csv") +nrow +nrow(data4) +data_list file_names <- list.files(path = "data/la_liga_events/", pattern = "*.json") +length(file_names) data_list <- lapply(paste("data/la_liga_events/", file_names, sep = ""), get_shots2) -combined_data <- do.call(rbind, data_list) -data_test <- data <- fromJSON(("data/la_liga_events/303377.json") %>% filter(type$name == "Shot") -data_test <- fromJSON("data/la_liga_events/303377.json") %>% filter(type$name == "Shot") -data_test <- fromJSON("data/la_liga_events/303377.json") %>% filter(type$name == "Shot") -data_test$id -data_test$index -data4 <- read.csv("data/data4.csv", nrows = 1000) -View(data4) +library(jsonlite) +library(tidyverse) +library(ggsoccer) +library(dplyr) # TODO not all json data have these same keys/fields, customize function to cover all cases get_shots2 <- function(json_file) { data <- fromJSON(json_file) %>% filter(type$name == "Shot") %>% dplyr::select(c(minute, position, location, shot)) @@ -499,14 +127,51 @@ unnest(shot_technique, names_sep = "_") %>% unnest(shot_body_part, names_sep = "_") data } -# sample data -data_test <- get_shots2("data/la_liga_events/303377.json") -write.csv(data_test, file = "data/data3_test.csv") -data1 <- read.csv("data/data1.csv", nrows = 1000) +data_list <- lapply(paste("data/la_liga_events/", file_names, sep = ""), get_shots2) +length(data_list) +ss <- lapply(data_list, nrow()) +ss <- lapply(data_list, nrow) +ss +sum(ss) +sss <- unlist(ss) +sss +sum(sss) +source("notebooks/dataCleaning.R") +source("notebooks/dataCleaning.R") +# generate random data +random_data <- as.data.frame(x = rnorm(100), +y = rnorm(100, mean = 1, sd = 3)) +# unit tests +expect_silent( +data <- get_shots(file_path = "data/events/events_England.json", name_detail = "EN") +) +library(tinytest) +# unit tests +expect_silent( +data <- get_shots(file_path = "data/events/events_England.json", name_detail = "EN") +) +expect_silent( +data <- get_shots2(json_file = "data/la_liga_events/ (1).json") +) +expect_error( +get_final_data(data = random_data) +) +data1 <- get_shots2(json_file = "data/la_liga_events/ (1).json") +data2 <- get_shots2(json_file = "data/la_liga_events/ (2).json") +expect_equivalent(colnames(data1), colnames(data2)) +expect_false(is.vector(data1)) +expect_true(is.data.frame(data1)) colnames(data1) -View(data1) -data2 <- read.csv("data/data2.csv", nrows = 1000) -View(data2) -data3 <- read.csv("data/data3_test.csv", nrows = 1000) -colnames(data3) -View(data3) +colnames(data2) +expect_length(length(colnames(data1)), length(colnames(data2))) +length(colnames(data1)) +length(colnames(data2)) +?expect_length +expect_length(colnames(data1), colnames(data2)) +expect_length(colnames(data1), colnames(data2)) +expect_length(colnames(data1), 22) +expect_length(colnames(data2), 22) +expect_false(is.vector(data1)) +expect_true(is.data.frame(data1)) +df <- read.csv("data/data4.csv", nrows = 1000) +View(df) diff --git a/app/.eslintrc.cjs b/app/.eslintrc.cjs new file mode 100644 index 0000000..4dcb439 --- /dev/null +++ b/app/.eslintrc.cjs @@ -0,0 +1,20 @@ +module.exports = { + root: true, + env: { browser: true, es2020: true }, + extends: [ + 'eslint:recommended', + 'plugin:react/recommended', + 'plugin:react/jsx-runtime', + 'plugin:react-hooks/recommended', + ], + ignorePatterns: ['dist', '.eslintrc.cjs'], + parserOptions: { ecmaVersion: 'latest', sourceType: 'module' }, + settings: { react: { version: '18.2' } }, + plugins: ['react-refresh'], + rules: { + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, +} diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/app/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/app/README.md b/app/README.md new file mode 100644 index 0000000..f768e33 --- /dev/null +++ b/app/README.md @@ -0,0 +1,8 @@ +# React + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh diff --git a/app/boisko.html b/app/boisko.html deleted file mode 100644 index ae51bff..0000000 --- a/app/boisko.html +++ /dev/null @@ -1,245 +0,0 @@ - - - - - - - - Football Field with Ball - - - - -
- - -
-
- - - - - - - - -
- -
- - - - - - - - -
-
-
- - - - - - - \ No newline at end of file diff --git a/app/index.html b/app/index.html new file mode 100644 index 0000000..980e89c --- /dev/null +++ b/app/index.html @@ -0,0 +1,13 @@ + + + + + + + Football analysys + + +
+ + + diff --git a/app/package-lock.json b/app/package-lock.json new file mode 100644 index 0000000..0c43740 --- /dev/null +++ b/app/package-lock.json @@ -0,0 +1,5497 @@ +{ + "name": "react_bs_web", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "react_bs_web", + "version": "0.0.0", + "dependencies": { + "@emailjs/browser": "^3.11.0", + "@react-three/drei": "^9.89.3", + "@react-three/fiber": "^8.15.12", + "cors": "^2.8.5", + "framer-motion": "^10.16.12", + "maath": "^0.10.4", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-router-dom": "^6.20.1", + "react-tilt": "^1.0.2", + "react-vertical-timeline-component": "^3.6.0" + }, + "devDependencies": { + "@types/react": "^18.2.37", + "@types/react-dom": "^18.2.15", + "@vitejs/plugin-react": "^4.2.0", + "autoprefixer": "^10.4.16", + "css": "^3.0.0", + "eslint": "^8.53.0", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.4", + "post": "^0.0.1", + "postcss": "^8.4.32", + "tailwindcss": "^3.3.5", + "vite": "^5.0.0" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", + "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.5.tgz", + "integrity": "sha512-Cwc2XjUrG4ilcfOw4wBAK+enbdgwAcAJCfGUItPBKR7Mjw4aEfAFYrLxeRp4jWgtNIKn3n2AlBOfwwafl+42/g==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.5", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.5", + "@babel/parser": "^7.23.5", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.5", + "@babel/types": "^7.23.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.5.tgz", + "integrity": "sha512-BPssCHrBD+0YrxviOa3QzpqwhNIXKEtOa2jQrm4FlmkC2apYgRnQcmPWiGZDlGxiNtltnUFolMe8497Esry+jA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.23.5", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.15", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.5.tgz", + "integrity": "sha512-oO7us8FzTEsG3U6ag9MfdF1iA/7Z6dz+MtFhifZk8C8o453rGJFFWUP1t+ULM9TUIAzC9uxXEiXjOiVMyd7QPg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.5", + "@babel/types": "^7.23.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.5.tgz", + "integrity": "sha512-hOOqoiNXrmGdFbhgCzu6GiURxUgM27Xwd/aPuu8RfHEZPBzL1Z54okAHAQjXfcQNwvrlkAmAp4SlRTZ45vlthQ==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.23.3.tgz", + "integrity": "sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.23.3.tgz", + "integrity": "sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.5.tgz", + "integrity": "sha512-NdUTHcPe4C99WxPub+K9l9tK5/lV4UXIoaHSYgzco9BCyjKAAwzdBI+wWtYqHt7LJdbo74ZjRPJgzVweq1sz0w==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.5.tgz", + "integrity": "sha512-czx7Xy5a6sapWWRx61m1Ke1Ra4vczu1mCTtJam5zRTBOonfdJ+S/B6HYmGYu3fJtr8GGET3si6IhgWVBhJ/m8w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.5", + "@babel/types": "^7.23.5", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.5.tgz", + "integrity": "sha512-ON5kSOJwVO6xXVRTvOI0eOnWe7VdUcIpsovGo9U/Br4Ie4UVFQTboO2cYnDhAGU6Fp+UxSiT+pMft0SMHfuq6w==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emailjs/browser": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/@emailjs/browser/-/browser-3.11.0.tgz", + "integrity": "sha512-RkY3FKZ3fPdK++OeF46mRTFpmmQWCHUVHZH209P3NE4D5sg2Atg7S2wa3gw5062Gl4clt4Wn5SyC4WhlVZC5pA==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@emotion/is-prop-valid": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", + "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==", + "optional": true, + "dependencies": { + "@emotion/memoize": "0.7.4" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==", + "optional": true + }, + "node_modules/@esbuild/android-arm": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.8.tgz", + "integrity": "sha512-31E2lxlGM1KEfivQl8Yf5aYU/mflz9g06H6S15ITUFQueMFtFjESRMoDSkvMo8thYvLBax+VKTPlpnx+sPicOA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.8.tgz", + "integrity": "sha512-B8JbS61bEunhfx8kasogFENgQfr/dIp+ggYXwTqdbMAgGDhRa3AaPpQMuQU0rNxDLECj6FhDzk1cF9WHMVwrtA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.8.tgz", + "integrity": "sha512-rdqqYfRIn4jWOp+lzQttYMa2Xar3OK9Yt2fhOhzFXqg0rVWEfSclJvZq5fZslnz6ypHvVf3CT7qyf0A5pM682A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.8.tgz", + "integrity": "sha512-RQw9DemMbIq35Bprbboyf8SmOr4UXsRVxJ97LgB55VKKeJOOdvsIPy0nFyF2l8U+h4PtBx/1kRf0BelOYCiQcw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.8.tgz", + "integrity": "sha512-3sur80OT9YdeZwIVgERAysAbwncom7b4bCI2XKLjMfPymTud7e/oY4y+ci1XVp5TfQp/bppn7xLw1n/oSQY3/Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.8.tgz", + "integrity": "sha512-WAnPJSDattvS/XtPCTj1tPoTxERjcTpH6HsMr6ujTT+X6rylVe8ggxk8pVxzf5U1wh5sPODpawNicF5ta/9Tmw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.8.tgz", + "integrity": "sha512-ICvZyOplIjmmhjd6mxi+zxSdpPTKFfyPPQMQTK/w+8eNK6WV01AjIztJALDtwNNfFhfZLux0tZLC+U9nSyA5Zg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.8.tgz", + "integrity": "sha512-H4vmI5PYqSvosPaTJuEppU9oz1dq2A7Mr2vyg5TF9Ga+3+MGgBdGzcyBP7qK9MrwFQZlvNyJrvz6GuCaj3OukQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.8.tgz", + "integrity": "sha512-z1zMZivxDLHWnyGOctT9JP70h0beY54xDDDJt4VpTX+iwA77IFsE1vCXWmprajJGa+ZYSqkSbRQ4eyLCpCmiCQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.8.tgz", + "integrity": "sha512-1a8suQiFJmZz1khm/rDglOc8lavtzEMRo0v6WhPgxkrjcU0LkHj+TwBrALwoz/OtMExvsqbbMI0ChyelKabSvQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.8.tgz", + "integrity": "sha512-fHZWS2JJxnXt1uYJsDv9+b60WCc2RlvVAy1F76qOLtXRO+H4mjt3Tr6MJ5l7Q78X8KgCFudnTuiQRBhULUyBKQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.8.tgz", + "integrity": "sha512-Wy/z0EL5qZYLX66dVnEg9riiwls5IYnziwuju2oUiuxVc+/edvqXa04qNtbrs0Ukatg5HEzqT94Zs7J207dN5Q==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.8.tgz", + "integrity": "sha512-ETaW6245wK23YIEufhMQ3HSeHO7NgsLx8gygBVldRHKhOlD1oNeNy/P67mIh1zPn2Hr2HLieQrt6tWrVwuqrxg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.8.tgz", + "integrity": "sha512-T2DRQk55SgoleTP+DtPlMrxi/5r9AeFgkhkZ/B0ap99zmxtxdOixOMI570VjdRCs9pE4Wdkz7JYrsPvsl7eESg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.8.tgz", + "integrity": "sha512-NPxbdmmo3Bk7mbNeHmcCd7R7fptJaczPYBaELk6NcXxy7HLNyWwCyDJ/Xx+/YcNH7Im5dHdx9gZ5xIwyliQCbg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.8.tgz", + "integrity": "sha512-lytMAVOM3b1gPypL2TRmZ5rnXl7+6IIk8uB3eLsV1JwcizuolblXRrc5ShPrO9ls/b+RTp+E6gbsuLWHWi2zGg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.8.tgz", + "integrity": "sha512-hvWVo2VsXz/8NVt1UhLzxwAfo5sioj92uo0bCfLibB0xlOmimU/DeAEsQILlBQvkhrGjamP0/el5HU76HAitGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.8.tgz", + "integrity": "sha512-/7Y7u77rdvmGTxR83PgaSvSBJCC2L3Kb1M/+dmSIvRvQPXXCuC97QAwMugBNG0yGcbEGfFBH7ojPzAOxfGNkwQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.8.tgz", + "integrity": "sha512-9Lc4s7Oi98GqFA4HzA/W2JHIYfnXbUYgekUP/Sm4BG9sfLjyv6GKKHKKVs83SMicBF2JwAX6A1PuOLMqpD001w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.8.tgz", + "integrity": "sha512-rq6WzBGjSzihI9deW3fC2Gqiak68+b7qo5/3kmB6Gvbh/NYPA0sJhrnp7wgV4bNwjqM+R2AApXGxMO7ZoGhIJg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.8.tgz", + "integrity": "sha512-AIAbverbg5jMvJznYiGhrd3sumfwWs8572mIJL5NQjJa06P8KfCPWZQ0NwZbPQnbQi9OWSZhFVSUWjjIrn4hSw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.8.tgz", + "integrity": "sha512-bfZ0cQ1uZs2PqpulNL5j/3w+GDhP36k1K5c38QdQg+Swy51jFZWWeIkteNsufkQxp986wnqRRsb/bHbY1WQ7TA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.55.0.tgz", + "integrity": "sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", + "dev": true + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "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/@jridgewell/trace-mapping": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@mediapipe/tasks-vision": { + "version": "0.10.8", + "resolved": "https://registry.npmjs.org/@mediapipe/tasks-vision/-/tasks-vision-0.10.8.tgz", + "integrity": "sha512-Rp7ll8BHrKB3wXaRFKhrltwZl1CiXGdibPxuWXvqGnKTnv8fqa/nvftYNuSbf+pbJWKYCXdBtYTITdAUTGGh0Q==" + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@react-spring/animated": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.6.1.tgz", + "integrity": "sha512-ls/rJBrAqiAYozjLo5EPPLLOb1LM0lNVQcXODTC1SMtS6DbuBCPaKco5svFUQFMP2dso3O+qcC4k9FsKc0KxMQ==", + "dependencies": { + "@react-spring/shared": "~9.6.1", + "@react-spring/types": "~9.6.1" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/core": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@react-spring/core/-/core-9.6.1.tgz", + "integrity": "sha512-3HAAinAyCPessyQNNXe5W0OHzRfa8Yo5P748paPcmMowZ/4sMfaZ2ZB6e5x5khQI8NusOHj8nquoutd6FRY5WQ==", + "dependencies": { + "@react-spring/animated": "~9.6.1", + "@react-spring/rafz": "~9.6.1", + "@react-spring/shared": "~9.6.1", + "@react-spring/types": "~9.6.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-spring/donate" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/rafz": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@react-spring/rafz/-/rafz-9.6.1.tgz", + "integrity": "sha512-v6qbgNRpztJFFfSE3e2W1Uz+g8KnIBs6SmzCzcVVF61GdGfGOuBrbjIcp+nUz301awVmREKi4eMQb2Ab2gGgyQ==" + }, + "node_modules/@react-spring/shared": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@react-spring/shared/-/shared-9.6.1.tgz", + "integrity": "sha512-PBFBXabxFEuF8enNLkVqMC9h5uLRBo6GQhRMQT/nRTnemVENimgRd+0ZT4yFnAQ0AxWNiJfX3qux+bW2LbG6Bw==", + "dependencies": { + "@react-spring/rafz": "~9.6.1", + "@react-spring/types": "~9.6.1" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/three": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@react-spring/three/-/three-9.6.1.tgz", + "integrity": "sha512-Tyw2YhZPKJAX3t2FcqvpLRb71CyTe1GvT3V+i+xJzfALgpk10uPGdGaQQ5Xrzmok1340DAeg2pR/MCfaW7b8AA==", + "dependencies": { + "@react-spring/animated": "~9.6.1", + "@react-spring/core": "~9.6.1", + "@react-spring/shared": "~9.6.1", + "@react-spring/types": "~9.6.1" + }, + "peerDependencies": { + "@react-three/fiber": ">=6.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "three": ">=0.126" + } + }, + "node_modules/@react-spring/types": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@react-spring/types/-/types-9.6.1.tgz", + "integrity": "sha512-POu8Mk0hIU3lRXB3bGIGe4VHIwwDsQyoD1F394OK7STTiX9w4dG3cTLljjYswkQN+hDSHRrj4O36kuVa7KPU8Q==" + }, + "node_modules/@react-three/drei": { + "version": "9.89.3", + "resolved": "https://registry.npmjs.org/@react-three/drei/-/drei-9.89.3.tgz", + "integrity": "sha512-hDyu8yhOn/jHoI03oPDTNXyrEGJNz1FqzZvLyBtR2wcfHQizHV1SA0zI1uK2kPUyLzqCzcruarW89WmfAOOQfQ==", + "dependencies": { + "@babel/runtime": "^7.11.2", + "@mediapipe/tasks-vision": "0.10.8", + "@react-spring/three": "~9.6.1", + "@use-gesture/react": "^10.2.24", + "camera-controls": "^2.4.2", + "cross-env": "^7.0.3", + "detect-gpu": "^5.0.28", + "glsl-noise": "^0.0.0", + "lodash.clamp": "^4.0.3", + "lodash.omit": "^4.5.0", + "lodash.pick": "^4.4.0", + "maath": "^0.9.0", + "meshline": "^3.1.6", + "react-composer": "^5.0.3", + "react-merge-refs": "^1.1.0", + "stats-gl": "^1.0.4", + "stats.js": "^0.17.0", + "suspend-react": "^0.1.3", + "three-mesh-bvh": "^0.6.7", + "three-stdlib": "^2.28.0", + "troika-three-text": "^0.47.2", + "utility-types": "^3.10.0", + "uuid": "^9.0.1", + "zustand": "^3.5.13" + }, + "peerDependencies": { + "@react-three/fiber": ">=8.0", + "react": ">=18.0", + "react-dom": ">=18.0", + "three": ">=0.137" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/@react-three/drei/node_modules/maath": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/maath/-/maath-0.9.0.tgz", + "integrity": "sha512-aAR8hoUqPxlsU8VOxkS9y37jhUzdUxM017NpCuxFU1Gk+nMaZASZxymZrV8LRSHzRk/watlbfyNKu6XPUhCFrQ==", + "peerDependencies": { + "@types/three": ">=0.144.0", + "three": ">=0.144.0" + } + }, + "node_modules/@react-three/fiber": { + "version": "8.15.12", + "resolved": "https://registry.npmjs.org/@react-three/fiber/-/fiber-8.15.12.tgz", + "integrity": "sha512-yg0CyXVHIdSbNjM/GAgDrGJnKLTsfTlaR5FoJGEh9IgVKptOoudnFZhBt/Cau4rzx2X6eLmB1+aWOm1dEHSUpg==", + "dependencies": { + "@babel/runtime": "^7.17.8", + "@types/react-reconciler": "^0.26.7", + "@types/webxr": "*", + "base64-js": "^1.5.1", + "buffer": "^6.0.3", + "its-fine": "^1.0.6", + "react-reconciler": "^0.27.0", + "react-use-measure": "^2.1.1", + "scheduler": "^0.21.0", + "suspend-react": "^0.1.3", + "zustand": "^3.7.1" + }, + "peerDependencies": { + "expo": ">=43.0", + "expo-asset": ">=8.4", + "expo-file-system": ">=11.0", + "expo-gl": ">=11.0", + "react": ">=18.0", + "react-dom": ">=18.0", + "react-native": ">=0.64", + "three": ">=0.133" + }, + "peerDependenciesMeta": { + "expo": { + "optional": true + }, + "expo-asset": { + "optional": true + }, + "expo-file-system": { + "optional": true + }, + "expo-gl": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/@react-three/fiber/node_modules/scheduler": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.21.0.tgz", + "integrity": "sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/@remix-run/router": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.13.1.tgz", + "integrity": "sha512-so+DHzZKsoOcoXrILB4rqDkMDy7NLMErRdOxvzvOKb507YINKUP4Di+shbTZDhSE/pBZ+vr7XGIpcOO0VLSA+Q==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.6.1.tgz", + "integrity": "sha512-0WQ0ouLejaUCRsL93GD4uft3rOmB8qoQMU05Kb8CmMtMBe7XUDLAltxVZI1q6byNqEtU7N1ZX1Vw5lIpgulLQA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.6.1.tgz", + "integrity": "sha512-1TKm25Rn20vr5aTGGZqo6E4mzPicCUD79k17EgTLAsXc1zysyi4xXKACfUbwyANEPAEIxkzwue6JZ+stYzWUTA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.6.1.tgz", + "integrity": "sha512-cEXJQY/ZqMACb+nxzDeX9IPLAg7S94xouJJCNVE5BJM8JUEP4HeTF+ti3cmxWeSJo+5D+o8Tc0UAWUkfENdeyw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.6.1.tgz", + "integrity": "sha512-LoSU9Xu56isrkV2jLldcKspJ7sSXmZWkAxg7sW/RfF7GS4F5/v4EiqKSMCFbZtDu2Nc1gxxFdQdKwkKS4rwxNg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.6.1.tgz", + "integrity": "sha512-EfI3hzYAy5vFNDqpXsNxXcgRDcFHUWSx5nnRSCKwXuQlI5J9dD84g2Usw81n3FLBNsGCegKGwwTVsSKK9cooSQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.6.1.tgz", + "integrity": "sha512-9lhc4UZstsegbNLhH0Zu6TqvDfmhGzuCWtcTFXY10VjLLUe4Mr0Ye2L3rrtHaDd/J5+tFMEuo5LTCSCMXWfUKw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.6.1.tgz", + "integrity": "sha512-FfoOK1yP5ksX3wwZ4Zk1NgyGHZyuRhf99j64I5oEmirV8EFT7+OhUZEnP+x17lcP/QHJNWGsoJwrz4PJ9fBEXw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.6.1.tgz", + "integrity": "sha512-DNGZvZDO5YF7jN5fX8ZqmGLjZEXIJRdJEdTFMhiyXqyXubBa0WVLDWSNlQ5JR2PNgDbEV1VQowhVRUh+74D+RA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.6.1.tgz", + "integrity": "sha512-RkJVNVRM+piYy87HrKmhbexCHg3A6Z6MU0W9GHnJwBQNBeyhCJG9KDce4SAMdicQnpURggSvtbGo9xAWOfSvIQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.6.1.tgz", + "integrity": "sha512-v2FVT6xfnnmTe3W9bJXl6r5KwJglMK/iRlkKiIFfO6ysKs0rDgz7Cwwf3tjldxQUrHL9INT/1r4VA0n9L/F1vQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.6.1.tgz", + "integrity": "sha512-YEeOjxRyEjqcWphH9dyLbzgkF8wZSKAKUkldRY6dgNR5oKs2LZazqGB41cWJ4Iqqcy9/zqYgmzBkRoVz3Q9MLw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.6.1.tgz", + "integrity": "sha512-0zfTlFAIhgz8V2G8STq8toAjsYYA6eci1hnXuyOTUFnymrtJwnS6uGKiv3v5UrPZkBlamLvrLV2iiaeqCKzb0A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.7", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.7.tgz", + "integrity": "sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.4", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.4.tgz", + "integrity": "sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/draco3d": { + "version": "1.4.9", + "resolved": "https://registry.npmjs.org/@types/draco3d/-/draco3d-1.4.9.tgz", + "integrity": "sha512-4MMUjMQb4yA5fJ4osXx+QxGHt0/ZSy4spT6jL1HM7Tn8OJEC35siqdnpOo+HxPhYjqEFumKfGVF9hJfdyKBIBA==" + }, + "node_modules/@types/offscreencanvas": { + "version": "2019.7.3", + "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz", + "integrity": "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==" + }, + "node_modules/@types/prop-types": { + "version": "15.7.11", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", + "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==" + }, + "node_modules/@types/react": { + "version": "18.2.41", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.41.tgz", + "integrity": "sha512-CwOGr/PiLiNBxEBqpJ7fO3kocP/2SSuC9fpH5K7tusrg4xPSRT/193rzolYwQnTN02We/ATXKnb6GqA5w4fRxw==", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.2.17", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.17.tgz", + "integrity": "sha512-rvrT/M7Df5eykWFxn6MYt5Pem/Dbyc1N8Y0S9Mrkw2WFCRiqUgw9P7ul2NpwsXCSM1DVdENzdG9J5SreqfAIWg==", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-reconciler": { + "version": "0.26.7", + "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.26.7.tgz", + "integrity": "sha512-mBDYl8x+oyPX/VBb3E638N0B7xG+SPk/EAMcVPeexqus/5aTpTphQi0curhhshOqRrc9t6OPoJfEUkbymse/lQ==", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", + "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==" + }, + "node_modules/@types/stats.js": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@types/stats.js/-/stats.js-0.17.3.tgz", + "integrity": "sha512-pXNfAD3KHOdif9EQXZ9deK82HVNaXP5ZIF5RP2QG6OQFNTaY2YIetfrE9t528vEreGQvEPRDDc8muaoYeK0SxQ==", + "peer": true + }, + "node_modules/@types/three": { + "version": "0.159.0", + "resolved": "https://registry.npmjs.org/@types/three/-/three-0.159.0.tgz", + "integrity": "sha512-2gybdh7HtX+rGUgslzK7QEJfzD2I0qrbUGzKk+dK0FDx49UHkNX0rqZVRzIgeFjBd1HzzhNNgwNoMacm3Wyc7w==", + "peer": true, + "dependencies": { + "@types/stats.js": "*", + "@types/webxr": "*", + "fflate": "~0.6.10", + "meshoptimizer": "~0.18.1" + } + }, + "node_modules/@types/webxr": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.10.tgz", + "integrity": "sha512-n3u5sqXQJhf1CS68mw3Wf16FQ4cRPNBBwdYLFzq3UddiADOim1Pn3Y6PBdDilz1vOJF3ybLxJ8ZEDlLIzrOQZg==" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/@use-gesture/core": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@use-gesture/core/-/core-10.3.0.tgz", + "integrity": "sha512-rh+6MND31zfHcy9VU3dOZCqGY511lvGcfyJenN4cWZe0u1BH6brBpBddLVXhF2r4BMqWbvxfsbL7D287thJU2A==" + }, + "node_modules/@use-gesture/react": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@use-gesture/react/-/react-10.3.0.tgz", + "integrity": "sha512-3zc+Ve99z4usVP6l9knYVbVnZgfqhKah7sIG+PS2w+vpig2v2OLct05vs+ZXMzwxdNCMka8B+8WlOo0z6Pn6DA==", + "dependencies": { + "@use-gesture/core": "10.3.0" + }, + "peerDependencies": { + "react": ">= 16.8.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.2.0.tgz", + "integrity": "sha512-+MHTH/e6H12kRp5HUkzOGqPMksezRMmW+TNzlh/QXfI8rRf6l2Z2yH/v12no1UvTwhZgEDMuQ7g7rrfMseU6FQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.23.3", + "@babel/plugin-transform-react-jsx-self": "^7.23.3", + "@babel/plugin-transform-react-jsx-source": "^7.23.3", + "@types/babel__core": "^7.20.4", + "react-refresh": "^0.14.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0" + } + }, + "node_modules/acorn": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", + "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz", + "integrity": "sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.2.1" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", + "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asynciterator.prototype": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", + "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + } + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true, + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.16", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", + "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.21.10", + "caniuse-lite": "^1.0.30001538", + "fraction.js": "^4.3.6", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bidi-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", + "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", + "dependencies": { + "require-from-string": "^2.0.2" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", + "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001565", + "electron-to-chromium": "^1.4.601", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/call-bind": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/camera-controls": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/camera-controls/-/camera-controls-2.7.3.tgz", + "integrity": "sha512-L4mxjBd3u8qiOLozdWrH2P8ZybSsDXBF7iyNyqNEFJhPUkovmuARWR8JTc1B/qlclOIg6FvZZA/0uAZMMim0mw==", + "peerDependencies": { + "three": ">=0.126.1" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001566", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001566.tgz", + "integrity": "sha512-ggIhCsTxmITBAMmK8yZjEhCO5/47jKXPu6Dha/wuCS4JePVL+3uiDEBuhu2aIoT+bqTOR8L76Ip1ARL9xYsEJA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/classnames": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", + "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/css/-/css-3.0.0.tgz", + "integrity": "sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.4", + "source-map": "^0.6.1", + "source-map-resolve": "^0.6.0" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "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==" + }, + "node_modules/debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==" + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/detect-gpu": { + "version": "5.0.37", + "resolved": "https://registry.npmjs.org/detect-gpu/-/detect-gpu-5.0.37.tgz", + "integrity": "sha512-EraWs84faI4iskB4qvE39bevMIazEvd1RpoyGLOBesRLbiz6eMeJqqRPHjEFClfRByYZzi9IzU35rBXIO76oDw==", + "dependencies": { + "webgl-constants": "^1.1.1" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/draco3d": { + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/draco3d/-/draco3d-1.5.6.tgz", + "integrity": "sha512-+3NaRjWktb5r61ZFoDejlykPEFKT5N/LkbXsaddlw6xNSXBanUYpFc2AXXpbJDilPHazcSreU/DpQIaxfX0NfQ==" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.601", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.601.tgz", + "integrity": "sha512-SpwUMDWe9tQu8JX5QCO1+p/hChAi9AE9UpoC3rcHVc+gdCGlbT3SGb5I1klgb952HRIyvt9wZhSz9bNBYz9swA==", + "dev": true + }, + "node_modules/es-abstract": { + "version": "1.22.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", + "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.2", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.5", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.2", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.12", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "safe-array-concat": "^1.0.1", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz", + "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==", + "dev": true, + "dependencies": { + "asynciterator.prototype": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.1", + "es-set-tostringtag": "^2.0.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.2.1", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.0.1" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", + "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.2", + "has-tostringtag": "^1.0.0", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.8.tgz", + "integrity": "sha512-l7iffQpT2OrZfH2rXIp7/FkmaeZM0vxbxN9KfiCwGYuZqzMg/JdvX26R31Zxn/Pxvsrg3Y9N6XTcnknqDyyv4w==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.19.8", + "@esbuild/android-arm64": "0.19.8", + "@esbuild/android-x64": "0.19.8", + "@esbuild/darwin-arm64": "0.19.8", + "@esbuild/darwin-x64": "0.19.8", + "@esbuild/freebsd-arm64": "0.19.8", + "@esbuild/freebsd-x64": "0.19.8", + "@esbuild/linux-arm": "0.19.8", + "@esbuild/linux-arm64": "0.19.8", + "@esbuild/linux-ia32": "0.19.8", + "@esbuild/linux-loong64": "0.19.8", + "@esbuild/linux-mips64el": "0.19.8", + "@esbuild/linux-ppc64": "0.19.8", + "@esbuild/linux-riscv64": "0.19.8", + "@esbuild/linux-s390x": "0.19.8", + "@esbuild/linux-x64": "0.19.8", + "@esbuild/netbsd-x64": "0.19.8", + "@esbuild/openbsd-x64": "0.19.8", + "@esbuild/sunos-x64": "0.19.8", + "@esbuild/win32-arm64": "0.19.8", + "@esbuild/win32-ia32": "0.19.8", + "@esbuild/win32-x64": "0.19.8" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.55.0.tgz", + "integrity": "sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.55.0", + "@humanwhocodes/config-array": "^0.11.13", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.33.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", + "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "array.prototype.tosorted": "^1.1.1", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.12", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "object.hasown": "^1.1.2", + "object.values": "^1.1.6", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.4", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.8" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.5.tgz", + "integrity": "sha512-D53FYKJa+fDmZMtriODxvhwrO+IOqrxoEo21gMA0sjHdU6dPVH4OhyFip9ypl8HOF5RV5KdTo+rBQLvnY2cO8w==", + "dev": true, + "peerDependencies": { + "eslint": ">=7" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/event-component": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/event-component/-/event-component-0.1.0.tgz", + "integrity": "sha512-nDko83zL1Sfl4gbYJAsFnyla0Ok+llczIyZ9X+lkCIm5yW/hggS9gbYPxhZW1JD8K5VKaFmgeIZvnGE/DQnh2w==", + "dev": true + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fflate": { + "version": "0.6.10", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.6.10.tgz", + "integrity": "sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg==" + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "dev": true + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/framer-motion": { + "version": "10.16.12", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-10.16.12.tgz", + "integrity": "sha512-w7Yzx0OzQ5Uh6uNkxaX+4TuAPuOKz3haSbjmHpdrqDpGuCJCpq6YP9Dy7JJWdZ6mJjndrg3Ao3vUwDajKNikCA==", + "dependencies": { + "tslib": "^2.4.0" + }, + "optionalDependencies": { + "@emotion/is-prop-valid": "^0.8.2" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "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/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glsl-noise": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/glsl-noise/-/glsl-noise-0.0.0.tgz", + "integrity": "sha512-b/ZCF6amfAUb7dJM/MxRs7AetQEahYzJ8PtgfrmEdtw6uyGOr+ZSGtgjFm6mfsBkxJ4d2W7kg+Nlqzqvn3Bc0w==" + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/internal-slot": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", + "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.2", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.11" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/iterator.prototype": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", + "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" + } + }, + "node_modules/its-fine": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/its-fine/-/its-fine-1.1.1.tgz", + "integrity": "sha512-v1Ia1xl20KbuSGlwoaGsW0oxsw8Be+TrXweidxD9oT/1lAh6O3K3/GIM95Tt6WCiv6W+h2M7RB1TwdoAjQyyKw==", + "dependencies": { + "@types/react-reconciler": "^0.28.0" + }, + "peerDependencies": { + "react": ">=18.0" + } + }, + "node_modules/its-fine/node_modules/@types/react-reconciler": { + "version": "0.28.8", + "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.28.8.tgz", + "integrity": "sha512-SN9c4kxXZonFhbX4hJrZy37yw9e7EIxcpHCxQv5JUS18wDE5ovkQKlqQEkufdJCCMfuI9BnjUJvhYeJ9x5Ra7g==", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/jiti": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.clamp": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/lodash.clamp/-/lodash.clamp-4.0.3.tgz", + "integrity": "sha512-HvzRFWjtcguTW7yd8NJBshuNaCa8aqNFtnswdT7f/cMd/1YKy5Zzoq4W/Oxvnx9l7aeY258uSdDfM793+eLsVg==" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.omit": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.omit/-/lodash.omit-4.5.0.tgz", + "integrity": "sha512-XeqSp49hNGmlkj2EJlfrQFIzQ6lXdNro9sddtQzcJY8QaoC2GO0DT7xaIokHeyM+mIT0mPMlPvkYzg2xCuHdZg==" + }, + "node_modules/lodash.pick": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", + "integrity": "sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/maath": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/maath/-/maath-0.10.4.tgz", + "integrity": "sha512-neHNZ302rFJzXih8r9o1tUfMouO0WKO/as5n1kX72IZvXv5qIRJyWJ2hdXBj/dCZorvnFOBLSkY8SdPmjfeXLw==", + "peerDependencies": { + "@types/three": ">=0.144.0", + "three": ">=0.144.0" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/meshline": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/meshline/-/meshline-3.1.7.tgz", + "integrity": "sha512-uf9fPI9wy0Ie0kZjvKuIkf2n7gi3ih0wdTeb/kmSvmzpPyEL5d9lFohg9+JV9VC4sQUBOZDgxu6fnjn57goSHg==", + "peerDependencies": { + "three": ">=0.137" + } + }, + "node_modules/meshoptimizer": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/meshoptimizer/-/meshoptimizer-0.18.1.tgz", + "integrity": "sha512-ZhoIoL7TNV4s5B6+rx5mC//fw8/POGyNxS/DZyCJeiZ12ScLfVwRE/GfsxwiTkMYYD5DmK2/JXnEVXqL4rF+Sw==", + "peer": true + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "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/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", + "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", + "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.hasown": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz", + "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", + "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "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/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/post": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/post/-/post-0.0.1.tgz", + "integrity": "sha512-mVZ2rOOYMZpME3yEDXuEfLzHHDTzHUeWLEFQEmdRSfctKsd4fh1EXqFrp3orS2E3b9e546W57XJ6/emW9VfRxQ==", + "dev": true, + "dependencies": { + "event-component": "0.1.0" + } + }, + "node_modules/postcss": { + "version": "8.4.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz", + "integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==", + "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.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-import/node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-load-config/node_modules/lilconfig": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", + "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/potpack": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.2.tgz", + "integrity": "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-composer": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/react-composer/-/react-composer-5.0.3.tgz", + "integrity": "sha512-1uWd07EME6XZvMfapwZmc7NgCZqDemcvicRi3wMJzXsQLvZ3L7fTHVyPy1bZdnWXM4iPjYuNE+uJ41MLKeTtnA==", + "dependencies": { + "prop-types": "^15.6.0" + }, + "peerDependencies": { + "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-intersection-observer": { + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/react-intersection-observer/-/react-intersection-observer-8.34.0.tgz", + "integrity": "sha512-TYKh52Zc0Uptp5/b4N91XydfSGKubEhgZRtcg1rhTKABXijc4Sdr1uTp5lJ8TN27jwUsdXxjHXtHa0kPj704sw==", + "peerDependencies": { + "react": "^15.0.0 || ^16.0.0 || ^17.0.0|| ^18.0.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/react-merge-refs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/react-merge-refs/-/react-merge-refs-1.1.0.tgz", + "integrity": "sha512-alTKsjEL0dKH/ru1Iyn7vliS2QRcBp9zZPGoWxUOvRGWPUYgjo+V01is7p04It6KhgrzhJGnIj9GgX8W4bZoCQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/react-reconciler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.27.0.tgz", + "integrity": "sha512-HmMDKciQjYmBRGuuhIaKA1ba/7a+UsM5FzOZsMO2JYHt9Jh8reCb7j1eDC95NOyUlKM9KRyvdx0flBuDvYSBoA==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.21.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "react": "^18.0.0" + } + }, + "node_modules/react-reconciler/node_modules/scheduler": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.21.0.tgz", + "integrity": "sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/react-refresh": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", + "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-router": { + "version": "6.20.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.20.1.tgz", + "integrity": "sha512-ccvLrB4QeT5DlaxSFFYi/KR8UMQ4fcD8zBcR71Zp1kaYTC5oJKYAp1cbavzGrogwxca+ubjkd7XjFZKBW8CxPA==", + "dependencies": { + "@remix-run/router": "1.13.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.20.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.20.1.tgz", + "integrity": "sha512-npzfPWcxfQN35psS7rJgi/EW0Gx6EsNjfdJSAk73U/HqMEJZ2k/8puxfwHFgDQhBGmS3+sjnGbMdMSV45axPQw==", + "dependencies": { + "@remix-run/router": "1.13.1", + "react-router": "6.20.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/react-tilt": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/react-tilt/-/react-tilt-1.0.2.tgz", + "integrity": "sha512-21tUUsmuw5id/6NDtKqwYTG4taVnw+BoUwIG6YsgPC9GI6cx4BnBuSqgriQYAYcv3bdGNzecaBL+rvQRAm28bg==", + "peerDependencies": { + "@types/react": "^18.0.29", + "@types/react-dom": "^18.0.11", + "react": "^18.2.0", + "react-dom": "^18.2.0" + } + }, + "node_modules/react-use-measure": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/react-use-measure/-/react-use-measure-2.1.1.tgz", + "integrity": "sha512-nocZhN26cproIiIduswYpV5y5lQpSQS1y/4KuvUCjSKmw7ZWIS/+g3aFnX3WdBkyuGUtTLif3UTqnLLhbDoQig==", + "dependencies": { + "debounce": "^1.2.1" + }, + "peerDependencies": { + "react": ">=16.13", + "react-dom": ">=16.13" + } + }, + "node_modules/react-vertical-timeline-component": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/react-vertical-timeline-component/-/react-vertical-timeline-component-3.6.0.tgz", + "integrity": "sha512-l9zulqjIGlRuaQeplGzV4r/tG2RYBpYt84Il8w4IxnJze2cDIGI04MKo3F7f1sHT0Sih1ohEFts8UV23AJS15Q==", + "hasInstallScript": true, + "dependencies": { + "classnames": "^2.2.6", + "prop-types": "^15.7.2", + "react-intersection-observer": "^8.26.2" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz", + "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "set-function-name": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.6.1.tgz", + "integrity": "sha512-jZHaZotEHQaHLgKr8JnQiDT1rmatjgKlMekyksz+yk9jt/8z9quNjnKNRoaM0wd9DC2QKXjmWWuDYtM3jfF8pQ==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.6.1", + "@rollup/rollup-android-arm64": "4.6.1", + "@rollup/rollup-darwin-arm64": "4.6.1", + "@rollup/rollup-darwin-x64": "4.6.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.6.1", + "@rollup/rollup-linux-arm64-gnu": "4.6.1", + "@rollup/rollup-linux-arm64-musl": "4.6.1", + "@rollup/rollup-linux-x64-gnu": "4.6.1", + "@rollup/rollup-linux-x64-musl": "4.6.1", + "@rollup/rollup-win32-arm64-msvc": "4.6.1", + "@rollup/rollup-win32-ia32-msvc": "4.6.1", + "@rollup/rollup-win32-x64-msvc": "4.6.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", + "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.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/source-map-resolve": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz", + "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==", + "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", + "dev": true, + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0" + } + }, + "node_modules/stats-gl": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/stats-gl/-/stats-gl-1.0.7.tgz", + "integrity": "sha512-vZI82CjefSxLC1bjw36z28v0+QE9rJKymGlXtfWu+ipW70ZEAwa4EbO4LxluAfLfpqiaAS04NzpYBRLDeAwYWQ==" + }, + "node_modules/stats.js": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/stats.js/-/stats.js-0.17.0.tgz", + "integrity": "sha512-hNKz8phvYLPEcRkeG1rsGmV5ChMjKDAWU7/OJJdDErPBNChQXxCo3WZurGpnWc6gZhAzEPFad1aVgyOANH1sMw==" + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", + "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "regexp.prototype.flags": "^1.5.0", + "set-function-name": "^2.0.0", + "side-channel": "^1.0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/sucrase": { + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", + "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "7.1.6", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/suspend-react": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/suspend-react/-/suspend-react-0.1.3.tgz", + "integrity": "sha512-aqldKgX9aZqpoDp3e8/BZ8Dm7x1pJl+qI3ZKxDN0i/IQTWUwBx/ManmlVJ3wowqbno6c2bmiIfs+Um6LbsjJyQ==", + "peerDependencies": { + "react": ">=17.0" + } + }, + "node_modules/tailwindcss": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.5.tgz", + "integrity": "sha512-5SEZU4J7pxZgSkv7FP1zY8i2TIAOooNZ1e/OGtxIEv6GltpoiXUqWvLy89+a10qYTB1N5Ifkuw9lqQkN9sscvA==", + "dev": true, + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.0", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.19.1", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss/node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/three": { + "version": "0.159.0", + "resolved": "https://registry.npmjs.org/three/-/three-0.159.0.tgz", + "integrity": "sha512-eCmhlLGbBgucuo4VEA9IO3Qpc7dh8Bd4VKzr7WfW4+8hMcIfoAVi1ev0pJYN9PTTsCslbcKgBwr2wNZ1EvLInA==", + "peer": true + }, + "node_modules/three-mesh-bvh": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/three-mesh-bvh/-/three-mesh-bvh-0.6.8.tgz", + "integrity": "sha512-EGebF9DZx1S8+7OZYNNTT80GXJZVf+UYXD/HyTg/e2kR/ApofIFfUS4ZzIHNnUVIadpnLSzM4n96wX+l7GMbnQ==", + "peerDependencies": { + "three": ">= 0.151.0" + } + }, + "node_modules/three-stdlib": { + "version": "2.28.7", + "resolved": "https://registry.npmjs.org/three-stdlib/-/three-stdlib-2.28.7.tgz", + "integrity": "sha512-E7NuztilCswBKnEoyqydvA7N4dy0cf/gLA0bKrrg6+Q6j4WtusGa/+t9oK2HVq47S1AHRH2CvFHpdIGNjPKo/A==", + "dependencies": { + "@types/draco3d": "^1.4.0", + "@types/offscreencanvas": "^2019.6.4", + "@types/webxr": "^0.5.2", + "draco3d": "^1.4.1", + "fflate": "^0.6.9", + "potpack": "^1.0.1" + }, + "peerDependencies": { + "three": ">=0.128.0" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/troika-three-text": { + "version": "0.47.2", + "resolved": "https://registry.npmjs.org/troika-three-text/-/troika-three-text-0.47.2.tgz", + "integrity": "sha512-qylT0F+U7xGs+/PEf3ujBdJMYWbn0Qci0kLqI5BJG2kW1wdg4T1XSxneypnF05DxFqJhEzuaOR9S2SjiyknMng==", + "dependencies": { + "bidi-js": "^1.0.2", + "troika-three-utils": "^0.47.2", + "troika-worker-utils": "^0.47.2", + "webgl-sdf-generator": "1.1.1" + }, + "peerDependencies": { + "three": ">=0.125.0" + } + }, + "node_modules/troika-three-utils": { + "version": "0.47.2", + "resolved": "https://registry.npmjs.org/troika-three-utils/-/troika-three-utils-0.47.2.tgz", + "integrity": "sha512-/28plhCxfKtH7MSxEGx8e3b/OXU5A0xlwl+Sbdp0H8FXUHKZDoksduEKmjQayXYtxAyuUiCRunYIv/8Vi7aiyg==", + "peerDependencies": { + "three": ">=0.125.0" + } + }, + "node_modules/troika-worker-utils": { + "version": "0.47.2", + "resolved": "https://registry.npmjs.org/troika-worker-utils/-/troika-worker-utils-0.47.2.tgz", + "integrity": "sha512-mzss4MeyzUkYBppn4x5cdAqrhBHFEuVmMMgLMTyFV23x6GvQMyo+/R5E5Lsbrt7WSt5RfvewjcwD1DChRTA9lA==" + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/utility-types": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz", + "integrity": "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vite": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.5.tgz", + "integrity": "sha512-OekeWqR9Ls56f3zd4CaxzbbS11gqYkEiBtnWFFgYR2WV8oPJRRKq0mpskYy/XaoCL3L7VINDhqqOMNDiYdGvGg==", + "dev": true, + "dependencies": { + "esbuild": "^0.19.3", + "postcss": "^8.4.32", + "rollup": "^4.2.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "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/webgl-constants": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/webgl-constants/-/webgl-constants-1.1.1.tgz", + "integrity": "sha512-LkBXKjU5r9vAW7Gcu3T5u+5cvSvh5WwINdr0C+9jpzVB41cjQAP5ePArDtk/WHYdVj0GefCgM73BA7FlIiNtdg==" + }, + "node_modules/webgl-sdf-generator": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/webgl-sdf-generator/-/webgl-sdf-generator-1.1.1.tgz", + "integrity": "sha512-9Z0JcMTFxeE+b2x1LJTdnaT8rT8aEp7MVxkNwoycNmJWwPdzoXzMh0BjJSh/AEFP+KPYZUli814h8bJZFIZ2jA==" + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", + "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", + "dev": true, + "dependencies": { + "function.prototype.name": "^1.1.5", + "has-tostringtag": "^1.0.0", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "dev": true, + "dependencies": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", + "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.4", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yaml": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", + "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zustand": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-3.7.2.tgz", + "integrity": "sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==", + "engines": { + "node": ">=12.7.0" + }, + "peerDependencies": { + "react": ">=16.8" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + } + } + } + } +} diff --git a/app/package.json b/app/package.json new file mode 100644 index 0000000..e0db960 --- /dev/null +++ b/app/package.json @@ -0,0 +1,41 @@ +{ + "name": "react_bs_web", + "private": true, + "proxy": "http://localhost:5000", + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "lint": "eslint . --ext js,jsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview" + }, + "dependencies": { + "@emailjs/browser": "^3.11.0", + "@react-three/drei": "^9.89.3", + "@react-three/fiber": "^8.15.12", + "cors": "^2.8.5", + "framer-motion": "^10.16.12", + "maath": "^0.10.4", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-router-dom": "^6.20.1", + "react-tilt": "^1.0.2", + "react-vertical-timeline-component": "^3.6.0" + }, + "devDependencies": { + "@types/react": "^18.2.37", + "@types/react-dom": "^18.2.15", + "@vitejs/plugin-react": "^4.2.0", + "autoprefixer": "^10.4.16", + "css": "^3.0.0", + "eslint": "^8.53.0", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.4", + "post": "^0.0.1", + "postcss": "^8.4.32", + "tailwindcss": "^3.3.5", + "vite": "^5.0.0" + } +} diff --git a/app/postcss.config.js b/app/postcss.config.js new file mode 100644 index 0000000..2e7af2b --- /dev/null +++ b/app/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/app/public/desktop_pc/license.txt b/app/public/desktop_pc/license.txt new file mode 100644 index 0000000..45f374f --- /dev/null +++ b/app/public/desktop_pc/license.txt @@ -0,0 +1,11 @@ +Model Information: +* title: Gaming Desktop PC +* source: https://sketchfab.com/3d-models/gaming-desktop-pc-d1d8282c9916438091f11aeb28787b66 +* author: Yolala1232 (https://sketchfab.com/Yolala1232) + +Model License: +* license type: CC-BY-4.0 (http://creativecommons.org/licenses/by/4.0/) +* requirements: Author must be credited. Commercial use is allowed. + +If you use this 3D model in your project be sure to copy paste this credit wherever you share it: +This work is based on "Gaming Desktop PC" (https://sketchfab.com/3d-models/gaming-desktop-pc-d1d8282c9916438091f11aeb28787b66) by Yolala1232 (https://sketchfab.com/Yolala1232) licensed under CC-BY-4.0 (http://creativecommons.org/licenses/by/4.0/) \ No newline at end of file diff --git a/app/public/desktop_pc/scene.bin b/app/public/desktop_pc/scene.bin new file mode 100644 index 0000000..733e737 Binary files /dev/null and b/app/public/desktop_pc/scene.bin differ diff --git a/app/public/desktop_pc/scene.gltf b/app/public/desktop_pc/scene.gltf new file mode 100644 index 0000000..821befd --- /dev/null +++ b/app/public/desktop_pc/scene.gltf @@ -0,0 +1,87680 @@ +{ + "accessors": [ + { + "bufferView": 2, + "componentType": 5126, + "count": 24, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 288, + "componentType": 5126, + "count": 24, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "componentType": 5126, + "count": 24, + "max": [ + 0.7262974977493286, + 1.0 + ], + "min": [ + 0.125, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "componentType": 5125, + "count": 36, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 576, + "componentType": 5126, + "count": 1092, + "max": [ + 1.0, + 1.000000238418579, + 1.0 + ], + "min": [ + -0.9999989867210388, + -0.9999997615814209, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 13680, + "componentType": 5126, + "count": 1092, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 192, + "componentType": 5126, + "count": 1092, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 144, + "componentType": 5125, + "count": 2157, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 26784, + "componentType": 5126, + "count": 369, + "max": [ + 1.0, + -0.9700000286102295, + 0.9999998211860657 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 31212, + "componentType": 5126, + "count": 369, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 8928, + "componentType": 5126, + "count": 369, + "max": [ + 0.625, + 1.0 + ], + "min": [ + 0.375, + 0.75 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 8772, + "componentType": 5125, + "count": 708, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 35640, + "componentType": 5126, + "count": 24, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 35928, + "componentType": 5126, + "count": 24, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 11880, + "componentType": 5126, + "count": 24, + "max": [ + 0.875, + 1.0 + ], + "min": [ + 0.125, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 11604, + "componentType": 5125, + "count": 36, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 36216, + "componentType": 5126, + "count": 24, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 36504, + "componentType": 5126, + "count": 24, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 12072, + "componentType": 5126, + "count": 24, + "max": [ + 0.875, + 1.0 + ], + "min": [ + 0.125, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 11748, + "componentType": 5125, + "count": 36, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 36792, + "componentType": 5126, + "count": 1536, + "max": [ + 1.0000009536743164, + 48.145477294921875, + 1.0 + ], + "min": [ + -54.65338134765625, + -1.000000238418579, + -80.99169921875 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 55224, + "componentType": 5126, + "count": 1536, + "max": [ + 0.9951848983764648, + 0.9951848983764648, + 1.0 + ], + "min": [ + -0.9951848983764648, + -0.9951848983764648, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 12264, + "componentType": 5126, + "count": 1536, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.01000000536441803 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 11892, + "componentType": 5125, + "count": 2976, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 73656, + "componentType": 5126, + "count": 423, + "max": [ + 1.0782172679901123, + 1.0711627006530762, + 1.0079421997070313 + ], + "min": [ + -1.0755589008331299, + -1.0782172679901123, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 78732, + "componentType": 5126, + "count": 423, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 24552, + "componentType": 5126, + "count": 423, + "max": [ + 0.75, + 0.875 + ], + "min": [ + 0.25, + 0.625 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 23796, + "componentType": 5125, + "count": 795, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 83808, + "componentType": 5126, + "count": 28, + "max": [ + 0.5023584961891174, + 0.5, + 0.0 + ], + "min": [ + -0.5023584961891174, + -0.5, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 84144, + "componentType": 5126, + "count": 28, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 27936, + "componentType": 5126, + "count": 28, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 26976, + "componentType": 5125, + "count": 78, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 84480, + "componentType": 5126, + "count": 28, + "max": [ + 0.5023584961891174, + 0.5, + 0.0 + ], + "min": [ + -0.5023584961891174, + -0.5, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 84816, + "componentType": 5126, + "count": 28, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 28160, + "componentType": 5126, + "count": 28, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 27288, + "componentType": 5125, + "count": 78, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 85152, + "componentType": 5126, + "count": 1257, + "max": [ + 1.0, + 31.104598999023438, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 100236, + "componentType": 5126, + "count": 1257, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 28384, + "componentType": 5126, + "count": 1257, + "max": [ + 0.875, + 1.0 + ], + "min": [ + 0.125, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 27600, + "componentType": 5125, + "count": 2370, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 115320, + "componentType": 5126, + "count": 423, + "max": [ + 1.0782172679901123, + 1.0711627006530762, + 1.0079421997070313 + ], + "min": [ + -1.0755589008331299, + -1.0782172679901123, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 120396, + "componentType": 5126, + "count": 423, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 38440, + "componentType": 5126, + "count": 423, + "max": [ + 0.75, + 0.875 + ], + "min": [ + 0.25, + 0.625 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 37080, + "componentType": 5125, + "count": 795, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 125472, + "componentType": 5126, + "count": 28, + "max": [ + 0.5023584961891174, + 0.5, + 0.0 + ], + "min": [ + -0.5023584961891174, + -0.5, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 125808, + "componentType": 5126, + "count": 28, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 41824, + "componentType": 5126, + "count": 28, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 40260, + "componentType": 5125, + "count": 78, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 126144, + "componentType": 5126, + "count": 28, + "max": [ + 0.5023584961891174, + 0.5, + 0.0 + ], + "min": [ + -0.5023584961891174, + -0.5, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 126480, + "componentType": 5126, + "count": 28, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 42048, + "componentType": 5126, + "count": 28, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 40572, + "componentType": 5125, + "count": 78, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 126816, + "componentType": 5126, + "count": 423, + "max": [ + 1.0782172679901123, + 1.0711627006530762, + 1.0079421997070313 + ], + "min": [ + -1.0755589008331299, + -1.0782172679901123, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 131892, + "componentType": 5126, + "count": 423, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 42272, + "componentType": 5126, + "count": 423, + "max": [ + 0.75, + 0.875 + ], + "min": [ + 0.25, + 0.625 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 40884, + "componentType": 5125, + "count": 795, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 136968, + "componentType": 5126, + "count": 28, + "max": [ + 0.5023584961891174, + 0.5, + 0.0 + ], + "min": [ + -0.5023584961891174, + -0.5, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 137304, + "componentType": 5126, + "count": 28, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 45656, + "componentType": 5126, + "count": 28, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 44064, + "componentType": 5125, + "count": 78, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 137640, + "componentType": 5126, + "count": 28, + "max": [ + 0.5023584961891174, + 0.5, + 0.0 + ], + "min": [ + -0.5023584961891174, + -0.5, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 137976, + "componentType": 5126, + "count": 28, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 45880, + "componentType": 5126, + "count": 28, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 44376, + "componentType": 5125, + "count": 78, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 138312, + "componentType": 5126, + "count": 423, + "max": [ + 1.0782172679901123, + 1.0711627006530762, + 1.0079421997070313 + ], + "min": [ + -1.0755589008331299, + -1.0782172679901123, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 143388, + "componentType": 5126, + "count": 423, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 46104, + "componentType": 5126, + "count": 423, + "max": [ + 0.75, + 0.875 + ], + "min": [ + 0.25, + 0.625 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 44688, + "componentType": 5125, + "count": 795, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 148464, + "componentType": 5126, + "count": 28, + "max": [ + 0.5023584961891174, + 0.5, + 0.0 + ], + "min": [ + -0.5023584961891174, + -0.5, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 148800, + "componentType": 5126, + "count": 28, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 49488, + "componentType": 5126, + "count": 28, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 47868, + "componentType": 5125, + "count": 78, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 149136, + "componentType": 5126, + "count": 28, + "max": [ + 0.5023584961891174, + 0.5, + 0.0 + ], + "min": [ + -0.5023584961891174, + -0.5, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 149472, + "componentType": 5126, + "count": 28, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 49712, + "componentType": 5126, + "count": 28, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 48180, + "componentType": 5125, + "count": 78, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 149808, + "componentType": 5126, + "count": 60, + "max": [ + 1.0000001192092896, + 1.0000005960464478, + 1.0 + ], + "min": [ + -1.0000001192092896, + -0.9999996423721313, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 150528, + "componentType": 5126, + "count": 60, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 49936, + "componentType": 5126, + "count": 60, + "max": [ + 0.9447774291038513, + 0.8551908731460571 + ], + "min": [ + 0.03647267818450928, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 48492, + "componentType": 5125, + "count": 120, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 151248, + "componentType": 5126, + "count": 24, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 151536, + "componentType": 5126, + "count": 24, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 50416, + "componentType": 5126, + "count": 24, + "max": [ + 0.875, + 1.0 + ], + "min": [ + 0.125, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 48972, + "componentType": 5125, + "count": 36, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 151824, + "componentType": 5126, + "count": 423, + "max": [ + 1.0782172679901123, + 1.0711627006530762, + 1.0079421997070313 + ], + "min": [ + -1.0755589008331299, + -1.0782172679901123, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 156900, + "componentType": 5126, + "count": 423, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 50608, + "componentType": 5126, + "count": 423, + "max": [ + 0.75, + 0.875 + ], + "min": [ + 0.25, + 0.625 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 49116, + "componentType": 5125, + "count": 795, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 161976, + "componentType": 5126, + "count": 28, + "max": [ + 0.5023584961891174, + 0.5, + 0.0 + ], + "min": [ + -0.5023584961891174, + -0.5, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 162312, + "componentType": 5126, + "count": 28, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 53992, + "componentType": 5126, + "count": 28, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 52296, + "componentType": 5125, + "count": 78, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 162648, + "componentType": 5126, + "count": 28, + "max": [ + 0.5023584961891174, + 0.5, + 0.0 + ], + "min": [ + -0.5023584961891174, + -0.5, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 162984, + "componentType": 5126, + "count": 28, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 54216, + "componentType": 5126, + "count": 28, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 52608, + "componentType": 5125, + "count": 78, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 163320, + "componentType": 5126, + "count": 1344, + "max": [ + 3.7961838245391846, + 1.1679691076278687, + 1.2246426343917847 + ], + "min": [ + -1.1679697036743164, + -1.1679697036743164, + -31.970701217651367 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 179448, + "componentType": 5126, + "count": 1344, + "max": [ + 1.0, + 0.9951847791671753, + 0.9951847791671753 + ], + "min": [ + -1.0, + -0.9951847791671753, + -0.9992701411247253 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 54440, + "componentType": 5126, + "count": 1344, + "max": [ + 1.0000001192092896, + 1.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 52920, + "componentType": 5125, + "count": 2094, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 195576, + "componentType": 5126, + "count": 1344, + "max": [ + 3.7961838245391846, + 1.1679691076278687, + 1.2246426343917847 + ], + "min": [ + -1.1679697036743164, + -1.1679697036743164, + -31.970701217651367 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 211704, + "componentType": 5126, + "count": 1344, + "max": [ + 1.0, + 0.9951847791671753, + 0.9951847791671753 + ], + "min": [ + -1.0, + -0.9951847791671753, + -0.9992701411247253 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 65192, + "componentType": 5126, + "count": 1344, + "max": [ + 1.0000001192092896, + 1.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 61296, + "componentType": 5125, + "count": 2094, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 227832, + "componentType": 5126, + "count": 4, + "max": [ + 1.8105590343475342, + 0.5, + 0.0 + ], + "min": [ + -1.8105590343475342, + -0.5, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 227880, + "componentType": 5126, + "count": 4, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 75944, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 69672, + "componentType": 5125, + "count": 6, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 227928, + "componentType": 5126, + "count": 554, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -0.9026387333869934 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 234576, + "componentType": 5126, + "count": 554, + "max": [ + 1.0, + 0.9995229840278625, + 0.9996175765991211 + ], + "min": [ + -1.0, + -0.9995237588882446, + -0.9995875954627991 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 75976, + "componentType": 5126, + "count": 554, + "max": [ + 0.875, + 1.0 + ], + "min": [ + 0.125, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 69696, + "componentType": 5125, + "count": 1044, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 241224, + "componentType": 5126, + "count": 536, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 247656, + "componentType": 5126, + "count": 536, + "max": [ + 1.0, + 1.0, + 0.9999208450317383 + ], + "min": [ + -1.0, + -1.0, + -0.9999490976333618 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 80408, + "componentType": 5126, + "count": 536, + "max": [ + 0.875004231929779, + 1.000004529953003 + ], + "min": [ + 0.12499542534351349, + 0.24999544024467468 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 73872, + "componentType": 5125, + "count": 1044, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 254088, + "componentType": 5126, + "count": 4, + "max": [ + 2.209876537322998, + 0.5, + 0.0 + ], + "min": [ + -2.209876537322998, + -0.5, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 254136, + "componentType": 5126, + "count": 4, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 84696, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 78048, + "componentType": 5125, + "count": 6, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 254184, + "componentType": 5126, + "count": 6, + "max": [ + -0.9191663265228271, + 1.0, + -0.18246042728424072 + ], + "min": [ + -0.9717132449150085, + 1.0, + -0.6503302454948425 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 254256, + "componentType": 5126, + "count": 6, + "max": [ + 0.0, + 1.0, + 0.0 + ], + "min": [ + 0.0, + 1.0, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 84728, + "componentType": 5126, + "count": 6, + "max": [ + 0.24364516139030457, + 0.40422821044921875 + ], + "min": [ + 0.22861061990261078, + 0.1771208941936493 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 78072, + "componentType": 5125, + "count": 12, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 254328, + "componentType": 5126, + "count": 7, + "max": [ + -0.7314748764038086, + 1.0, + -0.5818517208099365 + ], + "min": [ + -0.7544288635253906, + 1.0, + -0.922091543674469 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 254412, + "componentType": 5126, + "count": 7, + "max": [ + 0.0, + 1.0, + 0.0 + ], + "min": [ + 0.0, + 1.0, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 84776, + "componentType": 5126, + "count": 7, + "max": [ + 0.29871445894241333, + 0.21035167574882507 + ], + "min": [ + 0.2918335199356079, + 0.04545745998620987 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 78120, + "componentType": 5125, + "count": 15, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 254496, + "componentType": 5126, + "count": 4, + "max": [ + 0.6773743033409119, + 0.5, + 0.0 + ], + "min": [ + -0.6773743033409119, + -0.5, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 254544, + "componentType": 5126, + "count": 4, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 84832, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 78180, + "componentType": 5125, + "count": 6, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 254592, + "componentType": 5126, + "count": 4, + "max": [ + 0.6773743033409119, + 0.5, + 0.0 + ], + "min": [ + -0.6773743033409119, + -0.5, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 254640, + "componentType": 5126, + "count": 4, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 84864, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 78204, + "componentType": 5125, + "count": 6, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 254688, + "componentType": 5126, + "count": 1095, + "max": [ + 0.6773743033409119, + 0.5, + 0.0 + ], + "min": [ + -0.6773743033409119, + -0.5, + -3.243551205400763e-08 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 267828, + "componentType": 5126, + "count": 1095, + "max": [ + 7.840430953365285e-07, + 0.0, + 1.0 + ], + "min": [ + -7.535515464951459e-07, + -1.0621823776091333e-06, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 84896, + "componentType": 5126, + "count": 1095, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 78228, + "componentType": 5125, + "count": 6144, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 280968, + "componentType": 5126, + "count": 24, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 281256, + "componentType": 5126, + "count": 24, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 93656, + "componentType": 5126, + "count": 24, + "max": [ + 1.0868080854415894, + 1.001512885093689 + ], + "min": [ + -0.04749802500009537, + -0.004564238712191582 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 102804, + "componentType": 5125, + "count": 36, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 281544, + "componentType": 5126, + "count": 182, + "max": [ + 0.9999904632568359, + 1.0, + 0.9999997019767761 + ], + "min": [ + -1.000009536743164, + -1.0, + -0.9999997019767761 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 283728, + "componentType": 5126, + "count": 182, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 93848, + "componentType": 5126, + "count": 182, + "max": [ + 1.0917543172836304, + 1.0021878480911255 + ], + "min": [ + -0.023310065269470215, + -0.004564238712191582 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 102948, + "componentType": 5125, + "count": 330, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 285912, + "componentType": 5126, + "count": 24, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 286200, + "componentType": 5126, + "count": 24, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 95304, + "componentType": 5126, + "count": 24, + "max": [ + 1.0868080854415894, + 1.001512885093689 + ], + "min": [ + -0.04749802500009537, + -0.004564238712191582 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 104268, + "componentType": 5125, + "count": 36, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 286488, + "componentType": 5126, + "count": 180, + "max": [ + 1.0147204399108887, + 2.9120607376098633, + 0.9999997019767761 + ], + "min": [ + -1.272171974182129, + 1.0, + -0.9999997019767761 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 288648, + "componentType": 5126, + "count": 180, + "max": [ + 0.9986199140548706, + 1.0, + 1.0 + ], + "min": [ + -0.9986199140548706, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 95496, + "componentType": 5126, + "count": 180, + "max": [ + 1.0917543172836304, + 1.0021878480911255 + ], + "min": [ + -0.023310065269470215, + -0.004564238712191582 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 104412, + "componentType": 5125, + "count": 312, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 290808, + "componentType": 5126, + "count": 24, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 291096, + "componentType": 5126, + "count": 24, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 96936, + "componentType": 5126, + "count": 24, + "max": [ + 1.0868080854415894, + 1.001512885093689 + ], + "min": [ + -0.04749802500009537, + -0.004564238712191582 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 105660, + "componentType": 5125, + "count": 36, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 291384, + "componentType": 5126, + "count": 182, + "max": [ + 0.9999904632568359, + 1.0, + 0.9999997019767761 + ], + "min": [ + -1.000009536743164, + -1.0, + -0.9999997019767761 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 293568, + "componentType": 5126, + "count": 182, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 97128, + "componentType": 5126, + "count": 182, + "max": [ + 1.0917543172836304, + 1.0021878480911255 + ], + "min": [ + -0.023310065269470215, + -0.004564238712191582 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 105804, + "componentType": 5125, + "count": 330, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 295752, + "componentType": 5126, + "count": 24, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 296040, + "componentType": 5126, + "count": 24, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 98584, + "componentType": 5126, + "count": 24, + "max": [ + 1.0868080854415894, + 1.001512885093689 + ], + "min": [ + -0.04749802500009537, + -0.004564238712191582 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 107124, + "componentType": 5125, + "count": 36, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 296328, + "componentType": 5126, + "count": 180, + "max": [ + 1.0147204399108887, + 2.9120607376098633, + 0.9999997019767761 + ], + "min": [ + -1.272171974182129, + 1.0, + -0.9999997019767761 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 298488, + "componentType": 5126, + "count": 180, + "max": [ + 0.9986199140548706, + 1.0, + 1.0 + ], + "min": [ + -0.9986199140548706, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 98776, + "componentType": 5126, + "count": 180, + "max": [ + 1.0917543172836304, + 1.0021878480911255 + ], + "min": [ + -0.023310065269470215, + -0.004564238712191582 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 107268, + "componentType": 5125, + "count": 312, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 300648, + "componentType": 5126, + "count": 24, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 300936, + "componentType": 5126, + "count": 24, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 100216, + "componentType": 5126, + "count": 24, + "max": [ + 1.0868080854415894, + 1.001512885093689 + ], + "min": [ + -0.04749802500009537, + -0.004564238712191582 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 108516, + "componentType": 5125, + "count": 36, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 301224, + "componentType": 5126, + "count": 182, + "max": [ + 0.9999904632568359, + 1.0, + 0.9999997019767761 + ], + "min": [ + -1.000009536743164, + -1.0, + -0.9999997019767761 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 303408, + "componentType": 5126, + "count": 182, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 100408, + "componentType": 5126, + "count": 182, + "max": [ + 1.0917543172836304, + 1.0021878480911255 + ], + "min": [ + -0.023310065269470215, + -0.004564238712191582 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 108660, + "componentType": 5125, + "count": 330, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 305592, + "componentType": 5126, + "count": 24, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 305880, + "componentType": 5126, + "count": 24, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 101864, + "componentType": 5126, + "count": 24, + "max": [ + 1.0868080854415894, + 1.001512885093689 + ], + "min": [ + -0.04749802500009537, + -0.004564238712191582 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 109980, + "componentType": 5125, + "count": 36, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 306168, + "componentType": 5126, + "count": 180, + "max": [ + 1.0147204399108887, + 2.9120607376098633, + 0.9999997019767761 + ], + "min": [ + -1.272171974182129, + 1.0, + -0.9999997019767761 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 308328, + "componentType": 5126, + "count": 180, + "max": [ + 0.9986199140548706, + 1.0, + 1.0 + ], + "min": [ + -0.9986199140548706, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 102056, + "componentType": 5126, + "count": 180, + "max": [ + 1.0917543172836304, + 1.0021878480911255 + ], + "min": [ + -0.023310065269470215, + -0.004564238712191582 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 110124, + "componentType": 5125, + "count": 312, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 310488, + "componentType": 5126, + "count": 24, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 310776, + "componentType": 5126, + "count": 24, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 103496, + "componentType": 5126, + "count": 24, + "max": [ + 1.0868080854415894, + 1.001512885093689 + ], + "min": [ + -0.04749802500009537, + -0.004564238712191582 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 111372, + "componentType": 5125, + "count": 36, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 311064, + "componentType": 5126, + "count": 182, + "max": [ + 0.9999904632568359, + 1.0, + 0.9999997019767761 + ], + "min": [ + -1.000009536743164, + -1.0, + -0.9999997019767761 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 313248, + "componentType": 5126, + "count": 182, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 103688, + "componentType": 5126, + "count": 182, + "max": [ + 1.0917543172836304, + 1.0021878480911255 + ], + "min": [ + -0.023310065269470215, + -0.004564238712191582 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 111516, + "componentType": 5125, + "count": 330, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 315432, + "componentType": 5126, + "count": 24, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 315720, + "componentType": 5126, + "count": 24, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 105144, + "componentType": 5126, + "count": 24, + "max": [ + 1.0868080854415894, + 1.001512885093689 + ], + "min": [ + -0.04749802500009537, + -0.004564238712191582 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 112836, + "componentType": 5125, + "count": 36, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 316008, + "componentType": 5126, + "count": 180, + "max": [ + 1.0147204399108887, + 2.9120607376098633, + 0.9999997019767761 + ], + "min": [ + -1.272171974182129, + 1.0, + -0.9999997019767761 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 318168, + "componentType": 5126, + "count": 180, + "max": [ + 0.9986199140548706, + 1.0, + 1.0 + ], + "min": [ + -0.9986199140548706, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 105336, + "componentType": 5126, + "count": 180, + "max": [ + 1.0917543172836304, + 1.0021878480911255 + ], + "min": [ + -0.023310065269470215, + -0.004564238712191582 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 112980, + "componentType": 5125, + "count": 312, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 320328, + "componentType": 5126, + "count": 627, + "max": [ + 0.6773743033409119, + 0.5, + 0.0 + ], + "min": [ + -0.6773743033409119, + -0.5, + -3.243551205400763e-08 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 327852, + "componentType": 5126, + "count": 627, + "max": [ + 7.840430953365285e-07, + 0.0, + 1.0 + ], + "min": [ + -7.535515464951459e-07, + -1.0621823776091333e-06, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 106776, + "componentType": 5126, + "count": 627, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 114228, + "componentType": 5125, + "count": 3336, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 335376, + "componentType": 5126, + "count": 2082, + "max": [ + 1.1387947797775269, + 1.0000003576278687, + 0.9999998807907104 + ], + "min": [ + -1.1055898666381836, + -0.9999994039535522, + -0.9999998807907104 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 360360, + "componentType": 5126, + "count": 2082, + "max": [ + 0.9997839331626892, + 1.0, + 0.9994681477546692 + ], + "min": [ + -0.9985126852989197, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 111792, + "componentType": 5126, + "count": 2082, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 127572, + "componentType": 5125, + "count": 4002, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 385344, + "componentType": 5126, + "count": 24, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 385632, + "componentType": 5126, + "count": 24, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 128448, + "componentType": 5126, + "count": 24, + "max": [ + 1.0022401809692383, + 1.0030733346939087 + ], + "min": [ + 0.0023581634741276503, + -0.004165643826127052 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 143580, + "componentType": 5125, + "count": 36, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 385920, + "componentType": 5126, + "count": 4, + "max": [ + 0.6374045610427856, + 0.5, + 0.0 + ], + "min": [ + -0.6374045610427856, + -0.5, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 385968, + "componentType": 5126, + "count": 4, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 128640, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 143724, + "componentType": 5125, + "count": 6, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 386016, + "componentType": 5126, + "count": 4, + "max": [ + 0.5886889696121216, + 0.5, + 0.0 + ], + "min": [ + -0.5886889696121216, + -0.5, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 386064, + "componentType": 5126, + "count": 4, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 128672, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 143748, + "componentType": 5125, + "count": 6, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 386112, + "componentType": 5126, + "count": 392, + "max": [ + 0.9999997019767761, + 0.9999997615814209, + 0.9999923706054688 + ], + "min": [ + -1.0000005960464478, + -1.000000238418579, + -1.0000076293945313 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 390816, + "componentType": 5126, + "count": 392, + "max": [ + 0.9951847195625305, + 0.9952271580696106, + 1.0 + ], + "min": [ + -0.9951847791671753, + -0.9952271580696106, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 128704, + "componentType": 5126, + "count": 392, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.01000000536441803 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 143772, + "componentType": 5125, + "count": 768, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 395520, + "componentType": 5126, + "count": 392, + "max": [ + 0.9999997019767761, + 0.9999997615814209, + 0.9999923706054688 + ], + "min": [ + -1.0000005960464478, + -1.000000238418579, + -1.0000076293945313 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 400224, + "componentType": 5126, + "count": 392, + "max": [ + 0.9951847195625305, + 0.9952271580696106, + 1.0 + ], + "min": [ + -0.9951847791671753, + -0.9952271580696106, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 131840, + "componentType": 5126, + "count": 392, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.01000000536441803 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 146844, + "componentType": 5125, + "count": 768, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 404928, + "componentType": 5126, + "count": 2082, + "max": [ + 1.1387947797775269, + 1.0000003576278687, + 0.9999998807907104 + ], + "min": [ + -1.1055898666381836, + -0.9999994039535522, + -0.9999998807907104 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 429912, + "componentType": 5126, + "count": 2082, + "max": [ + 0.9997839331626892, + 1.0, + 0.9994681477546692 + ], + "min": [ + -0.9985126852989197, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 134976, + "componentType": 5126, + "count": 2082, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 149916, + "componentType": 5125, + "count": 4002, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 454896, + "componentType": 5126, + "count": 392, + "max": [ + 0.9999997019767761, + 0.9999997615814209, + 0.9999923706054688 + ], + "min": [ + -1.0000005960464478, + -1.000000238418579, + -1.0000076293945313 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 459600, + "componentType": 5126, + "count": 392, + "max": [ + 0.9951847195625305, + 0.9952271580696106, + 1.0 + ], + "min": [ + -0.9951847791671753, + -0.9952271580696106, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 151632, + "componentType": 5126, + "count": 392, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.01000000536441803 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 165924, + "componentType": 5125, + "count": 768, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 464304, + "componentType": 5126, + "count": 392, + "max": [ + 0.9999997019767761, + 0.9999997615814209, + 0.9999923706054688 + ], + "min": [ + -1.0000005960464478, + -1.000000238418579, + -1.0000076293945313 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 469008, + "componentType": 5126, + "count": 392, + "max": [ + 0.9951847195625305, + 0.9952271580696106, + 1.0 + ], + "min": [ + -0.9951847791671753, + -0.9952271580696106, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 154768, + "componentType": 5126, + "count": 392, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.01000000536441803 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 168996, + "componentType": 5125, + "count": 768, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 473712, + "componentType": 5126, + "count": 4, + "max": [ + 0.5045953989028931, + 0.3278324007987976, + 0.0 + ], + "min": [ + -0.6285498142242432, + -0.2782910466194153, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 473760, + "componentType": 5126, + "count": 4, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 157904, + "componentType": 5126, + "count": 4, + "max": [ + 0.7838349342346191, + 0.8278323411941528 + ], + "min": [ + 0.14644071459770203, + 0.22170895338058472 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 172068, + "componentType": 5125, + "count": 6, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 473808, + "componentType": 5126, + "count": 4, + "max": [ + 0.8977590799331665, + 0.5, + 0.0 + ], + "min": [ + -0.8977590799331665, + -0.5, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 473856, + "componentType": 5126, + "count": 4, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 157936, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 172092, + "componentType": 5125, + "count": 6, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 473904, + "componentType": 5126, + "count": 4, + "max": [ + 1.1818181276321411, + 0.5, + 0.0 + ], + "min": [ + -1.1818181276321411, + -0.5, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 473952, + "componentType": 5126, + "count": 4, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 157968, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 172116, + "componentType": 5125, + "count": 6, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 474000, + "componentType": 5126, + "count": 4, + "max": [ + 1.1818181276321411, + 0.5, + 0.0 + ], + "min": [ + -1.1818181276321411, + -0.5, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 474048, + "componentType": 5126, + "count": 4, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 158000, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 172140, + "componentType": 5125, + "count": 6, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 474096, + "componentType": 5126, + "count": 4, + "max": [ + 1.1818181276321411, + 0.5, + 0.0 + ], + "min": [ + -1.1818181276321411, + -0.5, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 474144, + "componentType": 5126, + "count": 4, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 158032, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 172164, + "componentType": 5125, + "count": 6, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 474192, + "componentType": 5126, + "count": 2304, + "max": [ + 1.25, + 1.25, + 0.25 + ], + "min": [ + -1.25, + -1.25, + -0.25 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 501840, + "componentType": 5126, + "count": 2304, + "max": [ + 0.9639958739280701, + 0.9639962315559387, + 0.9657869935035706 + ], + "min": [ + -0.9639959931373596, + -0.9639962315559387, + -0.9657869935035706 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 158064, + "componentType": 5126, + "count": 2304, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 8.881784197001252e-16, + 2.220446049250313e-16 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 172188, + "componentType": 5125, + "count": 3456, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 529488, + "componentType": 5126, + "count": 2304, + "max": [ + 1.25, + 1.25, + 0.25 + ], + "min": [ + -1.25, + -1.25, + -0.25 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 557136, + "componentType": 5126, + "count": 2304, + "max": [ + 0.9639958739280701, + 0.9639962315559387, + 0.9657869935035706 + ], + "min": [ + -0.9639959931373596, + -0.9639962315559387, + -0.9657869935035706 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 176496, + "componentType": 5126, + "count": 2304, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 8.881784197001252e-16, + 2.220446049250313e-16 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 186012, + "componentType": 5125, + "count": 3456, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 584784, + "componentType": 5126, + "count": 4, + "max": [ + 1.1818181276321411, + 0.5, + 0.0 + ], + "min": [ + -1.1818181276321411, + -0.5, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 584832, + "componentType": 5126, + "count": 4, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 194928, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 199836, + "componentType": 5125, + "count": 6, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 584880, + "componentType": 5126, + "count": 1081, + "max": [ + 1.9690883159637451, + 0.9999999403953552, + 0.999999463558197 + ], + "min": [ + -1.0000038146972656, + -0.9999999403953552, + -1.00078547000885 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 597852, + "componentType": 5126, + "count": 1081, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -0.9994636178016663 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 194960, + "componentType": 5126, + "count": 1081, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 199860, + "componentType": 5125, + "count": 2481, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 610824, + "componentType": 5126, + "count": 1187, + "max": [ + 1.0000076293945313, + 0.9999999403953552, + 1.004091739654541 + ], + "min": [ + -1.9652149677276611, + -0.9999999403953552, + -0.9871142506599426 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 625068, + "componentType": 5126, + "count": 1187, + "max": [ + 1.0, + 1.0, + 0.9998801946640015 + ], + "min": [ + -1.0, + -1.0, + -0.9999997019767761 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 203608, + "componentType": 5126, + "count": 1187, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 209784, + "componentType": 5125, + "count": 2583, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 639312, + "componentType": 5126, + "count": 12, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 639456, + "componentType": 5126, + "count": 12, + "max": [ + 1.0, + 0.0, + 0.0 + ], + "min": [ + -1.0, + -1.0, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 213104, + "componentType": 5126, + "count": 12, + "max": [ + 1.0026731491088867, + 1.0014619827270508 + ], + "min": [ + -0.0026727914810180664, + -0.00042990222573280334 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 220116, + "componentType": 5125, + "count": 18, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 639600, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0, + -1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 639648, + "componentType": 5126, + "count": 4, + "max": [ + 0.0, + 0.0, + -1.0 + ], + "min": [ + 0.0, + 0.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 213200, + "componentType": 5126, + "count": 4, + "max": [ + 1.0044105052947998, + 1.0086796283721924 + ], + "min": [ + -0.0004421733319759369, + 0.003827174659818411 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 220188, + "componentType": 5125, + "count": 6, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 639696, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 639744, + "componentType": 5126, + "count": 4, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 213232, + "componentType": 5126, + "count": 4, + "max": [ + 1.0006370544433594, + 0.9972243309020996 + ], + "min": [ + 0.0025941054336726665, + -0.0008186604827642441 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 220212, + "componentType": 5125, + "count": 6, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 639792, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + 1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 639840, + "componentType": 5126, + "count": 4, + "max": [ + 0.0, + 1.0, + 0.0 + ], + "min": [ + 0.0, + 1.0, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 213264, + "componentType": 5126, + "count": 4, + "max": [ + 0.625, + 0.5 + ], + "min": [ + 0.375, + 0.25 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 220236, + "componentType": 5125, + "count": 6, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 639888, + "componentType": 5126, + "count": 192, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 642192, + "componentType": 5126, + "count": 192, + "max": [ + 0.9951847195625305, + 0.9951848387718201, + 1.0 + ], + "min": [ + -0.9951847195625305, + -0.9951848387718201, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 213296, + "componentType": 5126, + "count": 192, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.020052731037139893 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 220260, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 644496, + "componentType": 5126, + "count": 1944, + "max": [ + 3.8038816452026367, + 2.2615699768066406, + 1.0 + ], + "min": [ + -15.249255180358887, + -31.022493362426758, + -2.3976168632507324 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 667824, + "componentType": 5126, + "count": 1944, + "max": [ + 1.0, + 0.9951848387718201, + 1.0 + ], + "min": [ + -1.0, + -0.9951848387718201, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 214832, + "componentType": 5126, + "count": 1944, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 221748, + "componentType": 5125, + "count": 3756, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 691152, + "componentType": 5126, + "count": 189, + "max": [ + 0.4233589172363281, + 0.125, + 0.0 + ], + "min": [ + -0.6773743033409119, + -0.0625, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 693420, + "componentType": 5126, + "count": 189, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 230384, + "componentType": 5126, + "count": 189, + "max": [ + 0.8125, + 0.625 + ], + "min": [ + 0.0, + 0.4375 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 236772, + "componentType": 5125, + "count": 936, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 695688, + "componentType": 5126, + "count": 260, + "max": [ + 4.499000072479248, + 0.6910000443458557, + 0.0 + ], + "min": [ + 0.017000000923871994, + -0.009000000543892384, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 698808, + "componentType": 5126, + "count": 260, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 231896, + "componentType": 5126, + "count": 260, + "max": [ + 1.0, + 0.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 240516, + "componentType": 5125, + "count": 744, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 701928, + "componentType": 5126, + "count": 48, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 702504, + "componentType": 5126, + "count": 48, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 233976, + "componentType": 5126, + "count": 48, + "max": [ + 0.875, + 1.0 + ], + "min": [ + 0.125, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 243492, + "componentType": 5125, + "count": 84, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 703080, + "componentType": 5126, + "count": 4, + "max": [ + 0.5416666865348816, + 0.5, + 0.0 + ], + "min": [ + -0.5416666865348816, + -0.5, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 703128, + "componentType": 5126, + "count": 4, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 234360, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 243828, + "componentType": 5125, + "count": 6, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 703176, + "componentType": 5126, + "count": 4, + "max": [ + 0.6265139579772949, + 7.990339756011963, + -0.23152554035186768 + ], + "min": [ + 0.38540422916412354, + 7.990339756011963, + -0.3160744905471802 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 703224, + "componentType": 5126, + "count": 4, + "max": [ + 0.0, + 1.0, + -3.648844358394854e-05 + ], + "min": [ + 0.0, + 1.0, + -3.648844358394854e-05 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 234392, + "componentType": 5126, + "count": 4, + "max": [ + 0.6926187872886658, + 0.38096722960472107 + ], + "min": [ + 0.6225779056549072, + 0.34027791023254395 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 243852, + "componentType": 5125, + "count": 6, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 703272, + "componentType": 5126, + "count": 8, + "max": [ + 0.815601646900177, + 7.990339756011963, + -0.3034449517726898 + ], + "min": [ + 0.5267530679702759, + 7.990339756011963, + -0.7035747170448303 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 703368, + "componentType": 5126, + "count": 8, + "max": [ + 0.0, + 1.0, + 4.142609395785257e-05 + ], + "min": [ + 0.0, + 1.0, + 4.142609395785257e-05 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 234424, + "componentType": 5126, + "count": 8, + "max": [ + 0.7475705742835999, + 0.34632164239883423 + ], + "min": [ + 0.6636441946029663, + 0.15354350209236145 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 243876, + "componentType": 5125, + "count": 18, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 703464, + "componentType": 5126, + "count": 680, + "max": [ + 1.0000015497207642, + 0.9999999403953552, + 2.1500468254089355 + ], + "min": [ + -0.9999996423721313, + -1.0, + -0.9999997615814209 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 711624, + "componentType": 5126, + "count": 680, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 234488, + "componentType": 5126, + "count": 680, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 243948, + "componentType": 5125, + "count": 1326, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 719784, + "componentType": 5126, + "count": 26, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 720096, + "componentType": 5126, + "count": 26, + "max": [ + 1.0, + 1.0, + 0.0 + ], + "min": [ + -1.0, + -0.9999943971633911, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 239928, + "componentType": 5126, + "count": 26, + "max": [ + 0.625, + 0.75 + ], + "min": [ + 0.125, + 0.008432947099208832 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 249252, + "componentType": 5125, + "count": 42, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 720408, + "componentType": 5126, + "count": 192, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 722712, + "componentType": 5126, + "count": 192, + "max": [ + 0.9951847195625305, + 0.9951848387718201, + 1.0 + ], + "min": [ + -0.9951847195625305, + -0.9951848387718201, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 240136, + "componentType": 5126, + "count": 192, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.01000000536441803 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 249420, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 725016, + "componentType": 5126, + "count": 192, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 727320, + "componentType": 5126, + "count": 192, + "max": [ + 0.9951847195625305, + 0.9951848387718201, + 1.0 + ], + "min": [ + -0.9951847195625305, + -0.9951848387718201, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 241672, + "componentType": 5126, + "count": 192, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.01000000536441803 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 250908, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 729624, + "componentType": 5126, + "count": 192, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 731928, + "componentType": 5126, + "count": 192, + "max": [ + 0.9951847195625305, + 0.9951848387718201, + 1.0 + ], + "min": [ + -0.9951847195625305, + -0.9951848387718201, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 243208, + "componentType": 5126, + "count": 192, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.01000000536441803 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 252396, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 734232, + "componentType": 5126, + "count": 312, + "max": [ + 1.0, + 1.0, + 0.01519803050905466 + ], + "min": [ + -1.0, + -1.0, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 737976, + "componentType": 5126, + "count": 312, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 244744, + "componentType": 5126, + "count": 312, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 253884, + "componentType": 5125, + "count": 612, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 741720, + "componentType": 5126, + "count": 538, + "max": [ + 6.535999774932861, + 0.6910000443458557, + 0.0 + ], + "min": [ + 0.05000000074505806, + -0.009000000543892384, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 748176, + "componentType": 5126, + "count": 538, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 247240, + "componentType": 5126, + "count": 538, + "max": [ + 1.0, + 0.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 256332, + "componentType": 5125, + "count": 1566, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 754632, + "componentType": 5126, + "count": 13, + "max": [ + 1.0, + -0.9932630062103271, + 1.0000039339065552 + ], + "min": [ + -1.0000001192092896, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 754788, + "componentType": 5126, + "count": 13, + "max": [ + 0.0, + -0.9950510263442993, + 5.819432402631719e-08 + ], + "min": [ + -0.0993652418255806, + -1.0, + -6.562207488514105e-08 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 251544, + "componentType": 5126, + "count": 13, + "max": [ + 0.9986333847045898, + 1.0311108827590942 + ], + "min": [ + -0.00327159371227026, + -0.01630556583404541 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 262596, + "componentType": 5125, + "count": 21, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 754944, + "componentType": 5126, + "count": 9, + "max": [ + 1.0000001192092896, + 1.0000001192092896, + 1.0000039339065552 + ], + "min": [ + -1.0000001192092896, + -1.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 755052, + "componentType": 5126, + "count": 9, + "max": [ + 2.074474195978837e-06, + 0.0, + 1.0 + ], + "min": [ + 6.654953033091715e-09, + -0.0005635370034724474, + 0.9999999403953552 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 251648, + "componentType": 5126, + "count": 9, + "max": [ + 0.625, + 0.9915670156478882 + ], + "min": [ + 0.6249999403953552, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 262680, + "componentType": 5125, + "count": 15, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 755160, + "componentType": 5126, + "count": 194, + "max": [ + -0.22562137246131897, + -0.9382895231246948, + 1.0 + ], + "min": [ + -0.866258978843689, + -1.167701005935669, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 757488, + "componentType": 5126, + "count": 194, + "max": [ + 0.9927478432655334, + 0.0, + 1.0 + ], + "min": [ + -0.992747962474823, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 251720, + "componentType": 5126, + "count": 194, + "max": [ + 0.859375, + 0.984375 + ], + "min": [ + 0.140625, + 0.75 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 262740, + "componentType": 5125, + "count": 732, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 759816, + "componentType": 5126, + "count": 60, + "max": [ + 0.9999980926513672, + 1.0, + 1.0 + ], + "min": [ + -1.0000019073486328, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 760536, + "componentType": 5126, + "count": 60, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 253272, + "componentType": 5126, + "count": 60, + "max": [ + 1.0023247003555298, + 1.0046660900115967 + ], + "min": [ + -0.003598049283027649, + -0.0012564584612846375 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 265668, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 761256, + "componentType": 5126, + "count": 4, + "max": [ + 2.7037036418914795, + 0.5, + 0.0 + ], + "min": [ + -2.7037036418914795, + -0.5, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 761304, + "componentType": 5126, + "count": 4, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 253752, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 266100, + "componentType": 5125, + "count": 6, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 761352, + "componentType": 5126, + "count": 4, + "max": [ + 0.1799444556236267, + -1.0, + 0.5355843305587769 + ], + "min": [ + -0.8836045861244202, + -1.0, + -0.9999997615814209 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 761400, + "componentType": 5126, + "count": 4, + "max": [ + 0.0, + -1.0, + -5.083506238179325e-08 + ], + "min": [ + 0.0, + -1.0, + -5.083506238179325e-08 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 253784, + "componentType": 5126, + "count": 4, + "max": [ + 0.5626317858695984, + 0.9854505658149719 + ], + "min": [ + 0.375, + 0.8525070548057556 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 266124, + "componentType": 5125, + "count": 6, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 761448, + "componentType": 5126, + "count": 24, + "max": [ + 0.07102882117033005, + 25.470916748046875, + -0.1949344128370285 + ], + "min": [ + -0.6432182192802429, + 11.928181648254395, + -0.21538281440734863 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 761736, + "componentType": 5126, + "count": 24, + "max": [ + 0.006363861728459597, + 0.0, + 0.9999958872795105 + ], + "min": [ + -0.9998001456260681, + 0.0, + -0.999982476234436 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 253816, + "componentType": 5126, + "count": 24, + "max": [ + 0.5313082933425903, + 0.3981918692588806 + ], + "min": [ + 0.32386016845703125, + 0.38820135593414307 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 266148, + "componentType": 5125, + "count": 36, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 762024, + "componentType": 5126, + "count": 765, + "max": [ + 0.7500004172325134, + 0.5835747718811035, + 0.30232858657836914 + ], + "min": [ + -1.2928948402404785, + -0.5835744142532349, + -0.4276741147041321 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 771204, + "componentType": 5126, + "count": 765, + "max": [ + 0.9747105836868286, + 0.9999939799308777, + 0.018605202436447144 + ], + "min": [ + -0.3604883849620819, + -0.9999939799308777, + -0.18716132640838623 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 254008, + "componentType": 5126, + "count": 765, + "max": [ + 0.6499660015106201, + 0.9854938387870789 + ], + "min": [ + 0.2914024591445923, + 0.009060414507985115 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 266292, + "componentType": 5125, + "count": 1749, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 780384, + "componentType": 5126, + "count": 613, + "max": [ + 0.8932732939720154, + 0.5172706842422485, + 0.23621487617492676 + ], + "min": [ + -1.106452465057373, + -0.5168939828872681, + -0.688133955001831 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 787740, + "componentType": 5126, + "count": 613, + "max": [ + 0.999932050704956, + 0.9057161808013916, + 0.9999951124191284 + ], + "min": [ + -0.9105597734451294, + -0.9052091836929321, + -0.14044713973999023 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 260128, + "componentType": 5126, + "count": 613, + "max": [ + 0.375, + 0.7506334185600281 + ], + "min": [ + 0.1249999925494194, + 0.4957195520401001 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 273288, + "componentType": 5125, + "count": 2835, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 795096, + "componentType": 5126, + "count": 1493, + "max": [ + 0.9630271792411804, + 0.556882917881012, + 0.18661321699619293 + ], + "min": [ + -0.39268001914024353, + -0.5569188594818115, + -0.8559430837631226 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 813012, + "componentType": 5126, + "count": 1493, + "max": [ + 0.40309983491897583, + 0.9057161808013916, + 0.9984613060951233 + ], + "min": [ + -0.910571277141571, + -0.9052091836929321, + 0.0592365525662899 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 265032, + "componentType": 5126, + "count": 1493, + "max": [ + 0.6605663895606995, + 0.6694607734680176 + ], + "min": [ + 0.3538597524166107, + 0.018428992480039597 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 284628, + "componentType": 5125, + "count": 4824, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 830928, + "componentType": 5126, + "count": 672, + "max": [ + -0.3396807312965393, + 0.5835744738578796, + 0.020233383402228355 + ], + "min": [ + -1.283933401107788, + -0.583574116230011, + -0.787056028842926 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 838992, + "componentType": 5126, + "count": 672, + "max": [ + 0.9925616383552551, + 0.8442164659500122, + 0.896517276763916 + ], + "min": [ + 0.1980707049369812, + -0.8451879620552063, + -0.14109082520008087 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 276976, + "componentType": 5126, + "count": 672, + "max": [ + 0.6619391441345215, + 0.9856670498847961 + ], + "min": [ + 0.3504842519760132, + 0.6516615152359009 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 303924, + "componentType": 5125, + "count": 2298, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 847056, + "componentType": 5126, + "count": 316, + "max": [ + -0.08425244688987732, + 0.5835747718811035, + 0.06442265957593918 + ], + "min": [ + -1.287115454673767, + -0.5835744142532349, + -0.7428668141365051 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 850848, + "componentType": 5126, + "count": 316, + "max": [ + 0.9999234676361084, + 0.8442509174346924, + 0.9873595833778381 + ], + "min": [ + 0.13590386509895325, + -0.9493451714515686, + -0.8693883419036865 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 282352, + "componentType": 5126, + "count": 316, + "max": [ + 0.2112555056810379, + 0.7506334185600281 + ], + "min": [ + 0.1249999925494194, + 0.4957195520401001 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 313116, + "componentType": 5125, + "count": 1386, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 854640, + "componentType": 5126, + "count": 130, + "max": [ + 0.942038893699646, + 0.5835747718811035, + 0.30232861638069153 + ], + "min": [ + -1.2387189865112305, + -0.5835744142532349, + 0.19289426505565643 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 856200, + "componentType": 5126, + "count": 130, + "max": [ + 0.0, + 0.6563863158226013, + -0.280200332403183 + ], + "min": [ + -0.9401999711990356, + -0.6825094819068909, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 284880, + "componentType": 5126, + "count": 130, + "max": [ + 0.3750000298023224, + 0.75 + ], + "min": [ + 0.125, + 0.4999999701976776 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 318660, + "componentType": 5125, + "count": 555, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 857760, + "componentType": 5126, + "count": 22, + "max": [ + 0.9630256295204163, + 0.4448215365409851, + 0.2138887345790863 + ], + "min": [ + 0.7368961572647095, + -0.43528974056243896, + 0.148872509598732 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 858024, + "componentType": 5126, + "count": 22, + "max": [ + -0.7164390087127686, + 0.6076161861419678, + -0.2859330475330353 + ], + "min": [ + -0.9401999711990356, + -0.6336402893066406, + -0.34062299132347107 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 285920, + "componentType": 5126, + "count": 22, + "max": [ + 0.9955021739006042, + 0.6052792072296143 + ], + "min": [ + 0.003247726708650589, + 0.11837545037269592 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 320880, + "componentType": 5125, + "count": 60, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 858288, + "componentType": 5126, + "count": 56, + "max": [ + 0.3541949391365051, + 0.11067457497119904, + 0.20713447034358978 + ], + "min": [ + -0.2008773386478424, + -0.12714293599128723, + -0.6662250757217407 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 858960, + "componentType": 5126, + "count": 56, + "max": [ + 0.9873329997062683, + 0.5114418864250183, + 0.9667909145355225 + ], + "min": [ + -0.9660261869430542, + -0.9983704090118408, + -0.24467438459396362 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 286096, + "componentType": 5126, + "count": 56, + "max": [ + 0.16031114757061005, + 0.6482478380203247 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 321120, + "componentType": 5125, + "count": 177, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 859632, + "componentType": 5126, + "count": 1794, + "max": [ + 1.0, + 1.0, + 1.8303378820419312 + ], + "min": [ + -1.0, + -0.708895206451416, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 881160, + "componentType": 5126, + "count": 1794, + "max": [ + 0.9997317790985107, + 0.9997317790985107, + 0.9997211694717407 + ], + "min": [ + -0.9997317790985107, + -0.9999548196792603, + -0.9997211694717407 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 286544, + "componentType": 5126, + "count": 1794, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.06371808797121048 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 321828, + "componentType": 5125, + "count": 6900, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 902688, + "componentType": 5126, + "count": 1794, + "max": [ + 1.0, + 1.0, + 1.8303378820419312 + ], + "min": [ + -1.0, + -0.7166607975959778, + -1.000000238418579 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 924216, + "componentType": 5126, + "count": 1794, + "max": [ + 0.9997317790985107, + 0.9997317790985107, + 0.9997026920318604 + ], + "min": [ + -0.9997317790985107, + -0.9999228715896606, + -0.9997026920318604 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 300896, + "componentType": 5126, + "count": 1794, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.06371808797121048 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 349428, + "componentType": 5125, + "count": 6900, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 945744, + "componentType": 5126, + "count": 1794, + "max": [ + 1.0, + 1.0, + 1.8303378820419312 + ], + "min": [ + -1.0, + -0.6901942491531372, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 967272, + "componentType": 5126, + "count": 1794, + "max": [ + 0.9997317790985107, + 0.9997317790985107, + 0.9997026920318604 + ], + "min": [ + -0.9997317790985107, + -0.999984622001648, + -0.9997026920318604 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 315248, + "componentType": 5126, + "count": 1794, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.06371808797121048 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 377028, + "componentType": 5125, + "count": 6900, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 988800, + "componentType": 5126, + "count": 338, + "max": [ + 0.8602254390716553, + 0.29808494448661804, + 0.22957493364810944 + ], + "min": [ + -1.0317869186401367, + -0.24712565541267395, + -0.035229362547397614 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 992856, + "componentType": 5126, + "count": 338, + "max": [ + 0.9866731762886047, + 0.9938561320304871, + 0.9956363439559937 + ], + "min": [ + -0.98597651720047, + -0.994462788105011, + -0.996464729309082 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 329600, + "componentType": 5126, + "count": 338, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 404628, + "componentType": 5125, + "count": 1728, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 996912, + "componentType": 5126, + "count": 48, + "max": [ + 1.0, + 1.000003695487976, + 1.0000038146972656 + ], + "min": [ + -3.7604222297668457, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 997488, + "componentType": 5126, + "count": 48, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 332304, + "componentType": 5126, + "count": 48, + "max": [ + 0.875, + 1.0 + ], + "min": [ + 0.125, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 411540, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 998064, + "componentType": 5126, + "count": 24, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 998352, + "componentType": 5126, + "count": 24, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 332688, + "componentType": 5126, + "count": 24, + "max": [ + 1.0019397735595703, + 1.0192652940750122 + ], + "min": [ + -0.0044936141930520535, + -0.022072911262512207 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 411828, + "componentType": 5125, + "count": 36, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 998640, + "componentType": 5126, + "count": 676, + "max": [ + 0.9330673813819885, + 0.5430426597595215, + 0.36170703172683716 + ], + "min": [ + -1.0667188167572021, + -0.040825046598911285, + 0.08442676067352295 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1006752, + "componentType": 5126, + "count": 676, + "max": [ + 0.8205440044403076, + 0.9991153478622437, + 0.9999567270278931 + ], + "min": [ + -0.8197392821311951, + -0.9990891218185425, + -0.9999803304672241 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 332880, + "componentType": 5126, + "count": 676, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 411972, + "componentType": 5125, + "count": 3456, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1014864, + "componentType": 5126, + "count": 24, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1015152, + "componentType": 5126, + "count": 24, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 338288, + "componentType": 5126, + "count": 24, + "max": [ + 0.875, + 1.0 + ], + "min": [ + 0.125, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 425796, + "componentType": 5125, + "count": 36, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1015440, + "componentType": 5126, + "count": 24, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1015728, + "componentType": 5126, + "count": 24, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 338480, + "componentType": 5126, + "count": 24, + "max": [ + 0.875, + 1.0 + ], + "min": [ + 0.125, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 425940, + "componentType": 5125, + "count": 36, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1016016, + "componentType": 5126, + "count": 169, + "max": [ + 1.4072322845458984, + 0.5186142921447754, + 0.019999999552965164 + ], + "min": [ + -1.0141421556472778, + -0.01414213702082634, + -0.22174862027168274 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1018044, + "componentType": 5126, + "count": 169, + "max": [ + 0.6527398824691772, + 0.9978617429733276, + 0.9996510744094849 + ], + "min": [ + -0.6526751518249512, + -0.9981852769851685, + -0.9996883869171143 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 338672, + "componentType": 5126, + "count": 169, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 426084, + "componentType": 5125, + "count": 864, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1020072, + "componentType": 5126, + "count": 24, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1020360, + "componentType": 5126, + "count": 24, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 340024, + "componentType": 5126, + "count": 24, + "max": [ + 0.875, + 1.0 + ], + "min": [ + 0.125, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 429540, + "componentType": 5125, + "count": 36, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1020648, + "componentType": 5126, + "count": 24, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1020936, + "componentType": 5126, + "count": 24, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 340216, + "componentType": 5126, + "count": 24, + "max": [ + 0.875, + 1.0 + ], + "min": [ + 0.125, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 429684, + "componentType": 5125, + "count": 36, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1021224, + "componentType": 5126, + "count": 637, + "max": [ + 4.994805335998535, + 0.5653908252716064, + 2.330575704574585 + ], + "min": [ + -1.021213173866272, + -4.445122718811035, + -0.030000004917383194 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1028868, + "componentType": 5126, + "count": 637, + "max": [ + 0.9691521525382996, + 0.9995149374008179, + 0.9999568462371826 + ], + "min": [ + -0.9723397493362427, + -0.9994716644287109, + -0.9999533891677856 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 340408, + "componentType": 5126, + "count": 637, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 429828, + "componentType": 5125, + "count": 3456, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1036512, + "componentType": 5126, + "count": 408, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1041408, + "componentType": 5126, + "count": 408, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 345504, + "componentType": 5126, + "count": 408, + "max": [ + 0.875, + 1.0 + ], + "min": [ + 0.125, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 443652, + "componentType": 5125, + "count": 804, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1046304, + "componentType": 5126, + "count": 24, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1046592, + "componentType": 5126, + "count": 24, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 348768, + "componentType": 5126, + "count": 24, + "max": [ + 0.875, + 1.0 + ], + "min": [ + 0.125, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 446868, + "componentType": 5125, + "count": 36, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1046880, + "componentType": 5126, + "count": 4, + "max": [ + 0.5882353186607361, + 0.5, + 0.0 + ], + "min": [ + -0.5882353186607361, + -0.5, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1046928, + "componentType": 5126, + "count": 4, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 348960, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 447012, + "componentType": 5125, + "count": 6, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1046976, + "componentType": 5126, + "count": 136, + "max": [ + 0.7500003576278687, + 0.5212170481681824, + 0.30232852697372437 + ], + "min": [ + -0.8974584937095642, + -0.521062970161438, + -0.42767417430877686 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1048608, + "componentType": 5126, + "count": 136, + "max": [ + -0.003111110767349601, + 0.9999951720237732, + 0.014688699506223202 + ], + "min": [ + -0.3005092144012451, + -0.999995231628418, + -0.044516440480947495 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 348992, + "componentType": 5126, + "count": 136, + "max": [ + 0.6499660015106201, + 0.9854938387870789 + ], + "min": [ + 0.2933575510978699, + 0.14725497364997864 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 447036, + "componentType": 5125, + "count": 204, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1050240, + "componentType": 5126, + "count": 192, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1052544, + "componentType": 5126, + "count": 192, + "max": [ + 0.9951847195625305, + 0.9951848387718201, + 1.0 + ], + "min": [ + -0.9951847195625305, + -0.9951848387718201, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 350080, + "componentType": 5126, + "count": 192, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.01000000536441803 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 447852, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1054848, + "componentType": 5126, + "count": 192, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1057152, + "componentType": 5126, + "count": 192, + "max": [ + 0.9951847195625305, + 0.9951848387718201, + 1.0 + ], + "min": [ + -0.9951847195625305, + -0.9951848387718201, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 351616, + "componentType": 5126, + "count": 192, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.01000000536441803 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 449340, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1059456, + "componentType": 5126, + "count": 192, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1061760, + "componentType": 5126, + "count": 192, + "max": [ + 0.9951847195625305, + 0.9951848387718201, + 1.0 + ], + "min": [ + -0.9951847195625305, + -0.9951848387718201, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 353152, + "componentType": 5126, + "count": 192, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.01000000536441803 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 450828, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1064064, + "componentType": 5126, + "count": 518, + "max": [ + 9.387999534606934, + 0.6910000443458557, + 0.0 + ], + "min": [ + 0.017000000923871994, + -0.009000000543892384, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1070280, + "componentType": 5126, + "count": 518, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 354688, + "componentType": 5126, + "count": 518, + "max": [ + 1.0, + 0.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 452316, + "componentType": 5125, + "count": 1470, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1076496, + "componentType": 5126, + "count": 816, + "max": [ + 2.9935412406921387, + 1.000001072883606, + 1.018251657485962 + ], + "min": [ + -1.0, + -1.000001072883606, + -1.1436574459075928 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1086288, + "componentType": 5126, + "count": 816, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 358832, + "componentType": 5126, + "count": 816, + "max": [ + 0.875, + 1.0 + ], + "min": [ + 0.125, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 458196, + "componentType": 5125, + "count": 1608, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1096080, + "componentType": 5126, + "count": 637, + "max": [ + 1.0, + 4.07976770401001, + 2.33182954788208 + ], + "min": [ + -3.1211745738983154, + -0.21817150712013245, + -0.054298970848321915 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1103724, + "componentType": 5126, + "count": 637, + "max": [ + 0.9998122453689575, + 0.9998880624771118, + 0.99811190366745 + ], + "min": [ + -0.9999591112136841, + -0.9997093677520752, + -0.9983429908752441 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 365360, + "componentType": 5126, + "count": 637, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 464628, + "componentType": 5125, + "count": 3456, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1111368, + "componentType": 5126, + "count": 24, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1111656, + "componentType": 5126, + "count": 24, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 370456, + "componentType": 5126, + "count": 24, + "max": [ + 0.875, + 1.0 + ], + "min": [ + 0.125, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 478452, + "componentType": 5125, + "count": 36, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1111944, + "componentType": 5126, + "count": 24, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1112232, + "componentType": 5126, + "count": 24, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 370648, + "componentType": 5126, + "count": 24, + "max": [ + 0.875, + 1.0 + ], + "min": [ + 0.125, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 478596, + "componentType": 5125, + "count": 36, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1112520, + "componentType": 5126, + "count": 24, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1112808, + "componentType": 5126, + "count": 24, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 370840, + "componentType": 5126, + "count": 24, + "max": [ + 0.875, + 1.0 + ], + "min": [ + 0.125, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 478740, + "componentType": 5125, + "count": 36, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1113096, + "componentType": 5126, + "count": 192, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -0.999997615814209 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1115400, + "componentType": 5126, + "count": 192, + "max": [ + 0.9897641539573669, + 0.9897640347480774, + 1.0 + ], + "min": [ + -0.9897638559341431, + -0.9897640347480774, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 371032, + "componentType": 5126, + "count": 192, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.01000000536441803 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 478884, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1117704, + "componentType": 5126, + "count": 2013, + "max": [ + 10.231720924377441, + 1.190000057220459, + 0.18070080876350403 + ], + "min": [ + -1.190000057220459, + -1.190000057220459, + -0.18070080876350403 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1141860, + "componentType": 5126, + "count": 2013, + "max": [ + 1.0, + 1.0, + 0.9541423916816711 + ], + "min": [ + -1.0, + -1.0, + -0.9541423916816711 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 372568, + "componentType": 5126, + "count": 2013, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 480372, + "componentType": 5125, + "count": 10800, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1166016, + "componentType": 5126, + "count": 949, + "max": [ + 7.893752574920654, + 4.911913871765137, + 2.367626428604126 + ], + "min": [ + -2.0634264945983887, + -0.1211291030049324, + -0.010644054040312767 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1177404, + "componentType": 5126, + "count": 949, + "max": [ + 0.9987199902534485, + 0.9999173879623413, + 0.9999998807907104 + ], + "min": [ + -0.9987598061561584, + -0.9999157190322876, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 388672, + "componentType": 5126, + "count": 949, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 523572, + "componentType": 5125, + "count": 5184, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1188792, + "componentType": 5126, + "count": 949, + "max": [ + 10.17917537689209, + 1.4507988691329956, + 2.491024971008301 + ], + "min": [ + -1.0149974822998047, + -0.1132107600569725, + -0.014966634102165699 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1200180, + "componentType": 5126, + "count": 949, + "max": [ + 0.9963359832763672, + 0.9977752566337585, + 0.9997072219848633 + ], + "min": [ + -0.9956904649734497, + -0.9977903366088867, + -0.9997614622116089 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 396264, + "componentType": 5126, + "count": 949, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 544308, + "componentType": 5125, + "count": 5184, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1211568, + "componentType": 5126, + "count": 949, + "max": [ + 10.166754722595215, + 1.4486969709396362, + 2.244112253189087 + ], + "min": [ + -1.0149974822998047, + -0.1132107600569725, + -0.014966634102165699 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1222956, + "componentType": 5126, + "count": 949, + "max": [ + 0.9962525367736816, + 0.9977681636810303, + 0.9997072219848633 + ], + "min": [ + -0.9946333765983582, + -0.9977903366088867, + -0.9997614622116089 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 403856, + "componentType": 5126, + "count": 949, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 565044, + "componentType": 5125, + "count": 5184, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1234344, + "componentType": 5126, + "count": 481, + "max": [ + 6.464488506317139, + 1.3787211179733276, + 0.01499739196151495 + ], + "min": [ + -1.0323694944381714, + -0.1946261078119278, + -0.14294561743736267 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1240116, + "componentType": 5126, + "count": 481, + "max": [ + 0.9965086579322815, + 0.999524712562561, + 0.9999058246612549 + ], + "min": [ + -0.996527910232544, + -0.9995371103286743, + -0.9998533725738525 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 411448, + "componentType": 5126, + "count": 481, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 585780, + "componentType": 5125, + "count": 2592, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1245888, + "componentType": 5126, + "count": 54, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1246536, + "componentType": 5126, + "count": 54, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 415296, + "componentType": 5126, + "count": 54, + "max": [ + 0.8750000596046448, + 1.0 + ], + "min": [ + 0.125, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 596148, + "componentType": 5125, + "count": 84, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1247184, + "componentType": 5126, + "count": 1039, + "max": [ + 1.0000001192092896, + 0.9999982118606567, + 1.0 + ], + "min": [ + -1.0000001192092896, + -1.000002145767212, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1259652, + "componentType": 5126, + "count": 1039, + "max": [ + 0.9999985098838806, + 1.0, + 1.0 + ], + "min": [ + -0.9999997019767761, + -0.9838612675666809, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 415728, + "componentType": 5126, + "count": 1039, + "max": [ + 0.875, + 1.0 + ], + "min": [ + 0.13124655187129974, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 596484, + "componentType": 5125, + "count": 1485, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1272120, + "componentType": 5126, + "count": 140, + "max": [ + 0.17399999499320984, + 0.5, + 0.0 + ], + "min": [ + -0.17399999499320984, + -0.5, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1273800, + "componentType": 5126, + "count": 140, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 424040, + "componentType": 5126, + "count": 140, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 602424, + "componentType": 5125, + "count": 414, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1275480, + "componentType": 5126, + "count": 512, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1281624, + "componentType": 5126, + "count": 512, + "max": [ + 0.9999985098838806, + 1.0, + 1.0 + ], + "min": [ + -0.9999974966049194, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 425160, + "componentType": 5126, + "count": 512, + "max": [ + 0.875, + 1.0 + ], + "min": [ + 0.125, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 604080, + "componentType": 5125, + "count": 1512, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1287768, + "componentType": 5126, + "count": 4, + "max": [ + 0.23312883079051971, + 0.5, + 0.0 + ], + "min": [ + -0.23312883079051971, + -0.5, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1287816, + "componentType": 5126, + "count": 4, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 429256, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 610128, + "componentType": 5125, + "count": 6, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1287864, + "componentType": 5126, + "count": 4, + "max": [ + 0.9528301954269409, + 0.5, + 0.0 + ], + "min": [ + -0.9528301954269409, + -0.5, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1287912, + "componentType": 5126, + "count": 4, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 429288, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 610152, + "componentType": 5125, + "count": 6, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1287960, + "componentType": 5126, + "count": 4, + "max": [ + 1.924242377281189, + 0.5, + 0.0 + ], + "min": [ + -1.924242377281189, + -0.5, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1288008, + "componentType": 5126, + "count": 4, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 429320, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 610176, + "componentType": 5125, + "count": 6, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1288056, + "componentType": 5126, + "count": 4, + "max": [ + 1.924242377281189, + 0.5, + 0.0 + ], + "min": [ + -1.924242377281189, + -0.5, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1288104, + "componentType": 5126, + "count": 4, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 429352, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 610200, + "componentType": 5125, + "count": 6, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1288152, + "componentType": 5126, + "count": 24, + "max": [ + 0.6847941279411316, + 1.0, + 1.0 + ], + "min": [ + -0.6627016663551331, + -1.0, + 0.159446120262146 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1288440, + "componentType": 5126, + "count": 24, + "max": [ + 0.965925931930542, + 1.0, + 1.0 + ], + "min": [ + -0.965925931930542, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 429384, + "componentType": 5126, + "count": 24, + "max": [ + 0.8258004188537598, + 0.957837700843811 + ], + "min": [ + 0.5199307799339294, + 0.29216229915618896 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 610224, + "componentType": 5125, + "count": 36, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1288728, + "componentType": 5126, + "count": 24, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1289016, + "componentType": 5126, + "count": 24, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 429576, + "componentType": 5126, + "count": 24, + "max": [ + 0.875, + 1.0 + ], + "min": [ + 0.125, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 610368, + "componentType": 5125, + "count": 36, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1289304, + "componentType": 5126, + "count": 28, + "max": [ + 0.9999999403953552, + 0.9999999403953552, + 0.9381787180900574 + ], + "min": [ + -0.9999999403953552, + -0.9999999403953552, + 0.18434110283851624 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1289640, + "componentType": 5126, + "count": 28, + "max": [ + 1.0, + 1.0, + 0.9999539852142334 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 429768, + "componentType": 5126, + "count": 28, + "max": [ + 0.8229703903198242, + 1.0 + ], + "min": [ + 0.2515289783477783, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 610512, + "componentType": 5125, + "count": 36, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1289976, + "componentType": 5126, + "count": 1317, + "max": [ + 0.9520146250724792, + 1.0, + 0.9999926090240479 + ], + "min": [ + -0.8265893459320068, + -1.0, + -1.0000078678131104 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1305780, + "componentType": 5126, + "count": 1317, + "max": [ + 0.9956441521644592, + 1.0, + 1.0 + ], + "min": [ + -0.9969434142112732, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 429992, + "componentType": 5126, + "count": 1317, + "max": [ + 0.8533236384391785, + 0.9783236980438232 + ], + "min": [ + 0.14667633175849915, + 0.2912680506706238 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 610656, + "componentType": 5125, + "count": 1692, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1321584, + "componentType": 5126, + "count": 26, + "max": [ + 1.000000238418579, + 1.0, + 1.0000001192092896 + ], + "min": [ + -0.9999997615814209, + -0.7173241376876831, + -1.0000001192092896 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1321896, + "componentType": 5126, + "count": 26, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -0.9888969659805298, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 440528, + "componentType": 5126, + "count": 26, + "max": [ + 0.875, + 0.7146654725074768 + ], + "min": [ + 0.125, + 0.03533446788787842 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 617424, + "componentType": 5125, + "count": 36, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1322208, + "componentType": 5126, + "count": 30, + "max": [ + 1.000000238418579, + 1.0, + 1.0000001192092896 + ], + "min": [ + -1.000000238418579, + -0.6962063312530518, + -1.0000001192092896 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1322568, + "componentType": 5126, + "count": 30, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -0.9910451173782349, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 440736, + "componentType": 5126, + "count": 30, + "max": [ + 0.875, + 0.7120258212089539 + ], + "min": [ + 0.125, + 0.07165783643722534 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 617568, + "componentType": 5125, + "count": 36, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1322928, + "componentType": 5126, + "count": 26, + "max": [ + 1.000000238418579, + 1.0, + 1.0000001192092896 + ], + "min": [ + -0.9999997615814209, + -0.7173241376876831, + -1.0000001192092896 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1323240, + "componentType": 5126, + "count": 26, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -0.9888969659805298, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 440976, + "componentType": 5126, + "count": 26, + "max": [ + 0.875, + 0.7146654725074768 + ], + "min": [ + 0.125, + 0.03533446788787842 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 617712, + "componentType": 5125, + "count": 36, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1323552, + "componentType": 5126, + "count": 138, + "max": [ + 2.2151129245758057, + 0.07467889785766602, + 0.6463348865509033 + ], + "min": [ + -2.2151129245758057, + -0.040715232491493225, + -0.643446683883667 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1325208, + "componentType": 5126, + "count": 138, + "max": [ + 0.9982470870018005, + 0.9964706897735596, + 0.9976335167884827 + ], + "min": [ + -0.9982462525367737, + -0.08511664718389511, + -0.9901845455169678 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 441184, + "componentType": 5126, + "count": 138, + "max": [ + 1.0130114555358887, + 0.7145282626152039 + ], + "min": [ + 0.09456038475036621, + 0.04113316535949707 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 442288, + "componentType": 5126, + "count": 138, + "max": [ + 0.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 443392, + "componentType": 5126, + "count": 138, + "max": [ + 0.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 617856, + "componentType": 5125, + "count": 600, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1326864, + "componentType": 5126, + "count": 90, + "max": [ + 2.2255301475524902, + 0.023431098088622093, + 0.6489425301551819 + ], + "min": [ + -2.2255301475524902, + -0.09325980395078659, + -0.6553332805633545 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1327944, + "componentType": 5126, + "count": 90, + "max": [ + 2.5111039576586336e-06, + -0.9960199594497681, + -0.08908609300851822 + ], + "min": [ + -2.511364755264367e-06, + -0.9960240125656128, + -0.08913079649209976 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 444496, + "componentType": 5126, + "count": 90, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 445216, + "componentType": 5126, + "count": 90, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 445936, + "componentType": 5126, + "count": 90, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 620256, + "componentType": 5125, + "count": 90, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1329024, + "componentType": 5126, + "count": 90, + "max": [ + 2.1504416465759277, + 0.08092901855707169, + 0.594927966594696 + ], + "min": [ + -2.1504416465759277, + -0.0022561463993042707, + -0.5882722735404968 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1330104, + "componentType": 5126, + "count": 90, + "max": [ + 3.578551513783168e-06, + 0.9975391030311584, + 0.07013937085866928 + ], + "min": [ + -3.6271821954869665e-06, + 0.9975371956825256, + 0.07011318951845169 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 446656, + "componentType": 5126, + "count": 90, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 447376, + "componentType": 5126, + "count": 90, + "max": [ + 0.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 448096, + "componentType": 5126, + "count": 90, + "max": [ + 0.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 620616, + "componentType": 5125, + "count": 90, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1331184, + "componentType": 5126, + "count": 4, + "max": [ + 1.8361645936965942, + 0.10734420269727707, + 0.5494362115859985 + ], + "min": [ + 1.6822326183319092, + -0.022430216893553734, + 0.33772993087768555 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1331232, + "componentType": 5126, + "count": 4, + "max": [ + -0.6204966306686401, + 0.7836227416992188, + 0.030323227867484093 + ], + "min": [ + -0.620853841304779, + 0.7833565473556519, + 0.02988385036587715 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 448816, + "componentType": 5126, + "count": 4, + "max": [ + 0.625, + 0.25 + ], + "min": [ + 0.375, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 448848, + "componentType": 5126, + "count": 4, + "max": [ + 0.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 448880, + "componentType": 5126, + "count": 4, + "max": [ + 0.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 620976, + "componentType": 5125, + "count": 6, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1331280, + "componentType": 5126, + "count": 4, + "max": [ + 1.8998640775680542, + 0.10692071169614792, + 0.5494362115859985 + ], + "min": [ + 1.7459319829940796, + -0.022853707894682884, + 0.33772993087768555 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1331328, + "componentType": 5126, + "count": 4, + "max": [ + 0.6207324266433716, + -0.7834422588348389, + -0.030082253739237785 + ], + "min": [ + 0.6206658482551575, + -0.7834979891777039, + -0.030157551169395447 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 448912, + "componentType": 5126, + "count": 4, + "max": [ + 0.625, + 0.75 + ], + "min": [ + 0.375, + 0.5 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 448944, + "componentType": 5126, + "count": 4, + "max": [ + 0.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 448976, + "componentType": 5126, + "count": 4, + "max": [ + 0.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 621000, + "componentType": 5125, + "count": 6, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1331376, + "componentType": 5126, + "count": 6, + "max": [ + 1.8998641967773438, + 0.10521435737609863, + 0.5494362115859985 + ], + "min": [ + 1.6822327375411987, + -0.022853707894682884, + 0.5454305410385132 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1331448, + "componentType": 5126, + "count": 6, + "max": [ + 0.0, + -0.03126237541437149, + 0.9995112419128418 + ], + "min": [ + 0.0, + -0.031262438744306564, + 0.9995112419128418 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 449008, + "componentType": 5126, + "count": 6, + "max": [ + 0.625, + 0.5 + ], + "min": [ + 0.375, + 0.25 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 449056, + "componentType": 5126, + "count": 6, + "max": [ + 0.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 449104, + "componentType": 5126, + "count": 6, + "max": [ + 0.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 621024, + "componentType": 5125, + "count": 6, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1331520, + "componentType": 5126, + "count": 6, + "max": [ + 1.8998640775680542, + 0.10692071169614792, + 0.34163254499435425 + ], + "min": [ + 1.6822326183319092, + -0.008598812855780125, + 0.33772993087768555 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1331592, + "componentType": 5126, + "count": 6, + "max": [ + 0.0, + 0.03376404196023941, + -0.9994298815727234 + ], + "min": [ + 0.0, + 0.03376373276114464, + -0.9994298815727234 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 449152, + "componentType": 5126, + "count": 6, + "max": [ + 0.625, + 1.0 + ], + "min": [ + 0.375, + 0.75 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 449200, + "componentType": 5126, + "count": 6, + "max": [ + 0.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 449248, + "componentType": 5126, + "count": 6, + "max": [ + 0.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 621048, + "componentType": 5125, + "count": 6, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1331664, + "componentType": 5126, + "count": 4, + "max": [ + 1.8998640775680542, + 0.10692071169614792, + 0.5494362115859985 + ], + "min": [ + 1.8361645936965942, + 0.10521435737609863, + 0.34163254499435425 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1331712, + "componentType": 5126, + "count": 4, + "max": [ + 0.0, + 0.9999663829803467, + 0.00821108091622591 + ], + "min": [ + 0.0, + 0.9999663829803467, + 0.00821108091622591 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 449296, + "componentType": 5126, + "count": 4, + "max": [ + 0.375, + 0.75 + ], + "min": [ + 0.125, + 0.5 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 449328, + "componentType": 5126, + "count": 4, + "max": [ + 0.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 449360, + "componentType": 5126, + "count": 4, + "max": [ + 0.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 621072, + "componentType": 5125, + "count": 6, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1331760, + "componentType": 5126, + "count": 6, + "max": [ + 1.7459319829940796, + -0.008598812855780125, + 0.5454305410385132 + ], + "min": [ + 1.6822326183319092, + -0.022853707894682884, + 0.33772993087768555 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1331832, + "componentType": 5126, + "count": 6, + "max": [ + 0.0, + -0.9976531863212585, + -0.06847063452005386 + ], + "min": [ + 0.0, + -0.9976532459259033, + -0.06847094744443893 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 449392, + "componentType": 5126, + "count": 6, + "max": [ + 0.875, + 0.75 + ], + "min": [ + 0.625, + 0.5 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 449440, + "componentType": 5126, + "count": 6, + "max": [ + 0.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 449488, + "componentType": 5126, + "count": 6, + "max": [ + 0.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 621096, + "componentType": 5125, + "count": 6, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1331904, + "componentType": 5126, + "count": 4, + "max": [ + -1.6822326183319092, + 0.10604637116193771, + 0.5494362115859985 + ], + "min": [ + -1.8361645936965942, + -0.02372804842889309, + 0.33772993087768555 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1331952, + "componentType": 5126, + "count": 4, + "max": [ + 0.6209080219268799, + 0.7836227416992188, + 0.03032323159277439 + ], + "min": [ + 0.6204966306686401, + 0.7833162546157837, + 0.0298172440379858 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 449536, + "componentType": 5126, + "count": 4, + "max": [ + 0.625, + 0.25 + ], + "min": [ + 0.375, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 449568, + "componentType": 5126, + "count": 4, + "max": [ + 0.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 449600, + "componentType": 5126, + "count": 4, + "max": [ + 0.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 621120, + "componentType": 5125, + "count": 6, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1332000, + "componentType": 5126, + "count": 6, + "max": [ + -1.6822326183319092, + 0.10434001684188843, + 0.5494362115859985 + ], + "min": [ + -1.8998640775680542, + -0.02372804842889309, + 0.5454305410385132 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1332072, + "componentType": 5126, + "count": 6, + "max": [ + 0.0, + -0.031262319535017014, + 0.9995113015174866 + ], + "min": [ + 0.0, + -0.03126237541437149, + 0.9995112419128418 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 449632, + "componentType": 5126, + "count": 6, + "max": [ + 0.625, + 0.5 + ], + "min": [ + 0.375, + 0.25 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 449680, + "componentType": 5126, + "count": 6, + "max": [ + 0.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 449728, + "componentType": 5126, + "count": 6, + "max": [ + 0.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 621144, + "componentType": 5125, + "count": 6, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1332144, + "componentType": 5126, + "count": 4, + "max": [ + -1.7459319829940796, + 0.10734420269727707, + 0.5494362115859985 + ], + "min": [ + -1.8998640775680542, + -0.022430216893553734, + 0.33772993087768555 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1332192, + "componentType": 5126, + "count": 4, + "max": [ + -0.6206658482551575, + -0.7833518385887146, + -0.030082257464528084 + ], + "min": [ + -0.620840311050415, + -0.7834979891777039, + -0.03028484433889389 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 449776, + "componentType": 5126, + "count": 4, + "max": [ + 0.625, + 0.75 + ], + "min": [ + 0.375, + 0.5 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 449808, + "componentType": 5126, + "count": 4, + "max": [ + 0.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 449840, + "componentType": 5126, + "count": 4, + "max": [ + 0.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 621168, + "componentType": 5125, + "count": 6, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1332240, + "componentType": 5126, + "count": 6, + "max": [ + -1.6822326183319092, + 0.10604637116193771, + 0.34163254499435425 + ], + "min": [ + -1.8998640775680542, + -0.00947315338999033, + 0.33772993087768555 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1332312, + "componentType": 5126, + "count": 6, + "max": [ + 0.0, + 0.03376404196023941, + -0.9994298815727234 + ], + "min": [ + 0.0, + 0.03376372903585434, + -0.9994298815727234 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 449872, + "componentType": 5126, + "count": 6, + "max": [ + 0.625, + 1.0 + ], + "min": [ + 0.375, + 0.75 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 449920, + "componentType": 5126, + "count": 6, + "max": [ + 0.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 449968, + "componentType": 5126, + "count": 6, + "max": [ + 0.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 621192, + "componentType": 5125, + "count": 6, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1332384, + "componentType": 5126, + "count": 4, + "max": [ + -1.8361645936965942, + 0.10604637116193771, + 0.5494362115859985 + ], + "min": [ + -1.8998640775680542, + 0.10434001684188843, + 0.34163254499435425 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1332432, + "componentType": 5126, + "count": 4, + "max": [ + 0.0, + 0.9999663829803467, + 0.00821108091622591 + ], + "min": [ + 0.0, + 0.9999663829803467, + 0.00821108091622591 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 450016, + "componentType": 5126, + "count": 4, + "max": [ + 0.375, + 0.75 + ], + "min": [ + 0.125, + 0.5 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 450048, + "componentType": 5126, + "count": 4, + "max": [ + 0.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 450080, + "componentType": 5126, + "count": 4, + "max": [ + 0.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 621216, + "componentType": 5125, + "count": 6, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1332480, + "componentType": 5126, + "count": 64, + "max": [ + 2.2255301475524902, + 0.03622890263795853, + 0.6500875949859619 + ], + "min": [ + -2.2255301475524902, + -0.09325980395078659, + -0.6553332805633545 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1333248, + "componentType": 5126, + "count": 64, + "max": [ + 0.9983014464378357, + 0.0905621200799942, + 0.9947178959846497 + ], + "min": [ + -0.9983017444610596, + -0.08802275359630585, + -0.9945378303527832 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 450112, + "componentType": 5126, + "count": 64, + "max": [ + 0.993938684463501, + 0.6706372499465942 + ], + "min": [ + 0.1136288270354271, + 0.07407575845718384 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 450624, + "componentType": 5126, + "count": 64, + "max": [ + 0.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 451136, + "componentType": 5126, + "count": 64, + "max": [ + 0.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 621240, + "componentType": 5125, + "count": 192, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1334016, + "componentType": 5126, + "count": 192, + "max": [ + 2.2255301475524902, + 0.03622890263795853, + 0.6500875949859619 + ], + "min": [ + -2.2255301475524902, + -0.0804620012640953, + -0.6541882157325745 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1336320, + "componentType": 5126, + "count": 192, + "max": [ + 1.919631586133619e-06, + 0.9960222244262695, + 0.08911620080471039 + ], + "min": [ + -1.5357055644926731e-06, + 0.9960212111473083, + 0.08910629898309708 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 451648, + "componentType": 5126, + "count": 192, + "max": [ + 0.993938684463501, + 0.6706372499465942 + ], + "min": [ + 0.1136288270354271, + 0.07407575845718384 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 453184, + "componentType": 5126, + "count": 192, + "max": [ + 0.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 454720, + "componentType": 5126, + "count": 192, + "max": [ + 0.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 622008, + "componentType": 5125, + "count": 192, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1338624, + "componentType": 5126, + "count": 64, + "max": [ + 2.2151129245758057, + 0.07467889785766602, + 0.6463348865509033 + ], + "min": [ + -2.2151129245758057, + -0.07981330156326294, + -0.6469447016716003 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1339392, + "componentType": 5126, + "count": 64, + "max": [ + 0.9982776045799255, + 0.08894722908735275, + 0.9945972561836243 + ], + "min": [ + -0.9982784390449524, + -0.08905120193958282, + -0.9946074485778809 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 456256, + "componentType": 5126, + "count": 64, + "max": [ + 0.9995817542076111, + 0.6823552250862122 + ], + "min": [ + 0.10798166692256927, + 0.06123870611190796 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 456768, + "componentType": 5126, + "count": 64, + "max": [ + 0.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 457280, + "componentType": 5126, + "count": 64, + "max": [ + 0.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 622776, + "componentType": 5125, + "count": 192, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1340160, + "componentType": 5126, + "count": 64, + "max": [ + 2.166231870651245, + 0.07358285784721375, + 0.6076068878173828 + ], + "min": [ + -2.166231870651245, + -0.010937920771539211, + -0.6020779609680176 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1340928, + "componentType": 5126, + "count": 64, + "max": [ + 0.013170073740184307, + 0.9987030625343323, + 0.06939584761857986 + ], + "min": [ + -0.013370863161981106, + 0.9975793361663818, + 0.0509122759103775 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 457792, + "componentType": 5126, + "count": 64, + "max": [ + 1.0173349380493164, + 0.7227101922035217 + ], + "min": [ + 0.0902390405535698, + 0.03187429904937744 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 458304, + "componentType": 5126, + "count": 64, + "max": [ + 0.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 458816, + "componentType": 5126, + "count": 64, + "max": [ + 0.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 623544, + "componentType": 5125, + "count": 192, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1341696, + "componentType": 5126, + "count": 64, + "max": [ + 2.1504416465759277, + 0.08092901855707169, + 0.594927966594696 + ], + "min": [ + -2.1504416465759277, + -0.010270118713378906, + -0.588835597038269 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1342464, + "componentType": 5126, + "count": 64, + "max": [ + 0.9982439875602722, + 0.0700233057141304, + 0.9961337447166443 + ], + "min": [ + -0.998244047164917, + -0.0700240284204483, + -0.9961333870887756 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 459328, + "componentType": 5126, + "count": 64, + "max": [ + 1.0204168558120728, + 0.7302978038787842 + ], + "min": [ + 0.08716042339801788, + 0.02330559492111206 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 459840, + "componentType": 5126, + "count": 64, + "max": [ + 0.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 460352, + "componentType": 5126, + "count": 64, + "max": [ + 0.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 624312, + "componentType": 5125, + "count": 192, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1343232, + "componentType": 5126, + "count": 28, + "max": [ + -1.587070345878601, + -0.04088224470615387, + -0.2526068687438965 + ], + "min": [ + -1.7051684856414795, + -0.09754288196563721, + -0.36366069316864014 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1343568, + "componentType": 5126, + "count": 28, + "max": [ + 0.9815739393234253, + 1.8476619516150095e-05, + 0.9807247519493103 + ], + "min": [ + -0.9815762042999268, + -2.0226463675498962e-05, + -0.9808501601219177 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 460864, + "componentType": 5126, + "count": 28, + "max": [ + 0.34563666582107544, + 0.7192898988723755 + ], + "min": [ + 0.1570555865764618, + 0.5053586363792419 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 461088, + "componentType": 5126, + "count": 28, + "max": [ + 0.34563666582107544, + 0.7192898988723755 + ], + "min": [ + 0.1570555865764618, + 0.5053586363792419 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 461312, + "componentType": 5126, + "count": 28, + "max": [ + 0.34563666582107544, + 0.7192898988723755 + ], + "min": [ + 0.1570555865764618, + 0.5053586363792419 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 625080, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1343904, + "componentType": 5126, + "count": 28, + "max": [ + 2.1183853149414063, + -0.04088224470615387, + -0.27028578519821167 + ], + "min": [ + 2.000246524810791, + -0.09754288196563721, + -0.5375593900680542 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1344240, + "componentType": 5126, + "count": 28, + "max": [ + 0.9809269905090332, + 1.1026860192941967e-05, + 0.9807900190353394 + ], + "min": [ + -0.9810882806777954, + -1.30366697703721e-05, + -0.9823353290557861 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 461536, + "componentType": 5126, + "count": 28, + "max": [ + 0.3456622064113617, + 0.7351214289665222 + ], + "min": [ + 0.1566442847251892, + 0.48921579122543335 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 461760, + "componentType": 5126, + "count": 28, + "max": [ + 0.3456622064113617, + 0.7351214289665222 + ], + "min": [ + 0.1566442847251892, + 0.48921579122543335 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 461984, + "componentType": 5126, + "count": 28, + "max": [ + 0.3456622064113617, + 0.7351214289665222 + ], + "min": [ + 0.1566442847251892, + 0.48921579122543335 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 625368, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1344576, + "componentType": 5126, + "count": 34, + "max": [ + 2.1179604530334473, + -0.04088224470615387, + 0.11120873689651489 + ], + "min": [ + 2.000633716583252, + -0.09754288196563721, + -0.15629839897155762 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1344984, + "componentType": 5126, + "count": 34, + "max": [ + 0.9808259606361389, + 6.736765499226749e-05, + 0.9807891249656677 + ], + "min": [ + -0.9808160066604614, + -6.629088602494448e-05, + -0.9807891845703125 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 462208, + "componentType": 5126, + "count": 34, + "max": [ + 0.34552350640296936, + 0.7351270318031311 + ], + "min": [ + 0.15666911005973816, + 0.4893134832382202 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 462480, + "componentType": 5126, + "count": 34, + "max": [ + 0.34552350640296936, + 0.7351270318031311 + ], + "min": [ + 0.15666911005973816, + 0.4893134832382202 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 462752, + "componentType": 5126, + "count": 34, + "max": [ + 0.34552350640296936, + 0.7351270318031311 + ], + "min": [ + 0.15666911005973816, + 0.4893134832382202 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 625656, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1345392, + "componentType": 5126, + "count": 34, + "max": [ + 2.117778778076172, + -0.04088224470615387, + 0.3185630440711975 + ], + "min": [ + 1.9995967149734497, + -0.09754288196563721, + 0.20821678638458252 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1345800, + "componentType": 5126, + "count": 34, + "max": [ + 0.9808624386787415, + 5.0287173507967964e-05, + 0.9809048771858215 + ], + "min": [ + -0.9807934761047363, + -1.5975398127920926e-05, + -0.9807936549186707 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 463024, + "componentType": 5126, + "count": 34, + "max": [ + 0.3454318642616272, + 0.7192908525466919 + ], + "min": [ + 0.15687048435211182, + 0.5055179595947266 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 463296, + "componentType": 5126, + "count": 34, + "max": [ + 0.3454318642616272, + 0.7192908525466919 + ], + "min": [ + 0.15687048435211182, + 0.5055179595947266 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 463568, + "componentType": 5126, + "count": 34, + "max": [ + 0.3454318642616272, + 0.7192908525466919 + ], + "min": [ + 0.15687048435211182, + 0.5055179595947266 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 625944, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1346208, + "componentType": 5126, + "count": 30, + "max": [ + 0.27022063732147217, + -0.04088224470615387, + 0.31852608919143677 + ], + "min": [ + 0.15208685398101807, + -0.09754288196563721, + 0.20733055472373962 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1346568, + "componentType": 5126, + "count": 30, + "max": [ + 0.9812389016151428, + 1.8319813534617424e-05, + 0.9807917475700378 + ], + "min": [ + -0.9808931350708008, + -5.076129309600219e-05, + -0.9821604490280151 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 463840, + "componentType": 5126, + "count": 30, + "max": [ + 0.3454321026802063, + 0.719290554523468 + ], + "min": [ + 0.15687048435211182, + 0.5055179595947266 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 464080, + "componentType": 5126, + "count": 30, + "max": [ + 0.3454321026802063, + 0.719290554523468 + ], + "min": [ + 0.15687048435211182, + 0.5055179595947266 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 464320, + "componentType": 5126, + "count": 30, + "max": [ + 0.3454321026802063, + 0.719290554523468 + ], + "min": [ + 0.15687048435211182, + 0.5055179595947266 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 626232, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1346928, + "componentType": 5126, + "count": 28, + "max": [ + 1.9274905920028687, + -0.04088224470615387, + 0.3184831440448761 + ], + "min": [ + 1.8092750310897827, + -0.09754288196563721, + 0.20821279287338257 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1347264, + "componentType": 5126, + "count": 28, + "max": [ + 0.9808470010757446, + 1.3366734492592514e-05, + 0.9807811379432678 + ], + "min": [ + -0.9808475375175476, + -1.3363512152864132e-05, + -0.980792760848999 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 464560, + "componentType": 5126, + "count": 28, + "max": [ + 0.3454320728778839, + 0.7192906141281128 + ], + "min": [ + 0.15687048435211182, + 0.5055180191993713 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 464784, + "componentType": 5126, + "count": 28, + "max": [ + 0.3454320728778839, + 0.7192906141281128 + ], + "min": [ + 0.15687048435211182, + 0.5055180191993713 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 465008, + "componentType": 5126, + "count": 28, + "max": [ + 0.3454320728778839, + 0.7192906141281128 + ], + "min": [ + 0.15687048435211182, + 0.5055180191993713 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 626520, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1347600, + "componentType": 5126, + "count": 32, + "max": [ + 0.07997763156890869, + -0.04088224470615387, + 0.31847384572029114 + ], + "min": [ + -0.03817546367645264, + -0.09754288196563721, + 0.20723965764045715 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1347984, + "componentType": 5126, + "count": 32, + "max": [ + 0.9813081622123718, + 6.552611739607528e-05, + 0.9808717370033264 + ], + "min": [ + -0.9812372326850891, + -1.0982155799865723e-05, + -0.9808263778686523 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 465232, + "componentType": 5126, + "count": 32, + "max": [ + 0.3454321026802063, + 0.7192904353141785 + ], + "min": [ + 0.15687058866024017, + 0.5055179595947266 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 465488, + "componentType": 5126, + "count": 32, + "max": [ + 0.3454321026802063, + 0.7192904353141785 + ], + "min": [ + 0.15687058866024017, + 0.5055179595947266 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 465744, + "componentType": 5126, + "count": 32, + "max": [ + 0.3454321026802063, + 0.7192904353141785 + ], + "min": [ + 0.15687058866024017, + 0.5055179595947266 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 626808, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1348368, + "componentType": 5126, + "count": 24, + "max": [ + 1.7372161149978638, + -0.04088224470615387, + 0.3184366822242737 + ], + "min": [ + 1.619019865989685, + -0.09754288196563721, + 0.20728135108947754 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1348656, + "componentType": 5126, + "count": 24, + "max": [ + 0.9808475971221924, + 0.0, + 0.9807831645011902 + ], + "min": [ + -0.9814582467079163, + 0.0, + -0.9822397828102112 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 466000, + "componentType": 5126, + "count": 24, + "max": [ + 0.34543201327323914, + 0.7192904949188232 + ], + "min": [ + 0.15687048435211182, + 0.5055179595947266 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 466192, + "componentType": 5126, + "count": 24, + "max": [ + 0.34543201327323914, + 0.7192904949188232 + ], + "min": [ + 0.15687048435211182, + 0.5055179595947266 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 466384, + "componentType": 5126, + "count": 24, + "max": [ + 0.34543201327323914, + 0.7192904949188232 + ], + "min": [ + 0.15687048435211182, + 0.5055179595947266 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 627096, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1348944, + "componentType": 5126, + "count": 36, + "max": [ + -0.11035442352294922, + -0.04088224470615387, + 0.3185182809829712 + ], + "min": [ + -0.2285221815109253, + -0.09754288196563721, + 0.20732659101486206 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1349376, + "componentType": 5126, + "count": 36, + "max": [ + 0.9812291264533997, + 1.4792377442063298e-05, + 0.9808697700500488 + ], + "min": [ + -0.9808517098426819, + -0.00020501749531831592, + -0.9821624755859375 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 466576, + "componentType": 5126, + "count": 36, + "max": [ + 0.34543177485466003, + 0.7192904949188232 + ], + "min": [ + 0.15687058866024017, + 0.5055179595947266 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 466864, + "componentType": 5126, + "count": 36, + "max": [ + 0.34543177485466003, + 0.7192904949188232 + ], + "min": [ + 0.15687058866024017, + 0.5055179595947266 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 467152, + "componentType": 5126, + "count": 36, + "max": [ + 0.34543177485466003, + 0.7192904949188232 + ], + "min": [ + 0.15687058866024017, + 0.5055179595947266 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 627384, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1349808, + "componentType": 5126, + "count": 32, + "max": [ + -0.3006131649017334, + -0.04088224470615387, + 0.3185161352157593 + ], + "min": [ + -0.4187757968902588, + -0.09754288196563721, + 0.20728498697280884 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1350192, + "componentType": 5126, + "count": 32, + "max": [ + 0.9814655184745789, + 1.842901110649109e-05, + 0.9809069633483887 + ], + "min": [ + -0.9809001088142395, + -0.00015429136692546308, + -0.9822366833686829 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 467440, + "componentType": 5126, + "count": 32, + "max": [ + 0.34543177485466003, + 0.7192904949188232 + ], + "min": [ + 0.15687058866024017, + 0.5055179595947266 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 467696, + "componentType": 5126, + "count": 32, + "max": [ + 0.34543177485466003, + 0.7192904949188232 + ], + "min": [ + 0.15687058866024017, + 0.5055179595947266 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 467952, + "componentType": 5126, + "count": 32, + "max": [ + 0.34543177485466003, + 0.7192904949188232 + ], + "min": [ + 0.15687058866024017, + 0.5055179595947266 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 627672, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1350576, + "componentType": 5126, + "count": 36, + "max": [ + 1.5468944311141968, + -0.04088224470615387, + 0.3185166120529175 + ], + "min": [ + 1.4287317991256714, + -0.09754288196563721, + 0.2072853446006775 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1351008, + "componentType": 5126, + "count": 36, + "max": [ + 0.980900228023529, + 0.00015429136692546308, + 0.9809069037437439 + ], + "min": [ + -0.9814725518226624, + -5.015382339479402e-05, + -0.982239842414856 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 468208, + "componentType": 5126, + "count": 36, + "max": [ + 0.3454320430755615, + 0.7192904949188232 + ], + "min": [ + 0.15687048435211182, + 0.5055179595947266 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 468496, + "componentType": 5126, + "count": 36, + "max": [ + 0.3454320430755615, + 0.7192904949188232 + ], + "min": [ + 0.15687048435211182, + 0.5055179595947266 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 468784, + "componentType": 5126, + "count": 36, + "max": [ + 0.3454320430755615, + 0.7192904949188232 + ], + "min": [ + 0.15687048435211182, + 0.5055179595947266 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 627960, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1351440, + "componentType": 5126, + "count": 32, + "max": [ + -0.490909218788147, + -0.04088224470615387, + 0.3185266852378845 + ], + "min": [ + -0.6090617179870605, + -0.09754288196563721, + 0.2072855532169342 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1351824, + "componentType": 5126, + "count": 32, + "max": [ + 0.9812283515930176, + 6.532105180667713e-05, + 0.9809501767158508 + ], + "min": [ + -0.9814706444740295, + -2.4527311325073242e-05, + -0.9822373390197754 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 469072, + "componentType": 5126, + "count": 32, + "max": [ + 0.34543177485466003, + 0.719290554523468 + ], + "min": [ + 0.15687058866024017, + 0.5055179595947266 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 469328, + "componentType": 5126, + "count": 32, + "max": [ + 0.34543177485466003, + 0.719290554523468 + ], + "min": [ + 0.15687058866024017, + 0.5055179595947266 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 469584, + "componentType": 5126, + "count": 32, + "max": [ + 0.34543177485466003, + 0.719290554523468 + ], + "min": [ + 0.15687058866024017, + 0.5055179595947266 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 628248, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1352208, + "componentType": 5126, + "count": 28, + "max": [ + 1.9272743463516235, + -0.04088224470615387, + -0.4450254440307617 + ], + "min": [ + 1.8091262578964233, + -0.09754288196563721, + -0.5550942420959473 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1352544, + "componentType": 5126, + "count": 28, + "max": [ + 0.980790913105011, + 9.258334102923982e-06, + 0.9807878732681274 + ], + "min": [ + -0.9807859659194946, + -7.40682371542789e-05, + -0.9807887673377991 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 469840, + "componentType": 5126, + "count": 28, + "max": [ + 0.34565991163253784, + 0.7192906737327576 + ], + "min": [ + 0.1570655107498169, + 0.5053465366363525 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 470064, + "componentType": 5126, + "count": 28, + "max": [ + 0.34565991163253784, + 0.7192906737327576 + ], + "min": [ + 0.1570655107498169, + 0.5053465366363525 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 470288, + "componentType": 5126, + "count": 28, + "max": [ + 0.34565991163253784, + 0.7192906737327576 + ], + "min": [ + 0.1570655107498169, + 0.5053465366363525 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 628536, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1352880, + "componentType": 5126, + "count": 32, + "max": [ + 1.2898491621017456, + -0.04088224470615387, + -0.4450746178627014 + ], + "min": [ + 1.1717263460159302, + -0.09754288196563721, + -0.5560767650604248 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1353264, + "componentType": 5126, + "count": 32, + "max": [ + 0.9815899133682251, + 1.094583512895042e-05, + 0.9807879328727722 + ], + "min": [ + -0.9809041619300842, + -2.150796353816986e-05, + -0.9823306798934937 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 470512, + "componentType": 5126, + "count": 32, + "max": [ + 0.34565994143486023, + 0.7192904949188232 + ], + "min": [ + 0.1570655256509781, + 0.5053465962409973 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 470768, + "componentType": 5126, + "count": 32, + "max": [ + 0.34565994143486023, + 0.7192904949188232 + ], + "min": [ + 0.1570655256509781, + 0.5053465962409973 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 471024, + "componentType": 5126, + "count": 32, + "max": [ + 0.34565994143486023, + 0.7192904949188232 + ], + "min": [ + 0.1570655256509781, + 0.5053465962409973 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 628824, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1353648, + "componentType": 5126, + "count": 32, + "max": [ + -0.6812232732772827, + -0.04088224470615387, + 0.31851619482040405 + ], + "min": [ + -0.7993860244750977, + -0.09754288196563721, + 0.20728498697280884 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1354032, + "componentType": 5126, + "count": 32, + "max": [ + 0.9813855886459351, + 8.793993038125336e-05, + 0.980857789516449 + ], + "min": [ + -0.9808567762374878, + -1.8963592083309777e-05, + -0.9822328090667725 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 471280, + "componentType": 5126, + "count": 32, + "max": [ + 0.34543177485466003, + 0.7192904949188232 + ], + "min": [ + 0.15687058866024017, + 0.5055179595947266 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 471536, + "componentType": 5126, + "count": 32, + "max": [ + 0.34543177485466003, + 0.7192904949188232 + ], + "min": [ + 0.15687058866024017, + 0.5055179595947266 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 471792, + "componentType": 5126, + "count": 32, + "max": [ + 0.34543177485466003, + 0.7192904949188232 + ], + "min": [ + 0.15687058866024017, + 0.5055179595947266 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 629112, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1354416, + "componentType": 5126, + "count": 36, + "max": [ + 1.0996202230453491, + -0.04088224470615387, + -0.4450744390487671 + ], + "min": [ + 0.9814976453781128, + -0.09754288196563721, + -0.5560767650604248 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1354848, + "componentType": 5126, + "count": 36, + "max": [ + 0.9809044599533081, + 1.9535422325134277e-05, + 0.9807838201522827 + ], + "min": [ + -0.981590747833252, + -6.257128552533686e-05, + -0.9823265075683594 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 472048, + "componentType": 5126, + "count": 36, + "max": [ + 0.34565988183021545, + 0.7192904949188232 + ], + "min": [ + 0.15706557035446167, + 0.5053466558456421 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 472336, + "componentType": 5126, + "count": 36, + "max": [ + 0.34565988183021545, + 0.7192904949188232 + ], + "min": [ + 0.15706557035446167, + 0.5053466558456421 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 472624, + "componentType": 5126, + "count": 36, + "max": [ + 0.34565988183021545, + 0.7192904949188232 + ], + "min": [ + 0.15706557035446167, + 0.5053466558456421 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 629400, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1355280, + "componentType": 5126, + "count": 32, + "max": [ + 0.9092916250228882, + -0.04088224470615387, + -0.44512343406677246 + ], + "min": [ + 0.7911945581436157, + -0.09754288196563721, + -0.5561728477478027 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1355664, + "componentType": 5126, + "count": 32, + "max": [ + 0.981590747833252, + 5.1597442507045344e-05, + 0.9807248711585999 + ], + "min": [ + -0.9815999269485474, + -2.0585954189300537e-05, + -0.9808481931686401 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 472912, + "componentType": 5126, + "count": 32, + "max": [ + 0.34565994143486023, + 0.7192902565002441 + ], + "min": [ + 0.1570655107498169, + 0.5053465366363525 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 473168, + "componentType": 5126, + "count": 32, + "max": [ + 0.34565994143486023, + 0.7192902565002441 + ], + "min": [ + 0.1570655107498169, + 0.5053465366363525 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 473424, + "componentType": 5126, + "count": 32, + "max": [ + 0.34565994143486023, + 0.7192902565002441 + ], + "min": [ + 0.1570655107498169, + 0.5053465366363525 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 629688, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1356048, + "componentType": 5126, + "count": 30, + "max": [ + -0.8714625835418701, + -0.04088224470615387, + 0.318389892578125 + ], + "min": [ + -0.9896399974822998, + -0.09754288196563721, + 0.20718997716903687 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1356408, + "componentType": 5126, + "count": 30, + "max": [ + 0.9814555644989014, + 1.5197323591564782e-05, + 0.9807312488555908 + ], + "min": [ + -0.9814555048942566, + -1.5272646123776212e-05, + -0.9808386564254761 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 473680, + "componentType": 5126, + "count": 30, + "max": [ + 0.3454318344593048, + 0.7192903161048889 + ], + "min": [ + 0.15687057375907898, + 0.5055179595947266 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 473920, + "componentType": 5126, + "count": 30, + "max": [ + 0.3454318344593048, + 0.7192903161048889 + ], + "min": [ + 0.15687057375907898, + 0.5055179595947266 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 474160, + "componentType": 5126, + "count": 30, + "max": [ + 0.3454318344593048, + 0.7192903161048889 + ], + "min": [ + 0.15687057375907898, + 0.5055179595947266 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 629976, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1356768, + "componentType": 5126, + "count": 32, + "max": [ + 1.927017331123352, + -0.04088224470615387, + -0.25240516662597656 + ], + "min": [ + 1.8093301057815552, + -0.09754288196563721, + -0.36364424228668213 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1357152, + "componentType": 5126, + "count": 32, + "max": [ + 0.9808874726295471, + 0.00013533652236219496, + 0.9810124635696411 + ], + "min": [ + -0.9813963770866394, + -9.808901813812554e-05, + -0.9808599352836609 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 474400, + "componentType": 5126, + "count": 32, + "max": [ + 0.3456368148326874, + 0.7192898988723755 + ], + "min": [ + 0.15705543756484985, + 0.5053586959838867 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 474656, + "componentType": 5126, + "count": 32, + "max": [ + 0.3456368148326874, + 0.7192898988723755 + ], + "min": [ + 0.15705543756484985, + 0.5053586959838867 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 474912, + "componentType": 5126, + "count": 32, + "max": [ + 0.3456368148326874, + 0.7192898988723755 + ], + "min": [ + 0.15705543756484985, + 0.5053586959838867 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 630264, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1357536, + "componentType": 5126, + "count": 32, + "max": [ + -1.0619816780090332, + -0.04088224470615387, + 0.3184802532196045 + ], + "min": [ + -1.1799345016479492, + -0.09754288196563721, + 0.2071945071220398 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1357920, + "componentType": 5126, + "count": 32, + "max": [ + 0.9810662865638733, + 2.580881118774414e-05, + 0.9809000492095947 + ], + "min": [ + -0.98146653175354, + -2.642907202243805e-05, + -0.9808372855186462 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 475168, + "componentType": 5126, + "count": 32, + "max": [ + 0.34543195366859436, + 0.719290554523468 + ], + "min": [ + 0.15687060356140137, + 0.5055179595947266 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 475424, + "componentType": 5126, + "count": 32, + "max": [ + 0.34543195366859436, + 0.719290554523468 + ], + "min": [ + 0.15687060356140137, + 0.5055179595947266 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 475680, + "componentType": 5126, + "count": 32, + "max": [ + 0.34543195366859436, + 0.719290554523468 + ], + "min": [ + 0.15687060356140137, + 0.5055179595947266 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 630552, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1358304, + "componentType": 5126, + "count": 36, + "max": [ + 1.7371400594711304, + -0.04088224470615387, + -0.2524073123931885 + ], + "min": [ + 1.6194580793380737, + -0.09754288196563721, + -0.3636484742164612 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1358736, + "componentType": 5126, + "count": 36, + "max": [ + 0.9815651178359985, + 0.00010096444020746276, + 0.9810062646865845 + ], + "min": [ + -0.9808775186538696, + -9.879012941382825e-05, + -0.9808496236801147 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 475936, + "componentType": 5126, + "count": 36, + "max": [ + 0.3456368148326874, + 0.7192898392677307 + ], + "min": [ + 0.15705545246601105, + 0.5053585767745972 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 476224, + "componentType": 5126, + "count": 36, + "max": [ + 0.3456368148326874, + 0.7192898392677307 + ], + "min": [ + 0.15705545246601105, + 0.5053585767745972 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 476512, + "componentType": 5126, + "count": 36, + "max": [ + 0.3456368148326874, + 0.7192898392677307 + ], + "min": [ + 0.15705545246601105, + 0.5053585767745972 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 630840, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1359168, + "componentType": 5126, + "count": 28, + "max": [ + -1.2520170211791992, + -0.04088224470615387, + 0.31848275661468506 + ], + "min": [ + -1.3702330589294434, + -0.09754288196563721, + 0.20821234583854675 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1359504, + "componentType": 5126, + "count": 28, + "max": [ + 0.9808475971221924, + 1.3366736311581917e-05, + 0.9807809591293335 + ], + "min": [ + -0.9808425307273865, + -1.3624009625345934e-05, + -0.9807906746864319 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 476800, + "componentType": 5126, + "count": 28, + "max": [ + 0.3454318344593048, + 0.7192907333374023 + ], + "min": [ + 0.15687063336372375, + 0.5055179595947266 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 477024, + "componentType": 5126, + "count": 28, + "max": [ + 0.3454318344593048, + 0.7192907333374023 + ], + "min": [ + 0.15687063336372375, + 0.5055179595947266 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 477248, + "componentType": 5126, + "count": 28, + "max": [ + 0.3454318344593048, + 0.7192907333374023 + ], + "min": [ + 0.15687063336372375, + 0.5055179595947266 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 631128, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1359840, + "componentType": 5126, + "count": 24, + "max": [ + 1.546836256980896, + -0.04088224470615387, + -0.25256210565567017 + ], + "min": [ + 1.4287506341934204, + -0.09754288196563721, + -0.3636539578437805 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1360128, + "componentType": 5126, + "count": 24, + "max": [ + 0.9815402030944824, + 0.0, + 0.9807917475700378 + ], + "min": [ + -0.9814136624336243, + 0.0, + -0.9809117913246155 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 477472, + "componentType": 5126, + "count": 24, + "max": [ + 0.3456368148326874, + 0.7192898988723755 + ], + "min": [ + 0.1570555865764618, + 0.5053584575653076 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 477664, + "componentType": 5126, + "count": 24, + "max": [ + 0.3456368148326874, + 0.7192898988723755 + ], + "min": [ + 0.1570555865764618, + 0.5053584575653076 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 477856, + "componentType": 5126, + "count": 24, + "max": [ + 0.3456368148326874, + 0.7192898988723755 + ], + "min": [ + 0.1570555865764618, + 0.5053584575653076 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 631416, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1360416, + "componentType": 5126, + "count": 34, + "max": [ + -1.4425501823425293, + -0.04088224470615387, + 0.31848442554473877 + ], + "min": [ + -1.5605132579803467, + -0.09754288196563721, + 0.20724019408226013 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1360824, + "componentType": 5126, + "count": 34, + "max": [ + 0.9809029698371887, + 9.348880121251568e-05, + 0.9809123873710632 + ], + "min": [ + -0.9813053011894226, + -1.5023132618807722e-05, + -0.9808308482170105 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 478048, + "componentType": 5126, + "count": 34, + "max": [ + 0.3454318940639496, + 0.719290554523468 + ], + "min": [ + 0.15687057375907898, + 0.5055179595947266 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 478320, + "componentType": 5126, + "count": 34, + "max": [ + 0.3454318940639496, + 0.719290554523468 + ], + "min": [ + 0.15687057375907898, + 0.5055179595947266 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 478592, + "componentType": 5126, + "count": 34, + "max": [ + 0.3454318940639496, + 0.719290554523468 + ], + "min": [ + 0.15687057375907898, + 0.5055179595947266 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 631704, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1361232, + "componentType": 5126, + "count": 38, + "max": [ + 1.9274569749832153, + -0.04088224470615387, + -0.06298625469207764 + ], + "min": [ + 1.809308648109436, + -0.09754288196563721, + -0.1729336977005005 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1361688, + "componentType": 5126, + "count": 38, + "max": [ + 0.9807935953140259, + 1.1105291378044058e-05, + 0.9807881712913513 + ], + "min": [ + -0.9807907342910767, + -6.921403837623075e-05, + -0.9807931780815125 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 478864, + "componentType": 5126, + "count": 38, + "max": [ + 0.3456781804561615, + 0.7193040251731873 + ], + "min": [ + 0.1570836901664734, + 0.5053344964981079 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 479168, + "componentType": 5126, + "count": 38, + "max": [ + 0.3456781804561615, + 0.7193040251731873 + ], + "min": [ + 0.1570836901664734, + 0.5053344964981079 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 479472, + "componentType": 5126, + "count": 38, + "max": [ + 0.3456781804561615, + 0.7193040251731873 + ], + "min": [ + 0.1570836901664734, + 0.5053344964981079 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 631992, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1362144, + "componentType": 5126, + "count": 32, + "max": [ + -1.6328461170196533, + -0.04088224470615387, + 0.31852877140045166 + ], + "min": [ + -1.7508234977722168, + -0.09754288196563721, + 0.20732709765434265 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1362528, + "componentType": 5126, + "count": 32, + "max": [ + 0.9809067845344543, + 2.1304389520082623e-05, + 0.9809136986732483 + ], + "min": [ + -0.9808538556098938, + -1.6895946828299202e-05, + -0.9821345210075378 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 479776, + "componentType": 5126, + "count": 32, + "max": [ + 0.3454318940639496, + 0.719290554523468 + ], + "min": [ + 0.15687057375907898, + 0.5055179595947266 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 480032, + "componentType": 5126, + "count": 32, + "max": [ + 0.3454318940639496, + 0.719290554523468 + ], + "min": [ + 0.15687057375907898, + 0.5055179595947266 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 480288, + "componentType": 5126, + "count": 32, + "max": [ + 0.3454318940639496, + 0.719290554523468 + ], + "min": [ + 0.15687057375907898, + 0.5055179595947266 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 632280, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1362912, + "componentType": 5126, + "count": 32, + "max": [ + 1.7371701002120972, + -0.04088224470615387, + -0.06298625469207764 + ], + "min": [ + 1.619022011756897, + -0.09754288196563721, + -0.17293381690979004 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1363296, + "componentType": 5126, + "count": 32, + "max": [ + 0.9807872772216797, + 6.67295025778003e-05, + 0.9807881712913513 + ], + "min": [ + -0.9807906746864319, + -9.189019328914583e-05, + -0.9807881116867065 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 480544, + "componentType": 5126, + "count": 32, + "max": [ + 0.3456782102584839, + 0.7193039059638977 + ], + "min": [ + 0.15708371996879578, + 0.5053346157073975 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 480800, + "componentType": 5126, + "count": 32, + "max": [ + 0.3456782102584839, + 0.7193039059638977 + ], + "min": [ + 0.15708371996879578, + 0.5053346157073975 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 481056, + "componentType": 5126, + "count": 32, + "max": [ + 0.3456782102584839, + 0.7193039059638977 + ], + "min": [ + 0.15708371996879578, + 0.5053346157073975 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 632568, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1363680, + "componentType": 5126, + "count": 32, + "max": [ + 1.546836256980896, + -0.04088224470615387, + -0.06301414966583252 + ], + "min": [ + 1.428721308708191, + -0.09754288196563721, + -0.1740100383758545 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1364064, + "componentType": 5126, + "count": 32, + "max": [ + 0.9814807176589966, + 9.76345381786814e-06, + 0.9807841181755066 + ], + "min": [ + -0.9809327125549316, + -0.00018807669403031468, + -0.9824597239494324 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 481312, + "componentType": 5126, + "count": 32, + "max": [ + 0.3456782400608063, + 0.7193037867546082 + ], + "min": [ + 0.15708373486995697, + 0.5053346157073975 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 481568, + "componentType": 5126, + "count": 32, + "max": [ + 0.3456782400608063, + 0.7193037867546082 + ], + "min": [ + 0.15708373486995697, + 0.5053346157073975 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 481824, + "componentType": 5126, + "count": 32, + "max": [ + 0.3456782400608063, + 0.7193037867546082 + ], + "min": [ + 0.15708373486995697, + 0.5053346157073975 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 632856, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1364448, + "componentType": 5126, + "count": 24, + "max": [ + -1.8228918313980103, + -0.04088224470615387, + 0.3183940351009369 + ], + "min": [ + -1.9410792589187622, + -0.09754288196563721, + 0.2072356939315796 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1364736, + "componentType": 5126, + "count": 24, + "max": [ + 0.981296956539154, + 0.0, + 0.9807450175285339 + ], + "min": [ + -0.981296956539154, + 0.0, + -0.9808260202407837 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 482080, + "componentType": 5126, + "count": 24, + "max": [ + 0.3454318940639496, + 0.7192904353141785 + ], + "min": [ + 0.15687057375907898, + 0.5055180788040161 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 482272, + "componentType": 5126, + "count": 24, + "max": [ + 0.3454318940639496, + 0.7192904353141785 + ], + "min": [ + 0.15687057375907898, + 0.5055180788040161 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 482464, + "componentType": 5126, + "count": 24, + "max": [ + 0.3454318940639496, + 0.7192904353141785 + ], + "min": [ + 0.15687057375907898, + 0.5055180788040161 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 633144, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1365024, + "componentType": 5126, + "count": 28, + "max": [ + 1.9274336099624634, + -0.04088224470615387, + 0.12841445207595825 + ], + "min": [ + 1.809332013130188, + -0.09754288196563721, + 0.017310619354248047 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1365360, + "componentType": 5126, + "count": 28, + "max": [ + 0.9815201163291931, + 1.778453770384658e-05, + 0.9807256460189819 + ], + "min": [ + -0.9815198183059692, + -5.631774547509849e-05, + -0.9808447957038879 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 482656, + "componentType": 5126, + "count": 28, + "max": [ + 0.34563618898391724, + 0.7193018794059753 + ], + "min": [ + 0.15702864527702332, + 0.505386471748352 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 482880, + "componentType": 5126, + "count": 28, + "max": [ + 0.34563618898391724, + 0.7193018794059753 + ], + "min": [ + 0.15702864527702332, + 0.505386471748352 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 483104, + "componentType": 5126, + "count": 28, + "max": [ + 0.34563618898391724, + 0.7193018794059753 + ], + "min": [ + 0.15702864527702332, + 0.505386471748352 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 633432, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1365696, + "componentType": 5126, + "count": 28, + "max": [ + -2.0134198665618896, + -0.04088224470615387, + 0.31852877140045166 + ], + "min": [ + -2.131397008895874, + -0.09754288196563721, + 0.20732709765434265 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1366032, + "componentType": 5126, + "count": 28, + "max": [ + 0.9809054732322693, + 1.1047092812077608e-05, + 0.9809136986732483 + ], + "min": [ + -0.9808588027954102, + -1.2794509530067444e-05, + -0.9821345210075378 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 483328, + "componentType": 5126, + "count": 28, + "max": [ + 0.3454318940639496, + 0.719290554523468 + ], + "min": [ + 0.15687057375907898, + 0.5055179595947266 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 483552, + "componentType": 5126, + "count": 28, + "max": [ + 0.3454318940639496, + 0.719290554523468 + ], + "min": [ + 0.15687057375907898, + 0.5055179595947266 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 483776, + "componentType": 5126, + "count": 28, + "max": [ + 0.3454318940639496, + 0.719290554523468 + ], + "min": [ + 0.15687057375907898, + 0.5055179595947266 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 633720, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1366368, + "componentType": 5126, + "count": 28, + "max": [ + -1.396785855293274, + -0.04088224470615387, + -0.25236326456069946 + ], + "min": [ + -1.5148873329162598, + -0.09754288196563721, + -0.3635557293891907 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1366704, + "componentType": 5126, + "count": 28, + "max": [ + 0.9815965294837952, + 6.555769505212083e-05, + 0.9811380505561829 + ], + "min": [ + -0.9815835952758789, + -2.001412030949723e-05, + -0.9823096990585327 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 484000, + "componentType": 5126, + "count": 28, + "max": [ + 0.3456365764141083, + 0.719290018081665 + ], + "min": [ + 0.1570555865764618, + 0.5053586363792419 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 484224, + "componentType": 5126, + "count": 28, + "max": [ + 0.3456365764141083, + 0.719290018081665 + ], + "min": [ + 0.1570555865764618, + 0.5053586363792419 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 484448, + "componentType": 5126, + "count": 28, + "max": [ + 0.3456365764141083, + 0.719290018081665 + ], + "min": [ + 0.1570555865764618, + 0.5053586363792419 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 634008, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1367040, + "componentType": 5126, + "count": 28, + "max": [ + 1.7243303060531616, + -0.04088224470615387, + -0.44487231969833374 + ], + "min": [ + 1.439355492591858, + -0.09754288196563721, + -0.5560990571975708 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1367376, + "componentType": 5126, + "count": 28, + "max": [ + 0.9808209538459778, + 2.2194335542735644e-05, + 0.980907142162323 + ], + "min": [ + -0.9808299541473389, + -1.65402889251709e-05, + -0.981362521648407 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 484672, + "componentType": 5126, + "count": 28, + "max": [ + 0.3596900999546051, + 0.719523012638092 + ], + "min": [ + 0.14232715964317322, + 0.5049206018447876 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 484896, + "componentType": 5126, + "count": 28, + "max": [ + 0.3596900999546051, + 0.719523012638092 + ], + "min": [ + 0.14232715964317322, + 0.5049206018447876 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 485120, + "componentType": 5126, + "count": 28, + "max": [ + 0.3596900999546051, + 0.719523012638092 + ], + "min": [ + 0.14232715964317322, + 0.5049206018447876 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 634296, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1367712, + "componentType": 5126, + "count": 36, + "max": [ + -1.2065119743347168, + -0.04088224470615387, + -0.2525160312652588 + ], + "min": [ + -1.324634075164795, + -0.09754288196563721, + -0.3635633587837219 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1368144, + "componentType": 5126, + "count": 36, + "max": [ + 0.9815828204154968, + 1.2141622391936835e-05, + 0.9808533191680908 + ], + "min": [ + -0.98093581199646, + -2.0533801944111474e-05, + -0.9823116660118103 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 485344, + "componentType": 5126, + "count": 36, + "max": [ + 0.34563663601875305, + 0.719290018081665 + ], + "min": [ + 0.15705561637878418, + 0.5053586959838867 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 485632, + "componentType": 5126, + "count": 36, + "max": [ + 0.34563663601875305, + 0.719290018081665 + ], + "min": [ + 0.15705561637878418, + 0.5053586959838867 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 485920, + "componentType": 5126, + "count": 36, + "max": [ + 0.34563663601875305, + 0.719290018081665 + ], + "min": [ + 0.15705561637878418, + 0.5053586959838867 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 634584, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1368576, + "componentType": 5126, + "count": 36, + "max": [ + 1.1006289720535278, + -0.04088224470615387, + -0.2524073123931885 + ], + "min": [ + 0.9829472303390503, + -0.09754288196563721, + -0.3636484742164612 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1369008, + "componentType": 5126, + "count": 36, + "max": [ + 0.9815650582313538, + 9.90903572528623e-05, + 0.9810062050819397 + ], + "min": [ + -0.9808775186538696, + -2.650730311870575e-05, + -0.9808433651924133 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 486208, + "componentType": 5126, + "count": 36, + "max": [ + 0.345636785030365, + 0.7192898392677307 + ], + "min": [ + 0.1570555865764618, + 0.5053585171699524 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 486496, + "componentType": 5126, + "count": 36, + "max": [ + 0.345636785030365, + 0.7192898392677307 + ], + "min": [ + 0.1570555865764618, + 0.5053585171699524 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 486784, + "componentType": 5126, + "count": 36, + "max": [ + 0.345636785030365, + 0.7192898392677307 + ], + "min": [ + 0.1570555865764618, + 0.5053585171699524 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 634872, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1369440, + "componentType": 5126, + "count": 30, + "max": [ + -1.016209363937378, + -0.04088224470615387, + -0.25256460905075073 + ], + "min": [ + -1.1342893838882446, + -0.09754288196563721, + -0.3636585474014282 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1369800, + "componentType": 5126, + "count": 30, + "max": [ + 0.9815803170204163, + 1.7933549315785058e-05, + 0.9807929396629333 + ], + "min": [ + -0.9815402626991272, + -7.730376091785729e-05, + -0.9808509945869446 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 487072, + "componentType": 5126, + "count": 30, + "max": [ + 0.34563660621643066, + 0.7192898988723755 + ], + "min": [ + 0.15705561637878418, + 0.5053586959838867 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 487312, + "componentType": 5126, + "count": 30, + "max": [ + 0.34563660621643066, + 0.7192898988723755 + ], + "min": [ + 0.15705561637878418, + 0.5053586959838867 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 487552, + "componentType": 5126, + "count": 30, + "max": [ + 0.34563660621643066, + 0.7192898988723755 + ], + "min": [ + 0.15705561637878418, + 0.5053586959838867 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 635160, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1370160, + "componentType": 5126, + "count": 32, + "max": [ + 0.6326147317886353, + -0.04088224470615387, + -0.25236064195632935 + ], + "min": [ + 0.22099530696868896, + -0.09754288196563721, + -0.3635943531990051 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1370544, + "componentType": 5126, + "count": 32, + "max": [ + 0.9808153510093689, + 0.00013105654215905815, + 0.9808653593063354 + ], + "min": [ + -0.9808257222175598, + -5.119540946907364e-05, + -0.9811767339706421 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 487792, + "componentType": 5126, + "count": 32, + "max": [ + 0.3639701306819916, + 0.7195733189582825 + ], + "min": [ + 0.1377984583377838, + 0.504866361618042 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 488048, + "componentType": 5126, + "count": 32, + "max": [ + 0.3639701306819916, + 0.7195733189582825 + ], + "min": [ + 0.1377984583377838, + 0.504866361618042 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 488304, + "componentType": 5126, + "count": 32, + "max": [ + 0.3639701306819916, + 0.7195733189582825 + ], + "min": [ + 0.1377984583377838, + 0.504866361618042 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 635448, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1370928, + "componentType": 5126, + "count": 28, + "max": [ + -0.8259264230728149, + -0.04088224470615387, + -0.252604603767395 + ], + "min": [ + -0.944029688835144, + -0.09754288196563721, + -0.3636564612388611 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1371264, + "componentType": 5126, + "count": 28, + "max": [ + 0.9815763831138611, + 1.8476619516150095e-05, + 0.9807373881340027 + ], + "min": [ + -0.9814082384109497, + -2.261623740196228e-05, + -0.980915904045105 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 488560, + "componentType": 5126, + "count": 28, + "max": [ + 0.34563663601875305, + 0.7192898988723755 + ], + "min": [ + 0.15705561637878418, + 0.5053586959838867 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 488784, + "componentType": 5126, + "count": 28, + "max": [ + 0.34563663601875305, + 0.7192898988723755 + ], + "min": [ + 0.15705561637878418, + 0.5053586959838867 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 489008, + "componentType": 5126, + "count": 28, + "max": [ + 0.34563663601875305, + 0.7192898988723755 + ], + "min": [ + 0.15705561637878418, + 0.5053586959838867 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 635736, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1371600, + "componentType": 5126, + "count": 32, + "max": [ + 0.6410342454910278, + -0.04088224470615387, + 0.31834638118743896 + ], + "min": [ + 0.35546863079071045, + -0.09754288196563721, + 0.20722761750221252 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1371984, + "componentType": 5126, + "count": 32, + "max": [ + 0.9814551472663879, + 5.430895180325024e-05, + 0.9807374477386475 + ], + "min": [ + -0.9814371466636658, + -2.1731480956077576e-05, + -0.9808443784713745 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 489232, + "componentType": 5126, + "count": 32, + "max": [ + 0.35955196619033813, + 0.7195199728012085 + ], + "min": [ + 0.14221319556236267, + 0.5050817728042603 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 489488, + "componentType": 5126, + "count": 32, + "max": [ + 0.35955196619033813, + 0.7195199728012085 + ], + "min": [ + 0.14221319556236267, + 0.5050817728042603 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 489744, + "componentType": 5126, + "count": 32, + "max": [ + 0.35955196619033813, + 0.7195199728012085 + ], + "min": [ + 0.14221319556236267, + 0.5050817728042603 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 636024, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1372368, + "componentType": 5126, + "count": 30, + "max": [ + -0.6356549263000488, + -0.04088224470615387, + -0.25256460905075073 + ], + "min": [ + -0.753734827041626, + -0.09754288196563721, + -0.3636585474014282 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1372728, + "componentType": 5126, + "count": 30, + "max": [ + 0.9815400242805481, + 6.535261491080746e-05, + 0.9807917475700378 + ], + "min": [ + -0.9815810322761536, + -6.535262946272269e-05, + -0.9808509945869446 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 490000, + "componentType": 5126, + "count": 30, + "max": [ + 0.3456365764141083, + 0.7192899584770203 + ], + "min": [ + 0.15705560147762299, + 0.5053586959838867 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 490240, + "componentType": 5126, + "count": 30, + "max": [ + 0.3456365764141083, + 0.7192899584770203 + ], + "min": [ + 0.15705560147762299, + 0.5053586959838867 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 490480, + "componentType": 5126, + "count": 30, + "max": [ + 0.3456365764141083, + 0.7192899584770203 + ], + "min": [ + 0.15705560147762299, + 0.5053586959838867 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 636312, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1373088, + "componentType": 5126, + "count": 40, + "max": [ + 0.3631385564804077, + -0.04088224470615387, + 0.12857460975646973 + ], + "min": [ + 0.24575793743133545, + -0.09754288196563721, + 0.017337530851364136 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1373568, + "componentType": 5126, + "count": 40, + "max": [ + 0.9808685779571533, + 1.3105571269989014e-05, + 0.9807783365249634 + ], + "min": [ + -0.980864942073822, + -1.5052444723551162e-05, + -0.9807958006858826 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 490720, + "componentType": 5126, + "count": 40, + "max": [ + 0.3456360697746277, + 0.7193018198013306 + ], + "min": [ + 0.1570286750793457, + 0.505386471748352 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 491040, + "componentType": 5126, + "count": 40, + "max": [ + 0.3456360697746277, + 0.7193018198013306 + ], + "min": [ + 0.1570286750793457, + 0.505386471748352 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 491360, + "componentType": 5126, + "count": 40, + "max": [ + 0.3456360697746277, + 0.7193018198013306 + ], + "min": [ + 0.1570286750793457, + 0.505386471748352 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 636600, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1374048, + "componentType": 5126, + "count": 30, + "max": [ + -0.6356549263000488, + -0.04088224470615387, + -0.25256460905075073 + ], + "min": [ + -0.753734827041626, + -0.09754288196563721, + -0.3636585474014282 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1374408, + "componentType": 5126, + "count": 30, + "max": [ + 0.9815400242805481, + 6.535261491080746e-05, + 0.9807917475700378 + ], + "min": [ + -0.9815810322761536, + -6.535262946272269e-05, + -0.9808509945869446 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 491680, + "componentType": 5126, + "count": 30, + "max": [ + 0.3456365764141083, + 0.7192899584770203 + ], + "min": [ + 0.15705560147762299, + 0.5053586959838867 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 491920, + "componentType": 5126, + "count": 30, + "max": [ + 0.3456365764141083, + 0.7192899584770203 + ], + "min": [ + 0.15705560147762299, + 0.5053586959838867 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 492160, + "componentType": 5126, + "count": 30, + "max": [ + 0.3456365764141083, + 0.7192899584770203 + ], + "min": [ + 0.15705560147762299, + 0.5053586959838867 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 636888, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1374768, + "componentType": 5126, + "count": 28, + "max": [ + -0.2550384998321533, + -0.04088224470615387, + -0.25246334075927734 + ], + "min": [ + -0.37318456172943115, + -0.09754288196563721, + -0.36258721351623535 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1375104, + "componentType": 5126, + "count": 28, + "max": [ + 0.9808127284049988, + 1.0495235073904041e-05, + 0.9807906746864319 + ], + "min": [ + -0.9808177351951599, + -1.1034310773538891e-05, + -0.9807828068733215 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 492400, + "componentType": 5126, + "count": 28, + "max": [ + 0.3456365466117859, + 0.7192903161048889 + ], + "min": [ + 0.1570555865764618, + 0.5053586959838867 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 492624, + "componentType": 5126, + "count": 28, + "max": [ + 0.3456365466117859, + 0.7192903161048889 + ], + "min": [ + 0.1570555865764618, + 0.5053586959838867 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 492848, + "componentType": 5126, + "count": 28, + "max": [ + 0.3456365466117859, + 0.7192903161048889 + ], + "min": [ + 0.1570555865764618, + 0.5053586959838867 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 637176, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1375440, + "componentType": 5126, + "count": 28, + "max": [ + -0.06513798236846924, + -0.04088224470615387, + -0.2523884177207947 + ], + "min": [ + -0.18251144886016846, + -0.09754288196563721, + -0.3635939359664917 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1375776, + "componentType": 5126, + "count": 28, + "max": [ + 0.9808403253555298, + 6.56111296848394e-05, + 0.9807897210121155 + ], + "min": [ + -0.9808407425880432, + -6.774663052055985e-05, + -0.980779767036438 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 493072, + "componentType": 5126, + "count": 28, + "max": [ + 0.3456365466117859, + 0.719290018081665 + ], + "min": [ + 0.1570555865764618, + 0.5053586959838867 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 493296, + "componentType": 5126, + "count": 28, + "max": [ + 0.3456365466117859, + 0.719290018081665 + ], + "min": [ + 0.1570555865764618, + 0.5053586959838867 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 493520, + "componentType": 5126, + "count": 28, + "max": [ + 0.3456365466117859, + 0.719290018081665 + ], + "min": [ + 0.1570555865764618, + 0.5053586959838867 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 637464, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1376112, + "componentType": 5126, + "count": 28, + "max": [ + 0.1251128911972046, + -0.04088224470615387, + -0.2523927688598633 + ], + "min": [ + 0.007811427116394043, + -0.09754288196563721, + -0.36364126205444336 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1376448, + "componentType": 5126, + "count": 28, + "max": [ + 0.9808964729309082, + 1.4284627468441613e-05, + 0.9807782173156738 + ], + "min": [ + -0.9808964729309082, + -1.765625893312972e-05, + -0.9807944893836975 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 493744, + "componentType": 5126, + "count": 28, + "max": [ + 0.345636785030365, + 0.7192898392677307 + ], + "min": [ + 0.15705560147762299, + 0.5053586959838867 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 493968, + "componentType": 5126, + "count": 28, + "max": [ + 0.345636785030365, + 0.7192898392677307 + ], + "min": [ + 0.15705560147762299, + 0.5053586959838867 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 494192, + "componentType": 5126, + "count": 28, + "max": [ + 0.345636785030365, + 0.7192898392677307 + ], + "min": [ + 0.15705560147762299, + 0.5053586959838867 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 637752, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1376784, + "componentType": 5126, + "count": 34, + "max": [ + -1.6940405368804932, + -0.04088224470615387, + 0.5565060973167419 + ], + "min": [ + -1.8122252225875854, + -0.09754288196563721, + 0.44515663385391235 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1377192, + "componentType": 5126, + "count": 34, + "max": [ + 0.9813300967216492, + 7.270782953128219e-05, + 0.9809819459915161 + ], + "min": [ + -0.9813825488090515, + -5.632088505080901e-05, + -0.9809182286262512 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 494416, + "componentType": 5126, + "count": 34, + "max": [ + 0.3454480767250061, + 0.7192911505699158 + ], + "min": [ + 0.1568463146686554, + 0.505518913269043 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 494688, + "componentType": 5126, + "count": 34, + "max": [ + 0.3454480767250061, + 0.7192911505699158 + ], + "min": [ + 0.1568463146686554, + 0.505518913269043 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 494960, + "componentType": 5126, + "count": 34, + "max": [ + 0.3454480767250061, + 0.7192911505699158 + ], + "min": [ + 0.1568463146686554, + 0.505518913269043 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 638040, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1377600, + "componentType": 5126, + "count": 36, + "max": [ + -1.5037792921066284, + -0.04088224470615387, + 0.5563896894454956 + ], + "min": [ + -1.6220455169677734, + -0.09754288196563721, + 0.44523486495018005 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1378032, + "componentType": 5126, + "count": 36, + "max": [ + 0.9815187454223633, + 6.450177897932008e-05, + 0.9807759523391724 + ], + "min": [ + -0.9809086322784424, + -0.00019464356591925025, + -0.9822543859481812 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 495232, + "componentType": 5126, + "count": 36, + "max": [ + 0.3454481065273285, + 0.7192912101745605 + ], + "min": [ + 0.1568463146686554, + 0.505518913269043 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 495520, + "componentType": 5126, + "count": 36, + "max": [ + 0.3454481065273285, + 0.7192912101745605 + ], + "min": [ + 0.1568463146686554, + 0.505518913269043 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 495808, + "componentType": 5126, + "count": 36, + "max": [ + 0.3454481065273285, + 0.7192912101745605 + ], + "min": [ + 0.1568463146686554, + 0.505518913269043 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 638328, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1378464, + "componentType": 5126, + "count": 32, + "max": [ + -1.313750982284546, + -0.04088224470615387, + 0.5564963817596436 + ], + "min": [ + -1.4317634105682373, + -0.09754288196563721, + 0.4452950358390808 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1378848, + "componentType": 5126, + "count": 32, + "max": [ + 0.980854332447052, + 0.00010153945186175406, + 0.9809421896934509 + ], + "min": [ + -0.9809186458587646, + -0.00015116961731109768, + -0.9821173548698425 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 496096, + "componentType": 5126, + "count": 32, + "max": [ + 0.34544801712036133, + 0.7192911505699158 + ], + "min": [ + 0.1568463295698166, + 0.505518913269043 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 496352, + "componentType": 5126, + "count": 32, + "max": [ + 0.34544801712036133, + 0.7192911505699158 + ], + "min": [ + 0.1568463295698166, + 0.505518913269043 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 496608, + "componentType": 5126, + "count": 32, + "max": [ + 0.34544801712036133, + 0.7192911505699158 + ], + "min": [ + 0.1568463295698166, + 0.505518913269043 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 638616, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1379232, + "componentType": 5126, + "count": 28, + "max": [ + -1.123184323310852, + -0.04088224470615387, + 0.5564469695091248 + ], + "min": [ + -1.241170883178711, + -0.09754288196563721, + 0.44514843821525574 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1379568, + "componentType": 5126, + "count": 28, + "max": [ + 0.9815278649330139, + 1.757778227329254e-05, + 0.9809194803237915 + ], + "min": [ + -0.9810644388198853, + -1.568688458064571e-05, + -0.9808447957038879 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 496864, + "componentType": 5126, + "count": 28, + "max": [ + 0.3454480469226837, + 0.7192909717559814 + ], + "min": [ + 0.15684635937213898, + 0.5055189728736877 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 497088, + "componentType": 5126, + "count": 28, + "max": [ + 0.3454480469226837, + 0.7192909717559814 + ], + "min": [ + 0.15684635937213898, + 0.5055189728736877 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 497312, + "componentType": 5126, + "count": 28, + "max": [ + 0.3454480469226837, + 0.7192909717559814 + ], + "min": [ + 0.15684635937213898, + 0.5055189728736877 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 638904, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1379904, + "componentType": 5126, + "count": 28, + "max": [ + -0.8071460723876953, + -0.04088224470615387, + 0.5565189719200134 + ], + "min": [ + -0.9252554178237915, + -0.09754288196563721, + 0.44515928626060486 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1380240, + "componentType": 5126, + "count": 28, + "max": [ + 0.9814019799232483, + 2.3536384105682373e-05, + 0.9807378053665161 + ], + "min": [ + -0.9814013242721558, + -1.1980533599853516e-05, + -0.980835497379303 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 497536, + "componentType": 5126, + "count": 28, + "max": [ + 0.3454481065273285, + 0.7192911505699158 + ], + "min": [ + 0.1568462997674942, + 0.505518913269043 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 497760, + "componentType": 5126, + "count": 28, + "max": [ + 0.3454481065273285, + 0.7192911505699158 + ], + "min": [ + 0.1568462997674942, + 0.505518913269043 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 497984, + "componentType": 5126, + "count": 28, + "max": [ + 0.3454481065273285, + 0.7192911505699158 + ], + "min": [ + 0.1568462997674942, + 0.505518913269043 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 639192, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1380576, + "componentType": 5126, + "count": 38, + "max": [ + -0.6170616149902344, + -0.04088224470615387, + 0.5565162301063538 + ], + "min": [ + -0.7349858283996582, + -0.09754288196563721, + 0.4451618492603302 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1381032, + "componentType": 5126, + "count": 38, + "max": [ + 0.981086254119873, + 7.63877178542316e-05, + 0.9808381795883179 + ], + "min": [ + -0.9811835289001465, + -0.00019597333448473364, + -0.9808939099311829 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 498208, + "componentType": 5126, + "count": 38, + "max": [ + 0.3454480767250061, + 0.7192912697792053 + ], + "min": [ + 0.15684635937213898, + 0.505518913269043 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 498512, + "componentType": 5126, + "count": 38, + "max": [ + 0.3454480767250061, + 0.7192912697792053 + ], + "min": [ + 0.15684635937213898, + 0.505518913269043 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 498816, + "componentType": 5126, + "count": 38, + "max": [ + 0.3454480767250061, + 0.7192912697792053 + ], + "min": [ + 0.15684635937213898, + 0.505518913269043 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 639480, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1381488, + "componentType": 5126, + "count": 36, + "max": [ + -1.680511474609375, + -0.04088224470615387, + -0.0630185604095459 + ], + "min": [ + -1.7986228466033936, + -0.09754288196563721, + -0.17404454946517944 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1381920, + "componentType": 5126, + "count": 36, + "max": [ + 0.9816046953201294, + 1.3940036296844482e-05, + 0.9807574152946472 + ], + "min": [ + -0.980922281742096, + -9.59760927798925e-06, + -0.9825182557106018 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 499120, + "componentType": 5126, + "count": 36, + "max": [ + 0.3456781208515167, + 0.7193037271499634 + ], + "min": [ + 0.15708374977111816, + 0.5053346753120422 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 499408, + "componentType": 5126, + "count": 36, + "max": [ + 0.3456781208515167, + 0.7193037271499634 + ], + "min": [ + 0.15708374977111816, + 0.5053346753120422 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 499696, + "componentType": 5126, + "count": 36, + "max": [ + 0.3456781208515167, + 0.7193037271499634 + ], + "min": [ + 0.15708374977111816, + 0.5053346753120422 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 639768, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1382352, + "componentType": 5126, + "count": 38, + "max": [ + -1.2999274730682373, + -0.04088224470615387, + -0.0630420446395874 + ], + "min": [ + -1.4180488586425781, + -0.09754288196563721, + -0.17404574155807495 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1382808, + "componentType": 5126, + "count": 38, + "max": [ + 0.9816243648529053, + 0.000133856461616233, + 0.9807890057563782 + ], + "min": [ + -0.9809232950210571, + -9.189019328914583e-05, + -0.9825206995010376 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 499984, + "componentType": 5126, + "count": 38, + "max": [ + 0.3456780016422272, + 0.7193037271499634 + ], + "min": [ + 0.15708373486995697, + 0.5053346157073975 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 500288, + "componentType": 5126, + "count": 38, + "max": [ + 0.3456780016422272, + 0.7193037271499634 + ], + "min": [ + 0.15708373486995697, + 0.5053346157073975 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 500592, + "componentType": 5126, + "count": 38, + "max": [ + 0.3456780016422272, + 0.7193037271499634 + ], + "min": [ + 0.15708373486995697, + 0.5053346157073975 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 640056, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1383264, + "componentType": 5126, + "count": 40, + "max": [ + -0.4264945983886719, + -0.04088224470615387, + 0.5565088391304016 + ], + "min": [ + -0.5446858406066895, + -0.09754288196563721, + 0.44521164894104004 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1383744, + "componentType": 5126, + "count": 40, + "max": [ + 0.9813297390937805, + 7.270782953128219e-05, + 0.9809973835945129 + ], + "min": [ + -0.981171190738678, + -6.5384287154302e-05, + -0.9808309078216553 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 500896, + "componentType": 5126, + "count": 40, + "max": [ + 0.34544801712036133, + 0.7192912101745605 + ], + "min": [ + 0.1568463146686554, + 0.505518913269043 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 501216, + "componentType": 5126, + "count": 40, + "max": [ + 0.34544801712036133, + 0.7192912101745605 + ], + "min": [ + 0.1568463146686554, + 0.505518913269043 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 501536, + "componentType": 5126, + "count": 40, + "max": [ + 0.34544801712036133, + 0.7192912101745605 + ], + "min": [ + 0.1568463146686554, + 0.505518913269043 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 640344, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1384224, + "componentType": 5126, + "count": 40, + "max": [ + -1.1095802783966064, + -0.04088224470615387, + -0.0630420446395874 + ], + "min": [ + -1.2277017831802368, + -0.09754288196563721, + -0.17404574155807495 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1384704, + "componentType": 5126, + "count": 40, + "max": [ + 0.9809197783470154, + 6.557346932822838e-05, + 0.9807888865470886 + ], + "min": [ + -0.9816259145736694, + -0.00013360701268538833, + -0.9825188517570496 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 501856, + "componentType": 5126, + "count": 40, + "max": [ + 0.3456779718399048, + 0.7193037867546082 + ], + "min": [ + 0.15708374977111816, + 0.5053346157073975 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 502176, + "componentType": 5126, + "count": 40, + "max": [ + 0.3456779718399048, + 0.7193037867546082 + ], + "min": [ + 0.15708374977111816, + 0.5053346157073975 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 502496, + "componentType": 5126, + "count": 40, + "max": [ + 0.3456779718399048, + 0.7193037867546082 + ], + "min": [ + 0.15708374977111816, + 0.5053346157073975 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 640632, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1385184, + "componentType": 5126, + "count": 28, + "max": [ + -0.9193471670150757, + -0.04088224470615387, + -0.06307399272918701 + ], + "min": [ + -1.0374321937561035, + -0.09754288196563721, + -0.17415326833724976 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1385520, + "componentType": 5126, + "count": 28, + "max": [ + 0.981602132320404, + 1.1136756256746594e-05, + 0.9807558059692383 + ], + "min": [ + -0.9816281795501709, + -2.1794812710140832e-05, + -0.9808515906333923 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 502816, + "componentType": 5126, + "count": 28, + "max": [ + 0.3456780016422272, + 0.719303548336029 + ], + "min": [ + 0.15708374977111816, + 0.5053346753120422 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 503040, + "componentType": 5126, + "count": 28, + "max": [ + 0.3456780016422272, + 0.719303548336029 + ], + "min": [ + 0.15708374977111816, + 0.5053346753120422 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 503264, + "componentType": 5126, + "count": 28, + "max": [ + 0.3456780016422272, + 0.719303548336029 + ], + "min": [ + 0.15708374977111816, + 0.5053346753120422 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 640920, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1385856, + "componentType": 5126, + "count": 28, + "max": [ + -0.7290457487106323, + -0.04088224470615387, + -0.06290322542190552 + ], + "min": [ + -0.8466997146606445, + -0.09754288196563721, + -0.17414367198944092 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1386192, + "componentType": 5126, + "count": 28, + "max": [ + 0.9816244840621948, + 1.065526157617569e-05, + 0.9810348749160767 + ], + "min": [ + -0.980871319770813, + -6.480861338786781e-05, + -0.9808557629585266 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 503488, + "componentType": 5126, + "count": 28, + "max": [ + 0.3456780016422272, + 0.7193033695220947 + ], + "min": [ + 0.15708379447460175, + 0.5053346157073975 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 503712, + "componentType": 5126, + "count": 28, + "max": [ + 0.3456780016422272, + 0.7193033695220947 + ], + "min": [ + 0.15708379447460175, + 0.5053346157073975 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 503936, + "componentType": 5126, + "count": 28, + "max": [ + 0.3456780016422272, + 0.7193033695220947 + ], + "min": [ + 0.15708379447460175, + 0.5053346157073975 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 641208, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1386528, + "componentType": 5126, + "count": 36, + "max": [ + -0.23646628856658936, + -0.04088224470615387, + 0.5564598441123962 + ], + "min": [ + -0.35419905185699463, + -0.09754288196563721, + 0.44515904784202576 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1386960, + "componentType": 5126, + "count": 36, + "max": [ + 0.9808705449104309, + 1.2820586562156677e-05, + 0.9807798862457275 + ], + "min": [ + -0.9810794591903687, + -1.5893669115030207e-05, + -0.9808940291404724 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 504160, + "componentType": 5126, + "count": 36, + "max": [ + 0.3454480469226837, + 0.7192911505699158 + ], + "min": [ + 0.156846284866333, + 0.505518913269043 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 504448, + "componentType": 5126, + "count": 36, + "max": [ + 0.3454480469226837, + 0.7192911505699158 + ], + "min": [ + 0.156846284866333, + 0.505518913269043 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 504736, + "componentType": 5126, + "count": 36, + "max": [ + 0.3454480469226837, + 0.7192911505699158 + ], + "min": [ + 0.156846284866333, + 0.505518913269043 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 641496, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1387392, + "componentType": 5126, + "count": 24, + "max": [ + -0.5392085313796997, + -0.04088224470615387, + -0.06290322542190552 + ], + "min": [ + -0.6568626165390015, + -0.09754288196563721, + -0.17414367198944092 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1387680, + "componentType": 5126, + "count": 24, + "max": [ + 0.9808762669563293, + 0.0, + 0.9810369610786438 + ], + "min": [ + -0.9816245436668396, + 0.0, + -0.9808522462844849 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 505024, + "componentType": 5126, + "count": 24, + "max": [ + 0.34567803144454956, + 0.719303548336029 + ], + "min": [ + 0.15708379447460175, + 0.5053346157073975 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 505216, + "componentType": 5126, + "count": 24, + "max": [ + 0.34567803144454956, + 0.719303548336029 + ], + "min": [ + 0.15708379447460175, + 0.5053346157073975 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 505408, + "componentType": 5126, + "count": 24, + "max": [ + 0.34567803144454956, + 0.719303548336029 + ], + "min": [ + 0.15708379447460175, + 0.5053346157073975 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 641784, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1387968, + "componentType": 5126, + "count": 28, + "max": [ + -0.34892165660858154, + -0.04088224470615387, + -0.06290322542190552 + ], + "min": [ + -0.4665757417678833, + -0.09754288196563721, + -0.17414367198944092 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1388304, + "componentType": 5126, + "count": 28, + "max": [ + 0.9808804988861084, + 2.3322176275542006e-05, + 0.9810369610786438 + ], + "min": [ + -0.9816245436668396, + -1.1879021258209832e-05, + -0.9808522462844849 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 505600, + "componentType": 5126, + "count": 28, + "max": [ + 0.34567803144454956, + 0.719303548336029 + ], + "min": [ + 0.15708379447460175, + 0.5053346157073975 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 505824, + "componentType": 5126, + "count": 28, + "max": [ + 0.34567803144454956, + 0.719303548336029 + ], + "min": [ + 0.15708379447460175, + 0.5053346157073975 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 506048, + "componentType": 5126, + "count": 28, + "max": [ + 0.34567803144454956, + 0.719303548336029 + ], + "min": [ + 0.15708379447460175, + 0.5053346157073975 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 642072, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1388640, + "componentType": 5126, + "count": 34, + "max": [ + 0.08349263668060303, + -0.04088224470615387, + 0.5563896298408508 + ], + "min": [ + -0.034773945808410645, + -0.09754288196563721, + 0.44523489475250244 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1389048, + "componentType": 5126, + "count": 34, + "max": [ + 0.9815180897712708, + 6.154170114314184e-05, + 0.9807769656181335 + ], + "min": [ + -0.9809094071388245, + -0.00019522660295479, + -0.9822495579719543 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 506272, + "componentType": 5126, + "count": 34, + "max": [ + 0.34544825553894043, + 0.7192912697792053 + ], + "min": [ + 0.1568462997674942, + 0.505518913269043 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 506544, + "componentType": 5126, + "count": 34, + "max": [ + 0.34544825553894043, + 0.7192912697792053 + ], + "min": [ + 0.1568462997674942, + 0.505518913269043 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 506816, + "componentType": 5126, + "count": 34, + "max": [ + 0.34544825553894043, + 0.7192912697792053 + ], + "min": [ + 0.1568462997674942, + 0.505518913269043 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 642360, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1389456, + "componentType": 5126, + "count": 32, + "max": [ + 0.2223726511001587, + -0.04088224470615387, + -0.06279468536376953 + ], + "min": [ + 0.10424792766571045, + -0.09754288196563721, + -0.1729246973991394 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1389840, + "componentType": 5126, + "count": 32, + "max": [ + 0.9815211892127991, + 5.7941571867559105e-05, + 0.9811360836029053 + ], + "min": [ + -0.9808121919631958, + -6.918067811056972e-05, + -0.9807837009429932 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 507088, + "componentType": 5126, + "count": 32, + "max": [ + 0.34567803144454956, + 0.719304084777832 + ], + "min": [ + 0.15708371996879578, + 0.5053346157073975 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 507344, + "componentType": 5126, + "count": 32, + "max": [ + 0.34567803144454956, + 0.719304084777832 + ], + "min": [ + 0.15708371996879578, + 0.5053346157073975 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 507600, + "componentType": 5126, + "count": 32, + "max": [ + 0.34567803144454956, + 0.719304084777832 + ], + "min": [ + 0.15708371996879578, + 0.5053346157073975 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 642648, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1390224, + "componentType": 5126, + "count": 32, + "max": [ + -1.5393695831298828, + -0.04088224470615387, + 0.1284140944480896 + ], + "min": [ + -1.6574711799621582, + -0.09754288196563721, + 0.01731047034263611 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1390608, + "componentType": 5126, + "count": 32, + "max": [ + 0.9815249443054199, + 8.117755351122469e-05, + 0.98072749376297 + ], + "min": [ + -0.9815270900726318, + -1.8581748008728027e-05, + -0.9808447957038879 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 507856, + "componentType": 5126, + "count": 32, + "max": [ + 0.3456360399723053, + 0.7193018198013306 + ], + "min": [ + 0.15702876448631287, + 0.5053865313529968 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 508112, + "componentType": 5126, + "count": 32, + "max": [ + 0.3456360399723053, + 0.7193018198013306 + ], + "min": [ + 0.15702876448631287, + 0.5053865313529968 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 508368, + "componentType": 5126, + "count": 32, + "max": [ + 0.3456360399723053, + 0.7193018198013306 + ], + "min": [ + 0.15702876448631287, + 0.5053865313529968 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 642936, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1390992, + "componentType": 5126, + "count": 24, + "max": [ + 0.273520827293396, + -0.04088224470615387, + 0.5564964413642883 + ], + "min": [ + 0.1555083990097046, + -0.09754288196563721, + 0.4452950358390808 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1391280, + "componentType": 5126, + "count": 24, + "max": [ + 0.9808520078659058, + 0.0, + 0.9809384346008301 + ], + "min": [ + -0.9809173345565796, + 0.0, + -0.9821183681488037 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 508624, + "componentType": 5126, + "count": 24, + "max": [ + 0.3454483151435852, + 0.7192914485931396 + ], + "min": [ + 0.15684619545936584, + 0.505518913269043 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 508816, + "componentType": 5126, + "count": 24, + "max": [ + 0.3454483151435852, + 0.7192914485931396 + ], + "min": [ + 0.15684619545936584, + 0.505518913269043 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 509008, + "componentType": 5126, + "count": 24, + "max": [ + 0.3454483151435852, + 0.7192914485931396 + ], + "min": [ + 0.15684619545936584, + 0.505518913269043 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 643224, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1391568, + "componentType": 5126, + "count": 36, + "max": [ + -1.3490829467773438, + -0.04088224470615387, + 0.12841445207595825 + ], + "min": [ + -1.46718430519104, + -0.09754288196563721, + 0.017310500144958496 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1392000, + "componentType": 5126, + "count": 36, + "max": [ + 0.9815247654914856, + 8.117753895930946e-05, + 0.9807273745536804 + ], + "min": [ + -0.9815251231193542, + -5.2103005145909265e-05, + -0.9808492660522461 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 509200, + "componentType": 5126, + "count": 36, + "max": [ + 0.34563595056533813, + 0.7193018198013306 + ], + "min": [ + 0.15702877938747406, + 0.5053865313529968 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 509488, + "componentType": 5126, + "count": 36, + "max": [ + 0.34563595056533813, + 0.7193018198013306 + ], + "min": [ + 0.15702877938747406, + 0.5053865313529968 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 509776, + "componentType": 5126, + "count": 36, + "max": [ + 0.34563595056533813, + 0.7193018198013306 + ], + "min": [ + 0.15702877938747406, + 0.5053865313529968 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 643512, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1392432, + "componentType": 5126, + "count": 36, + "max": [ + -0.9685089588165283, + -0.04088224470615387, + 0.1284140944480896 + ], + "min": [ + -1.0866105556488037, + -0.09754288196563721, + 0.01731047034263611 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1392864, + "componentType": 5126, + "count": 36, + "max": [ + 0.9815271496772766, + 5.610559310298413e-05, + 0.9807279109954834 + ], + "min": [ + -0.9815288186073303, + -6.555769505212083e-05, + -0.9808458089828491 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 510064, + "componentType": 5126, + "count": 36, + "max": [ + 0.3456360101699829, + 0.7193017601966858 + ], + "min": [ + 0.15702877938747406, + 0.5053865909576416 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 510352, + "componentType": 5126, + "count": 36, + "max": [ + 0.3456360101699829, + 0.7193017601966858 + ], + "min": [ + 0.15702877938747406, + 0.5053865909576416 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 510640, + "componentType": 5126, + "count": 36, + "max": [ + 0.3456360101699829, + 0.7193017601966858 + ], + "min": [ + 0.15702877938747406, + 0.5053865909576416 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 643800, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1393296, + "componentType": 5126, + "count": 36, + "max": [ + 0.17283785343170166, + -0.04088224470615387, + 0.12855932116508484 + ], + "min": [ + 0.05509817600250244, + -0.09754288196563721, + 0.017317742109298706 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1393728, + "componentType": 5126, + "count": 36, + "max": [ + 0.9808914065361023, + 7.331223605433479e-05, + 0.9809948801994324 + ], + "min": [ + -0.9815422892570496, + -0.00011447962606325746, + -0.9808427095413208 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 510928, + "componentType": 5126, + "count": 36, + "max": [ + 0.345636248588562, + 0.7193018794059753 + ], + "min": [ + 0.15702876448631287, + 0.505386471748352 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 511216, + "componentType": 5126, + "count": 36, + "max": [ + 0.345636248588562, + 0.7193018794059753 + ], + "min": [ + 0.15702876448631287, + 0.505386471748352 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 511504, + "componentType": 5126, + "count": 36, + "max": [ + 0.345636248588562, + 0.7193018794059753 + ], + "min": [ + 0.15702876448631287, + 0.505386471748352 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 644088, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1394160, + "componentType": 5126, + "count": 32, + "max": [ + 0.4638158082962036, + -0.04088224470615387, + 0.5564524531364441 + ], + "min": [ + 0.3458160161972046, + -0.09754288196563721, + 0.4452088475227356 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1394544, + "componentType": 5126, + "count": 32, + "max": [ + 0.9808523654937744, + 6.544726784341037e-05, + 0.9809384346008301 + ], + "min": [ + -0.9813272356987, + -1.6851263353601098e-05, + -0.9808284044265747 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 511792, + "componentType": 5126, + "count": 32, + "max": [ + 0.34544801712036133, + 0.7192912697792053 + ], + "min": [ + 0.15684621036052704, + 0.5055189728736877 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 512048, + "componentType": 5126, + "count": 32, + "max": [ + 0.34544801712036133, + 0.7192912697792053 + ], + "min": [ + 0.15684621036052704, + 0.5055189728736877 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 512304, + "componentType": 5126, + "count": 32, + "max": [ + 0.34544801712036133, + 0.7192912697792053 + ], + "min": [ + 0.15684621036052704, + 0.5055189728736877 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 644376, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1394928, + "componentType": 5126, + "count": 30, + "max": [ + -2.0132176876068115, + -0.04088224470615387, + 0.5565190315246582 + ], + "min": [ + -2.131326913833618, + -0.09754288196563721, + 0.44515925645828247 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1395288, + "componentType": 5126, + "count": 30, + "max": [ + 0.9813995361328125, + 1.4877845387673005e-05, + 0.9807378053665161 + ], + "min": [ + -0.9813993573188782, + -1.4901161193847656e-05, + -0.9808382391929626 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 512560, + "componentType": 5126, + "count": 30, + "max": [ + 0.3454480767250061, + 0.7192911505699158 + ], + "min": [ + 0.1568463146686554, + 0.505518913269043 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 512800, + "componentType": 5126, + "count": 30, + "max": [ + 0.3454480767250061, + 0.7192911505699158 + ], + "min": [ + 0.1568463146686554, + 0.505518913269043 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 513040, + "componentType": 5126, + "count": 30, + "max": [ + 0.3454480767250061, + 0.7192911505699158 + ], + "min": [ + 0.1568463146686554, + 0.505518913269043 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 644664, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1395648, + "componentType": 5126, + "count": 40, + "max": [ + 0.6540838479995728, + -0.04088224470615387, + 0.5564936995506287 + ], + "min": [ + 0.5360778570175171, + -0.09754288196563721, + 0.4452400803565979 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1396128, + "componentType": 5126, + "count": 40, + "max": [ + 0.9810689687728882, + 2.6514753699302673e-05, + 0.9809194803237915 + ], + "min": [ + -0.9809173941612244, + -1.3501383364200592e-05, + -0.9822170734405518 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 513280, + "componentType": 5126, + "count": 40, + "max": [ + 0.3454483151435852, + 0.7192913293838501 + ], + "min": [ + 0.15684621036052704, + 0.505518913269043 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 513600, + "componentType": 5126, + "count": 40, + "max": [ + 0.3454483151435852, + 0.7192913293838501 + ], + "min": [ + 0.15684621036052704, + 0.505518913269043 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 513920, + "componentType": 5126, + "count": 40, + "max": [ + 0.3454483151435852, + 0.7192913293838501 + ], + "min": [ + 0.15684621036052704, + 0.505518913269043 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 644952, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1396608, + "componentType": 5126, + "count": 24, + "max": [ + 0.9092937707901001, + -0.04088224470615387, + 0.5565528869628906 + ], + "min": [ + 0.791089653968811, + -0.09754288196563721, + 0.44529783725738525 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1396896, + "componentType": 5126, + "count": 24, + "max": [ + 0.9811732172966003, + 0.0, + 0.9809964299201965 + ], + "min": [ + -0.9809238314628601, + 0.0, + -0.9821439385414124 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 514240, + "componentType": 5126, + "count": 24, + "max": [ + 0.34544822573661804, + 0.7192913293838501 + ], + "min": [ + 0.15684616565704346, + 0.5055187940597534 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 514432, + "componentType": 5126, + "count": 24, + "max": [ + 0.34544822573661804, + 0.7192913293838501 + ], + "min": [ + 0.15684616565704346, + 0.5055187940597534 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 514624, + "componentType": 5126, + "count": 24, + "max": [ + 0.34544822573661804, + 0.7192913293838501 + ], + "min": [ + 0.15684616565704346, + 0.5055187940597534 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 645240, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1397184, + "componentType": 5126, + "count": 36, + "max": [ + -1.490203857421875, + -0.04088224470615387, + -0.06307071447372437 + ], + "min": [ + -1.6082966327667236, + -0.09754288196563721, + -0.1741170883178711 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1397616, + "componentType": 5126, + "count": 36, + "max": [ + 0.9814780354499817, + 5.4648429795634e-05, + 0.980766773223877 + ], + "min": [ + -0.9815025925636292, + -5.48159187019337e-05, + -0.9808480143547058 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 514816, + "componentType": 5126, + "count": 36, + "max": [ + 0.34567806124687195, + 0.719303548336029 + ], + "min": [ + 0.15708374977111816, + 0.5053346157073975 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 515104, + "componentType": 5126, + "count": 36, + "max": [ + 0.34567806124687195, + 0.719303548336029 + ], + "min": [ + 0.15708374977111816, + 0.5053346157073975 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 515392, + "componentType": 5126, + "count": 36, + "max": [ + 0.34567806124687195, + 0.719303548336029 + ], + "min": [ + 0.15708374977111816, + 0.5053346157073975 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 645528, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1398048, + "componentType": 5126, + "count": 34, + "max": [ + 1.0996407270431519, + -0.04088224470615387, + 0.5563896894454956 + ], + "min": [ + 0.9813746213912964, + -0.09754288196563721, + 0.44523489475250244 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1398456, + "componentType": 5126, + "count": 34, + "max": [ + 0.9815171360969543, + 2.0936131477355957e-05, + 0.9807748794555664 + ], + "min": [ + -0.9809051752090454, + -6.555789877893403e-05, + -0.982250452041626 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 515680, + "componentType": 5126, + "count": 34, + "max": [ + 0.34544825553894043, + 0.7192913293838501 + ], + "min": [ + 0.15684624016284943, + 0.5055190324783325 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 515952, + "componentType": 5126, + "count": 34, + "max": [ + 0.34544825553894043, + 0.7192913293838501 + ], + "min": [ + 0.15684624016284943, + 0.5055190324783325 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 516224, + "componentType": 5126, + "count": 34, + "max": [ + 0.34544825553894043, + 0.7192913293838501 + ], + "min": [ + 0.15684624016284943, + 0.5055190324783325 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 645816, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1398864, + "componentType": 5126, + "count": 40, + "max": [ + 1.2899492979049683, + -0.04088224470615387, + 0.5565087199211121 + ], + "min": [ + 1.1717575788497925, + -0.09754288196563721, + 0.44521164894104004 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1399344, + "componentType": 5126, + "count": 40, + "max": [ + 0.9813390970230103, + 5.8687710406957194e-05, + 0.9810009002685547 + ], + "min": [ + -0.9811739921569824, + -0.0001314085820922628, + -0.9808308482170105 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 516496, + "componentType": 5126, + "count": 40, + "max": [ + 0.3454483151435852, + 0.7192913293838501 + ], + "min": [ + 0.15684621036052704, + 0.505518913269043 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 516816, + "componentType": 5126, + "count": 40, + "max": [ + 0.3454483151435852, + 0.7192913293838501 + ], + "min": [ + 0.15684621036052704, + 0.505518913269043 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 517136, + "componentType": 5126, + "count": 40, + "max": [ + 0.3454483151435852, + 0.7192913293838501 + ], + "min": [ + 0.15684621036052704, + 0.505518913269043 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 646104, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1399824, + "componentType": 5126, + "count": 28, + "max": [ + 0.9092937707901001, + -0.04088224470615387, + 0.12841463088989258 + ], + "min": [ + 0.7911924123764038, + -0.09754288196563721, + 0.017310619354248047 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1400160, + "componentType": 5126, + "count": 28, + "max": [ + 0.9815223217010498, + 5.5976255680434406e-05, + 0.9807254672050476 + ], + "min": [ + -0.9815247654914856, + -1.900643292174209e-05, + -0.9808447957038879 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 517456, + "componentType": 5126, + "count": 28, + "max": [ + 0.34563612937927246, + 0.7193018794059753 + ], + "min": [ + 0.15702876448631287, + 0.5053867101669312 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 517680, + "componentType": 5126, + "count": 28, + "max": [ + 0.34563612937927246, + 0.7193018794059753 + ], + "min": [ + 0.15702876448631287, + 0.5053867101669312 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 517904, + "componentType": 5126, + "count": 28, + "max": [ + 0.34563612937927246, + 0.7193018794059753 + ], + "min": [ + 0.15702876448631287, + 0.5053867101669312 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 646392, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1400496, + "componentType": 5126, + "count": 28, + "max": [ + 1.0995806455612183, + -0.04088224470615387, + 0.1284143030643463 + ], + "min": [ + 0.9814790487289429, + -0.09754288196563721, + 0.01731058955192566 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1400832, + "componentType": 5126, + "count": 28, + "max": [ + 0.9815247654914856, + 1.1526050002430566e-05, + 0.9807280898094177 + ], + "min": [ + -0.9815249443054199, + -1.778453770384658e-05, + -0.9808447957038879 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 518128, + "componentType": 5126, + "count": 28, + "max": [ + 0.3456360995769501, + 0.7193018198013306 + ], + "min": [ + 0.15702879428863525, + 0.505386471748352 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 518352, + "componentType": 5126, + "count": 28, + "max": [ + 0.3456360995769501, + 0.7193018198013306 + ], + "min": [ + 0.15702879428863525, + 0.505386471748352 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 518576, + "componentType": 5126, + "count": 28, + "max": [ + 0.3456360995769501, + 0.7193018198013306 + ], + "min": [ + 0.15702879428863525, + 0.505386471748352 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 646680, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1401168, + "componentType": 5126, + "count": 42, + "max": [ + 0.9093316793441772, + -0.04088224470615387, + 0.31839025020599365 + ], + "min": [ + 0.7911547422409058, + -0.09754288196563721, + 0.20719033479690552 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1401672, + "componentType": 5126, + "count": 42, + "max": [ + 0.9814610481262207, + 2.099946141242981e-05, + 0.9807336330413818 + ], + "min": [ + -0.981457531452179, + -7.103494863258675e-05, + -0.9808411002159119 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 518800, + "componentType": 5126, + "count": 42, + "max": [ + 0.3454321026802063, + 0.7192903757095337 + ], + "min": [ + 0.15687048435211182, + 0.5055179595947266 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 519136, + "componentType": 5126, + "count": 42, + "max": [ + 0.3454321026802063, + 0.7192903757095337 + ], + "min": [ + 0.15687048435211182, + 0.5055179595947266 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 519472, + "componentType": 5126, + "count": 42, + "max": [ + 0.3454321026802063, + 0.7192903757095337 + ], + "min": [ + 0.15687048435211182, + 0.5055179595947266 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 646968, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1402176, + "componentType": 5126, + "count": 32, + "max": [ + 1.2898675203323364, + -0.04088224470615387, + 0.12841424345970154 + ], + "min": [ + 1.171765923500061, + -0.09754288196563721, + 0.01731058955192566 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1402560, + "componentType": 5126, + "count": 32, + "max": [ + 0.9815220832824707, + 1.8833205103874207e-05, + 0.9807254076004028 + ], + "min": [ + -0.9815198183059692, + -1.900643292174209e-05, + -0.9808447957038879 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 519808, + "componentType": 5126, + "count": 32, + "max": [ + 0.3456362187862396, + 0.7193018794059753 + ], + "min": [ + 0.15702864527702332, + 0.505386471748352 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 520064, + "componentType": 5126, + "count": 32, + "max": [ + 0.3456362187862396, + 0.7193018794059753 + ], + "min": [ + 0.15702864527702332, + 0.505386471748352 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 520320, + "componentType": 5126, + "count": 32, + "max": [ + 0.3456362187862396, + 0.7193018794059753 + ], + "min": [ + 0.15702864527702332, + 0.505386471748352 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 647256, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1402944, + "componentType": 5126, + "count": 36, + "max": [ + -0.11050760746002197, + -0.04088224470615387, + -0.4448731541633606 + ], + "min": [ + -0.2697392702102661, + -0.09754288196563721, + -0.5560810565948486 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1403376, + "componentType": 5126, + "count": 36, + "max": [ + 0.9808491468429565, + 1.7251371900783852e-05, + 0.9810023307800293 + ], + "min": [ + -0.9808719158172607, + -7.235352677525952e-05, + -0.9818587303161621 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 520576, + "componentType": 5126, + "count": 36, + "max": [ + 0.3511078357696533, + 0.7193815112113953 + ], + "min": [ + 0.15133601427078247, + 0.5051411390304565 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 520864, + "componentType": 5126, + "count": 36, + "max": [ + 0.3511078357696533, + 0.7193815112113953 + ], + "min": [ + 0.15133601427078247, + 0.5051411390304565 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 521152, + "componentType": 5126, + "count": 36, + "max": [ + 0.3511078357696533, + 0.7193815112113953 + ], + "min": [ + 0.15133601427078247, + 0.5051411390304565 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 647544, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1403808, + "componentType": 5126, + "count": 28, + "max": [ + -0.3977968692779541, + -0.04088224470615387, + -0.445101261138916 + ], + "min": [ + -1.3186476230621338, + -0.09754288196563721, + -0.556082010269165 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1404144, + "componentType": 5126, + "count": 28, + "max": [ + 0.9813893437385559, + 5.8327812439529225e-05, + 0.9807848930358887 + ], + "min": [ + -0.9808008074760437, + -0.00012785795843228698, + -0.9810106158256531 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 521440, + "componentType": 5126, + "count": 28, + "max": [ + 0.37074756622314453, + 0.719627857208252 + ], + "min": [ + 0.13063731789588928, + 0.5048677921295166 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 521664, + "componentType": 5126, + "count": 28, + "max": [ + 0.37074756622314453, + 0.719627857208252 + ], + "min": [ + 0.13063731789588928, + 0.5048677921295166 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 521888, + "componentType": 5126, + "count": 28, + "max": [ + 0.37074756622314453, + 0.719627857208252 + ], + "min": [ + 0.13063731789588928, + 0.5048677921295166 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 647832, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1404480, + "componentType": 5126, + "count": 28, + "max": [ + 1.0996142625808716, + -0.04088224470615387, + 0.3184387683868408 + ], + "min": [ + 0.9814130067825317, + -0.09754288196563721, + 0.20732298493385315 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1404816, + "componentType": 5126, + "count": 28, + "max": [ + 0.9813081622123718, + 2.1598625608021393e-05, + 0.9807831645011902 + ], + "min": [ + -0.9808472990989685, + -1.0602176189422607e-05, + -0.9821643233299255 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 522112, + "componentType": 5126, + "count": 28, + "max": [ + 0.3454321026802063, + 0.7192906141281128 + ], + "min": [ + 0.156870499253273, + 0.5055179595947266 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 522336, + "componentType": 5126, + "count": 28, + "max": [ + 0.3454321026802063, + 0.7192906141281128 + ], + "min": [ + 0.156870499253273, + 0.5055179595947266 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 522560, + "componentType": 5126, + "count": 28, + "max": [ + 0.3454321026802063, + 0.7192906141281128 + ], + "min": [ + 0.156870499253273, + 0.5055179595947266 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 648120, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1405152, + "componentType": 5126, + "count": 44, + "max": [ + -1.9256733655929565, + -0.04088224470615387, + 0.12842729687690735 + ], + "min": [ + -2.125053644180298, + -0.09754288196563721, + 0.01731005311012268 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1405680, + "componentType": 5126, + "count": 44, + "max": [ + 0.9816054701805115, + 9.853226220002398e-05, + 0.9807623624801636 + ], + "min": [ + -0.9815700054168701, + -9.869933273876086e-05, + -0.9808523058891296 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 522784, + "componentType": 5126, + "count": 44, + "max": [ + 0.3548302948474884, + 0.7194552421569824 + ], + "min": [ + 0.1474505364894867, + 0.5050725936889648 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 523136, + "componentType": 5126, + "count": 44, + "max": [ + 0.3548302948474884, + 0.7194552421569824 + ], + "min": [ + 0.1474505364894867, + 0.5050725936889648 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 523488, + "componentType": 5126, + "count": 44, + "max": [ + 0.3548302948474884, + 0.7194552421569824 + ], + "min": [ + 0.1474505364894867, + 0.5050725936889648 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 648408, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1406208, + "componentType": 5126, + "count": 28, + "max": [ + 1.546859860420227, + -0.04088224470615387, + 0.1284143030643463 + ], + "min": [ + 1.4287585020065308, + -0.09754288196563721, + 0.01731058955192566 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1406544, + "componentType": 5126, + "count": 28, + "max": [ + 0.9815199375152588, + 1.858547329902649e-05, + 0.9807254672050476 + ], + "min": [ + -0.9815247654914856, + -1.8829479813575745e-05, + -0.9808447957038879 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 523840, + "componentType": 5126, + "count": 28, + "max": [ + 0.34563618898391724, + 0.7193018794059753 + ], + "min": [ + 0.15702879428863525, + 0.5053865909576416 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 524064, + "componentType": 5126, + "count": 28, + "max": [ + 0.34563618898391724, + 0.7193018794059753 + ], + "min": [ + 0.15702879428863525, + 0.5053865909576416 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 524288, + "componentType": 5126, + "count": 28, + "max": [ + 0.34563618898391724, + 0.7193018794059753 + ], + "min": [ + 0.15702879428863525, + 0.5053865909576416 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 648696, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1406880, + "componentType": 5126, + "count": 36, + "max": [ + 1.7371467351913452, + -0.04088224470615387, + 0.12841463088989258 + ], + "min": [ + 1.6190451383590698, + -0.09754288196563721, + 0.017310619354248047 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1407312, + "componentType": 5126, + "count": 36, + "max": [ + 0.9815247654914856, + 5.597617564490065e-05, + 0.9807285666465759 + ], + "min": [ + -0.9815270304679871, + -5.20748617418576e-05, + -0.9808447957038879 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 524512, + "componentType": 5126, + "count": 36, + "max": [ + 0.34563612937927246, + 0.7193018198013306 + ], + "min": [ + 0.15702879428863525, + 0.505386471748352 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 524800, + "componentType": 5126, + "count": 36, + "max": [ + 0.34563612937927246, + 0.7193018198013306 + ], + "min": [ + 0.15702879428863525, + 0.505386471748352 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 525088, + "componentType": 5126, + "count": 36, + "max": [ + 0.34563612937927246, + 0.7193018198013306 + ], + "min": [ + 0.15702879428863525, + 0.505386471748352 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 648984, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1407744, + "componentType": 5126, + "count": 28, + "max": [ + 1.2899011373519897, + -0.04088224470615387, + 0.3184387683868408 + ], + "min": [ + 1.1716996431350708, + -0.09754288196563721, + 0.20732298493385315 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1408080, + "componentType": 5126, + "count": 28, + "max": [ + 0.9812991619110107, + 0.00015445786993950605, + 0.980783224105835 + ], + "min": [ + -0.9808472990989685, + -1.2796372175216675e-05, + -0.982165515422821 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 525376, + "componentType": 5126, + "count": 28, + "max": [ + 0.3454321026802063, + 0.7192904949188232 + ], + "min": [ + 0.15687048435211182, + 0.5055180191993713 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 525600, + "componentType": 5126, + "count": 28, + "max": [ + 0.3454321026802063, + 0.7192904949188232 + ], + "min": [ + 0.15687048435211182, + 0.5055180191993713 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 525824, + "componentType": 5126, + "count": 28, + "max": [ + 0.3454321026802063, + 0.7192904949188232 + ], + "min": [ + 0.15687048435211182, + 0.5055180191993713 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 649272, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1408416, + "componentType": 5126, + "count": 32, + "max": [ + -0.15816938877105713, + -0.04088224470615387, + -0.06283140182495117 + ], + "min": [ + -0.275836706161499, + -0.09754288196563721, + -0.17402660846710205 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1408800, + "componentType": 5126, + "count": 32, + "max": [ + 0.9816551804542542, + 2.3816881366656162e-05, + 0.9808459877967834 + ], + "min": [ + -0.9808909893035889, + -6.882408342789859e-05, + -0.9824649691581726 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 526048, + "componentType": 5126, + "count": 32, + "max": [ + 0.3456779718399048, + 0.7193037867546082 + ], + "min": [ + 0.15708380937576294, + 0.5053346753120422 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 526304, + "componentType": 5126, + "count": 32, + "max": [ + 0.3456779718399048, + 0.7193037867546082 + ], + "min": [ + 0.15708380937576294, + 0.5053346753120422 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 526560, + "componentType": 5126, + "count": 32, + "max": [ + 0.3456779718399048, + 0.7193037867546082 + ], + "min": [ + 0.15708380937576294, + 0.5053346753120422 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 649560, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1409184, + "componentType": 5126, + "count": 28, + "max": [ + 0.03166759014129639, + -0.04088224470615387, + -0.06282973289489746 + ], + "min": [ + -0.08601510524749756, + -0.09754288196563721, + -0.17399358749389648 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1409520, + "componentType": 5126, + "count": 28, + "max": [ + 0.9807645678520203, + 1.2752897418977227e-05, + 0.9808459877967834 + ], + "min": [ + -0.9816535115242004, + -2.418458097963594e-05, + -0.9824010133743286 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 526816, + "componentType": 5126, + "count": 28, + "max": [ + 0.3456783890724182, + 0.7193037271499634 + ], + "min": [ + 0.15708380937576294, + 0.5053346753120422 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 527040, + "componentType": 5126, + "count": 28, + "max": [ + 0.3456783890724182, + 0.7193037271499634 + ], + "min": [ + 0.15708380937576294, + 0.5053346753120422 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 527264, + "componentType": 5126, + "count": 28, + "max": [ + 0.3456783890724182, + 0.7193037271499634 + ], + "min": [ + 0.15708380937576294, + 0.5053346753120422 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 649848, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1409856, + "componentType": 5126, + "count": 24, + "max": [ + 0.3631385564804077, + -0.09754288196563721, + 0.12857460975646973 + ], + "min": [ + 0.24575793743133545, + -0.09754288196563721, + 0.017337530851364136 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1410144, + "componentType": 5126, + "count": 24, + "max": [ + 0.0, + -1.0, + 1.629195196528599e-07 + ], + "min": [ + 0.0, + -1.0, + -1.3747894911375624e-07 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 527488, + "componentType": 5126, + "count": 24, + "max": [ + 0.3456360697746277, + 0.7193017601966858 + ], + "min": [ + 0.15789641439914703, + 0.5065304040908813 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 527680, + "componentType": 5126, + "count": 24, + "max": [ + 0.3456360697746277, + 0.7193017601966858 + ], + "min": [ + 0.15789641439914703, + 0.5065304040908813 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 527872, + "componentType": 5126, + "count": 24, + "max": [ + 0.3456360697746277, + 0.7193017601966858 + ], + "min": [ + 0.15789641439914703, + 0.5065304040908813 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 650136, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1410432, + "componentType": 5126, + "count": 36, + "max": [ + -1.6842536926269531, + -0.04088224470615387, + -0.44491761922836304 + ], + "min": [ + -1.8434665203094482, + -0.09754288196563721, + -0.556157112121582 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1410864, + "componentType": 5126, + "count": 36, + "max": [ + 0.9814003705978394, + 0.00011023232218576595, + 0.9810023307800293 + ], + "min": [ + -0.9808505773544312, + -2.413243055343628e-05, + -0.9808613061904907 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 528064, + "componentType": 5126, + "count": 36, + "max": [ + 0.3511078953742981, + 0.7193813920021057 + ], + "min": [ + 0.15133598446846008, + 0.5051411390304565 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 528352, + "componentType": 5126, + "count": 36, + "max": [ + 0.3511078953742981, + 0.7193813920021057 + ], + "min": [ + 0.15133598446846008, + 0.5051411390304565 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 528640, + "componentType": 5126, + "count": 36, + "max": [ + 0.3511078953742981, + 0.7193813920021057 + ], + "min": [ + 0.15133598446846008, + 0.5051411390304565 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 650256, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1411296, + "componentType": 5126, + "count": 42, + "max": [ + -1.7296574115753174, + -0.04088224470615387, + 0.1284150779247284 + ], + "min": [ + -1.8477600812911987, + -0.09754288196563721, + 0.01731163263320923 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1411800, + "componentType": 5126, + "count": 42, + "max": [ + 0.9815248250961304, + 2.024136483669281e-05, + 0.9807305932044983 + ], + "min": [ + -0.9814843535423279, + -1.8581748008728027e-05, + -0.9808642268180847 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 528928, + "componentType": 5126, + "count": 42, + "max": [ + 0.3456360697746277, + 0.7193017601966858 + ], + "min": [ + 0.15702874958515167, + 0.5053865909576416 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 529264, + "componentType": 5126, + "count": 42, + "max": [ + 0.3456360697746277, + 0.7193017601966858 + ], + "min": [ + 0.15702874958515167, + 0.5053865909576416 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 529600, + "componentType": 5126, + "count": 42, + "max": [ + 0.3456360697746277, + 0.7193017601966858 + ], + "min": [ + 0.15702874958515167, + 0.5053865909576416 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 650544, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1412304, + "componentType": 5126, + "count": 34, + "max": [ + -1.4459552764892578, + -0.04088224470615387, + -0.44486844539642334 + ], + "min": [ + -1.6052820682525635, + -0.09754288196563721, + -0.5560188293457031 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1412712, + "componentType": 5126, + "count": 34, + "max": [ + 0.9808815121650696, + 8.258708112407476e-05, + 0.9809965491294861 + ], + "min": [ + -0.9808641076087952, + -2.6864930987358093e-05, + -0.9817690253257751 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 529936, + "componentType": 5126, + "count": 34, + "max": [ + 0.3511078357696533, + 0.7193817496299744 + ], + "min": [ + 0.1513359695672989, + 0.5051411390304565 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 530208, + "componentType": 5126, + "count": 34, + "max": [ + 0.3511078357696533, + 0.7193817496299744 + ], + "min": [ + 0.1513359695672989, + 0.5051411390304565 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 530480, + "componentType": 5126, + "count": 34, + "max": [ + 0.3511078357696533, + 0.7193817496299744 + ], + "min": [ + 0.1513359695672989, + 0.5051411390304565 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 650832, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1413120, + "componentType": 5126, + "count": 24, + "max": [ + 0.1282445192337036, + -0.04088224470615387, + -0.4449159502983093 + ], + "min": [ + -0.031047582626342773, + -0.09754288196563721, + -0.5561561584472656 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1413408, + "componentType": 5126, + "count": 24, + "max": [ + 0.9816175103187561, + 0.0, + 0.9809955954551697 + ], + "min": [ + -0.9809529781341553, + 0.0, + -0.9809225797653198 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 530752, + "componentType": 5126, + "count": 24, + "max": [ + 0.3511078357696533, + 0.7193814516067505 + ], + "min": [ + 0.15133602917194366, + 0.5051411390304565 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 530944, + "componentType": 5126, + "count": 24, + "max": [ + 0.3511078357696533, + 0.7193814516067505 + ], + "min": [ + 0.15133602917194366, + 0.5051411390304565 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 531136, + "componentType": 5126, + "count": 24, + "max": [ + 0.3511078357696533, + 0.7193814516067505 + ], + "min": [ + 0.15133602917194366, + 0.5051411390304565 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 651120, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1413696, + "componentType": 5126, + "count": 34, + "max": [ + -1.158796787261963, + -0.04088224470615387, + 0.12841466069221497 + ], + "min": [ + -1.2768996953964233, + -0.09754288196563721, + 0.01731160283088684 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1414104, + "componentType": 5126, + "count": 34, + "max": [ + 0.9815277457237244, + 1.7367303371429443e-05, + 0.9807316064834595 + ], + "min": [ + -0.9814846515655518, + -1.832283851399552e-05, + -0.980866551399231 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 531328, + "componentType": 5126, + "count": 34, + "max": [ + 0.3456359803676605, + 0.7193017601966858 + ], + "min": [ + 0.15702876448631287, + 0.5053865909576416 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 531600, + "componentType": 5126, + "count": 34, + "max": [ + 0.3456359803676605, + 0.7193017601966858 + ], + "min": [ + 0.15702876448631287, + 0.5053865909576416 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 531872, + "componentType": 5126, + "count": 34, + "max": [ + 0.3456359803676605, + 0.7193017601966858 + ], + "min": [ + 0.15702876448631287, + 0.5053865909576416 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 651408, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1414512, + "componentType": 5126, + "count": 28, + "max": [ + 0.36654365062713623, + -0.04088224470615387, + -0.44491761922836304 + ], + "min": [ + 0.2073308229446411, + -0.09754288196563721, + -0.556157112121582 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1414848, + "componentType": 5126, + "count": 28, + "max": [ + 0.9813978672027588, + 7.260780694196001e-05, + 0.9810022711753845 + ], + "min": [ + -0.9808468222618103, + -1.0813587323355023e-05, + -0.9808611869812012 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 532144, + "componentType": 5126, + "count": 28, + "max": [ + 0.3511078953742981, + 0.7193814516067505 + ], + "min": [ + 0.1513359099626541, + 0.505141019821167 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 532368, + "componentType": 5126, + "count": 28, + "max": [ + 0.3511078953742981, + 0.7193814516067505 + ], + "min": [ + 0.1513359099626541, + 0.505141019821167 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 532592, + "componentType": 5126, + "count": 28, + "max": [ + 0.3511078953742981, + 0.7193814516067505 + ], + "min": [ + 0.1513359099626541, + 0.505141019821167 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 651696, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1415184, + "componentType": 5126, + "count": 28, + "max": [ + 0.6448272466659546, + -0.04088224470615387, + -0.44510674476623535 + ], + "min": [ + 0.44545161724090576, + -0.09754288196563721, + -0.5560975074768066 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1415520, + "componentType": 5126, + "count": 28, + "max": [ + 0.9813675284385681, + 0.00011790275311795995, + 0.9807385802268982 + ], + "min": [ + -0.9813680648803711, + -2.4555251002311707e-05, + -0.9808318614959717 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 532816, + "componentType": 5126, + "count": 28, + "max": [ + 0.35478198528289795, + 0.7194437980651855 + ], + "min": [ + 0.14748170971870422, + 0.505033552646637 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 533040, + "componentType": 5126, + "count": 28, + "max": [ + 0.35478198528289795, + 0.7194437980651855 + ], + "min": [ + 0.14748170971870422, + 0.505033552646637 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 533264, + "componentType": 5126, + "count": 28, + "max": [ + 0.35478198528289795, + 0.7194437980651855 + ], + "min": [ + 0.14748170971870422, + 0.505033552646637 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 651984, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1415856, + "componentType": 5126, + "count": 40, + "max": [ + -0.7782233953475952, + -0.04088224470615387, + 0.1284150779247284 + ], + "min": [ + -0.896325945854187, + -0.09754288196563721, + 0.01731163263320923 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1416336, + "componentType": 5126, + "count": 40, + "max": [ + 0.9815277457237244, + 0.00011200910375919193, + 0.9807336926460266 + ], + "min": [ + -0.9814890027046204, + -5.252579285297543e-05, + -0.9808642268180847 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 533488, + "componentType": 5126, + "count": 40, + "max": [ + 0.3456360101699829, + 0.719301700592041 + ], + "min": [ + 0.15702873468399048, + 0.5053865909576416 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 533808, + "componentType": 5126, + "count": 40, + "max": [ + 0.3456360101699829, + 0.719301700592041 + ], + "min": [ + 0.15702873468399048, + 0.5053865909576416 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 534128, + "componentType": 5126, + "count": 40, + "max": [ + 0.3456360101699829, + 0.719301700592041 + ], + "min": [ + 0.15702873468399048, + 0.5053865909576416 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 652272, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1416816, + "componentType": 5126, + "count": 28, + "max": [ + -0.5879333019256592, + -0.04088224470615387, + 0.1284150779247284 + ], + "min": [ + -0.7060359716415405, + -0.09754288196563721, + 0.01731163263320923 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1417152, + "componentType": 5126, + "count": 28, + "max": [ + 0.9814796447753906, + 8.028662705328315e-05, + 0.9807295799255371 + ], + "min": [ + -0.9815272688865662, + -2.0502135157585144e-05, + -0.9808627963066101 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 534448, + "componentType": 5126, + "count": 28, + "max": [ + 0.3456360101699829, + 0.7193017601966858 + ], + "min": [ + 0.15702873468399048, + 0.5053865313529968 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 534672, + "componentType": 5126, + "count": 28, + "max": [ + 0.3456360101699829, + 0.7193017601966858 + ], + "min": [ + 0.15702873468399048, + 0.5053865313529968 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 534896, + "componentType": 5126, + "count": 28, + "max": [ + 0.3456360101699829, + 0.7193017601966858 + ], + "min": [ + 0.15702873468399048, + 0.5053865313529968 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 652560, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1417488, + "componentType": 5126, + "count": 28, + "max": [ + -1.926034688949585, + -0.04088224470615387, + -0.4448973536491394 + ], + "min": [ + -2.124711036682129, + -0.09754288196563721, + -0.5560784339904785 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1417824, + "componentType": 5126, + "count": 28, + "max": [ + 0.9809937477111816, + 1.389749286317965e-05, + 0.9808003306388855 + ], + "min": [ + -0.9809895157814026, + -1.3884102372685447e-05, + -0.9807681441307068 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 535120, + "componentType": 5126, + "count": 28, + "max": [ + 0.3547818958759308, + 0.7194437980651855 + ], + "min": [ + 0.14748182892799377, + 0.505033552646637 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 535344, + "componentType": 5126, + "count": 28, + "max": [ + 0.3547818958759308, + 0.7194437980651855 + ], + "min": [ + 0.14748182892799377, + 0.505033552646637 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 535568, + "componentType": 5126, + "count": 28, + "max": [ + 0.3547818958759308, + 0.7194437980651855 + ], + "min": [ + 0.14748182892799377, + 0.505033552646637 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 652848, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1418160, + "componentType": 5126, + "count": 32, + "max": [ + -0.3980090618133545, + -0.04088224470615387, + 0.12857460975646973 + ], + "min": [ + -0.5153895616531372, + -0.09754288196563721, + 0.017337530851364136 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1418544, + "componentType": 5126, + "count": 32, + "max": [ + 0.9808699488639832, + 9.380023402627558e-05, + 0.9807840585708618 + ], + "min": [ + -0.980864942073822, + -1.5639865523553453e-05, + -0.9807934761047363 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 535792, + "componentType": 5126, + "count": 32, + "max": [ + 0.3456360101699829, + 0.7193018198013306 + ], + "min": [ + 0.15702879428863525, + 0.5053865909576416 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 536048, + "componentType": 5126, + "count": 32, + "max": [ + 0.3456360101699829, + 0.7193018198013306 + ], + "min": [ + 0.15702879428863525, + 0.5053865909576416 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 536304, + "componentType": 5126, + "count": 32, + "max": [ + 0.3456360101699829, + 0.7193018198013306 + ], + "min": [ + 0.15702879428863525, + 0.5053865909576416 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 653136, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1418928, + "componentType": 5126, + "count": 28, + "max": [ + -1.9705206155776978, + -0.04088224470615387, + -0.25257396697998047 + ], + "min": [ + -2.1296064853668213, + -0.09754288196563721, + -0.36365312337875366 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1419264, + "componentType": 5126, + "count": 28, + "max": [ + 0.9813685417175293, + 1.8473716409062035e-05, + 0.9807385206222534 + ], + "min": [ + -0.9815871119499207, + -5.188678915146738e-05, + -0.9809199571609497 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 536560, + "componentType": 5126, + "count": 28, + "max": [ + 0.3509249985218048, + 0.7193800806999207 + ], + "min": [ + 0.15151703357696533, + 0.5051556825637817 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 536784, + "componentType": 5126, + "count": 28, + "max": [ + 0.3509249985218048, + 0.7193800806999207 + ], + "min": [ + 0.15151703357696533, + 0.5051556825637817 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 537008, + "componentType": 5126, + "count": 28, + "max": [ + 0.3509249985218048, + 0.7193800806999207 + ], + "min": [ + 0.15151703357696533, + 0.5051556825637817 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 653424, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1419600, + "componentType": 5126, + "count": 40, + "max": [ + -0.20734715461730957, + -0.04088224470615387, + 0.1285598874092102 + ], + "min": [ + -0.32508814334869385, + -0.09754288196563721, + 0.01731884479522705 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1420080, + "componentType": 5126, + "count": 40, + "max": [ + 0.9814997911453247, + 0.00010156474309042096, + 0.9809993505477905 + ], + "min": [ + -0.9808936715126038, + -6.463925819844007e-05, + -0.980827808380127 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 537232, + "componentType": 5126, + "count": 40, + "max": [ + 0.3456360101699829, + 0.719301700592041 + ], + "min": [ + 0.15702879428863525, + 0.5053865313529968 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 537552, + "componentType": 5126, + "count": 40, + "max": [ + 0.3456360101699829, + 0.719301700592041 + ], + "min": [ + 0.15702879428863525, + 0.5053865313529968 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 537872, + "componentType": 5126, + "count": 40, + "max": [ + 0.3456360101699829, + 0.719301700592041 + ], + "min": [ + 0.15702879428863525, + 0.5053865313529968 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 653712, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1420560, + "componentType": 5126, + "count": 32, + "max": [ + -0.01744985580444336, + -0.04088224470615387, + 0.1285598874092102 + ], + "min": [ + -0.13519084453582764, + -0.09754288196563721, + 0.01731884479522705 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1420944, + "componentType": 5126, + "count": 32, + "max": [ + 0.9808943271636963, + 6.544726784341037e-05, + 0.9809964895248413 + ], + "min": [ + -0.9815046787261963, + -2.7822330594062805e-05, + -0.9808224439620972 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 538192, + "componentType": 5126, + "count": 32, + "max": [ + 0.3456360101699829, + 0.7193017601966858 + ], + "min": [ + 0.15702879428863525, + 0.5053865909576416 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 538448, + "componentType": 5126, + "count": 32, + "max": [ + 0.3456360101699829, + 0.7193017601966858 + ], + "min": [ + 0.15702879428863525, + 0.5053865909576416 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 538704, + "componentType": 5126, + "count": 32, + "max": [ + 0.3456360101699829, + 0.7193017601966858 + ], + "min": [ + 0.15702879428863525, + 0.5053865909576416 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 654000, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1421328, + "componentType": 5126, + "count": 32, + "max": [ + -1.934800386428833, + -0.04088224470615387, + -0.06308293342590332 + ], + "min": [ + -2.1249332427978516, + -0.09754288196563721, + -0.17414963245391846 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1421712, + "componentType": 5126, + "count": 32, + "max": [ + 0.9816591143608093, + 1.654595325817354e-05, + 0.9807246327400208 + ], + "min": [ + -0.9814736247062683, + -2.1692365407943726e-05, + -0.9809048175811768 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 538960, + "componentType": 5126, + "count": 32, + "max": [ + 0.3538671135902405, + 0.7194452285766602 + ], + "min": [ + 0.14855866134166718, + 0.5050437450408936 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 539216, + "componentType": 5126, + "count": 32, + "max": [ + 0.3538671135902405, + 0.7194452285766602 + ], + "min": [ + 0.14855866134166718, + 0.5050437450408936 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 539472, + "componentType": 5126, + "count": 32, + "max": [ + 0.3538671135902405, + 0.7194452285766602 + ], + "min": [ + 0.14855866134166718, + 0.5050437450408936 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 654288, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1422096, + "componentType": 5126, + "count": 40, + "max": [ + 0.3631385564804077, + -0.04088224470615387, + 0.12857460975646973 + ], + "min": [ + 0.24575793743133545, + -0.09754288196563721, + 0.017337530851364136 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1422576, + "componentType": 5126, + "count": 40, + "max": [ + 0.9808685779571533, + 1.3105571269989014e-05, + 0.9807783365249634 + ], + "min": [ + -0.980864942073822, + -1.5052444723551162e-05, + -0.9807958006858826 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 539728, + "componentType": 5126, + "count": 40, + "max": [ + 0.3456360697746277, + 0.7193018198013306 + ], + "min": [ + 0.1570286750793457, + 0.505386471748352 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 540048, + "componentType": 5126, + "count": 40, + "max": [ + 0.3456360697746277, + 0.7193018198013306 + ], + "min": [ + 0.1570286750793457, + 0.505386471748352 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 540368, + "componentType": 5126, + "count": 40, + "max": [ + 0.3456360697746277, + 0.7193018198013306 + ], + "min": [ + 0.1570286750793457, + 0.505386471748352 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 654576, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1423056, + "componentType": 5126, + "count": 32, + "max": [ + 0.6326147317886353, + -0.04088224470615387, + -0.25236064195632935 + ], + "min": [ + 0.22099530696868896, + -0.09754288196563721, + -0.3635943531990051 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1423440, + "componentType": 5126, + "count": 32, + "max": [ + 0.9808153510093689, + 0.00013105654215905815, + 0.9808653593063354 + ], + "min": [ + -0.9808257222175598, + -5.119540946907364e-05, + -0.9811767339706421 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 540688, + "componentType": 5126, + "count": 32, + "max": [ + 0.3639701306819916, + 0.7195733189582825 + ], + "min": [ + 0.1377984583377838, + 0.504866361618042 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 540944, + "componentType": 5126, + "count": 32, + "max": [ + 0.3639701306819916, + 0.7195733189582825 + ], + "min": [ + 0.1377984583377838, + 0.504866361618042 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 541200, + "componentType": 5126, + "count": 32, + "max": [ + 0.3639701306819916, + 0.7195733189582825 + ], + "min": [ + 0.1377984583377838, + 0.504866361618042 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 654864, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1423824, + "componentType": 5126, + "count": 18, + "max": [ + 0.6326147317886353, + -0.09754288196563721, + -0.25236064195632935 + ], + "min": [ + 0.22099530696868896, + -0.09754288196563721, + -0.3635943531990051 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1424040, + "componentType": 5126, + "count": 18, + "max": [ + 0.0, + -1.0, + 1.6458803031582647e-07 + ], + "min": [ + 0.0, + -1.0, + -1.0282296614150255e-07 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 541456, + "componentType": 5126, + "count": 18, + "max": [ + 0.3639701306819916, + 0.7195733189582825 + ], + "min": [ + 0.1381610482931137, + 0.5052409768104553 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 541600, + "componentType": 5126, + "count": 18, + "max": [ + 0.3639701306819916, + 0.7195733189582825 + ], + "min": [ + 0.1381610482931137, + 0.5052409768104553 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 541744, + "componentType": 5126, + "count": 18, + "max": [ + 0.3639701306819916, + 0.7195733189582825 + ], + "min": [ + 0.1381610482931137, + 0.5052409768104553 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 655152, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1424256, + "componentType": 5126, + "count": 26, + "max": [ + -0.06513798236846924, + -0.09754288196563721, + -0.2523884177207947 + ], + "min": [ + -0.18251144886016846, + -0.09754288196563721, + -0.3635939359664917 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1424568, + "componentType": 5126, + "count": 26, + "max": [ + 0.0, + -1.0, + 1.6298962179916998e-07 + ], + "min": [ + 0.0, + -1.0, + -1.3503247942026064e-07 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 541888, + "componentType": 5126, + "count": 26, + "max": [ + 0.3456365466117859, + 0.719290018081665 + ], + "min": [ + 0.15791484713554382, + 0.5065017342567444 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 542096, + "componentType": 5126, + "count": 26, + "max": [ + 0.3456365466117859, + 0.719290018081665 + ], + "min": [ + 0.15791484713554382, + 0.5065017342567444 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 542304, + "componentType": 5126, + "count": 26, + "max": [ + 0.3456365466117859, + 0.719290018081665 + ], + "min": [ + 0.15791484713554382, + 0.5065017342567444 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 655272, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1424880, + "componentType": 5126, + "count": 28, + "max": [ + 0.03166759014129639, + -0.09754288196563721, + -0.06282973289489746 + ], + "min": [ + -0.08601510524749756, + -0.09754288196563721, + -0.17399358749389648 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1425216, + "componentType": 5126, + "count": 28, + "max": [ + 0.0, + -1.0, + 1.363591053404889e-07 + ], + "min": [ + 0.0, + -1.0, + -1.7599482760033425e-07 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 542512, + "componentType": 5126, + "count": 28, + "max": [ + 0.3456783890724182, + 0.7193037271499634 + ], + "min": [ + 0.15793447196483612, + 0.5064961910247803 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 542736, + "componentType": 5126, + "count": 28, + "max": [ + 0.3456783890724182, + 0.7193037271499634 + ], + "min": [ + 0.15793447196483612, + 0.5064961910247803 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 542960, + "componentType": 5126, + "count": 28, + "max": [ + 0.3456783890724182, + 0.7193037271499634 + ], + "min": [ + 0.15793447196483612, + 0.5064961910247803 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 655392, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1425552, + "componentType": 5126, + "count": 17, + "max": [ + -0.01744985580444336, + -0.09754288196563721, + 0.1285598874092102 + ], + "min": [ + -0.13519084453582764, + -0.09754288196563721, + 0.01731884479522705 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1425756, + "componentType": 5126, + "count": 17, + "max": [ + 0.0, + -1.0, + 0.0 + ], + "min": [ + 0.0, + -1.0, + -5.48352190321566e-08 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 543184, + "componentType": 5126, + "count": 17, + "max": [ + 0.3456360101699829, + 0.7193017601966858 + ], + "min": [ + 0.15790045261383057, + 0.5065325498580933 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 543320, + "componentType": 5126, + "count": 17, + "max": [ + 0.3456360101699829, + 0.7193017601966858 + ], + "min": [ + 0.15790045261383057, + 0.5065325498580933 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 543456, + "componentType": 5126, + "count": 17, + "max": [ + 0.3456360101699829, + 0.7193017601966858 + ], + "min": [ + 0.15790045261383057, + 0.5065325498580933 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 655512, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1425960, + "componentType": 5126, + "count": 28, + "max": [ + 0.07997763156890869, + -0.09754288196563721, + 0.31847384572029114 + ], + "min": [ + -0.03817546367645264, + -0.09754288196563721, + 0.20723965764045715 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1426296, + "componentType": 5126, + "count": 28, + "max": [ + 0.0, + -1.0, + 1.629373826972369e-07 + ], + "min": [ + 0.0, + -1.0, + -1.759948702328984e-07 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 543592, + "componentType": 5126, + "count": 28, + "max": [ + 0.3454321026802063, + 0.7192904353141785 + ], + "min": [ + 0.15778283774852753, + 0.506691575050354 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 543816, + "componentType": 5126, + "count": 28, + "max": [ + 0.3454321026802063, + 0.7192904353141785 + ], + "min": [ + 0.15778283774852753, + 0.506691575050354 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 544040, + "componentType": 5126, + "count": 28, + "max": [ + 0.3454321026802063, + 0.7192904353141785 + ], + "min": [ + 0.15778283774852753, + 0.506691575050354 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 655632, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1426632, + "componentType": 5126, + "count": 30, + "max": [ + 1.9274336099624634, + -0.09754288196563721, + 0.12841445207595825 + ], + "min": [ + 1.809332013130188, + -0.09754288196563721, + 0.017310619354248047 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1426992, + "componentType": 5126, + "count": 30, + "max": [ + 0.0, + -1.0, + 1.311403963200064e-07 + ], + "min": [ + 0.0, + -1.0, + -1.6315300399583066e-07 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 544264, + "componentType": 5126, + "count": 30, + "max": [ + 0.34563618898391724, + 0.7193018794059753 + ], + "min": [ + 0.15789785981178284, + 0.5065286755561829 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 544504, + "componentType": 5126, + "count": 30, + "max": [ + 0.34563618898391724, + 0.7193018794059753 + ], + "min": [ + 0.15789785981178284, + 0.5065286755561829 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 544744, + "componentType": 5126, + "count": 30, + "max": [ + 0.34563618898391724, + 0.7193018794059753 + ], + "min": [ + 0.15789785981178284, + 0.5065286755561829 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 655752, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1427352, + "componentType": 5126, + "count": 21, + "max": [ + -2.0134198665618896, + -0.09754288196563721, + 0.31852877140045166 + ], + "min": [ + -2.131397008895874, + -0.09754288196563721, + 0.20732709765434265 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1427604, + "componentType": 5126, + "count": 21, + "max": [ + 0.0, + -1.0, + 6.047439171652513e-08 + ], + "min": [ + 0.0, + -1.0, + -1.643940805706734e-07 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 544984, + "componentType": 5126, + "count": 21, + "max": [ + 0.3454318940639496, + 0.719290554523468 + ], + "min": [ + 0.15778198838233948, + 0.5066990852355957 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 545152, + "componentType": 5126, + "count": 21, + "max": [ + 0.3454318940639496, + 0.719290554523468 + ], + "min": [ + 0.15778198838233948, + 0.5066990852355957 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 545320, + "componentType": 5126, + "count": 21, + "max": [ + 0.3454318940639496, + 0.719290554523468 + ], + "min": [ + 0.15778198838233948, + 0.5066990852355957 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 655872, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1427856, + "componentType": 5126, + "count": 21, + "max": [ + -1.8228918313980103, + -0.09754288196563721, + 0.3183940351009369 + ], + "min": [ + -1.9410792589187622, + -0.09754288196563721, + 0.2072356939315796 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1428108, + "componentType": 5126, + "count": 21, + "max": [ + 0.0, + -1.0, + 4.4036909230271704e-08 + ], + "min": [ + 0.0, + -1.0, + -1.6306532302223786e-07 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 545488, + "componentType": 5126, + "count": 21, + "max": [ + 0.3454318940639496, + 0.7192904353141785 + ], + "min": [ + 0.15778279304504395, + 0.5066922903060913 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 545656, + "componentType": 5126, + "count": 21, + "max": [ + 0.3454318940639496, + 0.7192904353141785 + ], + "min": [ + 0.15778279304504395, + 0.5066922903060913 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 545824, + "componentType": 5126, + "count": 21, + "max": [ + 0.3454318940639496, + 0.7192904353141785 + ], + "min": [ + 0.15778279304504395, + 0.5066922903060913 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 655992, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1428360, + "componentType": 5126, + "count": 26, + "max": [ + 1.546836256980896, + -0.09754288196563721, + -0.06301414966583252 + ], + "min": [ + 1.428721308708191, + -0.09754288196563721, + -0.1740100383758545 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1428672, + "componentType": 5126, + "count": 26, + "max": [ + 0.0, + -1.0, + 1.3658068098720832e-07 + ], + "min": [ + 0.0, + -1.0, + -1.591032940950754e-07 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 545992, + "componentType": 5126, + "count": 26, + "max": [ + 0.3456782102584839, + 0.7193037867546082 + ], + "min": [ + 0.15793822705745697, + 0.5064811110496521 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 546200, + "componentType": 5126, + "count": 26, + "max": [ + 0.3456782102584839, + 0.7193037867546082 + ], + "min": [ + 0.15793822705745697, + 0.5064811110496521 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 546408, + "componentType": 5126, + "count": 26, + "max": [ + 0.3456782102584839, + 0.7193037867546082 + ], + "min": [ + 0.15793822705745697, + 0.5064811110496521 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 656112, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1428984, + "componentType": 5126, + "count": 24, + "max": [ + -1.6328461170196533, + -0.09754288196563721, + 0.31852877140045166 + ], + "min": [ + -1.7508234977722168, + -0.09754288196563721, + 0.20732709765434265 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1429272, + "componentType": 5126, + "count": 24, + "max": [ + 0.0, + -1.0, + 1.3621068717384333e-07 + ], + "min": [ + 0.0, + -1.0, + -1.643871598844271e-07 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 546616, + "componentType": 5126, + "count": 24, + "max": [ + 0.3454318940639496, + 0.719290554523468 + ], + "min": [ + 0.15778198838233948, + 0.5066990852355957 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 546808, + "componentType": 5126, + "count": 24, + "max": [ + 0.3454318940639496, + 0.719290554523468 + ], + "min": [ + 0.15778198838233948, + 0.5066990852355957 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 547000, + "componentType": 5126, + "count": 24, + "max": [ + 0.3454318940639496, + 0.719290554523468 + ], + "min": [ + 0.15778198838233948, + 0.5066990852355957 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 656232, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1429560, + "componentType": 5126, + "count": 12, + "max": [ + 1.7371701002120972, + -0.09754288196563721, + -0.06298625469207764 + ], + "min": [ + 1.619022011756897, + -0.09754288196563721, + -0.17293381690979004 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1429704, + "componentType": 5126, + "count": 12, + "max": [ + 0.0, + -1.0, + 0.0 + ], + "min": [ + 0.0, + -1.0, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 547192, + "componentType": 5126, + "count": 12, + "max": [ + 0.3456782102584839, + 0.7193039059638977 + ], + "min": [ + 0.157950296998024, + 0.5064895153045654 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 547288, + "componentType": 5126, + "count": 12, + "max": [ + 0.3456782102584839, + 0.7193039059638977 + ], + "min": [ + 0.157950296998024, + 0.5064895153045654 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 547384, + "componentType": 5126, + "count": 12, + "max": [ + 0.3456782102584839, + 0.7193039059638977 + ], + "min": [ + 0.157950296998024, + 0.5064895153045654 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 656352, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1429848, + "componentType": 5126, + "count": 12, + "max": [ + 1.9274569749832153, + -0.09754288196563721, + -0.06298625469207764 + ], + "min": [ + 1.809308648109436, + -0.09754288196563721, + -0.1729336977005005 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1429992, + "componentType": 5126, + "count": 12, + "max": [ + 0.0, + -1.0, + 0.0 + ], + "min": [ + 0.0, + -1.0, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 547480, + "componentType": 5126, + "count": 12, + "max": [ + 0.3456781804561615, + 0.7193040251731873 + ], + "min": [ + 0.15795014798641205, + 0.5064893960952759 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 547576, + "componentType": 5126, + "count": 12, + "max": [ + 0.3456781804561615, + 0.7193040251731873 + ], + "min": [ + 0.15795014798641205, + 0.5064893960952759 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 547672, + "componentType": 5126, + "count": 12, + "max": [ + 0.3456781804561615, + 0.7193040251731873 + ], + "min": [ + 0.15795014798641205, + 0.5064893960952759 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 656472, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1430136, + "componentType": 5126, + "count": 23, + "max": [ + -1.4425501823425293, + -0.09754288196563721, + 0.31848442554473877 + ], + "min": [ + -1.5605132579803467, + -0.09754288196563721, + 0.20724019408226013 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1430412, + "componentType": 5126, + "count": 23, + "max": [ + 0.0, + -1.0, + 6.048529144209169e-08 + ], + "min": [ + 0.0, + -1.0, + -1.630610597658233e-07 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 547768, + "componentType": 5126, + "count": 23, + "max": [ + 0.3454318940639496, + 0.7192904949188232 + ], + "min": [ + 0.15778306126594543, + 0.5066921710968018 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 547952, + "componentType": 5126, + "count": 23, + "max": [ + 0.3454318940639496, + 0.7192904949188232 + ], + "min": [ + 0.15778306126594543, + 0.5066921710968018 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 548136, + "componentType": 5126, + "count": 23, + "max": [ + 0.3454318940639496, + 0.7192904949188232 + ], + "min": [ + 0.15778306126594543, + 0.5066921710968018 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 656592, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1430688, + "componentType": 5126, + "count": 21, + "max": [ + -1.2520170211791992, + -0.09754288196563721, + 0.31848275661468506 + ], + "min": [ + -1.3702330589294434, + -0.09754288196563721, + 0.20821234583854675 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1430940, + "componentType": 5126, + "count": 21, + "max": [ + 0.0, + -1.0, + 4.575827716735148e-08 + ], + "min": [ + 0.0, + -1.0, + -1.6443041772618017e-07 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 548320, + "componentType": 5126, + "count": 21, + "max": [ + 0.3454318344593048, + 0.7192907333374023 + ], + "min": [ + 0.15778037905693054, + 0.5067003965377808 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 548488, + "componentType": 5126, + "count": 21, + "max": [ + 0.3454318344593048, + 0.7192907333374023 + ], + "min": [ + 0.15778037905693054, + 0.5067003965377808 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 548656, + "componentType": 5126, + "count": 21, + "max": [ + 0.3454318344593048, + 0.7192907333374023 + ], + "min": [ + 0.15778037905693054, + 0.5067003965377808 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 656712, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1431192, + "componentType": 5126, + "count": 26, + "max": [ + -1.0619816780090332, + -0.09754288196563721, + 0.3184802532196045 + ], + "min": [ + -1.1799345016479492, + -0.09754288196563721, + 0.2071945071220398 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1431504, + "componentType": 5126, + "count": 26, + "max": [ + 0.0, + -1.0, + 1.6299472349601274e-07 + ], + "min": [ + 0.0, + -1.0, + -1.5700500455295696e-07 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 548824, + "componentType": 5126, + "count": 26, + "max": [ + 0.34543195366859436, + 0.719290554523468 + ], + "min": [ + 0.15778431296348572, + 0.5066918134689331 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 549032, + "componentType": 5126, + "count": 26, + "max": [ + 0.34543195366859436, + 0.719290554523468 + ], + "min": [ + 0.15778431296348572, + 0.5066918134689331 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 549240, + "componentType": 5126, + "count": 26, + "max": [ + 0.34543195366859436, + 0.719290554523468 + ], + "min": [ + 0.15778431296348572, + 0.5066918134689331 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 656832, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1431816, + "componentType": 5126, + "count": 20, + "max": [ + 1.7371400594711304, + -0.09754288196563721, + -0.2524073123931885 + ], + "min": [ + 1.6194580793380737, + -0.09754288196563721, + -0.3636484742164612 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1432056, + "componentType": 5126, + "count": 20, + "max": [ + 0.0, + -1.0, + 0.0 + ], + "min": [ + 0.0, + -1.0, + -1.629140058412304e-07 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 549448, + "componentType": 5126, + "count": 20, + "max": [ + 0.3456368148326874, + 0.7192898392677307 + ], + "min": [ + 0.15792028605937958, + 0.5064886808395386 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 549608, + "componentType": 5126, + "count": 20, + "max": [ + 0.3456368148326874, + 0.7192898392677307 + ], + "min": [ + 0.15792028605937958, + 0.5064886808395386 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 549768, + "componentType": 5126, + "count": 20, + "max": [ + 0.3456368148326874, + 0.7192898392677307 + ], + "min": [ + 0.15792028605937958, + 0.5064886808395386 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 656952, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1432296, + "componentType": 5126, + "count": 26, + "max": [ + -0.8714625835418701, + -0.09754288196563721, + 0.318389892578125 + ], + "min": [ + -0.9896399974822998, + -0.09754288196563721, + 0.20718997716903687 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1432608, + "componentType": 5126, + "count": 26, + "max": [ + 0.0, + -1.0, + 1.5666418562432227e-07 + ], + "min": [ + 0.0, + -1.0, + -1.578929271772722e-07 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 549928, + "componentType": 5126, + "count": 26, + "max": [ + 0.3454318046569824, + 0.7192903161048889 + ], + "min": [ + 0.15778398513793945, + 0.5066918134689331 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 550136, + "componentType": 5126, + "count": 26, + "max": [ + 0.3454318046569824, + 0.7192903161048889 + ], + "min": [ + 0.15778398513793945, + 0.5066918134689331 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 550344, + "componentType": 5126, + "count": 26, + "max": [ + 0.3454318046569824, + 0.7192903161048889 + ], + "min": [ + 0.15778398513793945, + 0.5066918134689331 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 657072, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1432920, + "componentType": 5126, + "count": 30, + "max": [ + -0.6812232732772827, + -0.09754288196563721, + 0.31851619482040405 + ], + "min": [ + -0.7993860244750977, + -0.09754288196563721, + 0.20728498697280884 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1433280, + "componentType": 5126, + "count": 30, + "max": [ + 0.0, + -1.0, + 1.628961712185628e-07 + ], + "min": [ + 0.0, + -1.0, + -1.6438802674656472e-07 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 550552, + "componentType": 5126, + "count": 30, + "max": [ + 0.34543177485466003, + 0.7192904949188232 + ], + "min": [ + 0.1577824205160141, + 0.5066988468170166 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 550792, + "componentType": 5126, + "count": 30, + "max": [ + 0.34543177485466003, + 0.7192904949188232 + ], + "min": [ + 0.1577824205160141, + 0.5066988468170166 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 551032, + "componentType": 5126, + "count": 30, + "max": [ + 0.34543177485466003, + 0.7192904949188232 + ], + "min": [ + 0.1577824205160141, + 0.5066988468170166 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 657192, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1433640, + "componentType": 5126, + "count": 17, + "max": [ + -0.490909218788147, + -0.09754288196563721, + 0.3185266852378845 + ], + "min": [ + -0.6090617179870605, + -0.09754288196563721, + 0.2072855532169342 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1433844, + "componentType": 5126, + "count": 17, + "max": [ + 0.0, + -1.0, + 1.6300960226089956e-07 + ], + "min": [ + 0.0, + -1.0, + -1.7753210102000594e-07 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 551272, + "componentType": 5126, + "count": 17, + "max": [ + 0.34543174505233765, + 0.719290554523468 + ], + "min": [ + 0.15778225660324097, + 0.5066932439804077 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 551408, + "componentType": 5126, + "count": 17, + "max": [ + 0.34543174505233765, + 0.719290554523468 + ], + "min": [ + 0.15778225660324097, + 0.5066932439804077 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 551544, + "componentType": 5126, + "count": 17, + "max": [ + 0.34543174505233765, + 0.719290554523468 + ], + "min": [ + 0.15778225660324097, + 0.5066932439804077 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 657312, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1434048, + "componentType": 5126, + "count": 12, + "max": [ + 1.9272743463516235, + -0.09754288196563721, + -0.4450254440307617 + ], + "min": [ + 1.8091262578964233, + -0.09754288196563721, + -0.5550942420959473 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1434192, + "componentType": 5126, + "count": 12, + "max": [ + 0.0, + -1.0, + 0.0 + ], + "min": [ + 0.0, + -1.0, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 551680, + "componentType": 5126, + "count": 12, + "max": [ + 0.34565988183021545, + 0.7192906737327576 + ], + "min": [ + 0.15794619917869568, + 0.5064847469329834 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 551776, + "componentType": 5126, + "count": 12, + "max": [ + 0.34565988183021545, + 0.7192906737327576 + ], + "min": [ + 0.15794619917869568, + 0.5064847469329834 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 551872, + "componentType": 5126, + "count": 12, + "max": [ + 0.34565988183021545, + 0.7192906737327576 + ], + "min": [ + 0.15794619917869568, + 0.5064847469329834 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 657432, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1434336, + "componentType": 5126, + "count": 17, + "max": [ + 1.5468944311141968, + -0.09754288196563721, + 0.3185166120529175 + ], + "min": [ + 1.4287317991256714, + -0.09754288196563721, + 0.2072853446006775 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1434540, + "componentType": 5126, + "count": 17, + "max": [ + 0.0, + -1.0, + 1.310499158080347e-07 + ], + "min": [ + 0.0, + -1.0, + -1.760622865276673e-07 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 551968, + "componentType": 5126, + "count": 17, + "max": [ + 0.3454320430755615, + 0.7192904949188232 + ], + "min": [ + 0.15777988731861115, + 0.5066943168640137 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 552104, + "componentType": 5126, + "count": 17, + "max": [ + 0.3454320430755615, + 0.7192904949188232 + ], + "min": [ + 0.15777988731861115, + 0.5066943168640137 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 552240, + "componentType": 5126, + "count": 17, + "max": [ + 0.3454320430755615, + 0.7192904949188232 + ], + "min": [ + 0.15777988731861115, + 0.5066943168640137 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 657552, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1434744, + "componentType": 5126, + "count": 27, + "max": [ + -0.3006131649017334, + -0.09754288196563721, + 0.3185161352157593 + ], + "min": [ + -0.4187757968902588, + -0.09754288196563721, + 0.20728498697280884 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1435068, + "componentType": 5126, + "count": 27, + "max": [ + 0.0, + -1.0, + 1.630129986551765e-07 + ], + "min": [ + 0.0, + -1.0, + -8.802023643283974e-08 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 552376, + "componentType": 5126, + "count": 27, + "max": [ + 0.34543177485466003, + 0.7192904949188232 + ], + "min": [ + 0.1578901708126068, + 0.5067046284675598 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 552592, + "componentType": 5126, + "count": 27, + "max": [ + 0.34543177485466003, + 0.7192904949188232 + ], + "min": [ + 0.1578901708126068, + 0.5067046284675598 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 552808, + "componentType": 5126, + "count": 27, + "max": [ + 0.34543177485466003, + 0.7192904949188232 + ], + "min": [ + 0.1578901708126068, + 0.5067046284675598 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 657672, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1435392, + "componentType": 5126, + "count": 26, + "max": [ + -0.11035442352294922, + -0.09754288196563721, + 0.3185182809829712 + ], + "min": [ + -0.2285221815109253, + -0.09754288196563721, + 0.20732659101486206 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1435704, + "componentType": 5126, + "count": 26, + "max": [ + 0.0, + -1.0, + 1.5797120056504355e-07 + ], + "min": [ + 0.0, + -1.0, + -1.6441300942915404e-07 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 553024, + "componentType": 5126, + "count": 26, + "max": [ + 0.34543177485466003, + 0.7192904949188232 + ], + "min": [ + 0.1577817052602768, + 0.5066989660263062 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 553232, + "componentType": 5126, + "count": 26, + "max": [ + 0.34543177485466003, + 0.7192904949188232 + ], + "min": [ + 0.1577817052602768, + 0.5066989660263062 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 553440, + "componentType": 5126, + "count": 26, + "max": [ + 0.34543177485466003, + 0.7192904949188232 + ], + "min": [ + 0.1577817052602768, + 0.5066989660263062 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 657792, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1436016, + "componentType": 5126, + "count": 23, + "max": [ + 1.7372161149978638, + -0.09754288196563721, + 0.3184366822242737 + ], + "min": [ + 1.619019865989685, + -0.09754288196563721, + 0.20728135108947754 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1436292, + "componentType": 5126, + "count": 23, + "max": [ + 0.0, + -1.0, + 1.3105652385547728e-07 + ], + "min": [ + 0.0, + -1.0, + -1.7605138680210075e-07 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 553648, + "componentType": 5126, + "count": 23, + "max": [ + 0.34543201327323914, + 0.7192904949188232 + ], + "min": [ + 0.157781720161438, + 0.5066932439804077 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 553832, + "componentType": 5126, + "count": 23, + "max": [ + 0.34543201327323914, + 0.7192904949188232 + ], + "min": [ + 0.157781720161438, + 0.5066932439804077 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 554016, + "componentType": 5126, + "count": 23, + "max": [ + 0.34543201327323914, + 0.7192904949188232 + ], + "min": [ + 0.157781720161438, + 0.5066932439804077 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 657912, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1436568, + "componentType": 5126, + "count": 28, + "max": [ + 0.07997763156890869, + -0.09754288196563721, + 0.31847384572029114 + ], + "min": [ + -0.03817546367645264, + -0.09754288196563721, + 0.20723965764045715 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1436904, + "componentType": 5126, + "count": 28, + "max": [ + 0.0, + -1.0, + 1.629373826972369e-07 + ], + "min": [ + 0.0, + -1.0, + -1.759948702328984e-07 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 554200, + "componentType": 5126, + "count": 28, + "max": [ + 0.3454321026802063, + 0.7192904353141785 + ], + "min": [ + 0.15778283774852753, + 0.506691575050354 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 554424, + "componentType": 5126, + "count": 28, + "max": [ + 0.3454321026802063, + 0.7192904353141785 + ], + "min": [ + 0.15778283774852753, + 0.506691575050354 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 554648, + "componentType": 5126, + "count": 28, + "max": [ + 0.3454321026802063, + 0.7192904353141785 + ], + "min": [ + 0.15778283774852753, + 0.506691575050354 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 658032, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1437240, + "componentType": 5126, + "count": 24, + "max": [ + 1.9274905920028687, + -0.09754288196563721, + 0.3184831440448761 + ], + "min": [ + 1.8092750310897827, + -0.09754288196563721, + 0.20821279287338257 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1437528, + "componentType": 5126, + "count": 24, + "max": [ + 0.0, + -1.0, + 1.5809057174465124e-07 + ], + "min": [ + 0.0, + -1.0, + -1.644520466470567e-07 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 554872, + "componentType": 5126, + "count": 24, + "max": [ + 0.3454320728778839, + 0.7192906141281128 + ], + "min": [ + 0.15778006613254547, + 0.5067004561424255 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 555064, + "componentType": 5126, + "count": 24, + "max": [ + 0.3454320728778839, + 0.7192906141281128 + ], + "min": [ + 0.15778006613254547, + 0.5067004561424255 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 555256, + "componentType": 5126, + "count": 24, + "max": [ + 0.3454320728778839, + 0.7192906141281128 + ], + "min": [ + 0.15778006613254547, + 0.5067004561424255 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 658152, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1437816, + "componentType": 5126, + "count": 23, + "max": [ + 0.27022063732147217, + -0.09754288196563721, + 0.31852608919143677 + ], + "min": [ + 0.15208685398101807, + -0.09754288196563721, + 0.20733055472373962 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1438092, + "componentType": 5126, + "count": 23, + "max": [ + 0.0, + -1.0, + 1.4087505917359522e-07 + ], + "min": [ + 0.0, + -1.0, + -3.858139763224244e-08 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 555448, + "componentType": 5126, + "count": 23, + "max": [ + 0.3454321026802063, + 0.719290554523468 + ], + "min": [ + 0.15789015591144562, + 0.506704568862915 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 555632, + "componentType": 5126, + "count": 23, + "max": [ + 0.3454321026802063, + 0.719290554523468 + ], + "min": [ + 0.15789015591144562, + 0.506704568862915 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 555816, + "componentType": 5126, + "count": 23, + "max": [ + 0.3454321026802063, + 0.719290554523468 + ], + "min": [ + 0.15789015591144562, + 0.506704568862915 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 658272, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1438368, + "componentType": 5126, + "count": 26, + "max": [ + 2.117778778076172, + -0.09754288196563721, + 0.3185630440711975 + ], + "min": [ + 1.9995967149734497, + -0.09754288196563721, + 0.20821678638458252 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1438680, + "componentType": 5126, + "count": 26, + "max": [ + 0.0, + -1.0, + 1.5808497266789345e-07 + ], + "min": [ + 0.0, + -1.0, + -1.1742466199393675e-07 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 556000, + "componentType": 5126, + "count": 26, + "max": [ + 0.3454318344593048, + 0.7192908525466919 + ], + "min": [ + 0.15788999199867249, + 0.5067059993743896 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 556208, + "componentType": 5126, + "count": 26, + "max": [ + 0.3454318344593048, + 0.7192908525466919 + ], + "min": [ + 0.15788999199867249, + 0.5067059993743896 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 556416, + "componentType": 5126, + "count": 26, + "max": [ + 0.3454318344593048, + 0.7192908525466919 + ], + "min": [ + 0.15788999199867249, + 0.5067059993743896 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 658392, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1438992, + "componentType": 5126, + "count": 28, + "max": [ + 2.1179604530334473, + -0.09754288196563721, + 0.11120873689651489 + ], + "min": [ + 2.000633716583252, + -0.09754288196563721, + -0.15629839897155762 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1439328, + "componentType": 5126, + "count": 28, + "max": [ + 0.0, + -1.0, + 6.865446522397178e-08 + ], + "min": [ + 0.0, + -1.0, + -6.655251638676418e-08 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 556624, + "componentType": 5126, + "count": 28, + "max": [ + 0.34552350640296936, + 0.7351270318031311 + ], + "min": [ + 0.15683382749557495, + 0.48989254236221313 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 556848, + "componentType": 5126, + "count": 28, + "max": [ + 0.34552350640296936, + 0.7351270318031311 + ], + "min": [ + 0.15683382749557495, + 0.48989254236221313 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 557072, + "componentType": 5126, + "count": 28, + "max": [ + 0.34552350640296936, + 0.7351270318031311 + ], + "min": [ + 0.15683382749557495, + 0.48989254236221313 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 658512, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1439664, + "componentType": 5126, + "count": 15, + "max": [ + -1.587070345878601, + -0.09754288196563721, + -0.2526068687438965 + ], + "min": [ + -1.7051684856414795, + -0.09754288196563721, + -0.36366069316864014 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1439844, + "componentType": 5126, + "count": 15, + "max": [ + 0.0, + -1.0, + 1.311917259272377e-07 + ], + "min": [ + 0.0, + -1.0, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 557296, + "componentType": 5126, + "count": 15, + "max": [ + 0.34563666582107544, + 0.7192898988723755 + ], + "min": [ + 0.157917320728302, + 0.5064934492111206 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 557416, + "componentType": 5126, + "count": 15, + "max": [ + 0.34563666582107544, + 0.7192898988723755 + ], + "min": [ + 0.157917320728302, + 0.5064934492111206 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 557536, + "componentType": 5126, + "count": 15, + "max": [ + 0.34563666582107544, + 0.7192898988723755 + ], + "min": [ + 0.157917320728302, + 0.5064934492111206 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 658632, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1440024, + "componentType": 5126, + "count": 17, + "max": [ + 2.1183853149414063, + -0.09754288196563721, + -0.27028578519821167 + ], + "min": [ + 2.000246524810791, + -0.09754288196563721, + -0.5375593900680542 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1440228, + "componentType": 5126, + "count": 17, + "max": [ + 0.0, + -1.0, + 0.0 + ], + "min": [ + 0.0, + -1.0, + -6.870910596035174e-08 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 557656, + "componentType": 5126, + "count": 17, + "max": [ + 0.3456622064113617, + 0.7351214289665222 + ], + "min": [ + 0.15683889389038086, + 0.48985666036605835 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 557792, + "componentType": 5126, + "count": 17, + "max": [ + 0.3456622064113617, + 0.7351214289665222 + ], + "min": [ + 0.15683889389038086, + 0.48985666036605835 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 557928, + "componentType": 5126, + "count": 17, + "max": [ + 0.3456622064113617, + 0.7351214289665222 + ], + "min": [ + 0.15683889389038086, + 0.48985666036605835 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 658752, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1440432, + "componentType": 5126, + "count": 24, + "max": [ + 1.7243303060531616, + -0.09754288196563721, + -0.44487231969833374 + ], + "min": [ + 1.439355492591858, + -0.09754288196563721, + -0.5560990571975708 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1440720, + "componentType": 5126, + "count": 24, + "max": [ + 0.0, + -1.0, + 1.6460710128285427e-07 + ], + "min": [ + 0.0, + -1.0, + -1.7792986284348444e-07 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 558064, + "componentType": 5126, + "count": 24, + "max": [ + 0.3596900999546051, + 0.719523012638092 + ], + "min": [ + 0.14278283715248108, + 0.5054388046264648 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 558256, + "componentType": 5126, + "count": 24, + "max": [ + 0.3596900999546051, + 0.719523012638092 + ], + "min": [ + 0.14278283715248108, + 0.5054388046264648 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 558448, + "componentType": 5126, + "count": 24, + "max": [ + 0.3596900999546051, + 0.719523012638092 + ], + "min": [ + 0.14278283715248108, + 0.5054388046264648 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 658872, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1441008, + "componentType": 5126, + "count": 19, + "max": [ + -1.016209363937378, + -0.09754288196563721, + -0.25256460905075073 + ], + "min": [ + -1.1342893838882446, + -0.09754288196563721, + -0.3636585474014282 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1441236, + "componentType": 5126, + "count": 19, + "max": [ + 0.0, + -1.0, + 1.631632216003709e-07 + ], + "min": [ + 0.0, + -1.0, + -1.7623506209929474e-07 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 558640, + "componentType": 5126, + "count": 19, + "max": [ + 0.34563660621643066, + 0.7192898988723755 + ], + "min": [ + 0.15791979432106018, + 0.506489634513855 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 558792, + "componentType": 5126, + "count": 19, + "max": [ + 0.34563660621643066, + 0.7192898988723755 + ], + "min": [ + 0.15791979432106018, + 0.506489634513855 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 558944, + "componentType": 5126, + "count": 19, + "max": [ + 0.34563660621643066, + 0.7192898988723755 + ], + "min": [ + 0.15791979432106018, + 0.506489634513855 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 658992, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1441464, + "componentType": 5126, + "count": 18, + "max": [ + 0.6326147317886353, + -0.09754288196563721, + -0.25236064195632935 + ], + "min": [ + 0.22099530696868896, + -0.09754288196563721, + -0.3635943531990051 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1441680, + "componentType": 5126, + "count": 18, + "max": [ + 0.0, + -1.0, + 1.6458803031582647e-07 + ], + "min": [ + 0.0, + -1.0, + -1.0282296614150255e-07 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 559096, + "componentType": 5126, + "count": 18, + "max": [ + 0.3639701306819916, + 0.7195733189582825 + ], + "min": [ + 0.1381610482931137, + 0.5052409768104553 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 559240, + "componentType": 5126, + "count": 18, + "max": [ + 0.3639701306819916, + 0.7195733189582825 + ], + "min": [ + 0.1381610482931137, + 0.5052409768104553 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 559384, + "componentType": 5126, + "count": 18, + "max": [ + 0.3639701306819916, + 0.7195733189582825 + ], + "min": [ + 0.1381610482931137, + 0.5052409768104553 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 659112, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1441896, + "componentType": 5126, + "count": 18, + "max": [ + -0.8259264230728149, + -0.09754288196563721, + -0.252604603767395 + ], + "min": [ + -0.944029688835144, + -0.09754288196563721, + -0.3636564612388611 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1442112, + "componentType": 5126, + "count": 18, + "max": [ + 0.0, + -1.0, + 1.6328641549989698e-07 + ], + "min": [ + 0.0, + -1.0, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 559528, + "componentType": 5126, + "count": 18, + "max": [ + 0.34563663601875305, + 0.7192898988723755 + ], + "min": [ + 0.15791919827461243, + 0.5064903497695923 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 559672, + "componentType": 5126, + "count": 18, + "max": [ + 0.34563663601875305, + 0.7192898988723755 + ], + "min": [ + 0.15791919827461243, + 0.5064903497695923 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 559816, + "componentType": 5126, + "count": 18, + "max": [ + 0.34563663601875305, + 0.7192898988723755 + ], + "min": [ + 0.15791919827461243, + 0.5064903497695923 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 659232, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1442328, + "componentType": 5126, + "count": 20, + "max": [ + 0.6410342454910278, + -0.09754288196563721, + 0.31834638118743896 + ], + "min": [ + 0.35546863079071045, + -0.09754288196563721, + 0.20722761750221252 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1442568, + "componentType": 5126, + "count": 20, + "max": [ + 0.0, + -1.0, + 1.311068302811691e-07 + ], + "min": [ + 0.0, + -1.0, + -1.3217032801549067e-07 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 559960, + "componentType": 5126, + "count": 20, + "max": [ + 0.35955196619033813, + 0.7195199728012085 + ], + "min": [ + 0.1426922231912613, + 0.5057488083839417 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 560120, + "componentType": 5126, + "count": 20, + "max": [ + 0.35955196619033813, + 0.7195199728012085 + ], + "min": [ + 0.1426922231912613, + 0.5057488083839417 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 560280, + "componentType": 5126, + "count": 20, + "max": [ + 0.35955196619033813, + 0.7195199728012085 + ], + "min": [ + 0.1426922231912613, + 0.5057488083839417 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 659352, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1442808, + "componentType": 5126, + "count": 20, + "max": [ + -0.6356549263000488, + -0.09754288196563721, + -0.25256460905075073 + ], + "min": [ + -0.753734827041626, + -0.09754288196563721, + -0.3636585474014282 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1443048, + "componentType": 5126, + "count": 20, + "max": [ + 0.0, + -1.0, + 1.3521582786779618e-07 + ], + "min": [ + 0.0, + -1.0, + -6.758452286703687e-08 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 560440, + "componentType": 5126, + "count": 20, + "max": [ + 0.3456365764141083, + 0.7192899584770203 + ], + "min": [ + 0.15791979432106018, + 0.5064899325370789 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 560600, + "componentType": 5126, + "count": 20, + "max": [ + 0.3456365764141083, + 0.7192899584770203 + ], + "min": [ + 0.15791979432106018, + 0.5064899325370789 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 560760, + "componentType": 5126, + "count": 20, + "max": [ + 0.3456365764141083, + 0.7192899584770203 + ], + "min": [ + 0.15791979432106018, + 0.5064899325370789 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 659472, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1443288, + "componentType": 5126, + "count": 22, + "max": [ + -0.2550384998321533, + -0.09754288196563721, + -0.25246334075927734 + ], + "min": [ + -0.37318456172943115, + -0.09754288196563721, + -0.36258721351623535 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1443552, + "componentType": 5126, + "count": 22, + "max": [ + 0.0, + -1.0, + 2.0579140169729726e-08 + ], + "min": [ + 0.0, + -1.0, + -1.1007848144117816e-07 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 560920, + "componentType": 5126, + "count": 22, + "max": [ + 0.3456365466117859, + 0.7192903161048889 + ], + "min": [ + 0.15791483223438263, + 0.5064936280250549 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 561096, + "componentType": 5126, + "count": 22, + "max": [ + 0.3456365466117859, + 0.7192903161048889 + ], + "min": [ + 0.15791483223438263, + 0.5064936280250549 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 561272, + "componentType": 5126, + "count": 22, + "max": [ + 0.3456365466117859, + 0.7192903161048889 + ], + "min": [ + 0.15791483223438263, + 0.5064936280250549 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 659592, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1443816, + "componentType": 5126, + "count": 26, + "max": [ + -0.06513798236846924, + -0.09754288196563721, + -0.2523884177207947 + ], + "min": [ + -0.18251144886016846, + -0.09754288196563721, + -0.3635939359664917 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1444128, + "componentType": 5126, + "count": 26, + "max": [ + 0.0, + -1.0, + 1.6298962179916998e-07 + ], + "min": [ + 0.0, + -1.0, + -1.3503247942026064e-07 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 561448, + "componentType": 5126, + "count": 26, + "max": [ + 0.3456365466117859, + 0.719290018081665 + ], + "min": [ + 0.15791484713554382, + 0.5065017342567444 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 561656, + "componentType": 5126, + "count": 26, + "max": [ + 0.3456365466117859, + 0.719290018081665 + ], + "min": [ + 0.15791484713554382, + 0.5065017342567444 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 561864, + "componentType": 5126, + "count": 26, + "max": [ + 0.3456365466117859, + 0.719290018081665 + ], + "min": [ + 0.15791484713554382, + 0.5065017342567444 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 659712, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1444440, + "componentType": 5126, + "count": 28, + "max": [ + -1.680511474609375, + -0.09754288196563721, + -0.0630185604095459 + ], + "min": [ + -1.7986228466033936, + -0.09754288196563721, + -0.17404454946517944 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1444776, + "componentType": 5126, + "count": 28, + "max": [ + 0.0, + -1.0, + 8.21958323626859e-08 + ], + "min": [ + 0.0, + -1.0, + -1.3121650965786102e-07 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 562072, + "componentType": 5126, + "count": 28, + "max": [ + 0.3456781208515167, + 0.7193037271499634 + ], + "min": [ + 0.15795031189918518, + 0.5064878463745117 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 562296, + "componentType": 5126, + "count": 28, + "max": [ + 0.3456781208515167, + 0.7193037271499634 + ], + "min": [ + 0.15795031189918518, + 0.5064878463745117 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 562520, + "componentType": 5126, + "count": 28, + "max": [ + 0.3456781208515167, + 0.7193037271499634 + ], + "min": [ + 0.15795031189918518, + 0.5064878463745117 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 659832, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1445112, + "componentType": 5126, + "count": 24, + "max": [ + -1.2999274730682373, + -0.09754288196563721, + -0.0630420446395874 + ], + "min": [ + -1.4180488586425781, + -0.09754288196563721, + -0.17404574155807495 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1445400, + "componentType": 5126, + "count": 24, + "max": [ + 0.0, + -1.0, + 1.6328941399024188e-07 + ], + "min": [ + 0.0, + -1.0, + -1.0142942130642041e-07 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 562744, + "componentType": 5126, + "count": 24, + "max": [ + 0.3456780016422272, + 0.7193037271499634 + ], + "min": [ + 0.15795031189918518, + 0.5064879059791565 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 562936, + "componentType": 5126, + "count": 24, + "max": [ + 0.3456780016422272, + 0.7193037271499634 + ], + "min": [ + 0.15795031189918518, + 0.5064879059791565 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 563128, + "componentType": 5126, + "count": 24, + "max": [ + 0.3456780016422272, + 0.7193037271499634 + ], + "min": [ + 0.15795031189918518, + 0.5064879059791565 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 659952, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1445688, + "componentType": 5126, + "count": 14, + "max": [ + -0.4264945983886719, + -0.09754288196563721, + 0.5565088391304016 + ], + "min": [ + -0.5446858406066895, + -0.09754288196563721, + 0.44521164894104004 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1445856, + "componentType": 5126, + "count": 14, + "max": [ + 0.0, + -1.0, + 0.0 + ], + "min": [ + 0.0, + -1.0, + -2.2018454615135852e-08 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 563320, + "componentType": 5126, + "count": 14, + "max": [ + 0.34544801712036133, + 0.7192912101745605 + ], + "min": [ + 0.1577652245759964, + 0.5065995454788208 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 563432, + "componentType": 5126, + "count": 14, + "max": [ + 0.34544801712036133, + 0.7192912101745605 + ], + "min": [ + 0.1577652245759964, + 0.5065995454788208 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 563544, + "componentType": 5126, + "count": 14, + "max": [ + 0.34544801712036133, + 0.7192912101745605 + ], + "min": [ + 0.1577652245759964, + 0.5065995454788208 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 660072, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1446024, + "componentType": 5126, + "count": 15, + "max": [ + -1.1095802783966064, + -0.09754288196563721, + -0.0630420446395874 + ], + "min": [ + -1.2277017831802368, + -0.09754288196563721, + -0.17404574155807495 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1446204, + "componentType": 5126, + "count": 15, + "max": [ + 0.0, + -1.0, + 1.312443487222481e-07 + ], + "min": [ + 0.0, + -1.0, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 563656, + "componentType": 5126, + "count": 15, + "max": [ + 0.3456779420375824, + 0.7193037867546082 + ], + "min": [ + 0.1579345464706421, + 0.5064746737480164 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 563776, + "componentType": 5126, + "count": 15, + "max": [ + 0.3456779420375824, + 0.7193037867546082 + ], + "min": [ + 0.1579345464706421, + 0.5064746737480164 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 563896, + "componentType": 5126, + "count": 15, + "max": [ + 0.3456779420375824, + 0.7193037867546082 + ], + "min": [ + 0.1579345464706421, + 0.5064746737480164 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 660192, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1446384, + "componentType": 5126, + "count": 19, + "max": [ + -0.9193471670150757, + -0.09754288196563721, + -0.06307399272918701 + ], + "min": [ + -1.0374321937561035, + -0.09754288196563721, + -0.17415326833724976 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1446612, + "componentType": 5126, + "count": 19, + "max": [ + 0.0, + -1.0, + 5.0693650166522275e-08 + ], + "min": [ + 0.0, + -1.0, + -1.7628873649755405e-07 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 564016, + "componentType": 5126, + "count": 19, + "max": [ + 0.3456780016422272, + 0.719303548336029 + ], + "min": [ + 0.15793758630752563, + 0.5064727067947388 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 564168, + "componentType": 5126, + "count": 19, + "max": [ + 0.3456780016422272, + 0.719303548336029 + ], + "min": [ + 0.15793758630752563, + 0.5064727067947388 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 564320, + "componentType": 5126, + "count": 19, + "max": [ + 0.3456780016422272, + 0.719303548336029 + ], + "min": [ + 0.15793758630752563, + 0.5064727067947388 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 660312, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1446840, + "componentType": 5126, + "count": 20, + "max": [ + -0.7290457487106323, + -0.09754288196563721, + -0.06290322542190552 + ], + "min": [ + -0.8466997146606445, + -0.09754288196563721, + -0.17414367198944092 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1447080, + "componentType": 5126, + "count": 20, + "max": [ + 0.0, + -1.0, + 1.7593740153643012e-07 + ], + "min": [ + 0.0, + -1.0, + -4.4060751491770134e-08 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 564472, + "componentType": 5126, + "count": 20, + "max": [ + 0.3456780016422272, + 0.7193033695220947 + ], + "min": [ + 0.15793544054031372, + 0.5064846873283386 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 564632, + "componentType": 5126, + "count": 20, + "max": [ + 0.3456780016422272, + 0.7193033695220947 + ], + "min": [ + 0.15793544054031372, + 0.5064846873283386 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 564792, + "componentType": 5126, + "count": 20, + "max": [ + 0.3456780016422272, + 0.7193033695220947 + ], + "min": [ + 0.15793544054031372, + 0.5064846873283386 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 660432, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1447320, + "componentType": 5126, + "count": 17, + "max": [ + -0.5392085313796997, + -0.09754288196563721, + -0.06290322542190552 + ], + "min": [ + -0.6568626165390015, + -0.09754288196563721, + -0.17414367198944092 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1447524, + "componentType": 5126, + "count": 17, + "max": [ + 0.0, + -1.0, + 8.798652828545528e-08 + ], + "min": [ + 0.0, + -1.0, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 564952, + "componentType": 5126, + "count": 17, + "max": [ + 0.3456780016422272, + 0.719303548336029 + ], + "min": [ + 0.15793731808662415, + 0.5064725279808044 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 565088, + "componentType": 5126, + "count": 17, + "max": [ + 0.3456780016422272, + 0.719303548336029 + ], + "min": [ + 0.15793731808662415, + 0.5064725279808044 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 565224, + "componentType": 5126, + "count": 17, + "max": [ + 0.3456780016422272, + 0.719303548336029 + ], + "min": [ + 0.15793731808662415, + 0.5064725279808044 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 660552, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1447728, + "componentType": 5126, + "count": 23, + "max": [ + -0.23646628856658936, + -0.09754288196563721, + 0.5564598441123962 + ], + "min": [ + -0.35419905185699463, + -0.09754288196563721, + 0.44515904784202576 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1448004, + "componentType": 5126, + "count": 23, + "max": [ + 0.0, + -1.0, + 1.6284226944662805e-07 + ], + "min": [ + 0.0, + -1.0, + -9.897816255488578e-08 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 565360, + "componentType": 5126, + "count": 23, + "max": [ + 0.3454480469226837, + 0.719291090965271 + ], + "min": [ + 0.1577654927968979, + 0.506600558757782 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 565544, + "componentType": 5126, + "count": 23, + "max": [ + 0.3454480469226837, + 0.719291090965271 + ], + "min": [ + 0.1577654927968979, + 0.506600558757782 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 565728, + "componentType": 5126, + "count": 23, + "max": [ + 0.3454480469226837, + 0.719291090965271 + ], + "min": [ + 0.1577654927968979, + 0.506600558757782 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 660672, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1448280, + "componentType": 5126, + "count": 17, + "max": [ + -0.15816938877105713, + -0.09754288196563721, + -0.06283140182495117 + ], + "min": [ + -0.275836706161499, + -0.09754288196563721, + -0.17402660846710205 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1448484, + "componentType": 5126, + "count": 17, + "max": [ + 0.0, + -1.0, + 1.759473065021666e-07 + ], + "min": [ + 0.0, + -1.0, + -1.5896993943442794e-07 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 565912, + "componentType": 5126, + "count": 17, + "max": [ + 0.3456779718399048, + 0.7193037867546082 + ], + "min": [ + 0.15793445706367493, + 0.5064893960952759 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 566048, + "componentType": 5126, + "count": 17, + "max": [ + 0.3456779718399048, + 0.7193037867546082 + ], + "min": [ + 0.15793445706367493, + 0.5064893960952759 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 566184, + "componentType": 5126, + "count": 17, + "max": [ + 0.3456779718399048, + 0.7193037867546082 + ], + "min": [ + 0.15793445706367493, + 0.5064893960952759 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 660792, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1448688, + "componentType": 5126, + "count": 28, + "max": [ + 0.03166759014129639, + -0.09754288196563721, + -0.06282973289489746 + ], + "min": [ + -0.08601510524749756, + -0.09754288196563721, + -0.17399358749389648 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1449024, + "componentType": 5126, + "count": 28, + "max": [ + 0.0, + -1.0, + 1.363591053404889e-07 + ], + "min": [ + 0.0, + -1.0, + -1.7599482760033425e-07 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 566320, + "componentType": 5126, + "count": 28, + "max": [ + 0.3456783890724182, + 0.7193037271499634 + ], + "min": [ + 0.15793447196483612, + 0.5064961910247803 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 566544, + "componentType": 5126, + "count": 28, + "max": [ + 0.3456783890724182, + 0.7193037271499634 + ], + "min": [ + 0.15793447196483612, + 0.5064961910247803 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 566768, + "componentType": 5126, + "count": 28, + "max": [ + 0.3456783890724182, + 0.7193037271499634 + ], + "min": [ + 0.15793447196483612, + 0.5064961910247803 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 660912, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1449360, + "componentType": 5126, + "count": 18, + "max": [ + 0.273520827293396, + -0.09754288196563721, + 0.5564964413642883 + ], + "min": [ + 0.1555083990097046, + -0.09754288196563721, + 0.4452950358390808 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1449576, + "componentType": 5126, + "count": 18, + "max": [ + 0.0, + -1.0, + 1.6296498017709382e-07 + ], + "min": [ + 0.0, + -1.0, + -8.247622673707156e-08 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 566992, + "componentType": 5126, + "count": 18, + "max": [ + 0.3454483151435852, + 0.7192914485931396 + ], + "min": [ + 0.15776492655277252, + 0.5067306756973267 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 567136, + "componentType": 5126, + "count": 18, + "max": [ + 0.3454483151435852, + 0.7192914485931396 + ], + "min": [ + 0.15776492655277252, + 0.5067306756973267 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 567280, + "componentType": 5126, + "count": 18, + "max": [ + 0.3454483151435852, + 0.7192914485931396 + ], + "min": [ + 0.15776492655277252, + 0.5067306756973267 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 661032, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1449792, + "componentType": 5126, + "count": 21, + "max": [ + -1.3490829467773438, + -0.09754288196563721, + 0.12841445207595825 + ], + "min": [ + -1.46718430519104, + -0.09754288196563721, + 0.017310500144958496 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1450044, + "componentType": 5126, + "count": 21, + "max": [ + 0.0, + -1.0, + 1.6317004281063419e-07 + ], + "min": [ + 0.0, + -1.0, + -1.63149593390699e-07 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 567424, + "componentType": 5126, + "count": 21, + "max": [ + 0.34563595056533813, + 0.7193017601966858 + ], + "min": [ + 0.15790009498596191, + 0.5065323114395142 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 567592, + "componentType": 5126, + "count": 21, + "max": [ + 0.34563595056533813, + 0.7193017601966858 + ], + "min": [ + 0.15790009498596191, + 0.5065323114395142 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 567760, + "componentType": 5126, + "count": 21, + "max": [ + 0.34563595056533813, + 0.7193017601966858 + ], + "min": [ + 0.15790009498596191, + 0.5065323114395142 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 661152, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1450296, + "componentType": 5126, + "count": 18, + "max": [ + -0.3980090618133545, + -0.09754288196563721, + 0.12857460975646973 + ], + "min": [ + -0.5153895616531372, + -0.09754288196563721, + 0.017337530851364136 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1450512, + "componentType": 5126, + "count": 18, + "max": [ + 0.0, + -1.0, + 1.629539241321254e-07 + ], + "min": [ + 0.0, + -1.0, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 567928, + "componentType": 5126, + "count": 18, + "max": [ + 0.3456360101699829, + 0.7193017601966858 + ], + "min": [ + 0.15789660811424255, + 0.5065305233001709 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 568072, + "componentType": 5126, + "count": 18, + "max": [ + 0.3456360101699829, + 0.7193017601966858 + ], + "min": [ + 0.15789660811424255, + 0.5065305233001709 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 568216, + "componentType": 5126, + "count": 18, + "max": [ + 0.3456360101699829, + 0.7193017601966858 + ], + "min": [ + 0.15789660811424255, + 0.5065305233001709 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 661272, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1450728, + "componentType": 5126, + "count": 23, + "max": [ + 0.4638158082962036, + -0.09754288196563721, + 0.5564524531364441 + ], + "min": [ + 0.3458160161972046, + -0.09754288196563721, + 0.4452088475227356 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1451004, + "componentType": 5126, + "count": 23, + "max": [ + 0.0, + -1.0, + 1.5702936195793882e-07 + ], + "min": [ + 0.0, + -1.0, + -1.6311000194946246e-07 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 568360, + "componentType": 5126, + "count": 23, + "max": [ + 0.34544801712036133, + 0.7192912697792053 + ], + "min": [ + 0.15776531398296356, + 0.5066007375717163 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 568544, + "componentType": 5126, + "count": 23, + "max": [ + 0.34544801712036133, + 0.7192912697792053 + ], + "min": [ + 0.15776531398296356, + 0.5066007375717163 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 568728, + "componentType": 5126, + "count": 23, + "max": [ + 0.34544801712036133, + 0.7192912697792053 + ], + "min": [ + 0.15776531398296356, + 0.5066007375717163 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 661392, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1451280, + "componentType": 5126, + "count": 24, + "max": [ + 0.3631385564804077, + -0.09754288196563721, + 0.12857460975646973 + ], + "min": [ + 0.24575793743133545, + -0.09754288196563721, + 0.017337530851364136 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1451568, + "componentType": 5126, + "count": 24, + "max": [ + 0.0, + -1.0, + 1.629195196528599e-07 + ], + "min": [ + 0.0, + -1.0, + -1.3747894911375624e-07 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 568912, + "componentType": 5126, + "count": 24, + "max": [ + 0.3456360697746277, + 0.7193017601966858 + ], + "min": [ + 0.15789641439914703, + 0.5065304040908813 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 569104, + "componentType": 5126, + "count": 24, + "max": [ + 0.3456360697746277, + 0.7193017601966858 + ], + "min": [ + 0.15789641439914703, + 0.5065304040908813 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 569296, + "componentType": 5126, + "count": 24, + "max": [ + 0.3456360697746277, + 0.7193017601966858 + ], + "min": [ + 0.15789641439914703, + 0.5065304040908813 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 661512, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1451856, + "componentType": 5126, + "count": 20, + "max": [ + 0.6540838479995728, + -0.09754288196563721, + 0.5564936995506287 + ], + "min": [ + 0.5360778570175171, + -0.09754288196563721, + 0.4452400803565979 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1452096, + "componentType": 5126, + "count": 20, + "max": [ + 0.0, + -1.0, + 3.373156332031613e-08 + ], + "min": [ + 0.0, + -1.0, + -1.628685737387059e-07 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 569488, + "componentType": 5126, + "count": 20, + "max": [ + 0.3454483151435852, + 0.7192913293838501 + ], + "min": [ + 0.157765731215477, + 0.5067306160926819 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 569648, + "componentType": 5126, + "count": 20, + "max": [ + 0.3454483151435852, + 0.7192913293838501 + ], + "min": [ + 0.157765731215477, + 0.5067306160926819 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 569808, + "componentType": 5126, + "count": 20, + "max": [ + 0.3454483151435852, + 0.7192913293838501 + ], + "min": [ + 0.157765731215477, + 0.5067306160926819 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 661632, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1452336, + "componentType": 5126, + "count": 20, + "max": [ + -1.490203857421875, + -0.09754288196563721, + -0.06307071447372437 + ], + "min": [ + -1.6082966327667236, + -0.09754288196563721, + -0.1741170883178711 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1452576, + "componentType": 5126, + "count": 20, + "max": [ + 0.0, + -1.0, + 1.5703201938777056e-07 + ], + "min": [ + 0.0, + -1.0, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 569968, + "componentType": 5126, + "count": 20, + "max": [ + 0.34567803144454956, + 0.719303548336029 + ], + "min": [ + 0.1579379290342331, + 0.5064729452133179 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 570128, + "componentType": 5126, + "count": 20, + "max": [ + 0.34567803144454956, + 0.719303548336029 + ], + "min": [ + 0.1579379290342331, + 0.5064729452133179 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 570288, + "componentType": 5126, + "count": 20, + "max": [ + 0.34567803144454956, + 0.719303548336029 + ], + "min": [ + 0.1579379290342331, + 0.5064729452133179 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 661752, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1452816, + "componentType": 5126, + "count": 26, + "max": [ + -0.11050760746002197, + -0.09754288196563721, + -0.4448731541633606 + ], + "min": [ + -0.2697392702102661, + -0.09754288196563721, + -0.5560810565948486 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1453128, + "componentType": 5126, + "count": 26, + "max": [ + 0.0, + -1.0, + 1.3227489148448512e-07 + ], + "min": [ + 0.0, + -1.0, + -1.1739262006926765e-08 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 570448, + "componentType": 5126, + "count": 26, + "max": [ + 0.3511078357696533, + 0.7193814516067505 + ], + "min": [ + 0.15224836766719818, + 0.5060132145881653 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 570656, + "componentType": 5126, + "count": 26, + "max": [ + 0.3511078357696533, + 0.7193814516067505 + ], + "min": [ + 0.15224836766719818, + 0.5060132145881653 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 570864, + "componentType": 5126, + "count": 26, + "max": [ + 0.3511078357696533, + 0.7193814516067505 + ], + "min": [ + 0.15224836766719818, + 0.5060132145881653 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 661872, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1453440, + "componentType": 5126, + "count": 29, + "max": [ + -1.926034688949585, + -0.09754288196563721, + -0.4448973536491394 + ], + "min": [ + -2.124711036682129, + -0.09754288196563721, + -0.5560784339904785 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1453788, + "componentType": 5126, + "count": 29, + "max": [ + 0.0, + -1.0, + 1.7880719838103687e-07 + ], + "min": [ + 0.0, + -1.0, + -6.574389033175976e-08 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 571072, + "componentType": 5126, + "count": 29, + "max": [ + 0.3547818958759308, + 0.7194437980651855 + ], + "min": [ + 0.14806504547595978, + 0.5057498216629028 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 571304, + "componentType": 5126, + "count": 29, + "max": [ + 0.3547818958759308, + 0.7194437980651855 + ], + "min": [ + 0.14806504547595978, + 0.5057498216629028 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 571536, + "componentType": 5126, + "count": 29, + "max": [ + 0.3547818958759308, + 0.7194437980651855 + ], + "min": [ + 0.14806504547595978, + 0.5057498216629028 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 661992, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1454136, + "componentType": 5126, + "count": 18, + "max": [ + -1.9256733655929565, + -0.09754288196563721, + 0.12842729687690735 + ], + "min": [ + -2.125053644180298, + -0.09754288196563721, + 0.01731005311012268 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1454352, + "componentType": 5126, + "count": 18, + "max": [ + 0.0, + -1.0, + 1.351456546672125e-07 + ], + "min": [ + 0.0, + -1.0, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 571768, + "componentType": 5126, + "count": 18, + "max": [ + 0.3548302948474884, + 0.7194552421569824 + ], + "min": [ + 0.1480402797460556, + 0.5058395862579346 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 571912, + "componentType": 5126, + "count": 18, + "max": [ + 0.3548302948474884, + 0.7194552421569824 + ], + "min": [ + 0.1480402797460556, + 0.5058395862579346 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 572056, + "componentType": 5126, + "count": 18, + "max": [ + 0.3548302948474884, + 0.7194552421569824 + ], + "min": [ + 0.1480402797460556, + 0.5058395862579346 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 662112, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1454568, + "componentType": 5126, + "count": 28, + "max": [ + 1.546859860420227, + -0.09754288196563721, + 0.1284143030643463 + ], + "min": [ + 1.4287585020065308, + -0.09754288196563721, + 0.01731058955192566 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1454904, + "componentType": 5126, + "count": 28, + "max": [ + 0.0, + -1.0, + 1.3114258479163254e-07 + ], + "min": [ + 0.0, + -1.0, + -1.6315982520609396e-07 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 572200, + "componentType": 5126, + "count": 28, + "max": [ + 0.34563618898391724, + 0.7193018794059753 + ], + "min": [ + 0.15790027379989624, + 0.5065323710441589 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 572424, + "componentType": 5126, + "count": 28, + "max": [ + 0.34563618898391724, + 0.7193018794059753 + ], + "min": [ + 0.15790027379989624, + 0.5065323710441589 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 572648, + "componentType": 5126, + "count": 28, + "max": [ + 0.34563618898391724, + 0.7193018794059753 + ], + "min": [ + 0.15790027379989624, + 0.5065323710441589 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 662232, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1455240, + "componentType": 5126, + "count": 26, + "max": [ + 1.7371467351913452, + -0.09754288196563721, + 0.12841463088989258 + ], + "min": [ + 1.6190451383590698, + -0.09754288196563721, + 0.017310619354248047 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1455552, + "componentType": 5126, + "count": 26, + "max": [ + 0.0, + -1.0, + 1.3113790942043124e-07 + ], + "min": [ + 0.0, + -1.0, + -1.569038943216583e-07 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 572872, + "componentType": 5126, + "count": 26, + "max": [ + 0.34563612937927246, + 0.7193018198013306 + ], + "min": [ + 0.15790002048015594, + 0.5065323114395142 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 573080, + "componentType": 5126, + "count": 26, + "max": [ + 0.34563612937927246, + 0.7193018198013306 + ], + "min": [ + 0.15790002048015594, + 0.5065323114395142 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 573288, + "componentType": 5126, + "count": 26, + "max": [ + 0.34563612937927246, + 0.7193018198013306 + ], + "min": [ + 0.15790002048015594, + 0.5065323114395142 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 662352, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1455864, + "componentType": 5126, + "count": 17, + "max": [ + -0.34892165660858154, + -0.09754288196563721, + -0.06290322542190552 + ], + "min": [ + -0.4665757417678833, + -0.09754288196563721, + -0.17414367198944092 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1456068, + "componentType": 5126, + "count": 17, + "max": [ + 0.0, + -1.0, + 8.798652828545528e-08 + ], + "min": [ + 0.0, + -1.0, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 573496, + "componentType": 5126, + "count": 17, + "max": [ + 0.34567803144454956, + 0.719303548336029 + ], + "min": [ + 0.15793731808662415, + 0.5064725279808044 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 573632, + "componentType": 5126, + "count": 17, + "max": [ + 0.34567803144454956, + 0.719303548336029 + ], + "min": [ + 0.15793731808662415, + 0.5064725279808044 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 573768, + "componentType": 5126, + "count": 17, + "max": [ + 0.34567803144454956, + 0.719303548336029 + ], + "min": [ + 0.15793731808662415, + 0.5064725279808044 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 662472, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1456272, + "componentType": 5126, + "count": 23, + "max": [ + -1.6842536926269531, + -0.09754288196563721, + -0.44491761922836304 + ], + "min": [ + -1.8434665203094482, + -0.09754288196563721, + -0.556157112121582 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1456548, + "componentType": 5126, + "count": 23, + "max": [ + 0.0, + -1.0, + 1.6330648122675484e-07 + ], + "min": [ + 0.0, + -1.0, + -1.312585453661086e-07 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 573904, + "componentType": 5126, + "count": 23, + "max": [ + 0.3511078953742981, + 0.7193813920021057 + ], + "min": [ + 0.15202294290065765, + 0.5060132145881653 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 574088, + "componentType": 5126, + "count": 23, + "max": [ + 0.3511078953742981, + 0.7193813920021057 + ], + "min": [ + 0.15202294290065765, + 0.5060132145881653 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 574272, + "componentType": 5126, + "count": 23, + "max": [ + 0.3511078953742981, + 0.7193813920021057 + ], + "min": [ + 0.15202294290065765, + 0.5060132145881653 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 662592, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1456824, + "componentType": 5126, + "count": 21, + "max": [ + -1.7296574115753174, + -0.09754288196563721, + 0.1284150779247284 + ], + "min": [ + -1.8477600812911987, + -0.09754288196563721, + 0.01731163263320923 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1457076, + "componentType": 5126, + "count": 21, + "max": [ + 0.0, + -1.0, + 1.631325687867502e-07 + ], + "min": [ + 0.0, + -1.0, + -8.810560103711396e-08 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 574456, + "componentType": 5126, + "count": 21, + "max": [ + 0.3456360697746277, + 0.719301700592041 + ], + "min": [ + 0.1578999012708664, + 0.5065324306488037 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 574624, + "componentType": 5126, + "count": 21, + "max": [ + 0.3456360697746277, + 0.719301700592041 + ], + "min": [ + 0.1578999012708664, + 0.5065324306488037 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 574792, + "componentType": 5126, + "count": 21, + "max": [ + 0.3456360697746277, + 0.719301700592041 + ], + "min": [ + 0.1578999012708664, + 0.5065324306488037 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 662712, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1457328, + "componentType": 5126, + "count": 29, + "max": [ + -1.4459552764892578, + -0.09754288196563721, + -0.44486844539642334 + ], + "min": [ + -1.6052820682525635, + -0.09754288196563721, + -0.5560188293457031 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1457676, + "componentType": 5126, + "count": 29, + "max": [ + 0.0, + -1.0, + 1.3638963025641715e-07 + ], + "min": [ + 0.0, + -1.0, + -1.7796330098462931e-07 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 574960, + "componentType": 5126, + "count": 29, + "max": [ + 0.3511078357696533, + 0.7193817496299744 + ], + "min": [ + 0.15201959013938904, + 0.5060132741928101 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 575192, + "componentType": 5126, + "count": 29, + "max": [ + 0.3511078357696533, + 0.7193817496299744 + ], + "min": [ + 0.15201959013938904, + 0.5060132741928101 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 575424, + "componentType": 5126, + "count": 29, + "max": [ + 0.3511078357696533, + 0.7193817496299744 + ], + "min": [ + 0.15201959013938904, + 0.5060132741928101 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 662832, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1458024, + "componentType": 5126, + "count": 23, + "max": [ + -1.5393695831298828, + -0.09754288196563721, + 0.1284140944480896 + ], + "min": [ + -1.6574711799621582, + -0.09754288196563721, + 0.01731047034263611 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1458300, + "componentType": 5126, + "count": 23, + "max": [ + 0.0, + -1.0, + 1.3113090346905665e-07 + ], + "min": [ + 0.0, + -1.0, + -1.3515500540961511e-07 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 575656, + "componentType": 5126, + "count": 23, + "max": [ + 0.3456360399723053, + 0.7193018198013306 + ], + "min": [ + 0.15790005028247833, + 0.5065323114395142 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 575840, + "componentType": 5126, + "count": 23, + "max": [ + 0.3456360399723053, + 0.7193018198013306 + ], + "min": [ + 0.15790005028247833, + 0.5065323114395142 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 576024, + "componentType": 5126, + "count": 23, + "max": [ + 0.3456360399723053, + 0.7193018198013306 + ], + "min": [ + 0.15790005028247833, + 0.5065323114395142 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 662952, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1458576, + "componentType": 5126, + "count": 30, + "max": [ + -1.158796787261963, + -0.09754288196563721, + 0.12841466069221497 + ], + "min": [ + -1.2768996953964233, + -0.09754288196563721, + 0.01731160283088684 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1458936, + "componentType": 5126, + "count": 30, + "max": [ + 0.0, + -1.0, + 1.762092267654225e-07 + ], + "min": [ + 0.0, + -1.0, + -1.6315470929839648e-07 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 576208, + "componentType": 5126, + "count": 30, + "max": [ + 0.3456359803676605, + 0.7193017601966858 + ], + "min": [ + 0.15789993107318878, + 0.5065324306488037 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 576448, + "componentType": 5126, + "count": 30, + "max": [ + 0.3456359803676605, + 0.7193017601966858 + ], + "min": [ + 0.15789993107318878, + 0.5065324306488037 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 576688, + "componentType": 5126, + "count": 30, + "max": [ + 0.3456359803676605, + 0.7193017601966858 + ], + "min": [ + 0.15789993107318878, + 0.5065324306488037 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 663072, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1459296, + "componentType": 5126, + "count": 20, + "max": [ + 0.36654365062713623, + -0.09754288196563721, + -0.44491761922836304 + ], + "min": [ + 0.2073308229446411, + -0.09754288196563721, + -0.556157112121582 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1459536, + "componentType": 5126, + "count": 20, + "max": [ + 0.0, + -1.0, + 1.3097415774154797e-07 + ], + "min": [ + 0.0, + -1.0, + -8.818914665198463e-08 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 576928, + "componentType": 5126, + "count": 20, + "max": [ + 0.3511078953742981, + 0.7193814516067505 + ], + "min": [ + 0.1520228087902069, + 0.5060129761695862 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 577088, + "componentType": 5126, + "count": 20, + "max": [ + 0.3511078953742981, + 0.7193814516067505 + ], + "min": [ + 0.1520228087902069, + 0.5060129761695862 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 577248, + "componentType": 5126, + "count": 20, + "max": [ + 0.3511078953742981, + 0.7193814516067505 + ], + "min": [ + 0.1520228087902069, + 0.5060129761695862 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 663192, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1459776, + "componentType": 5126, + "count": 22, + "max": [ + -0.9685089588165283, + -0.09754288196563721, + 0.1284140944480896 + ], + "min": [ + -1.0866105556488037, + -0.09754288196563721, + 0.01731047034263611 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1460040, + "componentType": 5126, + "count": 22, + "max": [ + 0.0, + -1.0, + 1.3113083241478307e-07 + ], + "min": [ + 0.0, + -1.0, + -1.7624201120725047e-07 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 577408, + "componentType": 5126, + "count": 22, + "max": [ + 0.3456360101699829, + 0.7193017601966858 + ], + "min": [ + 0.15790009498596191, + 0.5065323710441589 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 577584, + "componentType": 5126, + "count": 22, + "max": [ + 0.3456360101699829, + 0.7193017601966858 + ], + "min": [ + 0.15790009498596191, + 0.5065323710441589 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 577760, + "componentType": 5126, + "count": 22, + "max": [ + 0.3456360101699829, + 0.7193017601966858 + ], + "min": [ + 0.15790009498596191, + 0.5065323710441589 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 663312, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1460304, + "componentType": 5126, + "count": 21, + "max": [ + 0.6448272466659546, + -0.09754288196563721, + -0.44510674476623535 + ], + "min": [ + 0.44545161724090576, + -0.09754288196563721, + -0.5560975074768066 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1460556, + "componentType": 5126, + "count": 21, + "max": [ + 0.0, + -1.0, + 4.409656284565244e-08 + ], + "min": [ + 0.0, + -1.0, + -1.6336623787083226e-07 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 577936, + "componentType": 5126, + "count": 21, + "max": [ + 0.35478198528289795, + 0.7194437980651855 + ], + "min": [ + 0.14806529879570007, + 0.5057465434074402 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 578104, + "componentType": 5126, + "count": 21, + "max": [ + 0.35478198528289795, + 0.7194437980651855 + ], + "min": [ + 0.14806529879570007, + 0.5057465434074402 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 578272, + "componentType": 5126, + "count": 21, + "max": [ + 0.35478198528289795, + 0.7194437980651855 + ], + "min": [ + 0.14806529879570007, + 0.5057465434074402 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 663432, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1460808, + "componentType": 5126, + "count": 17, + "max": [ + -0.7782233953475952, + -0.09754288196563721, + 0.1284150779247284 + ], + "min": [ + -0.896325945854187, + -0.09754288196563721, + 0.01731163263320923 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1461012, + "componentType": 5126, + "count": 17, + "max": [ + 0.0, + -1.0, + 0.0 + ], + "min": [ + 0.0, + -1.0, + -8.811355201032711e-08 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 578440, + "componentType": 5126, + "count": 17, + "max": [ + 0.3456360101699829, + 0.719301700592041 + ], + "min": [ + 0.15789994597434998, + 0.5065324306488037 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 578576, + "componentType": 5126, + "count": 17, + "max": [ + 0.3456360101699829, + 0.719301700592041 + ], + "min": [ + 0.15789994597434998, + 0.5065324306488037 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 578712, + "componentType": 5126, + "count": 17, + "max": [ + 0.3456360101699829, + 0.719301700592041 + ], + "min": [ + 0.15789994597434998, + 0.5065324306488037 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 663552, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1461216, + "componentType": 5126, + "count": 19, + "max": [ + -0.5879333019256592, + -0.09754288196563721, + 0.1284150779247284 + ], + "min": [ + -0.7060359716415405, + -0.09754288196563721, + 0.01731163263320923 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1461444, + "componentType": 5126, + "count": 19, + "max": [ + 0.0, + -1.0, + 1.7621916015286843e-07 + ], + "min": [ + 0.0, + -1.0, + -1.7621368897380307e-07 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 578848, + "componentType": 5126, + "count": 19, + "max": [ + 0.3456360101699829, + 0.7193017601966858 + ], + "min": [ + 0.15789982676506042, + 0.5065323710441589 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 579000, + "componentType": 5126, + "count": 19, + "max": [ + 0.3456360101699829, + 0.7193017601966858 + ], + "min": [ + 0.15789982676506042, + 0.5065323710441589 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 579152, + "componentType": 5126, + "count": 19, + "max": [ + 0.3456360101699829, + 0.7193017601966858 + ], + "min": [ + 0.15789982676506042, + 0.5065323710441589 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 663672, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1461672, + "componentType": 5126, + "count": 21, + "max": [ + -1.9705206155776978, + -0.09754288196563721, + -0.25257396697998047 + ], + "min": [ + -2.1296064853668213, + -0.09754288196563721, + -0.36365312337875366 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1461924, + "componentType": 5126, + "count": 21, + "max": [ + 0.0, + -1.0, + 1.1343259842533371e-07 + ], + "min": [ + 0.0, + -1.0, + -1.632842838716897e-07 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 579304, + "componentType": 5126, + "count": 21, + "max": [ + 0.3509249985218048, + 0.7193800806999207 + ], + "min": [ + 0.15220534801483154, + 0.5060242414474487 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 579472, + "componentType": 5126, + "count": 21, + "max": [ + 0.3509249985218048, + 0.7193800806999207 + ], + "min": [ + 0.15220534801483154, + 0.5060242414474487 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 579640, + "componentType": 5126, + "count": 21, + "max": [ + 0.3509249985218048, + 0.7193800806999207 + ], + "min": [ + 0.15220534801483154, + 0.5060242414474487 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 663792, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1462176, + "componentType": 5126, + "count": 20, + "max": [ + -0.20734715461730957, + -0.09754288196563721, + 0.1285598874092102 + ], + "min": [ + -0.32508814334869385, + -0.09754288196563721, + 0.01731884479522705 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1462416, + "componentType": 5126, + "count": 20, + "max": [ + 0.0, + -1.0, + 1.7621518111354817e-07 + ], + "min": [ + 0.0, + -1.0, + -5.0689266117842635e-08 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 579808, + "componentType": 5126, + "count": 20, + "max": [ + 0.3456359803676605, + 0.719301700592041 + ], + "min": [ + 0.1579003930091858, + 0.5065314173698425 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 579968, + "componentType": 5126, + "count": 20, + "max": [ + 0.3456359803676605, + 0.719301700592041 + ], + "min": [ + 0.1579003930091858, + 0.5065314173698425 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 580128, + "componentType": 5126, + "count": 20, + "max": [ + 0.3456359803676605, + 0.719301700592041 + ], + "min": [ + 0.1579003930091858, + 0.5065314173698425 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 663912, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1462656, + "componentType": 5126, + "count": 17, + "max": [ + -0.01744985580444336, + -0.09754288196563721, + 0.1285598874092102 + ], + "min": [ + -0.13519084453582764, + -0.09754288196563721, + 0.01731884479522705 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1462860, + "componentType": 5126, + "count": 17, + "max": [ + 0.0, + -1.0, + 0.0 + ], + "min": [ + 0.0, + -1.0, + -5.48352190321566e-08 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 580288, + "componentType": 5126, + "count": 17, + "max": [ + 0.3456360101699829, + 0.7193017601966858 + ], + "min": [ + 0.15790045261383057, + 0.5065325498580933 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 580424, + "componentType": 5126, + "count": 17, + "max": [ + 0.3456360101699829, + 0.7193017601966858 + ], + "min": [ + 0.15790045261383057, + 0.5065325498580933 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 580560, + "componentType": 5126, + "count": 17, + "max": [ + 0.3456360101699829, + 0.7193017601966858 + ], + "min": [ + 0.15790045261383057, + 0.5065325498580933 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 664032, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1463064, + "componentType": 5126, + "count": 19, + "max": [ + -1.934800386428833, + -0.09754288196563721, + -0.06308293342590332 + ], + "min": [ + -2.1249332427978516, + -0.09754288196563721, + -0.17414963245391846 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1463292, + "componentType": 5126, + "count": 19, + "max": [ + 0.0, + -1.0, + 0.0 + ], + "min": [ + 0.0, + -1.0, + -1.7639223415244487e-07 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 580696, + "componentType": 5126, + "count": 19, + "max": [ + 0.3538671135902405, + 0.7194452285766602 + ], + "min": [ + 0.14915549755096436, + 0.5058111548423767 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 580848, + "componentType": 5126, + "count": 19, + "max": [ + 0.3538671135902405, + 0.7194452285766602 + ], + "min": [ + 0.14915549755096436, + 0.5058111548423767 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 581000, + "componentType": 5126, + "count": 19, + "max": [ + 0.3538671135902405, + 0.7194452285766602 + ], + "min": [ + 0.14915549755096436, + 0.5058111548423767 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 664152, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1463520, + "componentType": 5126, + "count": 17, + "max": [ + 1.546836256980896, + -0.09754288196563721, + -0.25256210565567017 + ], + "min": [ + 1.4287506341934204, + -0.09754288196563721, + -0.3636539578437805 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1463724, + "componentType": 5126, + "count": 17, + "max": [ + 0.0, + -1.0, + 0.0 + ], + "min": [ + 0.0, + -1.0, + -1.3218225092259672e-07 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 581152, + "componentType": 5126, + "count": 17, + "max": [ + 0.345636785030365, + 0.7192898988723755 + ], + "min": [ + 0.15791675448417664, + 0.5064935684204102 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 581288, + "componentType": 5126, + "count": 17, + "max": [ + 0.345636785030365, + 0.7192898988723755 + ], + "min": [ + 0.15791675448417664, + 0.5064935684204102 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 581424, + "componentType": 5126, + "count": 17, + "max": [ + 0.345636785030365, + 0.7192898988723755 + ], + "min": [ + 0.15791675448417664, + 0.5064935684204102 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 664272, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1463928, + "componentType": 5126, + "count": 26, + "max": [ + 1.927017331123352, + -0.09754288196563721, + -0.25240516662597656 + ], + "min": [ + 1.8093301057815552, + -0.09754288196563721, + -0.36364424228668213 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1464240, + "componentType": 5126, + "count": 26, + "max": [ + 0.0, + -1.0, + 4.217756810476203e-08 + ], + "min": [ + 0.0, + -1.0, + -1.6324078444540646e-07 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 581560, + "componentType": 5126, + "count": 26, + "max": [ + 0.3456368148326874, + 0.7192898988723755 + ], + "min": [ + 0.15791945159435272, + 0.5064899325370789 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 581768, + "componentType": 5126, + "count": 26, + "max": [ + 0.3456368148326874, + 0.7192898988723755 + ], + "min": [ + 0.15791945159435272, + 0.5064899325370789 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 581976, + "componentType": 5126, + "count": 26, + "max": [ + 0.3456368148326874, + 0.7192898988723755 + ], + "min": [ + 0.15791945159435272, + 0.5064899325370789 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 664392, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1464552, + "componentType": 5126, + "count": 21, + "max": [ + -0.6170616149902344, + -0.09754288196563721, + 0.5565162301063538 + ], + "min": [ + -0.7349858283996582, + -0.09754288196563721, + 0.4451618492603302 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1464804, + "componentType": 5126, + "count": 21, + "max": [ + 0.0, + -1.0, + 1.6284141679534514e-07 + ], + "min": [ + 0.0, + -1.0, + -6.594830637141058e-08 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 582184, + "componentType": 5126, + "count": 21, + "max": [ + 0.3454480767250061, + 0.7192912101745605 + ], + "min": [ + 0.15776684880256653, + 0.5067225694656372 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 582352, + "componentType": 5126, + "count": 21, + "max": [ + 0.3454480767250061, + 0.7192912101745605 + ], + "min": [ + 0.15776684880256653, + 0.5067225694656372 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 582520, + "componentType": 5126, + "count": 21, + "max": [ + 0.3454480767250061, + 0.7192912101745605 + ], + "min": [ + 0.15776684880256653, + 0.5067225694656372 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 664512, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1465056, + "componentType": 5126, + "count": 29, + "max": [ + 0.1282445192337036, + -0.09754288196563721, + -0.4449159502983093 + ], + "min": [ + -0.031047582626342773, + -0.09754288196563721, + -0.5561561584472656 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1465404, + "componentType": 5126, + "count": 29, + "max": [ + 0.0, + -1.0, + 1.3505065510344139e-07 + ], + "min": [ + 0.0, + -1.0, + -1.2104896995879244e-07 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 582688, + "componentType": 5126, + "count": 29, + "max": [ + 0.3511078357696533, + 0.7193814516067505 + ], + "min": [ + 0.15202300250530243, + 0.5060133337974548 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 582920, + "componentType": 5126, + "count": 29, + "max": [ + 0.3511078357696533, + 0.7193814516067505 + ], + "min": [ + 0.15202300250530243, + 0.5060133337974548 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 583152, + "componentType": 5126, + "count": 29, + "max": [ + 0.3511078357696533, + 0.7193814516067505 + ], + "min": [ + 0.15202300250530243, + 0.5060133337974548 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 664632, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1465752, + "componentType": 5126, + "count": 72, + "max": [ + -1.9833532571792603, + -0.07334303855895996, + 0.5897574424743652 + ], + "min": [ + -2.161191463470459, + -0.1962679624557495, + 0.4119192957878113 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1466616, + "componentType": 5126, + "count": 72, + "max": [ + 0.977324903011322, + -0.060593053698539734, + 0.9981600642204285 + ], + "min": [ + -0.9773246049880981, + -0.9975011944770813, + -0.9312333464622498 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 583384, + "componentType": 5126, + "count": 72, + "max": [ + 0.04994118958711624, + 0.9797345995903015 + ], + "min": [ + 0.009556885808706284, + 0.8299568891525269 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 583960, + "componentType": 5126, + "count": 72, + "max": [ + 0.04994118958711624, + 0.9797345995903015 + ], + "min": [ + 0.009556885808706284, + 0.8299568891525269 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 664752, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1467480, + "componentType": 5126, + "count": 72, + "max": [ + 0.6816927194595337, + -0.07334303855895996, + 0.3517885208129883 + ], + "min": [ + 0.314811110496521, + -0.19102349877357483, + 0.17395034432411194 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1468344, + "componentType": 5126, + "count": 72, + "max": [ + 0.976402997970581, + -0.06181471422314644, + 0.9980873465538025 + ], + "min": [ + -0.9756389260292053, + -0.9994580149650574, + -0.928249180316925 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 584536, + "componentType": 5126, + "count": 72, + "max": [ + 0.6551312208175659, + 0.7854538559913635 + ], + "min": [ + 0.5718181133270264, + 0.6356762051582336 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 585112, + "componentType": 5126, + "count": 72, + "max": [ + 0.6551312208175659, + 0.7854538559913635 + ], + "min": [ + 0.5718181133270264, + 0.6356762051582336 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 666240, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1469208, + "componentType": 5126, + "count": 56, + "max": [ + -0.5139243602752686, + -0.07334303855895996, + -0.034624695777893066 + ], + "min": [ + -0.6816970109939575, + -0.14551645517349243, + -0.20239728689193726 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1469880, + "componentType": 5126, + "count": 56, + "max": [ + 0.934633195400238, + 0.4678288996219635, + 0.9035037159919739 + ], + "min": [ + -0.934634268283844, + 0.13572052121162415, + -0.9907472729682922 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 585688, + "componentType": 5126, + "count": 56, + "max": [ + 0.38362547755241394, + 0.46001124382019043 + ], + "min": [ + 0.3455268442630768, + 0.31871020793914795 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 586136, + "componentType": 5126, + "count": 56, + "max": [ + 0.38362547755241394, + 0.46001124382019043 + ], + "min": [ + 0.3455268442630768, + 0.31871020793914795 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 667728, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1470552, + "componentType": 5126, + "count": 56, + "max": [ + 2.143183708190918, + -0.07334303855895996, + 0.15508300065994263 + ], + "min": [ + 1.97541081905365, + -0.14551645517349243, + -0.20018088817596436 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1471224, + "componentType": 5126, + "count": 56, + "max": [ + 0.926451563835144, + 0.6483983397483826, + 0.7747944593429565 + ], + "min": [ + -0.9264460802078247, + 0.34633591771125793, + -0.9020326733589172 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 586584, + "componentType": 5126, + "count": 56, + "max": [ + 0.9870129227638245, + 0.6197856664657593 + ], + "min": [ + 0.9489142894744873, + 0.32057714462280273 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 587032, + "componentType": 5126, + "count": 56, + "max": [ + 0.9870129227638245, + 0.6197856664657593 + ], + "min": [ + 0.9489142894744873, + 0.32057714462280273 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 668160, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1471896, + "componentType": 5126, + "count": 72, + "max": [ + 0.6814929246902466, + -0.07334303855895996, + -0.21909785270690918 + ], + "min": [ + 0.17154157161712646, + -0.17803868651390076, + -0.39693599939346313 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1472760, + "componentType": 5126, + "count": 72, + "max": [ + 0.9640036821365356, + -0.11598226428031921, + 0.9932502508163452 + ], + "min": [ + -0.9639989733695984, + -0.986599326133728, + -0.9269254207611084 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 587480, + "componentType": 5126, + "count": 72, + "max": [ + 0.6550858616828918, + 0.30464524030685425 + ], + "min": [ + 0.539283812046051, + 0.15486735105514526 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 588056, + "componentType": 5126, + "count": 72, + "max": [ + 0.6550858616828918, + 0.30464524030685425 + ], + "min": [ + 0.539283812046051, + 0.15486735105514526 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 668592, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1473624, + "componentType": 5126, + "count": 72, + "max": [ + -1.6506125926971436, + -0.07334303855895996, + -0.029591917991638184 + ], + "min": [ + -1.8284507989883423, + -0.17012333869934082, + -0.20743006467819214 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1474488, + "componentType": 5126, + "count": 72, + "max": [ + 0.9620892405509949, + -0.11467728018760681, + 0.9933953881263733 + ], + "min": [ + -0.9620863199234009, + -0.9952102303504944, + -0.915906548500061 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 588632, + "componentType": 5126, + "count": 72, + "max": [ + 0.1255013644695282, + 0.464249849319458 + ], + "min": [ + 0.08511696755886078, + 0.3144715428352356 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 589208, + "componentType": 5126, + "count": 72, + "max": [ + 0.1255013644695282, + 0.464249849319458 + ], + "min": [ + 0.08511696755886078, + 0.3144715428352356 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 670080, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1475352, + "componentType": 5126, + "count": 72, + "max": [ + -1.4603257179260254, + -0.07334303855895996, + -0.029591917991638184 + ], + "min": [ + -1.6381639242172241, + -0.17012333869934082, + -0.20743006467819214 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1476216, + "componentType": 5126, + "count": 72, + "max": [ + 0.9620886445045471, + -0.11465809494256973, + 0.9933977723121643 + ], + "min": [ + -0.9620867967605591, + -0.9952096939086914, + -0.9159064292907715 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 589784, + "componentType": 5126, + "count": 72, + "max": [ + 0.16871242225170135, + 0.464249849319458 + ], + "min": [ + 0.12832827866077423, + 0.3144715428352356 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 590360, + "componentType": 5126, + "count": 72, + "max": [ + 0.16871242225170135, + 0.464249849319458 + ], + "min": [ + 0.12832827866077423, + 0.3144715428352356 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 671568, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1477080, + "componentType": 5126, + "count": 72, + "max": [ + -1.2700389623641968, + -0.07334303855895996, + -0.029591917991638184 + ], + "min": [ + -1.4478771686553955, + -0.17012333869934082, + -0.20743006467819214 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1477944, + "componentType": 5126, + "count": 72, + "max": [ + 0.9620893001556396, + -0.11471603810787201, + 0.9933910965919495 + ], + "min": [ + -0.9620862007141113, + -0.9952102303504944, + -0.915920078754425 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 590936, + "componentType": 5126, + "count": 72, + "max": [ + 0.21192362904548645, + 0.464249849319458 + ], + "min": [ + 0.17153935134410858, + 0.3144715428352356 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 591512, + "componentType": 5126, + "count": 72, + "max": [ + 0.21192362904548645, + 0.464249849319458 + ], + "min": [ + 0.17153935134410858, + 0.3144715428352356 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 673056, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1478808, + "componentType": 5126, + "count": 56, + "max": [ + -0.7042112350463867, + -0.07334303855895996, + -0.034624695777893066 + ], + "min": [ + -0.8719838857650757, + -0.14551645517349243, + -0.20239728689193726 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1479480, + "componentType": 5126, + "count": 56, + "max": [ + 0.934633195400238, + 0.4678295850753784, + 0.9035038352012634 + ], + "min": [ + -0.9346328973770142, + 0.1357203722000122, + -0.9907472729682922 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 592088, + "componentType": 5126, + "count": 56, + "max": [ + 0.3404141664505005, + 0.46001124382019043 + ], + "min": [ + 0.30231571197509766, + 0.31871020793914795 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 592536, + "componentType": 5126, + "count": 56, + "max": [ + 0.3404141664505005, + 0.46001124382019043 + ], + "min": [ + 0.30231571197509766, + 0.31871020793914795 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 674544, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1480152, + "componentType": 5126, + "count": 72, + "max": [ + -1.0797520875930786, + -0.07334303855895996, + -0.029591917991638184 + ], + "min": [ + -1.2575902938842773, + -0.17012333869934082, + -0.20743006467819214 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1481016, + "componentType": 5126, + "count": 72, + "max": [ + 0.9620896577835083, + -0.11457537114620209, + 0.9934071898460388 + ], + "min": [ + -0.96208655834198, + -0.9952102899551392, + -0.9159066677093506 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 592984, + "componentType": 5126, + "count": 72, + "max": [ + 0.2551347017288208, + 0.464249849319458 + ], + "min": [ + 0.21475058794021606, + 0.3144715428352356 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 593560, + "componentType": 5126, + "count": 72, + "max": [ + 0.2551347017288208, + 0.464249849319458 + ], + "min": [ + 0.21475058794021606, + 0.3144715428352356 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 674976, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1481880, + "componentType": 5126, + "count": 72, + "max": [ + -0.8894652128219604, + -0.07334303855895996, + -0.029591917991638184 + ], + "min": [ + -1.0673034191131592, + -0.17012333869934082, + -0.20743006467819214 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1482744, + "componentType": 5126, + "count": 72, + "max": [ + 0.9620891213417053, + -0.11467700451612473, + 0.9933955073356628 + ], + "min": [ + -0.9620862007141113, + -0.9952102899551392, + -0.9159218072891235 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 594136, + "componentType": 5126, + "count": 72, + "max": [ + 0.2983459532260895, + 0.464249849319458 + ], + "min": [ + 0.25796160101890564, + 0.3144715428352356 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 594712, + "componentType": 5126, + "count": 72, + "max": [ + 0.2983459532260895, + 0.464249849319458 + ], + "min": [ + 0.25796160101890564, + 0.3144715428352356 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 676464, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1483608, + "componentType": 5126, + "count": 72, + "max": [ + -0.6991784572601318, + -0.07334303855895996, + -0.029591917991638184 + ], + "min": [ + -0.8770166635513306, + -0.17012333869934082, + -0.20743006467819214 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1484472, + "componentType": 5126, + "count": 72, + "max": [ + 0.9620891213417053, + -0.11459226906299591, + 0.9934051036834717 + ], + "min": [ + -0.9620860815048218, + -0.9952102303504944, + -0.9159203171730042 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 595288, + "componentType": 5126, + "count": 72, + "max": [ + 0.34155693650245667, + 0.464249849319458 + ], + "min": [ + 0.3011728823184967, + 0.3144715428352356 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 595864, + "componentType": 5126, + "count": 72, + "max": [ + 0.34155693650245667, + 0.464249849319458 + ], + "min": [ + 0.3011728823184967, + 0.3144715428352356 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 677952, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1485336, + "componentType": 5126, + "count": 72, + "max": [ + -0.5088915824890137, + -0.07334303855895996, + -0.029591917991638184 + ], + "min": [ + -0.6867297887802124, + -0.17012333869934082, + -0.20743006467819214 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1486200, + "componentType": 5126, + "count": 72, + "max": [ + 0.9620895385742188, + -0.11467692255973816, + 0.9933955073356628 + ], + "min": [ + -0.9620862603187561, + -0.9952102303504944, + -0.915922224521637 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 596440, + "componentType": 5126, + "count": 72, + "max": [ + 0.3847683072090149, + 0.464249849319458 + ], + "min": [ + 0.3443838953971863, + 0.3144715428352356 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 597016, + "componentType": 5126, + "count": 72, + "max": [ + 0.3847683072090149, + 0.464249849319458 + ], + "min": [ + 0.3443838953971863, + 0.3144715428352356 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 679440, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1487064, + "componentType": 5126, + "count": 72, + "max": [ + -0.3186047077178955, + -0.07334303855895996, + -0.029591917991638184 + ], + "min": [ + -0.49644291400909424, + -0.17012333869934082, + -0.20743006467819214 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1487928, + "componentType": 5126, + "count": 72, + "max": [ + 0.9620895385742188, + -0.11471603810787201, + 0.9933910965919495 + ], + "min": [ + -0.9620863199234009, + -0.9952102899551392, + -0.9159069657325745 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 597592, + "componentType": 5126, + "count": 72, + "max": [ + 0.42797940969467163, + 0.464249849319458 + ], + "min": [ + 0.38759517669677734, + 0.3144715428352356 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 598168, + "componentType": 5126, + "count": 72, + "max": [ + 0.42797940969467163, + 0.464249849319458 + ], + "min": [ + 0.38759517669677734, + 0.3144715428352356 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 680928, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1488792, + "componentType": 5126, + "count": 56, + "max": [ + 2.1425561904907227, + -0.07334303855895996, + 0.3467557430267334 + ], + "min": [ + 1.9747833013534546, + -0.14551645517349243, + 0.17898312211036682 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1489464, + "componentType": 5126, + "count": 56, + "max": [ + 0.934838056564331, + 0.4680488705635071, + 0.9035114645957947 + ], + "min": [ + -0.9348477721214294, + 0.13573665916919708, + -0.9907450079917908 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 598744, + "componentType": 5126, + "count": 56, + "max": [ + 0.9868702292442322, + 0.7812153100967407 + ], + "min": [ + 0.9487718343734741, + 0.639914870262146 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 599192, + "componentType": 5126, + "count": 56, + "max": [ + 0.9868702292442322, + 0.7812153100967407 + ], + "min": [ + 0.9487718343734741, + 0.639914870262146 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 682416, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1490136, + "componentType": 5126, + "count": 72, + "max": [ + -0.12831783294677734, + -0.07334303855895996, + -0.029591917991638184 + ], + "min": [ + -0.3061560392379761, + -0.17012333869934082, + -0.20743006467819214 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1491000, + "componentType": 5126, + "count": 72, + "max": [ + 0.962089478969574, + -0.11470019072294235, + 0.9933927655220032 + ], + "min": [ + -0.9620863199234009, + -0.9952102899551392, + -0.9159219861030579 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 599640, + "componentType": 5126, + "count": 72, + "max": [ + 0.47119051218032837, + 0.464249849319458 + ], + "min": [ + 0.4308064877986908, + 0.3144715428352356 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 600216, + "componentType": 5126, + "count": 72, + "max": [ + 0.47119051218032837, + 0.464249849319458 + ], + "min": [ + 0.4308064877986908, + 0.3144715428352356 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 682848, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1491864, + "componentType": 5126, + "count": 72, + "max": [ + 0.06196916103363037, + -0.07334303855895996, + -0.029591917991638184 + ], + "min": [ + -0.11586916446685791, + -0.17012333869934082, + -0.20743006467819214 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1492728, + "componentType": 5126, + "count": 72, + "max": [ + 0.9620888829231262, + -0.11470013111829758, + 0.9933927655220032 + ], + "min": [ + -0.9620863795280457, + -0.9952102899551392, + -0.9159221053123474 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 600792, + "componentType": 5126, + "count": 72, + "max": [ + 0.5144016742706299, + 0.464249849319458 + ], + "min": [ + 0.4740173816680908, + 0.3144715428352356 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 601368, + "componentType": 5126, + "count": 72, + "max": [ + 0.5144016742706299, + 0.464249849319458 + ], + "min": [ + 0.4740173816680908, + 0.3144715428352356 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 684336, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1493592, + "componentType": 5126, + "count": 72, + "max": [ + 0.25225579738616943, + -0.07334303855895996, + -0.029591917991638184 + ], + "min": [ + 0.07441771030426025, + -0.17012333869934082, + -0.20743006467819214 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1494456, + "componentType": 5126, + "count": 72, + "max": [ + 0.9620899558067322, + -0.11467669159173965, + 0.9933954477310181 + ], + "min": [ + -0.9620862603187561, + -0.9952102303504944, + -0.9159221053123474 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 601944, + "componentType": 5126, + "count": 72, + "max": [ + 0.5576127767562866, + 0.464249849319458 + ], + "min": [ + 0.5172285437583923, + 0.3144715428352356 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 602520, + "componentType": 5126, + "count": 72, + "max": [ + 0.5576127767562866, + 0.464249849319458 + ], + "min": [ + 0.5172285437583923, + 0.3144715428352356 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 685824, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1495320, + "componentType": 5126, + "count": 72, + "max": [ + -1.8905491828918457, + -0.07334303855895996, + -0.4116091728210449 + ], + "min": [ + -2.160196542739868, + -0.1766635924577713, + -0.5894473195075989 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1496184, + "componentType": 5126, + "count": 72, + "max": [ + 0.9632067680358887, + -0.11844192445278168, + 0.9929571151733398 + ], + "min": [ + -0.9632048606872559, + -0.9854620695114136, + -0.9257926344871521 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 603096, + "componentType": 5126, + "count": 72, + "max": [ + 0.07101541012525558, + 0.14250916242599487 + ], + "min": [ + 0.00978281069546938, + -0.007269144058227539 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 603672, + "componentType": 5126, + "count": 72, + "max": [ + 0.07101541012525558, + 0.14250916242599487 + ], + "min": [ + 0.00978281069546938, + -0.007269144058227539 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 687312, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1497048, + "componentType": 5126, + "count": 72, + "max": [ + -1.6997880935668945, + -0.07334303855895996, + 0.16186833381652832 + ], + "min": [ + -1.8776262998580933, + -0.17252551019191742, + -0.015969812870025635 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1497912, + "componentType": 5126, + "count": 72, + "max": [ + 0.9660976529121399, + -0.10348633676767349, + 0.9946253895759583 + ], + "min": [ + -0.9661011099815369, + -0.9991055130958557, + -0.9187694191932678 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 604248, + "componentType": 5126, + "count": 72, + "max": [ + 0.11433429270982742, + 0.6255007386207581 + ], + "min": [ + 0.07395023107528687, + 0.47572243213653564 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 604824, + "componentType": 5126, + "count": 72, + "max": [ + 0.11433429270982742, + 0.6255007386207581 + ], + "min": [ + 0.07395023107528687, + 0.47572243213653564 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 688800, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1498776, + "componentType": 5126, + "count": 72, + "max": [ + -1.5095012187957764, + -0.07334303855895996, + 0.16186833381652832 + ], + "min": [ + -1.687339425086975, + -0.17252551019191742, + -0.015969812870025635 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1499640, + "componentType": 5126, + "count": 72, + "max": [ + 0.966097354888916, + -0.10346997529268265, + 0.9946272969245911 + ], + "min": [ + -0.9661011099815369, + -0.9991056323051453, + -0.9187688231468201 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 605400, + "componentType": 5126, + "count": 72, + "max": [ + 0.15754568576812744, + 0.6255007386207581 + ], + "min": [ + 0.11716122180223465, + 0.47572243213653564 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 605976, + "componentType": 5126, + "count": 72, + "max": [ + 0.15754568576812744, + 0.6255007386207581 + ], + "min": [ + 0.11716122180223465, + 0.47572243213653564 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 690288, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1500504, + "componentType": 5126, + "count": 72, + "max": [ + -1.3192144632339478, + -0.07334303855895996, + 0.16186833381652832 + ], + "min": [ + -1.4970526695251465, + -0.17252551019191742, + -0.015969812870025635 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1501368, + "componentType": 5126, + "count": 72, + "max": [ + 0.966097354888916, + -0.10336679220199585, + 0.994637668132782 + ], + "min": [ + -0.9661011099815369, + -0.9991055727005005, + -0.9187682271003723 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 606552, + "componentType": 5126, + "count": 72, + "max": [ + 0.20075654983520508, + 0.6255007386207581 + ], + "min": [ + 0.16037249565124512, + 0.47572243213653564 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 607128, + "componentType": 5126, + "count": 72, + "max": [ + 0.20075654983520508, + 0.6255007386207581 + ], + "min": [ + 0.16037249565124512, + 0.47572243213653564 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 691776, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1502232, + "componentType": 5126, + "count": 72, + "max": [ + -1.1289275884628296, + -0.07334303855895996, + 0.16186833381652832 + ], + "min": [ + -1.3067657947540283, + -0.17252551019191742, + -0.015969812870025635 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1503096, + "componentType": 5126, + "count": 72, + "max": [ + 0.9660976529121399, + -0.10341149568557739, + 0.9946334362030029 + ], + "min": [ + -0.9661011099815369, + -0.9991055130958557, + -0.9187685251235962 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 607704, + "componentType": 5126, + "count": 72, + "max": [ + 0.24396789073944092, + 0.6255007386207581 + ], + "min": [ + 0.2035835087299347, + 0.47572243213653564 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 608280, + "componentType": 5126, + "count": 72, + "max": [ + 0.24396789073944092, + 0.6255007386207581 + ], + "min": [ + 0.2035835087299347, + 0.47572243213653564 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 693264, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1503960, + "componentType": 5126, + "count": 56, + "max": [ + -0.8944979906082153, + -0.07334303855895996, + -0.034624695777893066 + ], + "min": [ + -1.0622706413269043, + -0.14551645517349243, + -0.20239728689193726 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1504632, + "componentType": 5126, + "count": 56, + "max": [ + 0.9346331357955933, + 0.46782901883125305, + 0.9035045504570007 + ], + "min": [ + -0.9346327781677246, + 0.13572007417678833, + -0.9907472729682922 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 608856, + "componentType": 5126, + "count": 56, + "max": [ + 0.2972031235694885, + 0.46001124382019043 + ], + "min": [ + 0.25910449028015137, + 0.31871020793914795 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 609304, + "componentType": 5126, + "count": 56, + "max": [ + 0.2972031235694885, + 0.46001124382019043 + ], + "min": [ + 0.25910449028015137, + 0.31871020793914795 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 694752, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1505304, + "componentType": 5126, + "count": 72, + "max": [ + -0.9386407136917114, + -0.07334303855895996, + 0.16186833381652832 + ], + "min": [ + -1.1164789199829102, + -0.17252551019191742, + -0.015969812870025635 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1506168, + "componentType": 5126, + "count": 72, + "max": [ + 0.9660975337028503, + -0.1034298837184906, + 0.9946313500404358 + ], + "min": [ + -0.9661010503768921, + -0.9991055727005005, + -0.9187687039375305 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 609752, + "componentType": 5126, + "count": 72, + "max": [ + 0.2871788740158081, + 0.6255007386207581 + ], + "min": [ + 0.24679487943649292, + 0.47572243213653564 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 610328, + "componentType": 5126, + "count": 72, + "max": [ + 0.2871788740158081, + 0.6255007386207581 + ], + "min": [ + 0.24679487943649292, + 0.47572243213653564 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 695184, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1507032, + "componentType": 5126, + "count": 72, + "max": [ + -0.7483539581298828, + -0.07334303855895996, + 0.16186833381652832 + ], + "min": [ + -0.9261921644210815, + -0.17252551019191742, + -0.015969812870025635 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1507896, + "componentType": 5126, + "count": 72, + "max": [ + 0.9660976529121399, + -0.1034117266535759, + 0.9946334362030029 + ], + "min": [ + -0.9661014080047607, + -0.9991055727005005, + -0.9187692403793335 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 610904, + "componentType": 5126, + "count": 72, + "max": [ + 0.33039015531539917, + 0.6255007386207581 + ], + "min": [ + 0.29000577330589294, + 0.47572243213653564 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 611480, + "componentType": 5126, + "count": 72, + "max": [ + 0.33039015531539917, + 0.6255007386207581 + ], + "min": [ + 0.29000577330589294, + 0.47572243213653564 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 696672, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1508760, + "componentType": 5126, + "count": 72, + "max": [ + -0.5580670833587646, + -0.07334303855895996, + 0.16186833381652832 + ], + "min": [ + -0.7359052896499634, + -0.17252551019191742, + -0.015969812870025635 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1509624, + "componentType": 5126, + "count": 72, + "max": [ + 0.9660976529121399, + -0.10348668694496155, + 0.9946253299713135 + ], + "min": [ + -0.9661010503768921, + -0.9991055727005005, + -0.9187739491462708 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 612056, + "componentType": 5126, + "count": 72, + "max": [ + 0.37360113859176636, + 0.6255007386207581 + ], + "min": [ + 0.3332168161869049, + 0.47572243213653564 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 612632, + "componentType": 5126, + "count": 72, + "max": [ + 0.37360113859176636, + 0.6255007386207581 + ], + "min": [ + 0.3332168161869049, + 0.47572243213653564 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 698160, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1510488, + "componentType": 5126, + "count": 72, + "max": [ + -0.3677802085876465, + -0.07334303855895996, + 0.16186833381652832 + ], + "min": [ + -0.5456184148788452, + -0.17252551019191742, + -0.015969812870025635 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1511352, + "componentType": 5126, + "count": 72, + "max": [ + 0.9660976529121399, + -0.10348668694496155, + 0.9946253299713135 + ], + "min": [ + -0.9661012887954712, + -0.9991055727005005, + -0.9187585711479187 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 613208, + "componentType": 5126, + "count": 72, + "max": [ + 0.4168124198913574, + 0.6255007386207581 + ], + "min": [ + 0.3764280378818512, + 0.47572243213653564 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 613784, + "componentType": 5126, + "count": 72, + "max": [ + 0.4168124198913574, + 0.6255007386207581 + ], + "min": [ + 0.3764280378818512, + 0.47572243213653564 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 699648, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1512216, + "componentType": 5126, + "count": 72, + "max": [ + -0.17749333381652832, + -0.07334303855895996, + 0.16186833381652832 + ], + "min": [ + -0.35533154010772705, + -0.17252551019191742, + -0.015969812870025635 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1513080, + "componentType": 5126, + "count": 72, + "max": [ + 0.9660977125167847, + -0.10344800353050232, + 0.9946293234825134 + ], + "min": [ + -0.9661010503768921, + -0.9991055727005005, + -0.9187690615653992 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 614360, + "componentType": 5126, + "count": 72, + "max": [ + 0.4600238800048828, + 0.6255007386207581 + ], + "min": [ + 0.4196392893791199, + 0.47572243213653564 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 614936, + "componentType": 5126, + "count": 72, + "max": [ + 0.4600238800048828, + 0.6255007386207581 + ], + "min": [ + 0.4196392893791199, + 0.47572243213653564 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 701136, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1513944, + "componentType": 5126, + "count": 56, + "max": [ + 1.952269196510315, + -0.07334303855895996, + 0.3467557430267334 + ], + "min": [ + 1.7844964265823364, + -0.14551645517349243, + 0.17898312211036682 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1514616, + "componentType": 5126, + "count": 56, + "max": [ + 0.9348395466804504, + 0.4680480659008026, + 0.9035109877586365 + ], + "min": [ + -0.93483966588974, + 0.13573652505874634, + -0.9907450675964355 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 615512, + "componentType": 5126, + "count": 56, + "max": [ + 0.9436593055725098, + 0.7812153697013855 + ], + "min": [ + 0.9055604338645935, + 0.639914870262146 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 615960, + "componentType": 5126, + "count": 56, + "max": [ + 0.9436593055725098, + 0.7812153697013855 + ], + "min": [ + 0.9055604338645935, + 0.639914870262146 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 702624, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1515288, + "componentType": 5126, + "count": 72, + "max": [ + 0.012793540954589844, + -0.07334303855895996, + 0.16186833381652832 + ], + "min": [ + -0.1650446653366089, + -0.17252551019191742, + -0.015969812870025635 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1516152, + "componentType": 5126, + "count": 72, + "max": [ + 0.9660977125167847, + -0.10344802588224411, + 0.9946293234825134 + ], + "min": [ + -0.9661012291908264, + -0.9991055727005005, + -0.9187690615653992 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 616408, + "componentType": 5126, + "count": 72, + "max": [ + 0.5032346844673157, + 0.6255007386207581 + ], + "min": [ + 0.46285057067871094, + 0.47572243213653564 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 616984, + "componentType": 5126, + "count": 72, + "max": [ + 0.5032346844673157, + 0.6255007386207581 + ], + "min": [ + 0.46285057067871094, + 0.47572243213653564 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 703056, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1517016, + "componentType": 5126, + "count": 72, + "max": [ + 0.20308053493499756, + -0.07334303855895996, + 0.16186833381652832 + ], + "min": [ + 0.025242209434509277, + -0.17252551019191742, + -0.015969812870025635 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1517880, + "componentType": 5126, + "count": 72, + "max": [ + 0.9660966992378235, + -0.10346631705760956, + 0.9946273565292358 + ], + "min": [ + -0.9661012291908264, + -0.9991055727005005, + -0.9187690615653992 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 617560, + "componentType": 5126, + "count": 72, + "max": [ + 0.5464456677436829, + 0.6255007386207581 + ], + "min": [ + 0.5060616135597229, + 0.47572243213653564 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 618136, + "componentType": 5126, + "count": 72, + "max": [ + 0.5464456677436829, + 0.6255007386207581 + ], + "min": [ + 0.5060616135597229, + 0.47572243213653564 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 704544, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1518744, + "componentType": 5126, + "count": 72, + "max": [ + 0.3933671712875366, + -0.07334303855895996, + 0.16186833381652832 + ], + "min": [ + 0.21552908420562744, + -0.17252551019191742, + -0.015969812870025635 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1519608, + "componentType": 5126, + "count": 72, + "max": [ + 0.9660985469818115, + -0.10327111929655075, + 0.9946476817131042 + ], + "min": [ + -0.9661012291908264, + -0.9991053938865662, + -0.9187742471694946 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 618712, + "componentType": 5126, + "count": 72, + "max": [ + 0.5896568298339844, + 0.6255007386207581 + ], + "min": [ + 0.5492725968360901, + 0.47572243213653564 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 619288, + "componentType": 5126, + "count": 72, + "max": [ + 0.5896568298339844, + 0.6255007386207581 + ], + "min": [ + 0.5492725968360901, + 0.47572243213653564 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 706032, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1520472, + "componentType": 5126, + "count": 72, + "max": [ + -1.9833532571792603, + -0.07334303855895996, + 0.35178810358047485 + ], + "min": [ + -2.161191463470459, + -0.19089370965957642, + 0.1739499568939209 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1521336, + "componentType": 5126, + "count": 72, + "max": [ + 0.9763625264167786, + -0.062200020998716354, + 0.9980618953704834 + ], + "min": [ + -0.9756553769111633, + -0.9994568824768066, + -0.9279475212097168 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 619864, + "componentType": 5126, + "count": 72, + "max": [ + 0.04994118958711624, + 0.7854538559913635 + ], + "min": [ + 0.009556885808706284, + 0.6356757879257202 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 620440, + "componentType": 5126, + "count": 72, + "max": [ + 0.04994118958711624, + 0.7854538559913635 + ], + "min": [ + 0.009556885808706284, + 0.6356757879257202 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 707520, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1522200, + "componentType": 5126, + "count": 72, + "max": [ + -1.7930665016174316, + -0.07334303855895996, + 0.35178810358047485 + ], + "min": [ + -1.9709045886993408, + -0.19089370965957642, + 0.1739499568939209 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1523064, + "componentType": 5126, + "count": 72, + "max": [ + 0.976360023021698, + -0.06227525696158409, + 0.9980572462081909 + ], + "min": [ + -0.9756553769111633, + -0.9994570016860962, + -0.9279466271400452 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 621016, + "componentType": 5126, + "count": 72, + "max": [ + 0.09315232187509537, + 0.7854538559913635 + ], + "min": [ + 0.052768152207136154, + 0.6356757879257202 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 621592, + "componentType": 5126, + "count": 72, + "max": [ + 0.09315232187509537, + 0.7854538559913635 + ], + "min": [ + 0.052768152207136154, + 0.6356757879257202 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 709008, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1523928, + "componentType": 5126, + "count": 72, + "max": [ + -1.6027796268463135, + -0.07334303855895996, + 0.35178810358047485 + ], + "min": [ + -1.7806177139282227, + -0.19089370965957642, + 0.1739499568939209 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1524792, + "componentType": 5126, + "count": 72, + "max": [ + 0.9763654470443726, + -0.06233350187540054, + 0.9980538487434387 + ], + "min": [ + -0.9756582975387573, + -0.9994569420814514, + -0.9279467463493347 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 622168, + "componentType": 5126, + "count": 72, + "max": [ + 0.1363634318113327, + 0.7854538559913635 + ], + "min": [ + 0.09597912430763245, + 0.6356757879257202 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 622744, + "componentType": 5126, + "count": 72, + "max": [ + 0.1363634318113327, + 0.7854538559913635 + ], + "min": [ + 0.09597912430763245, + 0.6356757879257202 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 710496, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1525656, + "componentType": 5126, + "count": 72, + "max": [ + -1.4124927520751953, + -0.07334303855895996, + 0.35178810358047485 + ], + "min": [ + -1.5903308391571045, + -0.19089370965957642, + 0.1739499568939209 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1526520, + "componentType": 5126, + "count": 72, + "max": [ + 0.9763631820678711, + -0.06220007687807083, + 0.9980618953704834 + ], + "min": [ + -0.9756585955619812, + -0.9994568824768066, + -0.9279464483261108 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 623320, + "componentType": 5126, + "count": 72, + "max": [ + 0.17957450449466705, + 0.7854538559913635 + ], + "min": [ + 0.13919046521186829, + 0.6356757879257202 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 623896, + "componentType": 5126, + "count": 72, + "max": [ + 0.17957450449466705, + 0.7854538559913635 + ], + "min": [ + 0.13919046521186829, + 0.6356757879257202 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 711984, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1527384, + "componentType": 5126, + "count": 72, + "max": [ + -1.2222058773040771, + -0.07334303855895996, + 0.35178810358047485 + ], + "min": [ + -1.4000440835952759, + -0.19089370965957642, + 0.1739499568939209 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1528248, + "componentType": 5126, + "count": 72, + "max": [ + 0.9763671159744263, + -0.06221463903784752, + 0.998060941696167 + ], + "min": [ + -0.9756603240966797, + -0.9994569420814514, + -0.9279463887214661 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 624472, + "componentType": 5126, + "count": 72, + "max": [ + 0.2227858006954193, + 0.7854538559913635 + ], + "min": [ + 0.18240141868591309, + 0.6356757879257202 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 625048, + "componentType": 5126, + "count": 72, + "max": [ + 0.2227858006954193, + 0.7854538559913635 + ], + "min": [ + 0.18240141868591309, + 0.6356757879257202 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 713472, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1529112, + "componentType": 5126, + "count": 72, + "max": [ + -1.0319191217422485, + -0.07334303855895996, + 0.35178810358047485 + ], + "min": [ + -1.2097573280334473, + -0.19089370965957642, + 0.1739499568939209 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1529976, + "componentType": 5126, + "count": 72, + "max": [ + 0.9763553142547607, + -0.062272459268569946, + 0.9980576038360596 + ], + "min": [ + -0.975660502910614, + -0.9994568824768066, + -0.9279463887214661 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 625624, + "componentType": 5126, + "count": 72, + "max": [ + 0.26599693298339844, + 0.7854538559913635 + ], + "min": [ + 0.22561271488666534, + 0.6356757879257202 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 626200, + "componentType": 5126, + "count": 72, + "max": [ + 0.26599693298339844, + 0.7854538559913635 + ], + "min": [ + 0.22561271488666534, + 0.6356757879257202 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 714960, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1530840, + "componentType": 5126, + "count": 56, + "max": [ + -1.0847848653793335, + -0.07334303855895996, + -0.034624695777893066 + ], + "min": [ + -1.2525575160980225, + -0.14551645517349243, + -0.20239728689193726 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1531512, + "componentType": 5126, + "count": 56, + "max": [ + 0.9346322417259216, + 0.4678308665752411, + 0.9035045504570007 + ], + "min": [ + -0.9346306324005127, + 0.13571900129318237, + -0.9907474517822266 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 626776, + "componentType": 5126, + "count": 56, + "max": [ + 0.25399187207221985, + 0.46001124382019043 + ], + "min": [ + 0.21589341759681702, + 0.31871020793914795 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 627224, + "componentType": 5126, + "count": 56, + "max": [ + 0.25399187207221985, + 0.46001124382019043 + ], + "min": [ + 0.21589341759681702, + 0.31871020793914795 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 716448, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1532184, + "componentType": 5126, + "count": 72, + "max": [ + -0.8416322469711304, + -0.07334303855895996, + 0.35178810358047485 + ], + "min": [ + -1.019470453262329, + -0.19089370965957642, + 0.1739499568939209 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1533048, + "componentType": 5126, + "count": 72, + "max": [ + 0.9763569235801697, + -0.06220007315278053, + 0.9980618953704834 + ], + "min": [ + -0.9756604433059692, + -0.9994569420814514, + -0.9279462099075317 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 627672, + "componentType": 5126, + "count": 72, + "max": [ + 0.30920812487602234, + 0.7854538559913635 + ], + "min": [ + 0.2688238322734833, + 0.6356757879257202 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 628248, + "componentType": 5126, + "count": 72, + "max": [ + 0.30920812487602234, + 0.7854538559913635 + ], + "min": [ + 0.2688238322734833, + 0.6356757879257202 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 716880, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1533912, + "componentType": 5126, + "count": 72, + "max": [ + -0.6513453722000122, + -0.07334303855895996, + 0.35178810358047485 + ], + "min": [ + -0.8291835784912109, + -0.19089370965957642, + 0.1739499568939209 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1534776, + "componentType": 5126, + "count": 72, + "max": [ + 0.9763563871383667, + -0.062200065702199936, + 0.9980618953704834 + ], + "min": [ + -0.9756604433059692, + -0.9994568824768066, + -0.927945613861084 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 628824, + "componentType": 5126, + "count": 72, + "max": [ + 0.3524191379547119, + 0.7854538559913635 + ], + "min": [ + 0.31203508377075195, + 0.6356757879257202 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 629400, + "componentType": 5126, + "count": 72, + "max": [ + 0.3524191379547119, + 0.7854538559913635 + ], + "min": [ + 0.31203508377075195, + 0.6356757879257202 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 718368, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1535640, + "componentType": 5126, + "count": 72, + "max": [ + -0.46105849742889404, + -0.07334303855895996, + 0.35178810358047485 + ], + "min": [ + -0.6388967037200928, + -0.19089370965957642, + 0.1739499568939209 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1536504, + "componentType": 5126, + "count": 72, + "max": [ + 0.976361095905304, + -0.06220007315278053, + 0.9980618953704834 + ], + "min": [ + -0.9756602644920349, + -0.9994569420814514, + -0.9279471039772034 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 629976, + "componentType": 5126, + "count": 72, + "max": [ + 0.395630419254303, + 0.7854538559913635 + ], + "min": [ + 0.3552462160587311, + 0.6356757879257202 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 630552, + "componentType": 5126, + "count": 72, + "max": [ + 0.395630419254303, + 0.7854538559913635 + ], + "min": [ + 0.3552462160587311, + 0.6356757879257202 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 719856, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1537368, + "componentType": 5126, + "count": 72, + "max": [ + -0.2707716226577759, + -0.07334303855895996, + 0.35178810358047485 + ], + "min": [ + -0.4486098289489746, + -0.19089370965957642, + 0.1739499568939209 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1538232, + "componentType": 5126, + "count": 72, + "max": [ + 0.976360023021698, + -0.06220003217458725, + 0.9980618953704834 + ], + "min": [ + -0.9756602644920349, + -0.9994570016860962, + -0.9279472231864929 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 631128, + "componentType": 5126, + "count": 72, + "max": [ + 0.4388415217399597, + 0.7854538559913635 + ], + "min": [ + 0.3984573185443878, + 0.6356757879257202 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 631704, + "componentType": 5126, + "count": 72, + "max": [ + 0.4388415217399597, + 0.7854538559913635 + ], + "min": [ + 0.3984573185443878, + 0.6356757879257202 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 721344, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1539096, + "componentType": 5126, + "count": 72, + "max": [ + -0.08048474788665771, + -0.07334303855895996, + 0.35178810358047485 + ], + "min": [ + -0.25832295417785645, + -0.19089370965957642, + 0.1739499568939209 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1539960, + "componentType": 5126, + "count": 72, + "max": [ + 0.976360559463501, + -0.062199968844652176, + 0.9980618953704834 + ], + "min": [ + -0.9756603837013245, + -0.9994568824768066, + -0.927946150302887 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 632280, + "componentType": 5126, + "count": 72, + "max": [ + 0.48205259442329407, + 0.7854538559913635 + ], + "min": [ + 0.44166845083236694, + 0.6356757879257202 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 632856, + "componentType": 5126, + "count": 72, + "max": [ + 0.48205259442329407, + 0.7854538559913635 + ], + "min": [ + 0.44166845083236694, + 0.6356757879257202 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 722832, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1540824, + "componentType": 5126, + "count": 56, + "max": [ + 1.7619823217391968, + -0.07334303855895996, + 0.3467557430267334 + ], + "min": [ + 1.5942097902297974, + -0.14551645517349243, + 0.17898312211036682 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1541496, + "componentType": 5126, + "count": 56, + "max": [ + 0.934837818145752, + 0.4680446982383728, + 0.9035103917121887 + ], + "min": [ + -0.9348388910293579, + 0.13573697209358215, + -0.9907450079917908 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 633432, + "componentType": 5126, + "count": 56, + "max": [ + 0.9004481434822083, + 0.7812153697013855 + ], + "min": [ + 0.8623493909835815, + 0.6399148106575012 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 633880, + "componentType": 5126, + "count": 56, + "max": [ + 0.9004481434822083, + 0.7812153697013855 + ], + "min": [ + 0.8623493909835815, + 0.6399148106575012 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 724320, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1542168, + "componentType": 5126, + "count": 72, + "max": [ + 0.10980212688446045, + -0.07334303855895996, + 0.35178810358047485 + ], + "min": [ + -0.06803607940673828, + -0.19089370965957642, + 0.1739499568939209 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1543032, + "componentType": 5126, + "count": 72, + "max": [ + 0.976358950138092, + -0.06211591139435768, + 0.9980668425559998 + ], + "min": [ + -0.9756603837013245, + -0.9994567036628723, + -0.9279463291168213 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 634328, + "componentType": 5126, + "count": 72, + "max": [ + 0.5252637267112732, + 0.7854538559913635 + ], + "min": [ + 0.48487958312034607, + 0.6356757879257202 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 634904, + "componentType": 5126, + "count": 72, + "max": [ + 0.5252637267112732, + 0.7854538559913635 + ], + "min": [ + 0.48487958312034607, + 0.6356757879257202 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 724752, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1543896, + "componentType": 5126, + "count": 72, + "max": [ + 0.3000890016555786, + -0.07334303855895996, + 0.35178810358047485 + ], + "min": [ + 0.12225091457366943, + -0.19089370965957642, + 0.1739499568939209 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1544760, + "componentType": 5126, + "count": 72, + "max": [ + 0.9763595461845398, + -0.062292397022247314, + 0.9980561137199402 + ], + "min": [ + -0.9756606817245483, + -0.9994569420814514, + -0.9279443621635437 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 635480, + "componentType": 5126, + "count": 72, + "max": [ + 0.5684748888015747, + 0.7854538559913635 + ], + "min": [ + 0.5280907154083252, + 0.6356757879257202 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 636056, + "componentType": 5126, + "count": 72, + "max": [ + 0.5684748888015747, + 0.7854538559913635 + ], + "min": [ + 0.5280907154083252, + 0.6356757879257202 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 726240, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1545624, + "componentType": 5126, + "count": 72, + "max": [ + -1.747487187385559, + -0.07334303855895996, + -0.21909785270690918 + ], + "min": [ + -1.9253253936767578, + -0.17694193124771118, + -0.39693599939346313 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1546488, + "componentType": 5126, + "count": 72, + "max": [ + 0.9640173316001892, + -0.11660277098417282, + 0.9931715726852417 + ], + "min": [ + -0.964017391204834, + -0.9866020679473877, + -0.9263019561767578 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 636632, + "componentType": 5126, + "count": 72, + "max": [ + 0.10350269079208374, + 0.30464524030685425 + ], + "min": [ + 0.06311829388141632, + 0.15486735105514526 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 637208, + "componentType": 5126, + "count": 72, + "max": [ + 0.10350269079208374, + 0.30464524030685425 + ], + "min": [ + 0.06311829388141632, + 0.15486735105514526 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 727728, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1547352, + "componentType": 5126, + "count": 72, + "max": [ + -1.5572004318237305, + -0.07334303855895996, + -0.21909785270690918 + ], + "min": [ + -1.7350385189056396, + -0.17694193124771118, + -0.39693599939346313 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1548216, + "componentType": 5126, + "count": 72, + "max": [ + 0.9640161991119385, + -0.1166025772690773, + 0.9931715726852417 + ], + "min": [ + -0.964017391204834, + -0.9866021275520325, + -0.9262992143630981 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 637784, + "componentType": 5126, + "count": 72, + "max": [ + 0.14671380817890167, + 0.30464524030685425 + ], + "min": [ + 0.10632960498332977, + 0.15486735105514526 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 638360, + "componentType": 5126, + "count": 72, + "max": [ + 0.14671380817890167, + 0.30464524030685425 + ], + "min": [ + 0.10632960498332977, + 0.15486735105514526 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 729216, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1549080, + "componentType": 5126, + "count": 72, + "max": [ + -1.3669135570526123, + -0.07334303855895996, + -0.21909785270690918 + ], + "min": [ + -1.5447516441345215, + -0.17694193124771118, + -0.39693599939346313 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1549944, + "componentType": 5126, + "count": 72, + "max": [ + 0.9640163779258728, + -0.1165638417005539, + 0.9931759238243103 + ], + "min": [ + -0.9640198945999146, + -0.9866020679473877, + -0.9262983798980713 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 638936, + "componentType": 5126, + "count": 72, + "max": [ + 0.18992504477500916, + 0.30464524030685425 + ], + "min": [ + 0.14954058825969696, + 0.15486735105514526 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 639512, + "componentType": 5126, + "count": 72, + "max": [ + 0.18992504477500916, + 0.30464524030685425 + ], + "min": [ + 0.14954058825969696, + 0.15486735105514526 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 730704, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1550808, + "componentType": 5126, + "count": 72, + "max": [ + -1.1766266822814941, + -0.07334303855895996, + -0.21909785270690918 + ], + "min": [ + -1.3544647693634033, + -0.17694193124771118, + -0.39693599939346313 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1551672, + "componentType": 5126, + "count": 72, + "max": [ + 0.9640164375305176, + -0.11654739826917648, + 0.9931776523590088 + ], + "min": [ + -0.9640234112739563, + -0.9866020679473877, + -0.9262983798980713 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 640088, + "componentType": 5126, + "count": 72, + "max": [ + 0.23313602805137634, + 0.30464524030685425 + ], + "min": [ + 0.19275188446044922, + 0.15486735105514526 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 640664, + "componentType": 5126, + "count": 72, + "max": [ + 0.23313602805137634, + 0.30464524030685425 + ], + "min": [ + 0.19275188446044922, + 0.15486735105514526 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 732192, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1552536, + "componentType": 5126, + "count": 72, + "max": [ + -0.9863398671150208, + -0.07334303855895996, + -0.21909785270690918 + ], + "min": [ + -1.1641780138015747, + -0.17694193124771118, + -0.39693599939346313 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1553400, + "componentType": 5126, + "count": 72, + "max": [ + 0.9640167951583862, + -0.11660298705101013, + 0.9931715130805969 + ], + "min": [ + -0.9640200734138489, + -0.9866021275520325, + -0.9262984395027161 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 641240, + "componentType": 5126, + "count": 72, + "max": [ + 0.2763473093509674, + 0.30464524030685425 + ], + "min": [ + 0.2359629124403, + 0.15486735105514526 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 641816, + "componentType": 5126, + "count": 72, + "max": [ + 0.2763473093509674, + 0.30464524030685425 + ], + "min": [ + 0.2359629124403, + 0.15486735105514526 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 733680, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1554264, + "componentType": 5126, + "count": 72, + "max": [ + -0.7960530519485474, + -0.07334303855895996, + -0.21909785270690918 + ], + "min": [ + -0.9738911390304565, + -0.17694193124771118, + -0.39693599939346313 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1555128, + "componentType": 5126, + "count": 72, + "max": [ + 0.9640166163444519, + -0.11656162142753601, + 0.9931766986846924 + ], + "min": [ + -0.9640175104141235, + -0.9866021275520325, + -0.9262983798980713 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 642392, + "componentType": 5126, + "count": 72, + "max": [ + 0.319558322429657, + 0.30464524030685425 + ], + "min": [ + 0.279174268245697, + 0.15486735105514526 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 642968, + "componentType": 5126, + "count": 72, + "max": [ + 0.319558322429657, + 0.30464524030685425 + ], + "min": [ + 0.279174268245697, + 0.15486735105514526 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 735168, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1555992, + "componentType": 5126, + "count": 56, + "max": [ + -1.2750717401504517, + -0.07334303855895996, + -0.034624695777893066 + ], + "min": [ + -1.4428443908691406, + -0.14551645517349243, + -0.20239728689193726 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1556664, + "componentType": 5126, + "count": 56, + "max": [ + 0.9346320033073425, + 0.46783408522605896, + 0.9035051465034485 + ], + "min": [ + -0.9346311092376709, + 0.1357203722000122, + -0.9907472729682922 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 643544, + "componentType": 5126, + "count": 56, + "max": [ + 0.21078075468540192, + 0.46001124382019043 + ], + "min": [ + 0.17268222570419312, + 0.31871020793914795 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 643992, + "componentType": 5126, + "count": 56, + "max": [ + 0.21078075468540192, + 0.46001124382019043 + ], + "min": [ + 0.17268222570419312, + 0.31871020793914795 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 736656, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1557336, + "componentType": 5126, + "count": 72, + "max": [ + -0.6057661771774292, + -0.07334303855895996, + -0.21909785270690918 + ], + "min": [ + -0.7836042642593384, + -0.17694193124771118, + -0.39693599939346313 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1558200, + "componentType": 5126, + "count": 72, + "max": [ + 0.9640166759490967, + -0.11662265658378601, + 0.9931694269180298 + ], + "min": [ + -0.9640234708786011, + -0.9866020679473877, + -0.9263023138046265 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 644440, + "componentType": 5126, + "count": 72, + "max": [ + 0.36276954412460327, + 0.30464524030685425 + ], + "min": [ + 0.3223852813243866, + 0.15486735105514526 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 645016, + "componentType": 5126, + "count": 72, + "max": [ + 0.36276954412460327, + 0.30464524030685425 + ], + "min": [ + 0.3223852813243866, + 0.15486735105514526 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 737088, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1559064, + "componentType": 5126, + "count": 72, + "max": [ + -0.22519242763519287, + -0.07334303855895996, + -0.21909785270690918 + ], + "min": [ + -0.4030306339263916, + -0.17694193124771118, + -0.39693599939346313 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1559928, + "componentType": 5126, + "count": 72, + "max": [ + 0.9640167355537415, + -0.11662264168262482, + 0.9931694269180298 + ], + "min": [ + -0.9640195965766907, + -0.9866020679473877, + -0.9262987971305847 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 645592, + "componentType": 5126, + "count": 72, + "max": [ + 0.44919177889823914, + 0.30464524030685425 + ], + "min": [ + 0.4088076949119568, + 0.15486735105514526 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 646168, + "componentType": 5126, + "count": 72, + "max": [ + 0.44919177889823914, + 0.30464524030685425 + ], + "min": [ + 0.4088076949119568, + 0.15486735105514526 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 738576, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1560792, + "componentType": 5126, + "count": 72, + "max": [ + -0.03490555286407471, + -0.07334303855895996, + -0.21909785270690918 + ], + "min": [ + -0.21274375915527344, + -0.17694193124771118, + -0.39693599939346313 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1561656, + "componentType": 5126, + "count": 72, + "max": [ + 0.9640167355537415, + -0.1166226714849472, + 0.9931694269180298 + ], + "min": [ + -0.9640195369720459, + -0.9866020679473877, + -0.9262987375259399 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 646744, + "componentType": 5126, + "count": 72, + "max": [ + 0.49240291118621826, + 0.30464524030685425 + ], + "min": [ + 0.45201873779296875, + 0.15486735105514526 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 647320, + "componentType": 5126, + "count": 72, + "max": [ + 0.49240291118621826, + 0.30464524030685425 + ], + "min": [ + 0.45201873779296875, + 0.15486735105514526 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 740064, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1562520, + "componentType": 5126, + "count": 72, + "max": [ + 0.15538132190704346, + -0.07334303855895996, + -0.21909785270690918 + ], + "min": [ + -0.022456884384155273, + -0.17694193124771118, + -0.39693599939346313 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1563384, + "componentType": 5126, + "count": 72, + "max": [ + 0.9640169739723206, + -0.11660127341747284, + 0.9931721687316895 + ], + "min": [ + -0.9640195965766907, + -0.9866021275520325, + -0.9262986779212952 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 647896, + "componentType": 5126, + "count": 72, + "max": [ + 0.535614013671875, + 0.30464524030685425 + ], + "min": [ + 0.4952298700809479, + 0.15486735105514526 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 648472, + "componentType": 5126, + "count": 72, + "max": [ + 0.535614013671875, + 0.30464524030685425 + ], + "min": [ + 0.4952298700809479, + 0.15486735105514526 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 741552, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1564248, + "componentType": 5126, + "count": 56, + "max": [ + 1.5716954469680786, + -0.07334303855895996, + 0.3467557430267334 + ], + "min": [ + 1.4039229154586792, + -0.14551645517349243, + 0.17898312211036682 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1564920, + "componentType": 5126, + "count": 56, + "max": [ + 0.9348381161689758, + 0.46804189682006836, + 0.9035103917121887 + ], + "min": [ + -0.9348387122154236, + 0.13573716580867767, + -0.990744948387146 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 649048, + "componentType": 5126, + "count": 56, + "max": [ + 0.857236921787262, + 0.7812153697013855 + ], + "min": [ + 0.8191381692886353, + 0.6399148106575012 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 649496, + "componentType": 5126, + "count": 56, + "max": [ + 0.857236921787262, + 0.7812153697013855 + ], + "min": [ + 0.8191381692886353, + 0.6399148106575012 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 743040, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1565592, + "componentType": 5126, + "count": 72, + "max": [ + -1.6642581224441528, + -0.07334303855895996, + 0.5897574424743652 + ], + "min": [ + -1.8420963287353516, + -0.1962679624557495, + 0.4119192957878113 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1566456, + "componentType": 5126, + "count": 72, + "max": [ + 0.9773221611976624, + -0.060593102127313614, + 0.9981600642204285 + ], + "min": [ + -0.977324903011322, + -0.9975012540817261, + -0.9312283396720886 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 649944, + "componentType": 5126, + "count": 72, + "max": [ + 0.122402623295784, + 0.9797345995903015 + ], + "min": [ + 0.08201834559440613, + 0.8299568891525269 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 650520, + "componentType": 5126, + "count": 72, + "max": [ + 0.122402623295784, + 0.9797345995903015 + ], + "min": [ + 0.08201834559440613, + 0.8299568891525269 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 743472, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1567320, + "componentType": 5126, + "count": 72, + "max": [ + -1.4739713668823242, + -0.07334303855895996, + 0.5897574424743652 + ], + "min": [ + -1.6518094539642334, + -0.1962679624557495, + 0.4119192957878113 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1568184, + "componentType": 5126, + "count": 72, + "max": [ + 0.9773252010345459, + -0.06074879691004753, + 0.9981512427330017 + ], + "min": [ + -0.9773245453834534, + -0.9975012540817261, + -0.931241512298584 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 651096, + "componentType": 5126, + "count": 72, + "max": [ + 0.16561375558376312, + 0.9797345995903015 + ], + "min": [ + 0.12522949278354645, + 0.8299568891525269 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 651672, + "componentType": 5126, + "count": 72, + "max": [ + 0.16561375558376312, + 0.9797345995903015 + ], + "min": [ + 0.12522949278354645, + 0.8299568891525269 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 744960, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1569048, + "componentType": 5126, + "count": 72, + "max": [ + -1.283684492111206, + -0.07334303855895996, + 0.5897574424743652 + ], + "min": [ + -1.4615225791931152, + -0.1962679624557495, + 0.4119192957878113 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1569912, + "componentType": 5126, + "count": 72, + "max": [ + 0.9773247838020325, + -0.060563910752534866, + 0.9981617331504822 + ], + "min": [ + -0.9773248434066772, + -0.9975011944770813, + -0.9312418103218079 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 652248, + "componentType": 5126, + "count": 72, + "max": [ + 0.20882487297058105, + 0.9797345995903015 + ], + "min": [ + 0.16844063997268677, + 0.8299568891525269 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 652824, + "componentType": 5126, + "count": 72, + "max": [ + 0.20882487297058105, + 0.9797345995903015 + ], + "min": [ + 0.16844063997268677, + 0.8299568891525269 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 746448, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1570776, + "componentType": 5126, + "count": 72, + "max": [ + -1.093397617340088, + -0.07334303855895996, + 0.5897574424743652 + ], + "min": [ + -1.271235704421997, + -0.1962679624557495, + 0.4119192957878113 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1571640, + "componentType": 5126, + "count": 72, + "max": [ + 0.977324903011322, + -0.06056360900402069, + 0.9981617331504822 + ], + "min": [ + -0.9773252606391907, + -0.9975011944770813, + -0.9312206506729126 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 653400, + "componentType": 5126, + "count": 72, + "max": [ + 0.25203606486320496, + 0.9797345995903015 + ], + "min": [ + 0.21165184676647186, + 0.8299568891525269 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 653976, + "componentType": 5126, + "count": 72, + "max": [ + 0.25203606486320496, + 0.9797345995903015 + ], + "min": [ + 0.21165184676647186, + 0.8299568891525269 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 747936, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1572504, + "componentType": 5126, + "count": 72, + "max": [ + -0.777281641960144, + -0.07334303855895996, + 0.5897574424743652 + ], + "min": [ + -0.9551198482513428, + -0.1962679624557495, + 0.4119192957878113 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1573368, + "componentType": 5126, + "count": 72, + "max": [ + 0.9773249626159668, + -0.060592979192733765, + 0.9981600642204285 + ], + "min": [ + -0.9773249626159668, + -0.9975013136863708, + -0.9312334656715393 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 654552, + "componentType": 5126, + "count": 72, + "max": [ + 0.32382118701934814, + 0.9797345995903015 + ], + "min": [ + 0.28343671560287476, + 0.8299568891525269 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 655128, + "componentType": 5126, + "count": 72, + "max": [ + 0.32382118701934814, + 0.9797345995903015 + ], + "min": [ + 0.28343671560287476, + 0.8299568891525269 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 749424, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1574232, + "componentType": 5126, + "count": 72, + "max": [ + -0.5869947671890259, + -0.07334303855895996, + 0.5897574424743652 + ], + "min": [ + -0.7648329734802246, + -0.1962679624557495, + 0.4119192957878113 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1575096, + "componentType": 5126, + "count": 72, + "max": [ + 0.977324903011322, + -0.06071558967232704, + 0.998153567314148 + ], + "min": [ + -0.9773246645927429, + -0.9975013136863708, + -0.9312421083450317 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 655704, + "componentType": 5126, + "count": 72, + "max": [ + 0.3670322895050049, + 0.9797345995903015 + ], + "min": [ + 0.32664814591407776, + 0.8299568891525269 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 656280, + "componentType": 5126, + "count": 72, + "max": [ + 0.3670322895050049, + 0.9797345995903015 + ], + "min": [ + 0.32664814591407776, + 0.8299568891525269 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 750912, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1575960, + "componentType": 5126, + "count": 54, + "max": [ + 0.15034854412078857, + -0.07334303855895996, + -0.22413063049316406 + ], + "min": [ + -0.01742410659790039, + -0.14551645517349243, + -0.39190322160720825 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1576608, + "componentType": 5126, + "count": 54, + "max": [ + 0.9347839951515198, + 0.4682091176509857, + 0.9035243391990662 + ], + "min": [ + -0.9347806572914124, + 0.13577784597873688, + -0.9907394051551819 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 656856, + "componentType": 5126, + "count": 54, + "max": [ + 0.5344712734222412, + 0.3004065752029419 + ], + "min": [ + 0.4963727593421936, + 0.15910589694976807 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 657288, + "componentType": 5126, + "count": 54, + "max": [ + 0.5344712734222412, + 0.3004065752029419 + ], + "min": [ + 0.4963727593421936, + 0.15910589694976807 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 752400, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1577256, + "componentType": 5126, + "count": 72, + "max": [ + -0.39670801162719727, + -0.07334303855895996, + 0.5897574424743652 + ], + "min": [ + -0.5745460987091064, + -0.1962679624557495, + 0.4119192957878113 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1578120, + "componentType": 5126, + "count": 72, + "max": [ + 0.9773250818252563, + -0.060563862323760986, + 0.9981616735458374 + ], + "min": [ + -0.9773250222206116, + -0.9975013136863708, + -0.9312418699264526 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 657720, + "componentType": 5126, + "count": 72, + "max": [ + 0.41544055938720703, + 0.9797345995903015 + ], + "min": [ + 0.36466193199157715, + 0.759369432926178 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 658296, + "componentType": 5126, + "count": 72, + "max": [ + 0.41544055938720703, + 0.9797345995903015 + ], + "min": [ + 0.36466193199157715, + 0.759369432926178 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 752832, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1578984, + "componentType": 5126, + "count": 72, + "max": [ + -0.2064211368560791, + -0.07334303855895996, + 0.5897574424743652 + ], + "min": [ + -0.38425934314727783, + -0.1962679624557495, + 0.4119192957878113 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1579848, + "componentType": 5126, + "count": 72, + "max": [ + 0.9773250818252563, + -0.06056385859847069, + 0.9981617331504822 + ], + "min": [ + -0.9773247838020325, + -0.9975013136863708, + -0.9312205910682678 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 658872, + "componentType": 5126, + "count": 72, + "max": [ + 0.45865142345428467, + 0.9797345995903015 + ], + "min": [ + 0.4078732132911682, + 0.759369432926178 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 659448, + "componentType": 5126, + "count": 72, + "max": [ + 0.45865142345428467, + 0.9797345995903015 + ], + "min": [ + 0.4078732132911682, + 0.759369432926178 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 754320, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1580712, + "componentType": 5126, + "count": 72, + "max": [ + 0.11330044269561768, + -0.07334303855895996, + 0.5897574424743652 + ], + "min": [ + -0.06453776359558105, + -0.1962679624557495, + 0.4119192957878113 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1581576, + "componentType": 5126, + "count": 72, + "max": [ + 0.9773250818252563, + -0.060577794909477234, + 0.9981609582901001 + ], + "min": [ + -0.9773248434066772, + -0.9975017309188843, + -0.9312332272529602 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 660024, + "componentType": 5126, + "count": 72, + "max": [ + 0.5312552452087402, + 0.9797345995903015 + ], + "min": [ + 0.48047730326652527, + 0.759369432926178 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 660600, + "componentType": 5126, + "count": 72, + "max": [ + 0.5312552452087402, + 0.9797345995903015 + ], + "min": [ + 0.48047730326652527, + 0.759369432926178 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 755808, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1582440, + "componentType": 5126, + "count": 56, + "max": [ + -1.4653584957122803, + -0.07334303855895996, + -0.034624695777893066 + ], + "min": [ + -1.6331311464309692, + -0.14551645517349243, + -0.20239728689193726 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1583112, + "componentType": 5126, + "count": 56, + "max": [ + 0.9346315264701843, + 0.4678320288658142, + 0.9035037755966187 + ], + "min": [ + -0.9346317648887634, + 0.1357204169034958, + -0.9907472729682922 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 661176, + "componentType": 5126, + "count": 56, + "max": [ + 0.1675696074962616, + 0.46001124382019043 + ], + "min": [ + 0.12947112321853638, + 0.31871020793914795 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 661624, + "componentType": 5126, + "count": 56, + "max": [ + 0.1675696074962616, + 0.46001124382019043 + ], + "min": [ + 0.12947112321853638, + 0.31871020793914795 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 757296, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1583784, + "componentType": 5126, + "count": 72, + "max": [ + 0.30358731746673584, + -0.07334303855895996, + 0.5897574424743652 + ], + "min": [ + 0.12574899196624756, + -0.1962679624557495, + 0.4119192957878113 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1584648, + "componentType": 5126, + "count": 72, + "max": [ + 0.9773247241973877, + -0.060715481638908386, + 0.998153567314148 + ], + "min": [ + -0.9773246645927429, + -0.9975013136863708, + -0.9312421679496765 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 662072, + "componentType": 5126, + "count": 72, + "max": [ + 0.5744664669036865, + 0.9797345995903015 + ], + "min": [ + 0.5236879587173462, + 0.759369432926178 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 662648, + "componentType": 5126, + "count": 72, + "max": [ + 0.5744664669036865, + 0.9797345995903015 + ], + "min": [ + 0.5236879587173462, + 0.759369432926178 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 757728, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1585512, + "componentType": 5126, + "count": 72, + "max": [ + 0.4938739538192749, + -0.07334303855895996, + 0.5897574424743652 + ], + "min": [ + 0.3160358667373657, + -0.1962679624557495, + 0.4119192957878113 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1586376, + "componentType": 5126, + "count": 72, + "max": [ + 0.9773254990577698, + -0.06055451184511185, + 0.9981624484062195 + ], + "min": [ + -0.9773246645927429, + -0.9975013136863708, + -0.9312422275543213 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 663224, + "componentType": 5126, + "count": 72, + "max": [ + 0.6176776885986328, + 0.9797345995903015 + ], + "min": [ + 0.5668990612030029, + 0.759369432926178 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 663800, + "componentType": 5126, + "count": 72, + "max": [ + 0.6176776885986328, + 0.9797345995903015 + ], + "min": [ + 0.5668990612030029, + 0.759369432926178 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 759216, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1587240, + "componentType": 5126, + "count": 72, + "max": [ + 0.6841610670089722, + -0.07334303855895996, + 0.5897574424743652 + ], + "min": [ + 0.5063227415084839, + -0.1962679624557495, + 0.4119192957878113 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1588104, + "componentType": 5126, + "count": 72, + "max": [ + 0.9773246645927429, + -0.060554567724466324, + 0.9981624484062195 + ], + "min": [ + -0.9773246645927429, + -0.9975013136863708, + -0.9312203526496887 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 664376, + "componentType": 5126, + "count": 72, + "max": [ + 0.6608887314796448, + 0.9797345995903015 + ], + "min": [ + 0.6101104617118835, + 0.759369432926178 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 664952, + "componentType": 5126, + "count": 72, + "max": [ + 0.6608887314796448, + 0.9797345995903015 + ], + "min": [ + 0.6101104617118835, + 0.759369432926178 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 760704, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1588968, + "componentType": 5126, + "count": 72, + "max": [ + 0.9391621351242065, + -0.07334303855895996, + 0.5897574424743652 + ], + "min": [ + 0.7613240480422974, + -0.1962679624557495, + 0.4119192957878113 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1589832, + "componentType": 5126, + "count": 72, + "max": [ + 0.9773249626159668, + -0.060593169182538986, + 0.9981600642204285 + ], + "min": [ + -0.9773249626159668, + -0.9975011944770813, + -0.9312331080436707 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 665528, + "componentType": 5126, + "count": 72, + "max": [ + 0.7187954187393188, + 0.9797345995903015 + ], + "min": [ + 0.6680172681808472, + 0.759369432926178 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 666104, + "componentType": 5126, + "count": 72, + "max": [ + 0.7187954187393188, + 0.9797345995903015 + ], + "min": [ + 0.6680172681808472, + 0.759369432926178 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 762192, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1590696, + "componentType": 5126, + "count": 72, + "max": [ + 1.1294490098953247, + -0.07334303855895996, + 0.5897574424743652 + ], + "min": [ + 0.9516109228134155, + -0.1962679624557495, + 0.4119192957878113 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1591560, + "componentType": 5126, + "count": 72, + "max": [ + 0.9773247241973877, + -0.060715463012456894, + 0.998153567314148 + ], + "min": [ + -0.9773249626159668, + -0.9975011944770813, + -0.9312418699264526 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 666680, + "componentType": 5126, + "count": 72, + "max": [ + 0.7620067596435547, + 0.9797345995903015 + ], + "min": [ + 0.7112281918525696, + 0.759369432926178 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 667256, + "componentType": 5126, + "count": 72, + "max": [ + 0.7620067596435547, + 0.9797345995903015 + ], + "min": [ + 0.7112281918525696, + 0.759369432926178 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 763680, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1592424, + "componentType": 5126, + "count": 56, + "max": [ + 1.9520865678787231, + -0.07334303855895996, + -0.41664230823516846 + ], + "min": [ + 1.7843140363693237, + -0.14551645517349243, + -0.5844148993492126 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1593096, + "componentType": 5126, + "count": 56, + "max": [ + 0.9347323179244995, + 0.46820375323295593, + 0.9035257697105408 + ], + "min": [ + -0.9347347617149353, + 0.1357753425836563, + -0.990739643573761 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 667832, + "componentType": 5126, + "count": 56, + "max": [ + 0.9436177015304565, + 0.13827002048492432 + ], + "min": [ + 0.9055191874504089, + -0.00303041934967041 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 668280, + "componentType": 5126, + "count": 56, + "max": [ + 0.9436177015304565, + 0.13827002048492432 + ], + "min": [ + 0.9055191874504089, + -0.00303041934967041 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 765168, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1593768, + "componentType": 5126, + "count": 72, + "max": [ + 1.3197358846664429, + -0.07334303855895996, + 0.5897574424743652 + ], + "min": [ + 1.1418975591659546, + -0.1962679624557495, + 0.4119192957878113 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1594632, + "componentType": 5126, + "count": 72, + "max": [ + 0.9773246049880981, + -0.060563817620277405, + 0.9981616735458374 + ], + "min": [ + -0.9773246645927429, + -0.9975011944770813, + -0.9312422275543213 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 668728, + "componentType": 5126, + "count": 72, + "max": [ + 0.8052177429199219, + 0.9797345995903015 + ], + "min": [ + 0.7544391751289368, + 0.759369432926178 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 669304, + "componentType": 5126, + "count": 72, + "max": [ + 0.8052177429199219, + 0.9797345995903015 + ], + "min": [ + 0.7544391751289368, + 0.759369432926178 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 765600, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1595496, + "componentType": 5126, + "count": 72, + "max": [ + 0.9391621351242065, + -0.07334303855895996, + 0.3517885208129883 + ], + "min": [ + 0.7613240480422974, + -0.19089370965957642, + 0.17395034432411194 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1596360, + "componentType": 5126, + "count": 72, + "max": [ + 0.9763561487197876, + -0.062185756862163544, + 0.9980628490447998 + ], + "min": [ + -0.9756572842597961, + -0.9994569420814514, + -0.9279468655586243 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 669880, + "componentType": 5126, + "count": 72, + "max": [ + 0.713598370552063, + 0.7854538559913635 + ], + "min": [ + 0.6732141971588135, + 0.6356762051582336 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 670456, + "componentType": 5126, + "count": 72, + "max": [ + 0.713598370552063, + 0.7854538559913635 + ], + "min": [ + 0.6732141971588135, + 0.6356762051582336 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 767088, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1597224, + "componentType": 5126, + "count": 72, + "max": [ + 1.1294490098953247, + -0.07334303855895996, + 0.3517885208129883 + ], + "min": [ + 0.9516109228134155, + -0.19089370965957642, + 0.17395034432411194 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1598088, + "componentType": 5126, + "count": 72, + "max": [ + 0.9763597249984741, + -0.06222498416900635, + 0.9980606436729431 + ], + "min": [ + -0.9756606817245483, + -0.9994568824768066, + -0.9279466867446899 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 671032, + "componentType": 5126, + "count": 72, + "max": [ + 0.756809413433075, + 0.7854538559913635 + ], + "min": [ + 0.7164252400398254, + 0.6356762051582336 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 671608, + "componentType": 5126, + "count": 72, + "max": [ + 0.756809413433075, + 0.7854538559913635 + ], + "min": [ + 0.7164252400398254, + 0.6356762051582336 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 768576, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1598952, + "componentType": 5126, + "count": 72, + "max": [ + 1.3197358846664429, + -0.07334303855895996, + 0.3517885208129883 + ], + "min": [ + 1.1418975591659546, + -0.19089370965957642, + 0.17395034432411194 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1599816, + "componentType": 5126, + "count": 72, + "max": [ + 0.9763613343238831, + -0.062276821583509445, + 0.9980575442314148 + ], + "min": [ + -0.9756603837013245, + -0.9994568824768066, + -0.927946150302887 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 672184, + "componentType": 5126, + "count": 72, + "max": [ + 0.8000207543373108, + 0.7854538559913635 + ], + "min": [ + 0.7596364617347717, + 0.6356762051582336 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 672760, + "componentType": 5126, + "count": 72, + "max": [ + 0.8000207543373108, + 0.7854538559913635 + ], + "min": [ + 0.7596364617347717, + 0.6356762051582336 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 770064, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1600680, + "componentType": 5126, + "count": 72, + "max": [ + 0.9391621351242065, + -0.07334303855895996, + 0.16186851263046265 + ], + "min": [ + 0.7613240480422974, + -0.17252551019191742, + -0.015969693660736084 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1601544, + "componentType": 5126, + "count": 72, + "max": [ + 0.9660977125167847, + -0.10343258827924728, + 0.9946314692497253 + ], + "min": [ + -0.9661014080047607, + -0.9991055727005005, + -0.9187741279602051 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 673336, + "componentType": 5126, + "count": 72, + "max": [ + 0.713598370552063, + 0.6255007386207581 + ], + "min": [ + 0.6732141971588135, + 0.4757227897644043 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 673912, + "componentType": 5126, + "count": 72, + "max": [ + 0.713598370552063, + 0.6255007386207581 + ], + "min": [ + 0.6732141971588135, + 0.4757227897644043 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 771552, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1602408, + "componentType": 5126, + "count": 72, + "max": [ + 1.1294490098953247, + -0.07334303855895996, + 0.16186851263046265 + ], + "min": [ + 0.9516109228134155, + -0.17252551019191742, + -0.015969693660736084 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1603272, + "componentType": 5126, + "count": 72, + "max": [ + 0.9660978317260742, + -0.10347016900777817, + 0.9946272373199463 + ], + "min": [ + -0.9661017060279846, + -0.9991055727005005, + -0.9187687635421753 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 674488, + "componentType": 5126, + "count": 72, + "max": [ + 0.756809413433075, + 0.6255007386207581 + ], + "min": [ + 0.7164252400398254, + 0.4757227897644043 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 675064, + "componentType": 5126, + "count": 72, + "max": [ + 0.756809413433075, + 0.6255007386207581 + ], + "min": [ + 0.7164252400398254, + 0.4757227897644043 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 773040, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1604136, + "componentType": 5126, + "count": 56, + "max": [ + -0.03993833065032959, + -0.07334303855895996, + -0.22413063049316406 + ], + "min": [ + -0.20771098136901855, + -0.14551645517349243, + -0.39190322160720825 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1604808, + "componentType": 5126, + "count": 56, + "max": [ + 0.9347839951515198, + 0.4682081937789917, + 0.9035243988037109 + ], + "min": [ + -0.9347829818725586, + 0.13577783107757568, + -0.9907393455505371 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 675640, + "componentType": 5126, + "count": 56, + "max": [ + 0.4912601113319397, + 0.3004065752029419 + ], + "min": [ + 0.4531615674495697, + 0.15910595655441284 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 676088, + "componentType": 5126, + "count": 56, + "max": [ + 0.4912601113319397, + 0.3004065752029419 + ], + "min": [ + 0.4531615674495697, + 0.15910595655441284 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 774528, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1605480, + "componentType": 5126, + "count": 72, + "max": [ + 1.3197358846664429, + -0.07334303855895996, + 0.16186851263046265 + ], + "min": [ + 1.1418975591659546, + -0.17252551019191742, + -0.015969693660736084 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1606344, + "componentType": 5126, + "count": 72, + "max": [ + 0.9660968780517578, + -0.10338403284549713, + 0.9946357011795044 + ], + "min": [ + -0.9661012887954712, + -0.9991055727005005, + -0.9187677502632141 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 676536, + "componentType": 5126, + "count": 72, + "max": [ + 0.8000207543373108, + 0.6255007386207581 + ], + "min": [ + 0.7596364617347717, + 0.4757227897644043 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 677112, + "componentType": 5126, + "count": 72, + "max": [ + 0.8000207543373108, + 0.6255007386207581 + ], + "min": [ + 0.7596364617347717, + 0.4757227897644043 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 774960, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1607208, + "componentType": 5126, + "count": 72, + "max": [ + -1.6517136096954346, + -0.07334303855895996, + -0.4116091728210449 + ], + "min": [ + -1.8764996528625488, + -0.176507830619812, + -0.5894473195075989 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1608072, + "componentType": 5126, + "count": 72, + "max": [ + 0.9632107019424438, + -0.118586465716362, + 0.992938220500946 + ], + "min": [ + -0.9632041454315186, + -0.9854681491851807, + -0.9256542325019836 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 677688, + "componentType": 5126, + "count": 72, + "max": [ + 0.12525127828121185, + 0.14250916242599487 + ], + "min": [ + 0.07420586049556732, + -0.007269144058227539 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 678264, + "componentType": 5126, + "count": 72, + "max": [ + 0.12525127828121185, + 0.14250916242599487 + ], + "min": [ + 0.07420586049556732, + -0.007269144058227539 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 776448, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1608936, + "componentType": 5126, + "count": 56, + "max": [ + -1.6556453704833984, + -0.07334303855895996, + -0.034624695777893066 + ], + "min": [ + -1.8234180212020874, + -0.14551645517349243, + -0.20239728689193726 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1609608, + "componentType": 5126, + "count": 56, + "max": [ + 0.9346317052841187, + 0.4678306579589844, + 0.9035047888755798 + ], + "min": [ + -0.9346336126327515, + 0.1357203871011734, + -0.9907472133636475 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 678840, + "componentType": 5126, + "count": 56, + "max": [ + 0.12435850501060486, + 0.46001124382019043 + ], + "min": [ + 0.08625984936952591, + 0.31871020793914795 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 679288, + "componentType": 5126, + "count": 56, + "max": [ + 0.12435850501060486, + 0.46001124382019043 + ], + "min": [ + 0.08625984936952591, + 0.31871020793914795 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 777936, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1610280, + "componentType": 5126, + "count": 72, + "max": [ + -1.413440465927124, + -0.07334303855895996, + -0.4116091728210449 + ], + "min": [ + -1.6382265090942383, + -0.176507830619812, + -0.5894473195075989 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1611144, + "componentType": 5126, + "count": 72, + "max": [ + 0.9632111191749573, + -0.11858627945184708, + 0.9929382801055908 + ], + "min": [ + -0.9632073640823364, + -0.9854681491851807, + -0.9256693720817566 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 679736, + "componentType": 5126, + "count": 72, + "max": [ + 0.1793593019247055, + 0.14250916242599487 + ], + "min": [ + 0.1283140927553177, + -0.007269144058227539 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 680312, + "componentType": 5126, + "count": 72, + "max": [ + 0.1793593019247055, + 0.14250916242599487 + ], + "min": [ + 0.1283140927553177, + -0.007269144058227539 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 778368, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1612008, + "componentType": 5126, + "count": 72, + "max": [ + -0.07746243476867676, + -0.07334303855895996, + -0.4116091728210449 + ], + "min": [ + -0.302248477935791, + -0.176507830619812, + -0.5894473195075989 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1612872, + "componentType": 5126, + "count": 72, + "max": [ + 0.9632110595703125, + -0.11860617995262146, + 0.9929360747337341 + ], + "min": [ + -0.9632042050361633, + -0.9854682087898254, + -0.9256540536880493 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 680888, + "componentType": 5126, + "count": 72, + "max": [ + 0.4827391505241394, + 0.14250916242599487 + ], + "min": [ + 0.4316936135292053, + -0.007269144058227539 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 681464, + "componentType": 5126, + "count": 72, + "max": [ + 0.4827391505241394, + 0.14250916242599487 + ], + "min": [ + 0.4316936135292053, + -0.007269144058227539 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 779856, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1613736, + "componentType": 5126, + "count": 72, + "max": [ + 0.16081058979034424, + -0.07334303855895996, + -0.4116091728210449 + ], + "min": [ + -0.06397533416748047, + -0.176507830619812, + -0.5894473195075989 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1614600, + "componentType": 5126, + "count": 72, + "max": [ + 0.963211715221405, + -0.11858683079481125, + 0.9929386973381042 + ], + "min": [ + -0.9632077813148499, + -0.9854682087898254, + -0.9256691336631775 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 682040, + "componentType": 5126, + "count": 72, + "max": [ + 0.5368467569351196, + 0.14250916242599487 + ], + "min": [ + 0.48580166697502136, + -0.007269144058227539 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 682616, + "componentType": 5126, + "count": 72, + "max": [ + 0.5368467569351196, + 0.14250916242599487 + ], + "min": [ + 0.48580166697502136, + -0.007269144058227539 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 781344, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1615464, + "componentType": 5126, + "count": 72, + "max": [ + 0.3990837335586548, + -0.07334303855895996, + -0.4116091728210449 + ], + "min": [ + 0.17429769039154053, + -0.176507830619812, + -0.5894473195075989 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1616328, + "componentType": 5126, + "count": 72, + "max": [ + 0.9632116556167603, + -0.11856627464294434, + 0.9929404854774475 + ], + "min": [ + -0.9632071852684021, + -0.9854682087898254, + -0.9256540536880493 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 683192, + "componentType": 5126, + "count": 72, + "max": [ + 0.5909551382064819, + 0.14250916242599487 + ], + "min": [ + 0.5399099588394165, + -0.007269144058227539 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 683768, + "componentType": 5126, + "count": 72, + "max": [ + 0.5909551382064819, + 0.14250916242599487 + ], + "min": [ + 0.5399099588394165, + -0.007269144058227539 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 782832, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1617192, + "componentType": 5126, + "count": 72, + "max": [ + 0.6799629926681519, + -0.07334303855895996, + -0.4116091728210449 + ], + "min": [ + 0.4103158712387085, + -0.1766635924577713, + -0.5894473195075989 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1618056, + "componentType": 5126, + "count": 72, + "max": [ + 0.9632039070129395, + -0.118367038667202, + 0.9929661154747009 + ], + "min": [ + -0.9632057547569275, + -0.9854546785354614, + -0.9257888197898865 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 684344, + "componentType": 5126, + "count": 72, + "max": [ + 0.6547384262084961, + 0.14250916242599487 + ], + "min": [ + 0.5935056209564209, + -0.007269144058227539 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 684920, + "componentType": 5126, + "count": 72, + "max": [ + 0.6547384262084961, + 0.14250916242599487 + ], + "min": [ + 0.5935056209564209, + -0.007269144058227539 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 784320, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1618920, + "componentType": 5126, + "count": 55, + "max": [ + 1.314703106880188, + -0.07334303855895996, + -0.41664230823516846 + ], + "min": [ + 1.1469303369522095, + -0.14551645517349243, + -0.5844148993492126 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1619580, + "componentType": 5126, + "count": 55, + "max": [ + 0.9347338080406189, + 0.46820488572120667, + 0.9035256505012512 + ], + "min": [ + -0.9347335696220398, + 0.1357755959033966, + -0.9907397031784058 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 685496, + "componentType": 5126, + "count": 55, + "max": [ + 0.7988779544830322, + 0.13827002048492432 + ], + "min": [ + 0.7607792615890503, + -0.00303041934967041 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 685936, + "componentType": 5126, + "count": 55, + "max": [ + 0.7988779544830322, + 0.13827002048492432 + ], + "min": [ + 0.7607792615890503, + -0.00303041934967041 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 785808, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1620240, + "componentType": 5126, + "count": 72, + "max": [ + -0.31584012508392334, + -0.07334303855895996, + -0.4116091728210449 + ], + "min": [ + -1.4005610942840576, + -0.18151462078094482, + -0.5894473195075989 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1621104, + "componentType": 5126, + "count": 72, + "max": [ + 0.97035813331604, + -0.11453495174646378, + 0.9934064149856567 + ], + "min": [ + -0.9703579545021057, + -0.9992782473564148, + -0.9298597574234009 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 686376, + "componentType": 5126, + "count": 72, + "max": [ + 0.42860713601112366, + 0.14250916242599487 + ], + "min": [ + 0.18228407204151154, + -0.007269144058227539 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 686952, + "componentType": 5126, + "count": 72, + "max": [ + 0.42860713601112366, + 0.14250916242599487 + ], + "min": [ + 0.18228407204151154, + -0.007269144058227539 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 786240, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1621968, + "componentType": 5126, + "count": 72, + "max": [ + -1.9379913806915283, + -0.07334303855895996, + -0.21909785270690918 + ], + "min": [ + -2.162151575088501, + -0.177182137966156, + -0.39693599939346313 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1622832, + "componentType": 5126, + "count": 72, + "max": [ + 0.964012086391449, + -0.11648939549922943, + 0.9931871294975281 + ], + "min": [ + -0.9640117883682251, + -0.9866090416908264, + -0.926460325717926 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 687528, + "componentType": 5126, + "count": 72, + "max": [ + 0.06024209037423134, + 0.30464524030685425 + ], + "min": [ + 0.009338838048279285, + 0.15486735105514526 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 688104, + "componentType": 5126, + "count": 72, + "max": [ + 0.06024209037423134, + 0.30464524030685425 + ], + "min": [ + 0.009338838048279285, + 0.15486735105514526 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 787728, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1623696, + "componentType": 5126, + "count": 72, + "max": [ + -1.8905491828918457, + -0.07334303855895996, + 0.16186851263046265 + ], + "min": [ + -2.160196542739868, + -0.17278113961219788, + -0.015969693660736084 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1624560, + "componentType": 5126, + "count": 72, + "max": [ + 0.9660892486572266, + -0.1029859185218811, + 0.9946801662445068 + ], + "min": [ + -0.9660876989364624, + -0.9991059899330139, + -0.9191436767578125 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 688680, + "componentType": 5126, + "count": 72, + "max": [ + 0.07101541012525558, + 0.6255007386207581 + ], + "min": [ + 0.00978281069546938, + 0.4757227897644043 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 689256, + "componentType": 5126, + "count": 72, + "max": [ + 0.07101541012525558, + 0.6255007386207581 + ], + "min": [ + 0.00978281069546938, + 0.4757227897644043 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 789216, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1625424, + "componentType": 5126, + "count": 72, + "max": [ + -1.9002501964569092, + -0.07334303855895996, + -0.029591917991638184 + ], + "min": [ + -2.1594648361206055, + -0.17048053443431854, + -0.20743006467819214 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1626288, + "componentType": 5126, + "count": 72, + "max": [ + 0.9620733261108398, + -0.11451174318790436, + 0.993418276309967 + ], + "min": [ + -0.9620758295059204, + -0.9952053427696228, + -0.9162130951881409 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 689832, + "componentType": 5126, + "count": 72, + "max": [ + 0.06881260871887207, + 0.464249849319458 + ], + "min": [ + 0.00994904711842537, + 0.3144715428352356 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 690408, + "componentType": 5126, + "count": 72, + "max": [ + 0.06881260871887207, + 0.464249849319458 + ], + "min": [ + 0.00994904711842537, + 0.3144715428352356 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 790704, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1627152, + "componentType": 5126, + "count": 72, + "max": [ + 1.5767282247543335, + -0.07334303855895996, + 0.16186851263046265 + ], + "min": [ + 1.3988901376724243, + -0.17252551019191742, + -0.015969693660736084 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1628016, + "componentType": 5126, + "count": 72, + "max": [ + 0.9660977125167847, + -0.10347040742635727, + 0.9946272969245911 + ], + "min": [ + -0.9661010503768921, + -0.9991055130958557, + -0.918769121170044 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 690984, + "componentType": 5126, + "count": 72, + "max": [ + 0.8583797216415405, + 0.6255007386207581 + ], + "min": [ + 0.8179953098297119, + 0.4757227897644043 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 691560, + "componentType": 5126, + "count": 72, + "max": [ + 0.8583797216415405, + 0.6255007386207581 + ], + "min": [ + 0.8179953098297119, + 0.4757227897644043 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 792192, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1628880, + "componentType": 5126, + "count": 55, + "max": [ + -0.23022520542144775, + -0.07334303855895996, + -0.22413063049316406 + ], + "min": [ + -0.3979978561401367, + -0.14551645517349243, + -0.39190322160720825 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1629540, + "componentType": 5126, + "count": 55, + "max": [ + 0.9347839951515198, + 0.46820855140686035, + 0.9035243391990662 + ], + "min": [ + -0.934782862663269, + 0.13577774167060852, + -0.9907394051551819 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 692136, + "componentType": 5126, + "count": 55, + "max": [ + 0.4480489492416382, + 0.3004065752029419 + ], + "min": [ + 0.40995049476623535, + 0.15910595655441284 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 692576, + "componentType": 5126, + "count": 55, + "max": [ + 0.4480489492416382, + 0.3004065752029419 + ], + "min": [ + 0.40995049476623535, + 0.15910595655441284 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 793680, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1630200, + "componentType": 5126, + "count": 72, + "max": [ + 1.7670150995254517, + -0.07334303855895996, + 0.16186851263046265 + ], + "min": [ + 1.5891770124435425, + -0.17252551019191742, + -0.015969693660736084 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1631064, + "componentType": 5126, + "count": 72, + "max": [ + 0.9660975933074951, + -0.10347036272287369, + 0.9946272373199463 + ], + "min": [ + -0.9661014676094055, + -0.9991055727005005, + -0.9187739491462708 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 693016, + "componentType": 5126, + "count": 72, + "max": [ + 0.9015909433364868, + 0.6255007386207581 + ], + "min": [ + 0.861206591129303, + 0.4757227897644043 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 693592, + "componentType": 5126, + "count": 72, + "max": [ + 0.9015909433364868, + 0.6255007386207581 + ], + "min": [ + 0.861206591129303, + 0.4757227897644043 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 794112, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1631928, + "componentType": 5126, + "count": 72, + "max": [ + 1.9573019742965698, + -0.07334303855895996, + 0.16186851263046265 + ], + "min": [ + 1.7794636487960815, + -0.17252551019191742, + -0.015969693660736084 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1632792, + "componentType": 5126, + "count": 72, + "max": [ + 0.9660970568656921, + -0.10338396579027176, + 0.9946357607841492 + ], + "min": [ + -0.9661012887954712, + -0.9991055727005005, + -0.9187679290771484 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 694168, + "componentType": 5126, + "count": 72, + "max": [ + 0.9448021054267883, + 0.6255007386207581 + ], + "min": [ + 0.9044174551963806, + 0.4757227897644043 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 694744, + "componentType": 5126, + "count": 72, + "max": [ + 0.9448021054267883, + 0.6255007386207581 + ], + "min": [ + 0.9044174551963806, + 0.4757227897644043 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 795600, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1633656, + "componentType": 5126, + "count": 72, + "max": [ + 1.5767282247543335, + -0.07334303855895996, + -0.029591500759124756 + ], + "min": [ + 1.3988901376724243, + -0.17012333869934082, + -0.2074296474456787 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1634520, + "componentType": 5126, + "count": 72, + "max": [ + 0.9620897173881531, + -0.1146770715713501, + 0.9933955073356628 + ], + "min": [ + -0.9620867371559143, + -0.9952096939086914, + -0.9159067869186401 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 695320, + "componentType": 5126, + "count": 72, + "max": [ + 0.8583797216415405, + 0.4642500877380371 + ], + "min": [ + 0.8179953098297119, + 0.3144722580909729 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 695896, + "componentType": 5126, + "count": 72, + "max": [ + 0.8583797216415405, + 0.4642500877380371 + ], + "min": [ + 0.8179953098297119, + 0.3144722580909729 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 797088, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1635384, + "componentType": 5126, + "count": 72, + "max": [ + 1.7670150995254517, + -0.07334303855895996, + -0.029591500759124756 + ], + "min": [ + 1.5891770124435425, + -0.17012333869934082, + -0.2074296474456787 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1636248, + "componentType": 5126, + "count": 72, + "max": [ + 0.962089478969574, + -0.11466021090745926, + 0.9933972358703613 + ], + "min": [ + -0.9620867967605591, + -0.9952096939086914, + -0.9159066081047058 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 696472, + "componentType": 5126, + "count": 72, + "max": [ + 0.9015909433364868, + 0.4642500877380371 + ], + "min": [ + 0.861206591129303, + 0.3144722580909729 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 697048, + "componentType": 5126, + "count": 72, + "max": [ + 0.9015909433364868, + 0.4642500877380371 + ], + "min": [ + 0.861206591129303, + 0.3144722580909729 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 798576, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1637112, + "componentType": 5126, + "count": 72, + "max": [ + 1.9573019742965698, + -0.07334303855895996, + -0.029591500759124756 + ], + "min": [ + 1.7794636487960815, + -0.17012333869934082, + -0.2074296474456787 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1637976, + "componentType": 5126, + "count": 72, + "max": [ + 0.9620888829231262, + -0.11471624672412872, + 0.9933910369873047 + ], + "min": [ + -0.9620864987373352, + -0.9952097535133362, + -0.9159204959869385 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 697624, + "componentType": 5126, + "count": 72, + "max": [ + 0.9448021054267883, + 0.4642500877380371 + ], + "min": [ + 0.9044174551963806, + 0.3144722580909729 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 698200, + "componentType": 5126, + "count": 72, + "max": [ + 0.9448021054267883, + 0.4642500877380371 + ], + "min": [ + 0.9044174551963806, + 0.3144722580909729 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 800064, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1638840, + "componentType": 5126, + "count": 72, + "max": [ + 1.5767282247543335, + -0.07334303855895996, + -0.21909749507904053 + ], + "min": [ + 1.3988901376724243, + -0.17694193124771118, + -0.3969356417655945 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1639704, + "componentType": 5126, + "count": 72, + "max": [ + 0.9640165567398071, + -0.11660274863243103, + 0.9931715726852417 + ], + "min": [ + -0.9640142321586609, + -0.9866021275520325, + -0.926301896572113 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 698776, + "componentType": 5126, + "count": 72, + "max": [ + 0.8583797216415405, + 0.3046454191207886 + ], + "min": [ + 0.8179953098297119, + 0.15486735105514526 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 699352, + "componentType": 5126, + "count": 72, + "max": [ + 0.8583797216415405, + 0.3046454191207886 + ], + "min": [ + 0.8179953098297119, + 0.15486735105514526 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 801552, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1640568, + "componentType": 5126, + "count": 72, + "max": [ + 1.7670150995254517, + -0.07334303855895996, + -0.21909749507904053 + ], + "min": [ + 1.5891770124435425, + -0.17694193124771118, + -0.3969356417655945 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1641432, + "componentType": 5126, + "count": 72, + "max": [ + 0.9640165567398071, + -0.11658210307359695, + 0.9931740760803223 + ], + "min": [ + -0.9640238881111145, + -0.9866021275520325, + -0.9263045787811279 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 699928, + "componentType": 5126, + "count": 72, + "max": [ + 0.9015909433364868, + 0.3046454191207886 + ], + "min": [ + 0.861206591129303, + 0.15486735105514526 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 700504, + "componentType": 5126, + "count": 72, + "max": [ + 0.9015909433364868, + 0.3046454191207886 + ], + "min": [ + 0.861206591129303, + 0.15486735105514526 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 803040, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1642296, + "componentType": 5126, + "count": 72, + "max": [ + 1.9573019742965698, + -0.07334303855895996, + -0.21909749507904053 + ], + "min": [ + 1.7794636487960815, + -0.17694193124771118, + -0.3969356417655945 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1643160, + "componentType": 5126, + "count": 72, + "max": [ + 0.9640158414840698, + -0.11656385660171509, + 0.9931759238243103 + ], + "min": [ + -0.9640198945999146, + -0.9866020679473877, + -0.9263026714324951 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 701080, + "componentType": 5126, + "count": 72, + "max": [ + 0.9448021054267883, + 0.3046454191207886 + ], + "min": [ + 0.9044174551963806, + 0.15486735105514526 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 701656, + "componentType": 5126, + "count": 72, + "max": [ + 0.9448021054267883, + 0.3046454191207886 + ], + "min": [ + 0.9044174551963806, + 0.15486735105514526 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 804528, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1644024, + "componentType": 5126, + "count": 56, + "max": [ + 1.1244162321090698, + -0.07334303855895996, + -0.41664230823516846 + ], + "min": [ + 0.9566437005996704, + -0.14551645517349243, + -0.5844148993492126 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1644696, + "componentType": 5126, + "count": 56, + "max": [ + 0.934734046459198, + 0.468204140663147, + 0.9035252332687378 + ], + "min": [ + -0.9347321391105652, + 0.1357755959033966, + -0.990739643573761 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 702232, + "componentType": 5126, + "count": 56, + "max": [ + 0.7556666135787964, + 0.13827002048492432 + ], + "min": [ + 0.7175681591033936, + -0.00303041934967041 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 702680, + "componentType": 5126, + "count": 56, + "max": [ + 0.7556666135787964, + 0.13827002048492432 + ], + "min": [ + 0.7175681591033936, + -0.00303041934967041 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 806016, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1645368, + "componentType": 5126, + "count": 72, + "max": [ + 0.9391621351242065, + -0.07334303855895996, + -0.4116095304489136 + ], + "min": [ + 0.7613240480422974, + -0.1762552410364151, + -0.5894476771354675 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1646232, + "componentType": 5126, + "count": 72, + "max": [ + 0.9632192850112915, + -0.11886897683143616, + 0.9929026961326599 + ], + "min": [ + -0.9632192254066467, + -0.9854605197906494, + -0.9254544973373413 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 703128, + "componentType": 5126, + "count": 72, + "max": [ + 0.713598370552063, + 0.14250868558883667 + ], + "min": [ + 0.6732141971588135, + -0.007269144058227539 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 703704, + "componentType": 5126, + "count": 72, + "max": [ + 0.713598370552063, + 0.14250868558883667 + ], + "min": [ + 0.6732141971588135, + -0.007269144058227539 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 806448, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1647096, + "componentType": 5126, + "count": 72, + "max": [ + 1.1294490098953247, + -0.07334303855895996, + -0.4116095304489136 + ], + "min": [ + 0.9516109228134155, + -0.1762552410364151, + -0.5894476771354675 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1647960, + "componentType": 5126, + "count": 72, + "max": [ + 0.9632197618484497, + -0.11890997737646103, + 0.9928978085517883 + ], + "min": [ + -0.9632195234298706, + -0.9854605197906494, + -0.9254578948020935 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 704280, + "componentType": 5126, + "count": 72, + "max": [ + 0.756809413433075, + 0.14250868558883667 + ], + "min": [ + 0.7164252400398254, + -0.007269144058227539 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 704856, + "componentType": 5126, + "count": 72, + "max": [ + 0.756809413433075, + 0.14250868558883667 + ], + "min": [ + 0.7164252400398254, + -0.007269144058227539 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 807936, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1648824, + "componentType": 5126, + "count": 72, + "max": [ + 1.3197358846664429, + -0.07334303855895996, + -0.4116095304489136 + ], + "min": [ + 1.1418975591659546, + -0.1762552410364151, + -0.5894476771354675 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1649688, + "componentType": 5126, + "count": 72, + "max": [ + 0.9632194638252258, + -0.11890998482704163, + 0.9928978085517883 + ], + "min": [ + -0.9632184505462646, + -0.9854604601860046, + -0.9254541397094727 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 705432, + "componentType": 5126, + "count": 72, + "max": [ + 0.8000207543373108, + 0.14250868558883667 + ], + "min": [ + 0.7596364617347717, + -0.007269144058227539 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 706008, + "componentType": 5126, + "count": 72, + "max": [ + 0.8000207543373108, + 0.14250868558883667 + ], + "min": [ + 0.7596364617347717, + -0.007269144058227539 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 809424, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1650552, + "componentType": 5126, + "count": 72, + "max": [ + 1.957119345664978, + -0.07334303855895996, + -0.4116095304489136 + ], + "min": [ + 1.7792812585830688, + -0.1762552410364151, + -0.5894476771354675 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1651416, + "componentType": 5126, + "count": 72, + "max": [ + 0.963219404220581, + -0.11889062821865082, + 0.9928998351097107 + ], + "min": [ + -0.9632198214530945, + -0.9854605197906494, + -0.9254582524299622 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 706584, + "componentType": 5126, + "count": 72, + "max": [ + 0.9447605609893799, + 0.14250868558883667 + ], + "min": [ + 0.9043764472007751, + -0.007269144058227539 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 707160, + "componentType": 5126, + "count": 72, + "max": [ + 0.9447605609893799, + 0.14250868558883667 + ], + "min": [ + 0.9043764472007751, + -0.007269144058227539 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 810912, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1652280, + "componentType": 5126, + "count": 72, + "max": [ + 1.5767282247543335, + -0.07334303855895996, + 0.3517885208129883 + ], + "min": [ + 1.3988901376724243, + -0.19089370965957642, + 0.17395034432411194 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1653144, + "componentType": 5126, + "count": 72, + "max": [ + 0.976362407207489, + -0.06218568980693817, + 0.9980628490447998 + ], + "min": [ + -0.975660502910614, + -0.9994569420814514, + -0.9279471039772034 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 707736, + "componentType": 5126, + "count": 72, + "max": [ + 0.8583797216415405, + 0.7854538559913635 + ], + "min": [ + 0.8179953098297119, + 0.6356762051582336 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 708312, + "componentType": 5126, + "count": 72, + "max": [ + 0.8583797216415405, + 0.7854538559913635 + ], + "min": [ + 0.8179953098297119, + 0.6356762051582336 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 812400, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1654008, + "componentType": 5126, + "count": 72, + "max": [ + 1.7670150995254517, + -0.07334303855895996, + 0.3517885208129883 + ], + "min": [ + 1.5891770124435425, + -0.19089370965957642, + 0.17395034432411194 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1654872, + "componentType": 5126, + "count": 72, + "max": [ + 0.9763671159744263, + -0.06222478672862053, + 0.9980606436729431 + ], + "min": [ + -0.9756572842597961, + -0.9994569420814514, + -0.9279457926750183 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 708888, + "componentType": 5126, + "count": 72, + "max": [ + 0.9015909433364868, + 0.7854538559913635 + ], + "min": [ + 0.861206591129303, + 0.6356762051582336 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 709464, + "componentType": 5126, + "count": 72, + "max": [ + 0.9015909433364868, + 0.7854538559913635 + ], + "min": [ + 0.861206591129303, + 0.6356762051582336 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 813888, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1655736, + "componentType": 5126, + "count": 72, + "max": [ + 1.9573019742965698, + -0.07334303855895996, + 0.3517885208129883 + ], + "min": [ + 1.7794636487960815, + -0.19089370965957642, + 0.17395034432411194 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1656600, + "componentType": 5126, + "count": 72, + "max": [ + 0.9763659834861755, + -0.06227684020996094, + 0.9980575442314148 + ], + "min": [ + -0.9756605625152588, + -0.9994569420814514, + -0.9279460310935974 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 710040, + "componentType": 5126, + "count": 72, + "max": [ + 0.9448021054267883, + 0.7854538559913635 + ], + "min": [ + 0.9044174551963806, + 0.6356762051582336 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 710616, + "componentType": 5126, + "count": 72, + "max": [ + 0.9448021054267883, + 0.7854538559913635 + ], + "min": [ + 0.9044174551963806, + 0.6356762051582336 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 815376, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1657464, + "componentType": 5126, + "count": 72, + "max": [ + 2.1475887298583984, + -0.07334303855895996, + 0.3517885208129883 + ], + "min": [ + 1.9697505235671997, + -0.19089370965957642, + 0.17395034432411194 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1658328, + "componentType": 5126, + "count": 72, + "max": [ + 0.9763458967208862, + -0.06217123195528984, + 0.9980639219284058 + ], + "min": [ + -0.9756605625152588, + -0.9994569420814514, + -0.9279471039772034 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 711192, + "componentType": 5126, + "count": 72, + "max": [ + 0.9880129098892212, + 0.7854538559913635 + ], + "min": [ + 0.9476290345191956, + 0.6356762051582336 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 711768, + "componentType": 5126, + "count": 72, + "max": [ + 0.9880129098892212, + 0.7854538559913635 + ], + "min": [ + 0.9476290345191956, + 0.6356762051582336 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 816864, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1659192, + "componentType": 5126, + "count": 72, + "max": [ + 2.1482162475585938, + -0.07334303855895996, + 0.1601157784461975 + ], + "min": [ + 1.970378041267395, + -0.16959485411643982, + -0.20521366596221924 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1660056, + "componentType": 5126, + "count": 72, + "max": [ + 0.9662594795227051, + -0.10339636355638504, + 0.9946351051330566 + ], + "min": [ + -0.9662612676620483, + -0.9999862909317017, + -0.9128897190093994 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 712344, + "componentType": 5126, + "count": 72, + "max": [ + 0.9881557822227478, + 0.6240242719650269 + ], + "min": [ + 0.9477715492248535, + 0.3163384795188904 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 712920, + "componentType": 5126, + "count": 72, + "max": [ + 0.9881557822227478, + 0.6240242719650269 + ], + "min": [ + 0.9477715492248535, + 0.3163384795188904 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 818352, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1660920, + "componentType": 5126, + "count": 72, + "max": [ + 2.1482162475585938, + -0.07334303855895996, + -0.22121769189834595 + ], + "min": [ + 1.970378041267395, + -0.17569206655025482, + -0.5865471959114075 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1661784, + "componentType": 5126, + "count": 72, + "max": [ + 0.9649208188056946, + -0.1174602136015892, + 0.9930703043937683 + ], + "min": [ + -0.9649246335029602, + -0.9980500936508179, + -0.9236984252929688 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 713496, + "componentType": 5126, + "count": 72, + "max": [ + 0.9881557822227478, + 0.302859902381897 + ], + "min": [ + 0.9477715492248535, + -0.00482630729675293 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 714072, + "componentType": 5126, + "count": 72, + "max": [ + 0.9881557822227478, + 0.302859902381897 + ], + "min": [ + 0.9477715492248535, + -0.00482630729675293 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 819840, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1662648, + "componentType": 5126, + "count": 72, + "max": [ + 1.7655714750289917, + -0.07334303855895996, + -0.4116095304489136 + ], + "min": [ + 1.398689866065979, + -0.17699289321899414, + -0.5894476771354675 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1663512, + "componentType": 5126, + "count": 72, + "max": [ + 0.9632046222686768, + -0.1184525340795517, + 0.9929577112197876 + ], + "min": [ + -0.9632000923156738, + -0.9854601621627808, + -0.9259207844734192 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 714648, + "componentType": 5126, + "count": 72, + "max": [ + 0.9012628793716431, + 0.14250868558883667 + ], + "min": [ + 0.8179501891136169, + -0.007269144058227539 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 715224, + "componentType": 5126, + "count": 72, + "max": [ + 0.9012628793716431, + 0.14250868558883667 + ], + "min": [ + 0.8179501891136169, + -0.007269144058227539 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 821328, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1664376, + "componentType": 5126, + "count": 72, + "max": [ + 1.1305040121078491, + -0.07334303855895996, + -0.21909749507904053 + ], + "min": [ + 0.9526659250259399, + -0.17694193124771118, + -0.3969356417655945 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1665240, + "componentType": 5126, + "count": 72, + "max": [ + 0.9640164375305176, + -0.11658179759979248, + 0.9931741952896118 + ], + "min": [ + -0.9640235900878906, + -0.9866021275520325, + -0.9262980222702026 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 715800, + "componentType": 5126, + "count": 72, + "max": [ + 0.7570495009422302, + 0.3046454191207886 + ], + "min": [ + 0.7166649699211121, + 0.15486735105514526 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 716376, + "componentType": 5126, + "count": 72, + "max": [ + 0.7570495009422302, + 0.3046454191207886 + ], + "min": [ + 0.7166649699211121, + 0.15486735105514526 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 822816, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1666104, + "componentType": 5126, + "count": 72, + "max": [ + 0.6814929246902466, + -0.07334303855895996, + -0.21909785270690918 + ], + "min": [ + 0.17154157161712646, + -0.17803868651390076, + -0.39693599939346313 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1666968, + "componentType": 5126, + "count": 72, + "max": [ + 0.9640036821365356, + -0.11598226428031921, + 0.9932502508163452 + ], + "min": [ + -0.9639989733695984, + -0.986599326133728, + -0.9269254207611084 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 716952, + "componentType": 5126, + "count": 72, + "max": [ + 0.6550858616828918, + 0.30464524030685425 + ], + "min": [ + 0.539283812046051, + 0.15486735105514526 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 717528, + "componentType": 5126, + "count": 72, + "max": [ + 0.6550858616828918, + 0.30464524030685425 + ], + "min": [ + 0.539283812046051, + 0.15486735105514526 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 824304, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1667832, + "componentType": 5126, + "count": 54, + "max": [ + 0.9341293573379517, + -0.07334303855895996, + -0.41664230823516846 + ], + "min": [ + 0.7663568258285522, + -0.14551645517349243, + -0.5844148993492126 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1668480, + "componentType": 5126, + "count": 54, + "max": [ + 0.9347319602966309, + 0.46820417046546936, + 0.90352463722229 + ], + "min": [ + -0.9347341656684875, + 0.13577544689178467, + -0.9907397031784058 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 718104, + "componentType": 5126, + "count": 54, + "max": [ + 0.7124555110931396, + 0.13827002048492432 + ], + "min": [ + 0.6743570566177368, + -0.00303041934967041 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 718536, + "componentType": 5126, + "count": 54, + "max": [ + 0.7124555110931396, + 0.13827002048492432 + ], + "min": [ + 0.6743570566177368, + -0.00303041934967041 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 825792, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1669128, + "componentType": 5126, + "count": 72, + "max": [ + 0.6816927194595337, + -0.07334303855895996, + 0.3517885208129883 + ], + "min": [ + 0.314811110496521, + -0.19102349877357483, + 0.17395034432411194 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1669992, + "componentType": 5126, + "count": 72, + "max": [ + 0.976402997970581, + -0.06181471422314644, + 0.9980873465538025 + ], + "min": [ + -0.9756389260292053, + -0.9994580149650574, + -0.928249180316925 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 718968, + "componentType": 5126, + "count": 72, + "max": [ + 0.6551312208175659, + 0.7854538559913635 + ], + "min": [ + 0.5718181133270264, + 0.6356762051582336 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 719544, + "componentType": 5126, + "count": 72, + "max": [ + 0.6551312208175659, + 0.7854538559913635 + ], + "min": [ + 0.5718181133270264, + 0.6356762051582336 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 826224, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1670856, + "componentType": 5126, + "count": 56, + "max": [ + -0.6107989549636841, + -0.07334303855895996, + -0.22413063049316406 + ], + "min": [ + -0.7785714864730835, + -0.14551645517349243, + -0.39190322160720825 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1671528, + "componentType": 5126, + "count": 56, + "max": [ + 0.9347842335700989, + 0.4682077169418335, + 0.9035245776176453 + ], + "min": [ + -0.9347829222679138, + 0.13577760756015778, + -0.9907394051551819 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 720120, + "componentType": 5126, + "count": 56, + "max": [ + 0.36162668466567993, + 0.3004065752029419 + ], + "min": [ + 0.3235281705856323, + 0.15910595655441284 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 720568, + "componentType": 5126, + "count": 56, + "max": [ + 0.36162668466567993, + 0.3004065752029419 + ], + "min": [ + 0.3235281705856323, + 0.15910595655441284 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 827712, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1672200, + "componentType": 5126, + "count": 56, + "max": [ + 2.143183708190918, + -0.07334303855895996, + -0.22625046968460083 + ], + "min": [ + 1.97541081905365, + -0.14551645517349243, + -0.5815144181251526 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1672872, + "componentType": 5126, + "count": 56, + "max": [ + 0.9263186454772949, + 0.6483283638954163, + 0.774817168712616 + ], + "min": [ + -0.9263285994529724, + 0.3464697301387787, + -0.9020110964775085 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 721016, + "componentType": 5126, + "count": 56, + "max": [ + 0.9870129227638245, + 0.29862117767333984 + ], + "min": [ + 0.9489143490791321, + -0.0005877017974853516 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 721464, + "componentType": 5126, + "count": 56, + "max": [ + 0.9870129227638245, + 0.29862117767333984 + ], + "min": [ + 0.9489143490791321, + -0.0005877017974853516 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 828144, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1673544, + "componentType": 5126, + "count": 56, + "max": [ + -0.3236374855041504, + -0.07334303855895996, + -0.034624695777893066 + ], + "min": [ + -0.49141013622283936, + -0.14551645517349243, + -0.20239728689193726 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1674216, + "componentType": 5126, + "count": 56, + "max": [ + 0.9346345663070679, + 0.46783047914505005, + 0.9035037159919739 + ], + "min": [ + -0.9346343874931335, + 0.13572077453136444, + -0.9907472133636475 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 721912, + "componentType": 5126, + "count": 56, + "max": [ + 0.4268365502357483, + 0.46001124382019043 + ], + "min": [ + 0.3887380361557007, + 0.31871020793914795 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 722360, + "componentType": 5126, + "count": 56, + "max": [ + 0.4268365502357483, + 0.46001124382019043 + ], + "min": [ + 0.3887380361557007, + 0.31871020793914795 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 828576, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1674888, + "componentType": 5126, + "count": 55, + "max": [ + 1.7605386972427368, + -0.07334303855895996, + -0.41664230823516846 + ], + "min": [ + 1.4037226438522339, + -0.14551645517349243, + -0.5844148993492126 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1675548, + "componentType": 5126, + "count": 55, + "max": [ + 0.8203830122947693, + 0.613490104675293, + 0.9035317301750183 + ], + "min": [ + -0.8203837275505066, + 0.13579608500003815, + -0.9907369017601013 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 722808, + "componentType": 5126, + "count": 55, + "max": [ + 0.9001200199127197, + 0.1382700800895691 + ], + "min": [ + 0.8190929889678955, + -0.00303041934967041 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 723248, + "componentType": 5126, + "count": 55, + "max": [ + 0.9001200199127197, + 0.1382700800895691 + ], + "min": [ + 0.8190929889678955, + -0.00303041934967041 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 829008, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1676208, + "componentType": 5126, + "count": 56, + "max": [ + -0.13335061073303223, + -0.07334303855895996, + -0.034624695777893066 + ], + "min": [ + -0.3011232614517212, + -0.14551645517349243, + -0.20239728689193726 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1676880, + "componentType": 5126, + "count": 56, + "max": [ + 0.9346331357955933, + 0.4678296744823456, + 0.9035035967826843 + ], + "min": [ + -0.9346345067024231, + 0.13572078943252563, + -0.9907472133636475 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 723688, + "componentType": 5126, + "count": 56, + "max": [ + 0.4700477123260498, + 0.46001124382019043 + ], + "min": [ + 0.43194931745529175, + 0.31871020793914795 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 724136, + "componentType": 5126, + "count": 56, + "max": [ + 0.4700477123260498, + 0.46001124382019043 + ], + "min": [ + 0.43194931745529175, + 0.31871020793914795 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 829440, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1677552, + "componentType": 5126, + "count": 56, + "max": [ + 1.1254712343215942, + -0.07334303855895996, + -0.2241302728652954 + ], + "min": [ + 0.9576987028121948, + -0.14551645517349243, + -0.3919028639793396 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1678224, + "componentType": 5126, + "count": 56, + "max": [ + 0.9347851872444153, + 0.4682082533836365, + 0.903525173664093 + ], + "min": [ + -0.934783935546875, + 0.13577736914157867, + -0.9907394051551819 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 724584, + "componentType": 5126, + "count": 56, + "max": [ + 0.7559066414833069, + 0.30040669441223145 + ], + "min": [ + 0.7178078889846802, + 0.15910601615905762 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 725032, + "componentType": 5126, + "count": 56, + "max": [ + 0.7559066414833069, + 0.30040669441223145 + ], + "min": [ + 0.7178078889846802, + 0.15910601615905762 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 829872, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1678896, + "componentType": 5126, + "count": 51, + "max": [ + 0.05693638324737549, + -0.07334303855895996, + -0.034624695777893066 + ], + "min": [ + -0.11083638668060303, + -0.14551645517349243, + -0.20239728689193726 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1679508, + "componentType": 5126, + "count": 51, + "max": [ + 0.934633195400238, + 0.4678300619125366, + 0.9035035371780396 + ], + "min": [ + -0.934629499912262, + 0.13572001457214355, + -0.990747332572937 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 725480, + "componentType": 5126, + "count": 51, + "max": [ + 0.5132588148117065, + 0.46001124382019043 + ], + "min": [ + 0.47516027092933655, + 0.31871020793914795 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 725888, + "componentType": 5126, + "count": 51, + "max": [ + 0.5132588148117065, + 0.46001124382019043 + ], + "min": [ + 0.47516027092933655, + 0.31871020793914795 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 830304, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1680120, + "componentType": 5126, + "count": 56, + "max": [ + 0.6764601469039917, + -0.07334303855895996, + -0.22413063049316406 + ], + "min": [ + 0.17657434940338135, + -0.14551645517349243, + -0.39190322160720825 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1680792, + "componentType": 5126, + "count": 56, + "max": [ + 0.725549578666687, + 0.6990403532981873, + 0.903533399105072 + ], + "min": [ + -0.7255500555038452, + 0.1358027160167694, + -0.9907359480857849 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 726296, + "componentType": 5126, + "count": 56, + "max": [ + 0.6539430022239685, + 0.3004065752029419 + ], + "min": [ + 0.5404266119003296, + 0.15910601615905762 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 726744, + "componentType": 5126, + "count": 56, + "max": [ + 0.6539430022239685, + 0.3004065752029419 + ], + "min": [ + 0.5404266119003296, + 0.15910601615905762 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 830736, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1681464, + "componentType": 5126, + "count": 56, + "max": [ + 0.24722301959991455, + -0.07334303855895996, + -0.034624695777893066 + ], + "min": [ + 0.07945048809051514, + -0.14551645517349243, + -0.20239728689193726 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1682136, + "componentType": 5126, + "count": 56, + "max": [ + 0.9346303343772888, + 0.4678294062614441, + 0.9035035371780396 + ], + "min": [ + -0.9346309304237366, + 0.13572078943252563, + -0.9907471537590027 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 727192, + "componentType": 5126, + "count": 56, + "max": [ + 0.5564699769020081, + 0.46001124382019043 + ], + "min": [ + 0.5183714628219604, + 0.31871020793914795 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 727640, + "componentType": 5126, + "count": 56, + "max": [ + 0.5564699769020081, + 0.46001124382019043 + ], + "min": [ + 0.5183714628219604, + 0.31871020793914795 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 831168, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1682808, + "componentType": 5126, + "count": 55, + "max": [ + 0.6766599416732788, + -0.07334303855895996, + 0.3467557430267334 + ], + "min": [ + 0.3198438882827759, + -0.14551645517349243, + 0.17898312211036682 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1683468, + "componentType": 5126, + "count": 55, + "max": [ + 0.8203191161155701, + 0.6138243675231934, + 0.903513491153717 + ], + "min": [ + -0.8203189969062805, + 0.13574807345867157, + -0.9907434582710266 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 728088, + "componentType": 5126, + "count": 55, + "max": [ + 0.6539883613586426, + 0.7812153100967407 + ], + "min": [ + 0.5729609131813049, + 0.639914870262146 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 728528, + "componentType": 5126, + "count": 55, + "max": [ + 0.6539883613586426, + 0.7812153100967407 + ], + "min": [ + 0.5729609131813049, + 0.639914870262146 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 831600, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1684128, + "componentType": 5126, + "count": 54, + "max": [ + -1.5145339965820313, + -0.07334303855895996, + 0.15683555603027344 + ], + "min": [ + -1.6823066473007202, + -0.14551645517349243, + -0.010937035083770752 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1684776, + "componentType": 5126, + "count": 54, + "max": [ + 0.9347134232521057, + 0.46784257888793945, + 0.9035042524337769 + ], + "min": [ + -0.9347133636474609, + 0.1357189118862152, + -0.9907474517822266 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 728968, + "componentType": 5126, + "count": 54, + "max": [ + 0.15640276670455933, + 0.6212620735168457 + ], + "min": [ + 0.11830408871173859, + 0.4799610376358032 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 729400, + "componentType": 5126, + "count": 54, + "max": [ + 0.15640276670455933, + 0.6212620735168457 + ], + "min": [ + 0.11830408871173859, + 0.4799610376358032 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 832032, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1685424, + "componentType": 5126, + "count": 56, + "max": [ + 0.6791282892227173, + -0.07334303855895996, + 0.5847246646881104 + ], + "min": [ + 0.5113555192947388, + -0.14551645517349243, + 0.41695207357406616 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1686096, + "componentType": 5126, + "count": 56, + "max": [ + 0.9345242381095886, + 0.4680114984512329, + 0.9035001397132874 + ], + "min": [ + -0.934524416923523, + 0.13570931553840637, + -0.9907487630844116 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 729832, + "componentType": 5126, + "count": 56, + "max": [ + 0.6594518423080444, + 0.9754961133003235 + ], + "min": [ + 0.6115472912788391, + 0.7646989822387695 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 730280, + "componentType": 5126, + "count": 56, + "max": [ + 0.6594518423080444, + 0.9754961133003235 + ], + "min": [ + 0.6115472912788391, + 0.7646989822387695 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 832464, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1686768, + "componentType": 5126, + "count": 54, + "max": [ + -1.3242472410202026, + -0.07334303855895996, + 0.15683555603027344 + ], + "min": [ + -1.4920198917388916, + -0.14551645517349243, + -0.010937035083770752 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1687416, + "componentType": 5126, + "count": 54, + "max": [ + 0.9347130656242371, + 0.4678429067134857, + 0.9035038352012634 + ], + "min": [ + -0.9347147941589355, + 0.13571879267692566, + -0.9907475113868713 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 730728, + "componentType": 5126, + "count": 54, + "max": [ + 0.19961372017860413, + 0.6212620735168457 + ], + "min": [ + 0.16151531040668488, + 0.479961097240448 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 731160, + "componentType": 5126, + "count": 54, + "max": [ + 0.19961372017860413, + 0.6212620735168457 + ], + "min": [ + 0.16151531040668488, + 0.479961097240448 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 832896, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1688064, + "componentType": 5126, + "count": 56, + "max": [ + 0.9341293573379517, + -0.07334303855895996, + 0.5847246646881104 + ], + "min": [ + 0.7663568258285522, + -0.14551645517349243, + 0.41695207357406616 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1688736, + "componentType": 5126, + "count": 56, + "max": [ + 0.9345218539237976, + 0.46800971031188965, + 0.9035000205039978 + ], + "min": [ + -0.9345265030860901, + 0.13570894300937653, + -0.9907487630844116 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 731592, + "componentType": 5126, + "count": 56, + "max": [ + 0.717358410358429, + 0.9754959940910339 + ], + "min": [ + 0.6694540977478027, + 0.76469886302948 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 732040, + "componentType": 5126, + "count": 56, + "max": [ + 0.717358410358429, + 0.9754959940910339 + ], + "min": [ + 0.6694540977478027, + 0.76469886302948 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 833328, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1689408, + "componentType": 5126, + "count": 54, + "max": [ + -1.1339603662490845, + -0.07334303855895996, + 0.15683555603027344 + ], + "min": [ + -1.3017330169677734, + -0.14551645517349243, + -0.010937035083770752 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1690056, + "componentType": 5126, + "count": 54, + "max": [ + 0.9347129464149475, + 0.46783876419067383, + 0.9035045504570007 + ], + "min": [ + -0.9347139000892639, + 0.13571879267692566, + -0.9907475113868713 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 732488, + "componentType": 5126, + "count": 54, + "max": [ + 0.2428250014781952, + 0.6212620735168457 + ], + "min": [ + 0.20472638309001923, + 0.479961097240448 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 732920, + "componentType": 5126, + "count": 54, + "max": [ + 0.2428250014781952, + 0.6212620735168457 + ], + "min": [ + 0.20472638309001923, + 0.479961097240448 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 833760, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1690704, + "componentType": 5126, + "count": 56, + "max": [ + 1.1244162321090698, + -0.07334303855895996, + 0.5847246646881104 + ], + "min": [ + 0.9566437005996704, + -0.14551645517349243, + 0.41695207357406616 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1691376, + "componentType": 5126, + "count": 56, + "max": [ + 0.9345272779464722, + 0.4680098295211792, + 0.9035001397132874 + ], + "min": [ + -0.9345212578773499, + 0.13570894300937653, + -0.9907488226890564 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 733352, + "componentType": 5126, + "count": 56, + "max": [ + 0.7605696320533752, + 0.9754959940910339 + ], + "min": [ + 0.7126651406288147, + 0.7646989822387695 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 733800, + "componentType": 5126, + "count": 56, + "max": [ + 0.7605696320533752, + 0.9754959940910339 + ], + "min": [ + 0.7126651406288147, + 0.7646989822387695 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 834192, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1692048, + "componentType": 5126, + "count": 56, + "max": [ + -0.9436734914779663, + -0.07334303855895996, + 0.15683555603027344 + ], + "min": [ + -1.1114461421966553, + -0.14551645517349243, + -0.010937035083770752 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1692720, + "componentType": 5126, + "count": 56, + "max": [ + 0.9347149133682251, + 0.46784210205078125, + 0.9035054445266724 + ], + "min": [ + -0.9347149729728699, + 0.13571859896183014, + -0.9907475113868713 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 734248, + "componentType": 5126, + "count": 56, + "max": [ + 0.28603601455688477, + 0.6212620735168457 + ], + "min": [ + 0.24793767929077148, + 0.479961097240448 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 734696, + "componentType": 5126, + "count": 56, + "max": [ + 0.28603601455688477, + 0.6212620735168457 + ], + "min": [ + 0.24793767929077148, + 0.479961097240448 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 834624, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1693392, + "componentType": 5126, + "count": 56, + "max": [ + 1.314703106880188, + -0.07334303855895996, + 0.5847246646881104 + ], + "min": [ + 1.1469303369522095, + -0.14551645517349243, + 0.41695207357406616 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1694064, + "componentType": 5126, + "count": 56, + "max": [ + 0.93452388048172, + 0.4680100977420807, + 0.9035001993179321 + ], + "min": [ + -0.934524416923523, + 0.13570894300937653, + -0.9907488226890564 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 735144, + "componentType": 5126, + "count": 56, + "max": [ + 0.8037807941436768, + 0.9754960536956787 + ], + "min": [ + 0.7558763027191162, + 0.7646989822387695 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 735592, + "componentType": 5126, + "count": 56, + "max": [ + 0.8037807941436768, + 0.9754960536956787 + ], + "min": [ + 0.7558763027191162, + 0.7646989822387695 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 835056, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1694736, + "componentType": 5126, + "count": 56, + "max": [ + -0.7533867359161377, + -0.07334303855895996, + 0.15683555603027344 + ], + "min": [ + -0.9211593866348267, + -0.14551645517349243, + -0.010937035083770752 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1695408, + "componentType": 5126, + "count": 56, + "max": [ + 0.934714674949646, + 0.4678388833999634, + 0.9035038352012634 + ], + "min": [ + -0.9347134232521057, + 0.1357194036245346, + -0.9907473921775818 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 736040, + "componentType": 5126, + "count": 56, + "max": [ + 0.3292473256587982, + 0.6212620735168457 + ], + "min": [ + 0.29114866256713867, + 0.479961097240448 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 736488, + "componentType": 5126, + "count": 56, + "max": [ + 0.3292473256587982, + 0.6212620735168457 + ], + "min": [ + 0.29114866256713867, + 0.479961097240448 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 835488, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1696080, + "componentType": 5126, + "count": 56, + "max": [ + 0.9341293573379517, + -0.07334303855895996, + 0.3467557430267334 + ], + "min": [ + 0.7663568258285522, + -0.14551645517349243, + 0.17898312211036682 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1696752, + "componentType": 5126, + "count": 56, + "max": [ + 0.9348376393318176, + 0.4680415093898773, + 0.9035102128982544 + ], + "min": [ + -0.9348393678665161, + 0.13573716580867767, + -0.990744948387146 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 736936, + "componentType": 5126, + "count": 56, + "max": [ + 0.7124555110931396, + 0.7812153697013855 + ], + "min": [ + 0.674356997013092, + 0.6399148106575012 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 737384, + "componentType": 5126, + "count": 56, + "max": [ + 0.7124555110931396, + 0.7812153697013855 + ], + "min": [ + 0.674356997013092, + 0.6399148106575012 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 835920, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1697424, + "componentType": 5126, + "count": 54, + "max": [ + -0.5630998611450195, + -0.07334303855895996, + 0.15683555603027344 + ], + "min": [ + -0.7308725118637085, + -0.14551645517349243, + -0.010937035083770752 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1698072, + "componentType": 5126, + "count": 54, + "max": [ + 0.9347147941589355, + 0.4678380489349365, + 0.9035037159919739 + ], + "min": [ + -0.9347147941589355, + 0.13571947813034058, + -0.9907473921775818 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 737832, + "componentType": 5126, + "count": 54, + "max": [ + 0.3724583387374878, + 0.6212620735168457 + ], + "min": [ + 0.334359735250473, + 0.479961097240448 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 738264, + "componentType": 5126, + "count": 54, + "max": [ + 0.3724583387374878, + 0.6212620735168457 + ], + "min": [ + 0.334359735250473, + 0.479961097240448 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 836352, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1698720, + "componentType": 5126, + "count": 56, + "max": [ + 1.1244162321090698, + -0.07334303855895996, + 0.3467557430267334 + ], + "min": [ + 0.9566437005996704, + -0.14551645517349243, + 0.17898312211036682 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1699392, + "componentType": 5126, + "count": 56, + "max": [ + 0.9348375201225281, + 0.4680413603782654, + 0.9035103917121887 + ], + "min": [ + -0.93483966588974, + 0.13573713600635529, + -0.990744948387146 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 738696, + "componentType": 5126, + "count": 56, + "max": [ + 0.7556666135787964, + 0.7812153697013855 + ], + "min": [ + 0.7175681591033936, + 0.6399148106575012 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 739144, + "componentType": 5126, + "count": 56, + "max": [ + 0.7556666135787964, + 0.7812153697013855 + ], + "min": [ + 0.7175681591033936, + 0.6399148106575012 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 836784, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1700064, + "componentType": 5126, + "count": 54, + "max": [ + -0.37281298637390137, + -0.07334303855895996, + 0.15683555603027344 + ], + "min": [ + -0.5405856370925903, + -0.14551645517349243, + -0.010937035083770752 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1700712, + "componentType": 5126, + "count": 54, + "max": [ + 0.9347148537635803, + 0.4678385555744171, + 0.9035034775733948 + ], + "min": [ + -0.9347146153450012, + 0.1357194036245346, + -0.9907473921775818 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 739592, + "componentType": 5126, + "count": 54, + "max": [ + 0.41566959023475647, + 0.6212620735168457 + ], + "min": [ + 0.3775709271430969, + 0.479961097240448 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 740024, + "componentType": 5126, + "count": 54, + "max": [ + 0.41566959023475647, + 0.6212620735168457 + ], + "min": [ + 0.3775709271430969, + 0.479961097240448 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 837216, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1701360, + "componentType": 5126, + "count": 56, + "max": [ + 1.314703106880188, + -0.07334303855895996, + 0.3467557430267334 + ], + "min": [ + 1.1469303369522095, + -0.14551645517349243, + 0.17898312211036682 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1702032, + "componentType": 5126, + "count": 56, + "max": [ + 0.9348392486572266, + 0.4680423438549042, + 0.9035103917121887 + ], + "min": [ + -0.9348388314247131, + 0.13573727011680603, + -0.990744948387146 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 740456, + "componentType": 5126, + "count": 56, + "max": [ + 0.798878014087677, + 0.7812153697013855 + ], + "min": [ + 0.7607793807983398, + 0.639914870262146 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 740904, + "componentType": 5126, + "count": 56, + "max": [ + 0.798878014087677, + 0.7812153697013855 + ], + "min": [ + 0.7607793807983398, + 0.639914870262146 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 837648, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1702704, + "componentType": 5126, + "count": 52, + "max": [ + -0.1825261116027832, + -0.07334303855895996, + 0.15683555603027344 + ], + "min": [ + -0.35029876232147217, + -0.14551645517349243, + -0.010937035083770752 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1703328, + "componentType": 5126, + "count": 52, + "max": [ + 0.9347147345542908, + 0.46783900260925293, + 0.90350341796875 + ], + "min": [ + -0.934714674949646, + 0.1357194483280182, + -0.9907473921775818 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 741352, + "componentType": 5126, + "count": 52, + "max": [ + 0.4588809907436371, + 0.6212620735168457 + ], + "min": [ + 0.4207821488380432, + 0.479961097240448 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 741768, + "componentType": 5126, + "count": 52, + "max": [ + 0.4588809907436371, + 0.6212620735168457 + ], + "min": [ + 0.4207821488380432, + 0.479961097240448 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 838080, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1703952, + "componentType": 5126, + "count": 54, + "max": [ + 0.9341293573379517, + -0.07334303855895996, + 0.15683573484420776 + ], + "min": [ + 0.7663568258285522, + -0.14551645517349243, + -0.010936915874481201 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1704600, + "componentType": 5126, + "count": 54, + "max": [ + 0.9347130656242371, + 0.46783745288848877, + 0.9035038352012634 + ], + "min": [ + -0.934714674949646, + 0.13571897149085999, + -0.9907473921775818 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 742184, + "componentType": 5126, + "count": 54, + "max": [ + 0.7124555706977844, + 0.6212620735168457 + ], + "min": [ + 0.6743569374084473, + 0.4799613952636719 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 742616, + "componentType": 5126, + "count": 54, + "max": [ + 0.7124555706977844, + 0.6212620735168457 + ], + "min": [ + 0.6743569374084473, + 0.4799613952636719 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 838512, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1705248, + "componentType": 5126, + "count": 54, + "max": [ + 0.007760763168334961, + -0.07334303855895996, + 0.15683555603027344 + ], + "min": [ + -0.160011887550354, + -0.14551645517349243, + -0.010937035083770752 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1705896, + "componentType": 5126, + "count": 54, + "max": [ + 0.934714674949646, + 0.46783891320228577, + 0.90350341796875 + ], + "min": [ + -0.9347146153450012, + 0.13571961224079132, + -0.9907473921775818 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 743048, + "componentType": 5126, + "count": 54, + "max": [ + 0.5020918846130371, + 0.6212620735168457 + ], + "min": [ + 0.4639933705329895, + 0.479961097240448 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 743480, + "componentType": 5126, + "count": 54, + "max": [ + 0.5020918846130371, + 0.6212620735168457 + ], + "min": [ + 0.4639933705329895, + 0.479961097240448 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 838944, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1706544, + "componentType": 5126, + "count": 54, + "max": [ + 1.1244162321090698, + -0.07334303855895996, + 0.15683573484420776 + ], + "min": [ + 0.9566437005996704, + -0.14551645517349243, + -0.010936915874481201 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1707192, + "componentType": 5126, + "count": 54, + "max": [ + 0.934715747833252, + 0.46783891320228577, + 0.9035037159919739 + ], + "min": [ + -0.9347112774848938, + 0.1357192099094391, + -0.9907474517822266 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 743912, + "componentType": 5126, + "count": 54, + "max": [ + 0.7556667327880859, + 0.6212620735168457 + ], + "min": [ + 0.7175681591033936, + 0.4799613952636719 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 744344, + "componentType": 5126, + "count": 54, + "max": [ + 0.7556667327880859, + 0.6212620735168457 + ], + "min": [ + 0.7175681591033936, + 0.4799613952636719 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 839376, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1707840, + "componentType": 5126, + "count": 55, + "max": [ + 0.19804775714874268, + -0.07334303855895996, + 0.15683555603027344 + ], + "min": [ + 0.03027498722076416, + -0.14551645517349243, + -0.010937035083770752 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1708500, + "componentType": 5126, + "count": 55, + "max": [ + 0.9347147345542908, + 0.46783822774887085, + 0.90350341796875 + ], + "min": [ + -0.9347116351127625, + 0.13571959733963013, + -0.9907473921775818 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 744776, + "componentType": 5126, + "count": 55, + "max": [ + 0.5453028678894043, + 0.6212620735168457 + ], + "min": [ + 0.5072044730186462, + 0.479961097240448 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 745216, + "componentType": 5126, + "count": 55, + "max": [ + 0.5453028678894043, + 0.6212620735168457 + ], + "min": [ + 0.5072044730186462, + 0.479961097240448 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 839808, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1709160, + "componentType": 5126, + "count": 54, + "max": [ + 1.314703106880188, + -0.07334303855895996, + 0.15683573484420776 + ], + "min": [ + 1.1469303369522095, + -0.14551645517349243, + -0.010936915874481201 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1709808, + "componentType": 5126, + "count": 54, + "max": [ + 0.9347123503684998, + 0.4678384065628052, + 0.9035037159919739 + ], + "min": [ + -0.9347121715545654, + 0.1357192099094391, + -0.9907474517822266 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 745656, + "componentType": 5126, + "count": 54, + "max": [ + 0.798878014087677, + 0.6212620735168457 + ], + "min": [ + 0.7607793807983398, + 0.4799613952636719 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 746088, + "componentType": 5126, + "count": 54, + "max": [ + 0.798878014087677, + 0.6212620735168457 + ], + "min": [ + 0.7607793807983398, + 0.4799613952636719 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 840240, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1710456, + "componentType": 5126, + "count": 55, + "max": [ + 0.38833439350128174, + -0.07334303855895996, + 0.15683555603027344 + ], + "min": [ + 0.22056186199188232, + -0.14551645517349243, + -0.010937035083770752 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1711116, + "componentType": 5126, + "count": 55, + "max": [ + 0.934712827205658, + 0.46783849596977234, + 0.9035035371780396 + ], + "min": [ + -0.9347142577171326, + 0.13571959733963013, + -0.990747332572937 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 746520, + "componentType": 5126, + "count": 55, + "max": [ + 0.5885140299797058, + 0.6212620735168457 + ], + "min": [ + 0.5504154562950134, + 0.479961097240448 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 746960, + "componentType": 5126, + "count": 55, + "max": [ + 0.5885140299797058, + 0.6212620735168457 + ], + "min": [ + 0.5504154562950134, + 0.479961097240448 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 840672, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1711776, + "componentType": 5126, + "count": 56, + "max": [ + -1.6567463874816895, + -0.07334303855895996, + -0.4166419506072998 + ], + "min": [ + -1.871466875076294, + -0.14551645517349243, + -0.584414541721344 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1712448, + "componentType": 5126, + "count": 56, + "max": [ + 0.9096219539642334, + 0.507886528968811, + 0.9035289883613586 + ], + "min": [ + -0.9096221327781677, + 0.13578327000141144, + -0.990738570690155 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 747400, + "componentType": 5126, + "count": 56, + "max": [ + 0.12410842627286911, + 0.13827049732208252 + ], + "min": [ + 0.07534874975681305, + -0.00303041934967041 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 747848, + "componentType": 5126, + "count": 56, + "max": [ + 0.12410842627286911, + 0.13827049732208252 + ], + "min": [ + 0.07534874975681305, + -0.00303041934967041 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 841104, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1713120, + "componentType": 5126, + "count": 55, + "max": [ + -1.418473243713379, + -0.07334303855895996, + -0.4166419506072998 + ], + "min": [ + -1.6331937313079834, + -0.14551645517349243, + -0.584414541721344 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1713780, + "componentType": 5126, + "count": 55, + "max": [ + 0.9096218943595886, + 0.5078874230384827, + 0.9035288691520691 + ], + "min": [ + -0.9096223711967468, + 0.13578495383262634, + -0.9907383918762207 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 748296, + "componentType": 5126, + "count": 55, + "max": [ + 0.17821642756462097, + 0.13827049732208252 + ], + "min": [ + 0.12945690751075745, + -0.00303041934967041 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 748736, + "componentType": 5126, + "count": 55, + "max": [ + 0.17821642756462097, + 0.13827049732208252 + ], + "min": [ + 0.12945690751075745, + -0.00303041934967041 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 841536, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1714440, + "componentType": 5126, + "count": 53, + "max": [ + -0.08249521255493164, + -0.07334303855895996, + -0.4166419506072998 + ], + "min": [ + -0.29721570014953613, + -0.14551645517349243, + -0.584414541721344 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1715076, + "componentType": 5126, + "count": 53, + "max": [ + 0.9096216559410095, + 0.5078868865966797, + 0.9035282135009766 + ], + "min": [ + -0.909622311592102, + 0.13578498363494873, + -0.9907383918762207 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 749176, + "componentType": 5126, + "count": 53, + "max": [ + 0.48159629106521606, + 0.13827049732208252 + ], + "min": [ + 0.43283647298812866, + -0.00303041934967041 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 749600, + "componentType": 5126, + "count": 53, + "max": [ + 0.48159629106521606, + 0.13827049732208252 + ], + "min": [ + 0.43283647298812866, + -0.00303041934967041 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 841968, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1715712, + "componentType": 5126, + "count": 54, + "max": [ + 0.15577781200408936, + -0.07334303855895996, + -0.4166419506072998 + ], + "min": [ + -0.058942556381225586, + -0.14551645517349243, + -0.584414541721344 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1716360, + "componentType": 5126, + "count": 54, + "max": [ + 0.9096216559410095, + 0.5078862905502319, + 0.903528094291687 + ], + "min": [ + -0.9096226692199707, + 0.1357850879430771, + -0.9907383918762207 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 750024, + "componentType": 5126, + "count": 54, + "max": [ + 0.5357040166854858, + 0.13827049732208252 + ], + "min": [ + 0.4869445562362671, + -0.00303041934967041 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 750456, + "componentType": 5126, + "count": 54, + "max": [ + 0.5357040166854858, + 0.13827049732208252 + ], + "min": [ + 0.4869445562362671, + -0.00303041934967041 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 842400, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1717008, + "componentType": 5126, + "count": 56, + "max": [ + 0.3940509557723999, + -0.07334303855895996, + -0.4166419506072998 + ], + "min": [ + 0.1793304681777954, + -0.14551645517349243, + -0.584414541721344 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1717680, + "componentType": 5126, + "count": 56, + "max": [ + 0.9096195101737976, + 0.5078864097595215, + 0.903528094291687 + ], + "min": [ + -0.9096225500106812, + 0.1357850581407547, + -0.9907383918762207 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 750888, + "componentType": 5126, + "count": 56, + "max": [ + 0.5898122191429138, + 0.13827049732208252 + ], + "min": [ + 0.5410526990890503, + -0.00303041934967041 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 751336, + "componentType": 5126, + "count": 56, + "max": [ + 0.5898122191429138, + 0.13827049732208252 + ], + "min": [ + 0.5410526990890503, + -0.00303041934967041 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 842832, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1718352, + "componentType": 5126, + "count": 55, + "max": [ + 0.674930214881897, + -0.07334303855895996, + -0.4166419506072998 + ], + "min": [ + 0.4153486490249634, + -0.14551645517349243, + -0.584414541721344 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1719012, + "componentType": 5126, + "count": 55, + "max": [ + 0.8831286430358887, + 0.5436239838600159, + 0.9035293459892273 + ], + "min": [ + -0.8831281065940857, + 0.13578972220420837, + -0.990737795829773 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 751784, + "componentType": 5126, + "count": 55, + "max": [ + 0.6535958051681519, + 0.13827049732208252 + ], + "min": [ + 0.5946484804153442, + -0.00303041934967041 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 752224, + "componentType": 5126, + "count": 55, + "max": [ + 0.6535958051681519, + 0.13827049732208252 + ], + "min": [ + 0.5946484804153442, + -0.00303041934967041 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 843264, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1719672, + "componentType": 5126, + "count": 54, + "max": [ + -1.8955819606781006, + -0.07334303855895996, + -0.4166419506072998 + ], + "min": [ + -2.1551637649536133, + -0.14551645517349243, + -0.584414541721344 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1720320, + "componentType": 5126, + "count": 54, + "max": [ + 0.8831280469894409, + 0.5436347126960754, + 0.9035323858261108 + ], + "min": [ + -0.8831276893615723, + 0.13579076528549194, + -0.9907376170158386 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 752664, + "componentType": 5126, + "count": 54, + "max": [ + 0.06987255811691284, + 0.13827049732208252 + ], + "min": [ + 0.01092567015439272, + -0.00303041934967041 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 753096, + "componentType": 5126, + "count": 54, + "max": [ + 0.06987255811691284, + 0.13827049732208252 + ], + "min": [ + 0.01092567015439272, + -0.00303041934967041 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 843696, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1720968, + "componentType": 5126, + "count": 56, + "max": [ + -0.6563781499862671, + -0.07334303855895996, + 0.34675532579421997 + ], + "min": [ + -0.824150800704956, + -0.14551645517349243, + 0.17898273468017578 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1721640, + "componentType": 5126, + "count": 56, + "max": [ + 0.9348385334014893, + 0.4680421054363251, + 0.9035101532936096 + ], + "min": [ + -0.9348392486572266, + 0.13573716580867767, + -0.990744948387146 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 753528, + "componentType": 5126, + "count": 56, + "max": [ + 0.35127630829811096, + 0.781215250492096 + ], + "min": [ + 0.3131779134273529, + 0.6399144530296326 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 753976, + "componentType": 5126, + "count": 56, + "max": [ + 0.35127630829811096, + 0.781215250492096 + ], + "min": [ + 0.3131779134273529, + 0.6399144530296326 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 844128, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1722312, + "componentType": 5126, + "count": 56, + "max": [ + -0.4660912752151489, + -0.07334303855895996, + 0.34675532579421997 + ], + "min": [ + -0.6338639259338379, + -0.14551645517349243, + 0.17898273468017578 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1722984, + "componentType": 5126, + "count": 56, + "max": [ + 0.9348385334014893, + 0.46804362535476685, + 0.9035098552703857 + ], + "min": [ + -0.934839129447937, + 0.13573703169822693, + -0.990744948387146 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 754424, + "componentType": 5126, + "count": 56, + "max": [ + 0.39448752999305725, + 0.781215250492096 + ], + "min": [ + 0.3563890755176544, + 0.6399144530296326 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 754872, + "componentType": 5126, + "count": 56, + "max": [ + 0.39448752999305725, + 0.781215250492096 + ], + "min": [ + 0.3563890755176544, + 0.6399144530296326 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 844560, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1723656, + "componentType": 5126, + "count": 54, + "max": [ + -0.27580440044403076, + -0.07334303855895996, + 0.34675532579421997 + ], + "min": [ + -0.4435770511627197, + -0.14551645517349243, + 0.17898273468017578 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1724304, + "componentType": 5126, + "count": 54, + "max": [ + 0.9348385334014893, + 0.46804219484329224, + 0.9035100936889648 + ], + "min": [ + -0.9348376989364624, + 0.13573706150054932, + -0.990744948387146 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 755320, + "componentType": 5126, + "count": 54, + "max": [ + 0.43769869208335876, + 0.781215250492096 + ], + "min": [ + 0.39960017800331116, + 0.6399144530296326 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 755752, + "componentType": 5126, + "count": 54, + "max": [ + 0.43769869208335876, + 0.781215250492096 + ], + "min": [ + 0.39960017800331116, + 0.6399144530296326 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 844992, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1724952, + "componentType": 5126, + "count": 56, + "max": [ + -1.905282974243164, + -0.07334303855895996, + -0.034624695777893066 + ], + "min": [ + -2.1544320583343506, + -0.14551645517349243, + -0.20239728689193726 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1725624, + "componentType": 5126, + "count": 56, + "max": [ + 0.8893449902534485, + 0.5353978872299194, + 0.903508186340332 + ], + "min": [ + -0.8893436789512634, + 0.13572898507118225, + -0.9907460808753967 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 756184, + "componentType": 5126, + "count": 56, + "max": [ + 0.06766971945762634, + 0.46001124382019043 + ], + "min": [ + 0.01109190285205841, + 0.31871020793914795 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 756632, + "componentType": 5126, + "count": 56, + "max": [ + 0.06766971945762634, + 0.46001124382019043 + ], + "min": [ + 0.01109190285205841, + 0.31871020793914795 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 845424, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1726296, + "componentType": 5126, + "count": 54, + "max": [ + -0.0855175256729126, + -0.07334303855895996, + 0.34675532579421997 + ], + "min": [ + -0.25329017639160156, + -0.14551645517349243, + 0.17898273468017578 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1726944, + "componentType": 5126, + "count": 54, + "max": [ + 0.9348386526107788, + 0.4680415093898773, + 0.9035097360610962 + ], + "min": [ + -0.9348391890525818, + 0.13573721051216125, + -0.990744948387146 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 757080, + "componentType": 5126, + "count": 54, + "max": [ + 0.4809098541736603, + 0.781215250492096 + ], + "min": [ + 0.4428112804889679, + 0.6399144530296326 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 757512, + "componentType": 5126, + "count": 54, + "max": [ + 0.4809098541736603, + 0.781215250492096 + ], + "min": [ + 0.4428112804889679, + 0.6399144530296326 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 845856, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1727592, + "componentType": 5126, + "count": 54, + "max": [ + 1.5716954469680786, + -0.07334303855895996, + 0.15683573484420776 + ], + "min": [ + 1.4039229154586792, + -0.14551645517349243, + -0.010936915874481201 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1728240, + "componentType": 5126, + "count": 54, + "max": [ + 0.9347132444381714, + 0.4678390920162201, + 0.9035037755966187 + ], + "min": [ + -0.9347141981124878, + 0.1357192099094391, + -0.9907474517822266 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 757944, + "componentType": 5126, + "count": 54, + "max": [ + 0.857236921787262, + 0.6212620735168457 + ], + "min": [ + 0.8191381096839905, + 0.4799613952636719 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 758376, + "componentType": 5126, + "count": 54, + "max": [ + 0.857236921787262, + 0.6212620735168457 + ], + "min": [ + 0.8191381096839905, + 0.4799613952636719 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 846288, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1728888, + "componentType": 5126, + "count": 56, + "max": [ + 0.10476934909820557, + -0.07334303855895996, + 0.34675532579421997 + ], + "min": [ + -0.0630033016204834, + -0.14551645517349243, + 0.17898273468017578 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1729560, + "componentType": 5126, + "count": 56, + "max": [ + 0.9348385334014893, + 0.4680419862270355, + 0.9035097360610962 + ], + "min": [ + -0.9348393082618713, + 0.13573728501796722, + -0.990744948387146 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 758808, + "componentType": 5126, + "count": 56, + "max": [ + 0.5241209268569946, + 0.781215250492096 + ], + "min": [ + 0.486022412776947, + 0.6399144530296326 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 759256, + "componentType": 5126, + "count": 56, + "max": [ + 0.5241209268569946, + 0.781215250492096 + ], + "min": [ + 0.486022412776947, + 0.6399144530296326 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 846720, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1730232, + "componentType": 5126, + "count": 54, + "max": [ + 1.7619823217391968, + -0.07334303855895996, + 0.15683573484420776 + ], + "min": [ + 1.5942097902297974, + -0.14551645517349243, + -0.010936915874481201 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1730880, + "componentType": 5126, + "count": 54, + "max": [ + 0.934715986251831, + 0.46783867478370667, + 0.9035045504570007 + ], + "min": [ + -0.9347145557403564, + 0.13571836054325104, + -0.9907475113868713 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 759704, + "componentType": 5126, + "count": 54, + "max": [ + 0.9004481434822083, + 0.6212620735168457 + ], + "min": [ + 0.8623495101928711, + 0.4799613952636719 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 760136, + "componentType": 5126, + "count": 54, + "max": [ + 0.9004481434822083, + 0.6212620735168457 + ], + "min": [ + 0.8623495101928711, + 0.4799613952636719 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 847152, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1731528, + "componentType": 5126, + "count": 56, + "max": [ + 0.29505622386932373, + -0.07334303855895996, + 0.34675532579421997 + ], + "min": [ + 0.12728369235992432, + -0.14551645517349243, + 0.17898273468017578 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1732200, + "componentType": 5126, + "count": 56, + "max": [ + 0.9348377585411072, + 0.4680422842502594, + 0.9035097360610962 + ], + "min": [ + -0.9348393082618713, + 0.13573716580867767, + -0.990744948387146 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 760568, + "componentType": 5126, + "count": 56, + "max": [ + 0.5673320889472961, + 0.7812153100967407 + ], + "min": [ + 0.5292336344718933, + 0.6399144530296326 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 761016, + "componentType": 5126, + "count": 56, + "max": [ + 0.5673320889472961, + 0.7812153100967407 + ], + "min": [ + 0.5292336344718933, + 0.6399144530296326 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 847584, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1732872, + "componentType": 5126, + "count": 54, + "max": [ + 1.952269196510315, + -0.07334303855895996, + 0.15683573484420776 + ], + "min": [ + 1.7844964265823364, + -0.14551645517349243, + -0.010936915874481201 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1733520, + "componentType": 5126, + "count": 54, + "max": [ + 0.9347149133682251, + 0.46783873438835144, + 0.9035037159919739 + ], + "min": [ + -0.9347121715545654, + 0.13571834564208984, + -0.9907475113868713 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 761464, + "componentType": 5126, + "count": 54, + "max": [ + 0.943659245967865, + 0.6212620735168457 + ], + "min": [ + 0.9055604934692383, + 0.4799613952636719 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 761896, + "componentType": 5126, + "count": 54, + "max": [ + 0.943659245967865, + 0.6212620735168457 + ], + "min": [ + 0.9055604934692383, + 0.4799613952636719 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 848016, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1734168, + "componentType": 5126, + "count": 56, + "max": [ + 1.5716954469680786, + -0.07334303855895996, + -0.03462427854537964 + ], + "min": [ + 1.4039229154586792, + -0.14551645517349243, + -0.20239686965942383 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1734840, + "componentType": 5126, + "count": 56, + "max": [ + 0.9346309900283813, + 0.4678316116333008, + 0.9035037755966187 + ], + "min": [ + -0.9346302151679993, + 0.1357196718454361, + -0.990747332572937 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 762328, + "componentType": 5126, + "count": 56, + "max": [ + 0.857236921787262, + 0.46001136302948 + ], + "min": [ + 0.8191381692886353, + 0.31871092319488525 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 762776, + "componentType": 5126, + "count": 56, + "max": [ + 0.857236921787262, + 0.46001136302948 + ], + "min": [ + 0.8191381692886353, + 0.31871092319488525 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 848448, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1735512, + "componentType": 5126, + "count": 56, + "max": [ + -1.5622332096099854, + -0.07334303855895996, + -0.22413063049316406 + ], + "min": [ + -1.7300057411193848, + -0.14551645517349243, + -0.39190322160720825 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1736184, + "componentType": 5126, + "count": 56, + "max": [ + 0.9347840547561646, + 0.4682103991508484, + 0.9035254716873169 + ], + "min": [ + -0.9347847104072571, + 0.1357765644788742, + -0.9907395243644714 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 763224, + "componentType": 5126, + "count": 56, + "max": [ + 0.14557093381881714, + 0.3004065752029419 + ], + "min": [ + 0.10747244209051132, + 0.15910595655441284 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 763672, + "componentType": 5126, + "count": 56, + "max": [ + 0.14557093381881714, + 0.3004065752029419 + ], + "min": [ + 0.10747244209051132, + 0.15910595655441284 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 848880, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1736856, + "componentType": 5126, + "count": 56, + "max": [ + 1.7619823217391968, + -0.07334303855895996, + -0.03462427854537964 + ], + "min": [ + 1.5942097902297974, + -0.14551645517349243, + -0.20239686965942383 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1737528, + "componentType": 5126, + "count": 56, + "max": [ + 0.9346304535865784, + 0.4678325951099396, + 0.9035037755966187 + ], + "min": [ + -0.9346293210983276, + 0.13571910560131073, + -0.9907474517822266 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 764120, + "componentType": 5126, + "count": 56, + "max": [ + 0.900448203086853, + 0.46001136302948 + ], + "min": [ + 0.8623494505882263, + 0.31871092319488525 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 764568, + "componentType": 5126, + "count": 56, + "max": [ + 0.900448203086853, + 0.46001136302948 + ], + "min": [ + 0.8623494505882263, + 0.31871092319488525 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 849312, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1738200, + "componentType": 5126, + "count": 56, + "max": [ + -1.3719463348388672, + -0.07334303855895996, + -0.22413063049316406 + ], + "min": [ + -1.5397188663482666, + -0.14551645517349243, + -0.39190322160720825 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1738872, + "componentType": 5126, + "count": 56, + "max": [ + 0.9347836375236511, + 0.4682086110115051, + 0.9035258293151855 + ], + "min": [ + -0.9347842335700989, + 0.13577671349048615, + -0.9907394647598267 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 765016, + "componentType": 5126, + "count": 56, + "max": [ + 0.18878218531608582, + 0.3004065752029419 + ], + "min": [ + 0.1506834775209427, + 0.15910589694976807 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 765464, + "componentType": 5126, + "count": 56, + "max": [ + 0.18878218531608582, + 0.3004065752029419 + ], + "min": [ + 0.1506834775209427, + 0.15910589694976807 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 849744, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1739544, + "componentType": 5126, + "count": 56, + "max": [ + 1.952269196510315, + -0.07334303855895996, + -0.03462427854537964 + ], + "min": [ + 1.7844964265823364, + -0.14551645517349243, + -0.20239686965942383 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1740216, + "componentType": 5126, + "count": 56, + "max": [ + 0.9346283078193665, + 0.4678279757499695, + 0.903505265712738 + ], + "min": [ + -0.9346295595169067, + 0.13571836054325104, + -0.9907475113868713 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 765912, + "componentType": 5126, + "count": 56, + "max": [ + 0.943659245967865, + 0.46001136302948 + ], + "min": [ + 0.9055603742599487, + 0.31871092319488525 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 766360, + "componentType": 5126, + "count": 56, + "max": [ + 0.943659245967865, + 0.46001136302948 + ], + "min": [ + 0.9055603742599487, + 0.31871092319488525 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 850176, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1740888, + "componentType": 5126, + "count": 56, + "max": [ + -1.181659460067749, + -0.07334303855895996, + -0.22413063049316406 + ], + "min": [ + -1.3494319915771484, + -0.14551645517349243, + -0.39190322160720825 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1741560, + "componentType": 5126, + "count": 56, + "max": [ + 0.9347841143608093, + 0.46821415424346924, + 0.903525173664093 + ], + "min": [ + -0.9347831606864929, + 0.13577671349048615, + -0.9907394647598267 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 766808, + "componentType": 5126, + "count": 56, + "max": [ + 0.231993168592453, + 0.3004065752029419 + ], + "min": [ + 0.19389475882053375, + 0.15910589694976807 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 767256, + "componentType": 5126, + "count": 56, + "max": [ + 0.231993168592453, + 0.3004065752029419 + ], + "min": [ + 0.19389475882053375, + 0.15910589694976807 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 850608, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1742232, + "componentType": 5126, + "count": 56, + "max": [ + 1.5716954469680786, + -0.07334303855895996, + -0.2241302728652954 + ], + "min": [ + 1.4039229154586792, + -0.14551645517349243, + -0.3919028639793396 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1742904, + "componentType": 5126, + "count": 56, + "max": [ + 0.9347845911979675, + 0.4682115912437439, + 0.9035249352455139 + ], + "min": [ + -0.934783935546875, + 0.13577736914157867, + -0.9907394051551819 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 767704, + "componentType": 5126, + "count": 56, + "max": [ + 0.857236921787262, + 0.30040669441223145 + ], + "min": [ + 0.81913822889328, + 0.15910601615905762 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 768152, + "componentType": 5126, + "count": 56, + "max": [ + 0.857236921787262, + 0.30040669441223145 + ], + "min": [ + 0.81913822889328, + 0.15910601615905762 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 851040, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1743576, + "componentType": 5126, + "count": 56, + "max": [ + -0.9913726449012756, + -0.07334303855895996, + -0.22413063049316406 + ], + "min": [ + -1.1591452360153198, + -0.14551645517349243, + -0.39190322160720825 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1744248, + "componentType": 5126, + "count": 56, + "max": [ + 0.9347851276397705, + 0.46821150183677673, + 0.903525710105896 + ], + "min": [ + -0.9347829818725586, + 0.13577677309513092, + -0.9907395243644714 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 768600, + "componentType": 5126, + "count": 56, + "max": [ + 0.27520444989204407, + 0.3004065752029419 + ], + "min": [ + 0.23710580170154572, + 0.15910595655441284 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 769048, + "componentType": 5126, + "count": 56, + "max": [ + 0.27520444989204407, + 0.3004065752029419 + ], + "min": [ + 0.23710580170154572, + 0.15910595655441284 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 851472, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1744920, + "componentType": 5126, + "count": 56, + "max": [ + 1.7619823217391968, + -0.07334303855895996, + -0.2241302728652954 + ], + "min": [ + 1.5942097902297974, + -0.14551645517349243, + -0.3919028639793396 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1745592, + "componentType": 5126, + "count": 56, + "max": [ + 0.9347838759422302, + 0.4682078957557678, + 0.903525173664093 + ], + "min": [ + -0.9347819685935974, + 0.1357770711183548, + -0.9907394051551819 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 769496, + "componentType": 5126, + "count": 56, + "max": [ + 0.9004481434822083, + 0.30040669441223145 + ], + "min": [ + 0.8623496294021606, + 0.15910601615905762 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 769944, + "componentType": 5126, + "count": 56, + "max": [ + 0.9004481434822083, + 0.30040669441223145 + ], + "min": [ + 0.8623496294021606, + 0.15910601615905762 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 851904, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1746264, + "componentType": 5126, + "count": 55, + "max": [ + -0.8010858297348022, + -0.07334303855895996, + -0.22413063049316406 + ], + "min": [ + -0.9688583612442017, + -0.14551645517349243, + -0.39190322160720825 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1746924, + "componentType": 5126, + "count": 55, + "max": [ + 0.9347844123840332, + 0.4682084023952484, + 0.9035245180130005 + ], + "min": [ + -0.9347835183143616, + 0.13577760756015778, + -0.9907393455505371 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 770392, + "componentType": 5126, + "count": 55, + "max": [ + 0.31841549277305603, + 0.3004065752029419 + ], + "min": [ + 0.280317097902298, + 0.15910595655441284 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 770832, + "componentType": 5126, + "count": 55, + "max": [ + 0.31841549277305603, + 0.3004065752029419 + ], + "min": [ + 0.280317097902298, + 0.15910595655441284 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 852336, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1747584, + "componentType": 5126, + "count": 56, + "max": [ + 1.952269196510315, + -0.07334303855895996, + -0.2241302728652954 + ], + "min": [ + 1.7844964265823364, + -0.14551645517349243, + -0.3919028639793396 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1748256, + "componentType": 5126, + "count": 56, + "max": [ + 0.9347847700119019, + 0.4682050347328186, + 0.9035258293151855 + ], + "min": [ + -0.9347836375236511, + 0.1357770711183548, + -0.9907394051551819 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 771272, + "componentType": 5126, + "count": 56, + "max": [ + 0.9436593055725098, + 0.30040669441223145 + ], + "min": [ + 0.905560314655304, + 0.15910601615905762 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 771720, + "componentType": 5126, + "count": 56, + "max": [ + 0.9436593055725098, + 0.30040669441223145 + ], + "min": [ + 0.905560314655304, + 0.15910601615905762 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 852768, + "componentType": 5125, + "count": 108, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1748928, + "componentType": 5126, + "count": 4, + "max": [ + 1.4277108907699585, + 0.5, + 0.0 + ], + "min": [ + -1.4277108907699585, + -0.5, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1748976, + "componentType": 5126, + "count": 4, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 772168, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 853200, + "componentType": 5125, + "count": 6, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1749024, + "componentType": 5126, + "count": 3, + "max": [ + 0.032837823033332825, + 0.037317439913749695, + 0.0018195505253970623 + ], + "min": [ + -0.03500913083553314, + -0.016769900918006897, + 0.0018195505253970623 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1749060, + "componentType": 5126, + "count": 3, + "max": [ + 1.5060983571402176e-09, + 0.0, + 1.0 + ], + "min": [ + 1.5060983571402176e-09, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 772200, + "componentType": 5126, + "count": 3, + "max": [ + 0.4628410339355469, + 0.15343427658081055 + ], + "min": [ + 0.4289175271987915, + 0.12639057636260986 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 772224, + "componentType": 5126, + "count": 3, + "max": [ + 0.4628410339355469, + 0.15343427658081055 + ], + "min": [ + 0.4289175271987915, + 0.12639057636260986 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 772248, + "componentType": 5126, + "count": 3, + "max": [ + 0.4628410339355469, + 0.15343427658081055 + ], + "min": [ + 0.4289175271987915, + 0.12639057636260986 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 853224, + "componentType": 5125, + "count": 3, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1749096, + "componentType": 5126, + "count": 3, + "max": [ + 0.032837823033332825, + 0.037317439913749695, + 0.0018195505253970623 + ], + "min": [ + -0.03500913083553314, + -0.016769900918006897, + 0.0018195505253970623 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1749132, + "componentType": 5126, + "count": 3, + "max": [ + 1.5060983571402176e-09, + 0.0, + 1.0 + ], + "min": [ + 1.5060983571402176e-09, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 772272, + "componentType": 5126, + "count": 3, + "max": [ + 0.4628410339355469, + 0.15343427658081055 + ], + "min": [ + 0.4289175271987915, + 0.12639057636260986 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 772296, + "componentType": 5126, + "count": 3, + "max": [ + 0.4628410339355469, + 0.15343427658081055 + ], + "min": [ + 0.4289175271987915, + 0.12639057636260986 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 772320, + "componentType": 5126, + "count": 3, + "max": [ + 0.4628410339355469, + 0.15343427658081055 + ], + "min": [ + 0.4289175271987915, + 0.12639057636260986 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 853236, + "componentType": 5125, + "count": 3, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1749168, + "componentType": 5126, + "count": 3, + "max": [ + 0.032837823033332825, + 0.037317439913749695, + 0.0018195505253970623 + ], + "min": [ + -0.03500913083553314, + -0.016769900918006897, + 0.0018195505253970623 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1749204, + "componentType": 5126, + "count": 3, + "max": [ + 1.5060983571402176e-09, + 0.0, + 1.0 + ], + "min": [ + 1.5060983571402176e-09, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 772344, + "componentType": 5126, + "count": 3, + "max": [ + 0.4628410339355469, + 0.15343427658081055 + ], + "min": [ + 0.4289175271987915, + 0.12639057636260986 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 772368, + "componentType": 5126, + "count": 3, + "max": [ + 0.4628410339355469, + 0.15343427658081055 + ], + "min": [ + 0.4289175271987915, + 0.12639057636260986 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 772392, + "componentType": 5126, + "count": 3, + "max": [ + 0.4628410339355469, + 0.15343427658081055 + ], + "min": [ + 0.4289175271987915, + 0.12639057636260986 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 853248, + "componentType": 5125, + "count": 3, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1749240, + "componentType": 5126, + "count": 3, + "max": [ + 0.032837823033332825, + 0.037317439913749695, + 0.0018195505253970623 + ], + "min": [ + -0.03500913083553314, + -0.016769900918006897, + 0.0018195505253970623 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1749276, + "componentType": 5126, + "count": 3, + "max": [ + 1.5060983571402176e-09, + 0.0, + 1.0 + ], + "min": [ + 1.5060983571402176e-09, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 772416, + "componentType": 5126, + "count": 3, + "max": [ + 0.4628410339355469, + 0.15343427658081055 + ], + "min": [ + 0.4289175271987915, + 0.12639057636260986 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 772440, + "componentType": 5126, + "count": 3, + "max": [ + 0.4628410339355469, + 0.15343427658081055 + ], + "min": [ + 0.4289175271987915, + 0.12639057636260986 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 772464, + "componentType": 5126, + "count": 3, + "max": [ + 0.4628410339355469, + 0.15343427658081055 + ], + "min": [ + 0.4289175271987915, + 0.12639057636260986 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 853260, + "componentType": 5125, + "count": 3, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1749312, + "componentType": 5126, + "count": 3, + "max": [ + 0.032837823033332825, + 0.037317439913749695, + 0.0018195505253970623 + ], + "min": [ + -0.03500913083553314, + -0.016769900918006897, + 0.0018195505253970623 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1749348, + "componentType": 5126, + "count": 3, + "max": [ + 1.5060983571402176e-09, + 0.0, + 1.0 + ], + "min": [ + 1.5060983571402176e-09, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 772488, + "componentType": 5126, + "count": 3, + "max": [ + 0.4628410339355469, + 0.15343427658081055 + ], + "min": [ + 0.4289175271987915, + 0.12639057636260986 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 772512, + "componentType": 5126, + "count": 3, + "max": [ + 0.4628410339355469, + 0.15343427658081055 + ], + "min": [ + 0.4289175271987915, + 0.12639057636260986 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 772536, + "componentType": 5126, + "count": 3, + "max": [ + 0.4628410339355469, + 0.15343427658081055 + ], + "min": [ + 0.4289175271987915, + 0.12639057636260986 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 853272, + "componentType": 5125, + "count": 3, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1749384, + "componentType": 5126, + "count": 3, + "max": [ + 0.032837823033332825, + 0.037317439913749695, + 0.0018195505253970623 + ], + "min": [ + -0.03500913083553314, + -0.016769900918006897, + 0.0018195505253970623 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1749420, + "componentType": 5126, + "count": 3, + "max": [ + 1.5060983571402176e-09, + 0.0, + 1.0 + ], + "min": [ + 1.5060983571402176e-09, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 772560, + "componentType": 5126, + "count": 3, + "max": [ + 0.4628410339355469, + 0.15343427658081055 + ], + "min": [ + 0.4289175271987915, + 0.12639057636260986 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 772584, + "componentType": 5126, + "count": 3, + "max": [ + 0.4628410339355469, + 0.15343427658081055 + ], + "min": [ + 0.4289175271987915, + 0.12639057636260986 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 772608, + "componentType": 5126, + "count": 3, + "max": [ + 0.4628410339355469, + 0.15343427658081055 + ], + "min": [ + 0.4289175271987915, + 0.12639057636260986 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 853284, + "componentType": 5125, + "count": 3, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1749456, + "componentType": 5126, + "count": 3, + "max": [ + 0.032837823033332825, + 0.037317439913749695, + 0.0018195505253970623 + ], + "min": [ + -0.03500913083553314, + -0.016769900918006897, + 0.0018195505253970623 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1749492, + "componentType": 5126, + "count": 3, + "max": [ + 1.5060983571402176e-09, + 0.0, + 1.0 + ], + "min": [ + 1.5060983571402176e-09, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 772632, + "componentType": 5126, + "count": 3, + "max": [ + 0.4628410339355469, + 0.15343427658081055 + ], + "min": [ + 0.4289175271987915, + 0.12639057636260986 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 772656, + "componentType": 5126, + "count": 3, + "max": [ + 0.4628410339355469, + 0.15343427658081055 + ], + "min": [ + 0.4289175271987915, + 0.12639057636260986 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 772680, + "componentType": 5126, + "count": 3, + "max": [ + 0.4628410339355469, + 0.15343427658081055 + ], + "min": [ + 0.4289175271987915, + 0.12639057636260986 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 853296, + "componentType": 5125, + "count": 3, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1749528, + "componentType": 5126, + "count": 3, + "max": [ + 0.032837823033332825, + 0.037317439913749695, + 0.0018195505253970623 + ], + "min": [ + -0.03500913083553314, + -0.016769900918006897, + 0.0018195505253970623 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1749564, + "componentType": 5126, + "count": 3, + "max": [ + 1.5060983571402176e-09, + 0.0, + 1.0 + ], + "min": [ + 1.5060983571402176e-09, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 772704, + "componentType": 5126, + "count": 3, + "max": [ + 0.4628410339355469, + 0.15343427658081055 + ], + "min": [ + 0.4289175271987915, + 0.12639057636260986 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 772728, + "componentType": 5126, + "count": 3, + "max": [ + 0.4628410339355469, + 0.15343427658081055 + ], + "min": [ + 0.4289175271987915, + 0.12639057636260986 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 772752, + "componentType": 5126, + "count": 3, + "max": [ + 0.4628410339355469, + 0.15343427658081055 + ], + "min": [ + 0.4289175271987915, + 0.12639057636260986 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 853308, + "componentType": 5125, + "count": 3, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1749600, + "componentType": 5126, + "count": 11, + "max": [ + 0.06859070062637329, + 0.047524213790893555, + 0.08194233477115631 + ], + "min": [ + -0.09665438532829285, + -0.1291668713092804, + 0.08194233477115631 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1749732, + "componentType": 5126, + "count": 11, + "max": [ + 1.61201825221724e-08, + 0.0, + 1.0 + ], + "min": [ + -4.991475179849658e-06, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 772776, + "componentType": 5126, + "count": 11, + "max": [ + 0.36046451330184937, + 0.41260403394699097 + ], + "min": [ + 0.2778420150279999, + 0.3242584466934204 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 772864, + "componentType": 5126, + "count": 11, + "max": [ + 0.36046451330184937, + 0.41260403394699097 + ], + "min": [ + 0.2778420150279999, + 0.3242584466934204 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 772952, + "componentType": 5126, + "count": 11, + "max": [ + 0.36046451330184937, + 0.41260403394699097 + ], + "min": [ + 0.2778420150279999, + 0.3242584466934204 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 853320, + "componentType": 5125, + "count": 12, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1749864, + "componentType": 5126, + "count": 6, + "max": [ + 0.08991119265556335, + 0.09479515254497528, + 0.07622576504945755 + ], + "min": [ + -0.1114981472492218, + -0.12154007703065872, + 0.07622576504945755 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1749936, + "componentType": 5126, + "count": 6, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + -4.19368539894549e-08, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 773040, + "componentType": 5126, + "count": 6, + "max": [ + 0.37771832942962646, + 0.5261034965515137 + ], + "min": [ + 0.2770136594772339, + 0.41793590784072876 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 773088, + "componentType": 5126, + "count": 6, + "max": [ + 0.37771832942962646, + 0.5261034965515137 + ], + "min": [ + 0.2770136594772339, + 0.41793590784072876 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 773136, + "componentType": 5126, + "count": 6, + "max": [ + 0.37771832942962646, + 0.5261034965515137 + ], + "min": [ + 0.2770136594772339, + 0.41793590784072876 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 853368, + "componentType": 5125, + "count": 6, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1750008, + "componentType": 5126, + "count": 9, + "max": [ + 0.03951675072312355, + 0.07882791757583618, + 0.11243274807929993 + ], + "min": [ + -0.1233980804681778, + -0.13562358915805817, + 0.11243274807929993 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1750116, + "componentType": 5126, + "count": 9, + "max": [ + 3.270593751381057e-08, + 0.0, + 1.0 + ], + "min": [ + -1.2338843191628257e-07, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 773184, + "componentType": 5126, + "count": 9, + "max": [ + 0.2726686894893646, + 0.5246718525886536 + ], + "min": [ + 0.19121131300926208, + 0.4174461364746094 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 773256, + "componentType": 5126, + "count": 9, + "max": [ + 0.2726686894893646, + 0.5246718525886536 + ], + "min": [ + 0.19121131300926208, + 0.4174461364746094 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 773328, + "componentType": 5126, + "count": 9, + "max": [ + 0.2726686894893646, + 0.5246718525886536 + ], + "min": [ + 0.19121131300926208, + 0.4174461364746094 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 853392, + "componentType": 5125, + "count": 9, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1750224, + "componentType": 5126, + "count": 6, + "max": [ + 0.029693126678466797, + 0.04939550161361694, + 0.11243273317813873 + ], + "min": [ + -0.11242479085922241, + -0.12664994597434998, + 0.11243273317813873 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1750296, + "componentType": 5126, + "count": 6, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + -1.2159316042925639e-07, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 773400, + "componentType": 5126, + "count": 6, + "max": [ + 0.2733590602874756, + 0.41216903924942017 + ], + "min": [ + 0.20230010151863098, + 0.3241463303565979 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 773448, + "componentType": 5126, + "count": 6, + "max": [ + 0.2733590602874756, + 0.41216903924942017 + ], + "min": [ + 0.20230010151863098, + 0.3241463303565979 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 773496, + "componentType": 5126, + "count": 6, + "max": [ + 0.2733590602874756, + 0.41216903924942017 + ], + "min": [ + 0.20230010151863098, + 0.3241463303565979 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 853428, + "componentType": 5125, + "count": 6, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1750368, + "componentType": 5126, + "count": 124, + "max": [ + 0.7800000309944153, + 0.6910000443458557, + 0.0 + ], + "min": [ + 0.04500000178813934, + -0.13900001347064972, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1751856, + "componentType": 5126, + "count": 124, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 773544, + "componentType": 5126, + "count": 124, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 774536, + "componentType": 5126, + "count": 124, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 775528, + "componentType": 5126, + "count": 124, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 853452, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1753344, + "componentType": 5126, + "count": 13, + "max": [ + 1.0410000085830688, + 0.6820000410079956, + 0.0 + ], + "min": [ + 0.0, + -0.006000000052154064, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1753500, + "componentType": 5126, + "count": 13, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 776520, + "componentType": 5126, + "count": 13, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 776624, + "componentType": 5126, + "count": 13, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 776728, + "componentType": 5126, + "count": 13, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 854940, + "componentType": 5125, + "count": 33, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1753656, + "componentType": 5126, + "count": 12, + "max": [ + 0.4710000157356262, + 0.6820000410079956, + 0.0 + ], + "min": [ + 0.07500000298023224, + 0.0, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1753800, + "componentType": 5126, + "count": 12, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 776832, + "componentType": 5126, + "count": 12, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 776928, + "componentType": 5126, + "count": 12, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 777024, + "componentType": 5126, + "count": 12, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 855072, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1753944, + "componentType": 5126, + "count": 94, + "max": [ + 0.6040000319480896, + 0.6820000410079956, + 0.0 + ], + "min": [ + 0.07700000703334808, + 0.0, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1755072, + "componentType": 5126, + "count": 94, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 777120, + "componentType": 5126, + "count": 94, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 777872, + "componentType": 5126, + "count": 94, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 778624, + "componentType": 5126, + "count": 94, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 855192, + "componentType": 5125, + "count": 282, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1756200, + "componentType": 5126, + "count": 8, + "max": [ + 0.5870000123977661, + 0.6820000410079956, + 0.0 + ], + "min": [ + 0.017000000923871994, + 0.0, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1756296, + "componentType": 5126, + "count": 8, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 779376, + "componentType": 5126, + "count": 8, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 779440, + "componentType": 5126, + "count": 8, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 779504, + "componentType": 5126, + "count": 8, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 856320, + "componentType": 5125, + "count": 12, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1756392, + "componentType": 5126, + "count": 9, + "max": [ + 0.6040000319480896, + 0.6820000410079956, + 0.0 + ], + "min": [ + 0.0, + 0.0, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1756500, + "componentType": 5126, + "count": 9, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 779568, + "componentType": 5126, + "count": 9, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 779640, + "componentType": 5126, + "count": 9, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 779712, + "componentType": 5126, + "count": 9, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 856368, + "componentType": 5125, + "count": 21, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1756608, + "componentType": 5126, + "count": 78, + "max": [ + 0.6480000019073486, + 0.6820000410079956, + 0.0 + ], + "min": [ + 0.06100000441074371, + -0.009000000543892384, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1757544, + "componentType": 5126, + "count": 78, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 779784, + "componentType": 5126, + "count": 78, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 780408, + "componentType": 5126, + "count": 78, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 781032, + "componentType": 5126, + "count": 78, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 856452, + "componentType": 5125, + "count": 228, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1758480, + "componentType": 5126, + "count": 4, + "max": [ + 0.17400000989437103, + 0.6820000410079956, + 0.0 + ], + "min": [ + 0.07600000500679016, + 0.0, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1758528, + "componentType": 5126, + "count": 4, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 781656, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 781688, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 781720, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 857364, + "componentType": 5125, + "count": 6, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1758576, + "componentType": 5126, + "count": 96, + "max": [ + 0.7780000567436218, + 0.6910000443458557, + 0.0 + ], + "min": [ + 0.04500000178813934, + -0.009000000543892384, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1759728, + "componentType": 5126, + "count": 96, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 781752, + "componentType": 5126, + "count": 96, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 782520, + "componentType": 5126, + "count": 96, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 783288, + "componentType": 5126, + "count": 96, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 857388, + "componentType": 5125, + "count": 288, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1760880, + "componentType": 5126, + "count": 56, + "max": [ + 0.5, + 0.6820000410079956, + 0.0 + ], + "min": [ + 0.07000000029802322, + 0.0, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1761552, + "componentType": 5126, + "count": 56, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 784056, + "componentType": 5126, + "count": 56, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 784504, + "componentType": 5126, + "count": 56, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 784952, + "componentType": 5126, + "count": 56, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 858540, + "componentType": 5125, + "count": 168, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1762224, + "componentType": 5126, + "count": 11, + "max": [ + 0.6670000553131104, + 0.6860000491142273, + 0.0 + ], + "min": [ + 0.0, + 0.0, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1762356, + "componentType": 5126, + "count": 11, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 785400, + "componentType": 5126, + "count": 11, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 785488, + "componentType": 5126, + "count": 11, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 785576, + "componentType": 5126, + "count": 11, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 859212, + "componentType": 5125, + "count": 33, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1762488, + "componentType": 5126, + "count": 122, + "max": [ + 0.42600002884864807, + 0.6910000443458557, + 0.0 + ], + "min": [ + 0.04000000283122063, + -0.009000000543892384, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1763952, + "componentType": 5126, + "count": 122, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 785664, + "componentType": 5126, + "count": 122, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 786640, + "componentType": 5126, + "count": 122, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 787616, + "componentType": 5126, + "count": 122, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 859344, + "componentType": 5125, + "count": 360, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1765416, + "componentType": 5126, + "count": 54, + "max": [ + 0.7040000557899475, + 0.6820000410079956, + 0.0 + ], + "min": [ + 0.07600000500679016, + 0.0, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1766064, + "componentType": 5126, + "count": 54, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 788592, + "componentType": 5126, + "count": 54, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 789024, + "componentType": 5126, + "count": 54, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 789456, + "componentType": 5126, + "count": 54, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 860784, + "componentType": 5125, + "count": 162, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1766712, + "componentType": 5126, + "count": 10, + "max": [ + 0.4400000274181366, + 0.6820000410079956, + 0.0 + ], + "min": [ + 0.07600000500679016, + 0.0, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1766832, + "componentType": 5126, + "count": 10, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 789888, + "componentType": 5126, + "count": 10, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 789968, + "componentType": 5126, + "count": 10, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 790048, + "componentType": 5126, + "count": 10, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 861432, + "componentType": 5125, + "count": 24, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1766952, + "componentType": 5126, + "count": 102, + "max": [ + 0.6730000376701355, + 0.6910000443458557, + 0.0 + ], + "min": [ + 0.05000000074505806, + -0.009000000543892384, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1768176, + "componentType": 5126, + "count": 102, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 790128, + "componentType": 5126, + "count": 102, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 790944, + "componentType": 5126, + "count": 102, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 791760, + "componentType": 5126, + "count": 102, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 861528, + "componentType": 5125, + "count": 300, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1769400, + "componentType": 5126, + "count": 694, + "max": [ + 4.2779998779296875, + 0.6910000443458557, + 0.0 + ], + "min": [ + 0.04800000041723251, + -0.23000000417232513, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1777728, + "componentType": 5126, + "count": 694, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 792576, + "componentType": 5126, + "count": 694, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 798128, + "componentType": 5126, + "count": 694, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 803680, + "componentType": 5126, + "count": 694, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 862728, + "componentType": 5125, + "count": 2046, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1786056, + "componentType": 5126, + "count": 215, + "max": [ + 1.5910000801086426, + 0.6910000443458557, + 0.0 + ], + "min": [ + 0.04800000041723251, + -0.009000000543892384, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1788636, + "componentType": 5126, + "count": 215, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 809232, + "componentType": 5126, + "count": 215, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 810952, + "componentType": 5126, + "count": 215, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 812672, + "componentType": 5126, + "count": 215, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 870912, + "componentType": 5125, + "count": 615, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1791216, + "componentType": 5126, + "count": 12, + "max": [ + 0.6530000567436218, + 0.6820000410079956, + 0.0 + ], + "min": [ + 0.07500000298023224, + 0.0, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1791360, + "componentType": 5126, + "count": 12, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 814392, + "componentType": 5126, + "count": 12, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 814488, + "componentType": 5126, + "count": 12, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 814584, + "componentType": 5126, + "count": 12, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 873372, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1791504, + "componentType": 5126, + "count": 41, + "max": [ + 0.17400000989437103, + 0.6820000410079956, + 0.0 + ], + "min": [ + -0.06200000271201134, + -0.23000000417232513, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1791996, + "componentType": 5126, + "count": 41, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 814680, + "componentType": 5126, + "count": 41, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 815008, + "componentType": 5126, + "count": 41, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 815336, + "componentType": 5126, + "count": 41, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 873492, + "componentType": 5125, + "count": 117, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1792488, + "componentType": 5126, + "count": 11, + "max": [ + 0.6550000309944153, + 0.6820000410079956, + 0.0 + ], + "min": [ + 0.07500000298023224, + 0.0, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1792620, + "componentType": 5126, + "count": 11, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 815664, + "componentType": 5126, + "count": 11, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 815752, + "componentType": 5126, + "count": 11, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 815840, + "componentType": 5126, + "count": 11, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 873960, + "componentType": 5125, + "count": 27, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1792752, + "componentType": 5126, + "count": 6, + "max": [ + 0.48000001907348633, + 0.6820000410079956, + 0.0 + ], + "min": [ + 0.07400000095367432, + 0.0, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1792824, + "componentType": 5126, + "count": 6, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 815928, + "componentType": 5126, + "count": 6, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 815976, + "componentType": 5126, + "count": 6, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 816024, + "componentType": 5126, + "count": 6, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 874068, + "componentType": 5125, + "count": 12, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1792896, + "componentType": 5126, + "count": 102, + "max": [ + 0.5600000023841858, + 0.3450000286102295, + 0.0 + ], + "min": [ + 0.02500000037252903, + -0.49299997091293335, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1794120, + "componentType": 5126, + "count": 102, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 816072, + "componentType": 5126, + "count": 102, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 816888, + "componentType": 5126, + "count": 102, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 817704, + "componentType": 5126, + "count": 102, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 874116, + "componentType": 5125, + "count": 294, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1795344, + "componentType": 5126, + "count": 106, + "max": [ + 0.5430000424385071, + 0.6820000410079956, + 0.0 + ], + "min": [ + 0.07500000298023224, + 0.0, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1796616, + "componentType": 5126, + "count": 106, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 818520, + "componentType": 5126, + "count": 106, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 819368, + "componentType": 5126, + "count": 106, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 820216, + "componentType": 5126, + "count": 106, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 875292, + "componentType": 5125, + "count": 324, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1797888, + "componentType": 5126, + "count": 7, + "max": [ + 0.6040000319480896, + 0.6820000410079956, + 0.0 + ], + "min": [ + 0.0, + -0.006000000052154064, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1797972, + "componentType": 5126, + "count": 7, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 821064, + "componentType": 5126, + "count": 7, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 821120, + "componentType": 5126, + "count": 7, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 821176, + "componentType": 5126, + "count": 7, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 876588, + "componentType": 5125, + "count": 15, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1798056, + "componentType": 5126, + "count": 98, + "max": [ + 0.6630000472068787, + 0.6910000443458557, + 0.0 + ], + "min": [ + 0.04800000041723251, + -0.009000000543892384, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1799232, + "componentType": 5126, + "count": 98, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 821232, + "componentType": 5126, + "count": 98, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 822016, + "componentType": 5126, + "count": 98, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 822800, + "componentType": 5126, + "count": 98, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 876648, + "componentType": 5125, + "count": 288, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1800408, + "componentType": 5126, + "count": 12, + "max": [ + 0.706000030040741, + 0.6820000410079956, + 0.0 + ], + "min": [ + 0.0020000000949949026, + 0.0, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1800552, + "componentType": 5126, + "count": 12, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 823584, + "componentType": 5126, + "count": 12, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 823680, + "componentType": 5126, + "count": 12, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 823776, + "componentType": 5126, + "count": 12, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 877800, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1800696, + "componentType": 5126, + "count": 8, + "max": [ + 0.6310000419616699, + 0.6820000410079956, + 0.0 + ], + "min": [ + 0.01600000075995922, + 0.0, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1800792, + "componentType": 5126, + "count": 8, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 823872, + "componentType": 5126, + "count": 8, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 823936, + "componentType": 5126, + "count": 8, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 824000, + "componentType": 5126, + "count": 8, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 877920, + "componentType": 5125, + "count": 18, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1800888, + "componentType": 5126, + "count": 10, + "max": [ + 0.706000030040741, + 0.6820000410079956, + 0.0 + ], + "min": [ + 0.07400000095367432, + 0.0, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1801008, + "componentType": 5126, + "count": 10, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 824064, + "componentType": 5126, + "count": 10, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 824144, + "componentType": 5126, + "count": 10, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 824224, + "componentType": 5126, + "count": 10, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 877992, + "componentType": 5125, + "count": 24, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1801128, + "componentType": 5126, + "count": 15, + "max": [ + 0.7090000510215759, + 0.6820000410079956, + 0.0 + ], + "min": [ + 0.07300000637769699, + 0.0, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1801308, + "componentType": 5126, + "count": 15, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 824304, + "componentType": 5126, + "count": 15, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 824424, + "componentType": 5126, + "count": 15, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 824544, + "componentType": 5126, + "count": 15, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 878088, + "componentType": 5125, + "count": 39, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1801488, + "componentType": 5126, + "count": 126, + "max": [ + 0.19600000977516174, + 0.6910000443458557, + 0.0 + ], + "min": [ + 0.07600000500679016, + -1.0, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1803000, + "componentType": 5126, + "count": 126, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 824664, + "componentType": 5126, + "count": 126, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 825672, + "componentType": 5126, + "count": 126, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 826680, + "componentType": 5126, + "count": 126, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 878244, + "componentType": 5125, + "count": 360, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1804512, + "componentType": 5126, + "count": 244, + "max": [ + 0.9810000658035278, + 0.7290000319480896, + 0.0 + ], + "min": [ + 0.05400000140070915, + -0.21000000834465027, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1807440, + "componentType": 5126, + "count": 244, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 827688, + "componentType": 5126, + "count": 244, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 829640, + "componentType": 5126, + "count": 244, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 831592, + "componentType": 5126, + "count": 244, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 879684, + "componentType": 5125, + "count": 732, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1810368, + "componentType": 5126, + "count": 89, + "max": [ + 0.4660000205039978, + 0.6910000443458557, + 0.0 + ], + "min": [ + 0.03400000184774399, + 0.0, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1811436, + "componentType": 5126, + "count": 89, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 833544, + "componentType": 5126, + "count": 89, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 834256, + "componentType": 5126, + "count": 89, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 834968, + "componentType": 5126, + "count": 89, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 882612, + "componentType": 5125, + "count": 261, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1812504, + "componentType": 5126, + "count": 215, + "max": [ + 1.5910000801086426, + 0.6910000443458557, + 0.0 + ], + "min": [ + 0.04800000041723251, + -0.009000000543892384, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1815084, + "componentType": 5126, + "count": 215, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 835680, + "componentType": 5126, + "count": 215, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 837400, + "componentType": 5126, + "count": 215, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 839120, + "componentType": 5126, + "count": 215, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 883656, + "componentType": 5125, + "count": 615, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1817664, + "componentType": 5126, + "count": 281, + "max": [ + 2.2090001106262207, + 0.6820000410079956, + 0.0 + ], + "min": [ + 0.07500000298023224, + -0.009000000543892384, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1821036, + "componentType": 5126, + "count": 281, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 840840, + "componentType": 5126, + "count": 281, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 843088, + "componentType": 5126, + "count": 281, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 845336, + "componentType": 5126, + "count": 281, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 886116, + "componentType": 5125, + "count": 813, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1824408, + "componentType": 5126, + "count": 32, + "max": [ + 0.5840000510215759, + 0.6170000433921814, + 0.0 + ], + "min": [ + 0.0010000000474974513, + -0.08100000023841858, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1824792, + "componentType": 5126, + "count": 32, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 847584, + "componentType": 5126, + "count": 32, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 847840, + "componentType": 5126, + "count": 32, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 848096, + "componentType": 5126, + "count": 32, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 889368, + "componentType": 5125, + "count": 72, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1825176, + "componentType": 5126, + "count": 147, + "max": [ + 0.4240000247955322, + 0.6910000443458557, + 0.0 + ], + "min": [ + 0.06400000303983688, + -0.009000000543892384, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1826940, + "componentType": 5126, + "count": 147, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 848352, + "componentType": 5126, + "count": 147, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 849528, + "componentType": 5126, + "count": 147, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 850704, + "componentType": 5126, + "count": 147, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 889656, + "componentType": 5125, + "count": 435, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1828704, + "componentType": 5126, + "count": 156, + "max": [ + 0.5020000338554382, + 0.6910000443458557, + 0.0 + ], + "min": [ + 0.05100000277161598, + -0.11800000816583633, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1830576, + "componentType": 5126, + "count": 156, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 851880, + "componentType": 5126, + "count": 156, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 853128, + "componentType": 5126, + "count": 156, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 854376, + "componentType": 5126, + "count": 156, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 891396, + "componentType": 5125, + "count": 474, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1832448, + "componentType": 5126, + "count": 15, + "max": [ + 0.4710000157356262, + 0.6910000443458557, + 0.0 + ], + "min": [ + 0.01100000087171793, + 0.0, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1832628, + "componentType": 5126, + "count": 15, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 855624, + "componentType": 5126, + "count": 15, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 855744, + "componentType": 5126, + "count": 15, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 855864, + "componentType": 5126, + "count": 15, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 893292, + "componentType": 5125, + "count": 39, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1832808, + "componentType": 5126, + "count": 244, + "max": [ + 1.2879999876022339, + 0.6820000410079956, + 0.0 + ], + "min": [ + 0.07500000298023224, + -0.009000000543892384, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1835736, + "componentType": 5126, + "count": 244, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 855984, + "componentType": 5126, + "count": 244, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 857936, + "componentType": 5126, + "count": 244, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 859888, + "componentType": 5126, + "count": 244, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 893448, + "componentType": 5125, + "count": 714, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1838664, + "componentType": 5126, + "count": 196, + "max": [ + 0.6550000309944153, + 0.6910000443458557, + 0.0 + ], + "min": [ + 0.02500000037252903, + -0.010000000707805157, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1841016, + "componentType": 5126, + "count": 196, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 861840, + "componentType": 5126, + "count": 196, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 863408, + "componentType": 5126, + "count": 196, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 864976, + "componentType": 5126, + "count": 196, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 896304, + "componentType": 5125, + "count": 582, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1843368, + "componentType": 5126, + "count": 78, + "max": [ + 0.43800002336502075, + 0.6820000410079956, + 0.0 + ], + "min": [ + 0.05000000074505806, + -0.009000000543892384, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1844304, + "componentType": 5126, + "count": 78, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 866544, + "componentType": 5126, + "count": 78, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 867168, + "componentType": 5126, + "count": 78, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 867792, + "componentType": 5126, + "count": 78, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 898632, + "componentType": 5125, + "count": 228, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1845240, + "componentType": 5126, + "count": 88, + "max": [ + 0.9070000648498535, + 0.6820000410079956, + 0.0 + ], + "min": [ + 0.07600000500679016, + -0.009000000543892384, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1846296, + "componentType": 5126, + "count": 88, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 868416, + "componentType": 5126, + "count": 88, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 869120, + "componentType": 5126, + "count": 88, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 869824, + "componentType": 5126, + "count": 88, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 899544, + "componentType": 5125, + "count": 252, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1847352, + "componentType": 5126, + "count": 25, + "max": [ + 0.940000057220459, + 0.6910000443458557, + 0.0 + ], + "min": [ + 0.07600000500679016, + 0.0, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1847652, + "componentType": 5126, + "count": 25, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 870528, + "componentType": 5126, + "count": 25, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 870728, + "componentType": 5126, + "count": 25, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 870928, + "componentType": 5126, + "count": 25, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 900552, + "componentType": 5125, + "count": 63, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1847952, + "componentType": 5126, + "count": 157, + "max": [ + 0.8930000066757202, + 0.6910000443458557, + 0.0 + ], + "min": [ + 0.07600000500679016, + -0.009000000543892384, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1849836, + "componentType": 5126, + "count": 157, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 871128, + "componentType": 5126, + "count": 157, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 872384, + "componentType": 5126, + "count": 157, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 873640, + "componentType": 5126, + "count": 157, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 900804, + "componentType": 5125, + "count": 459, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1851720, + "componentType": 5126, + "count": 99, + "max": [ + 0.9350000619888306, + 0.6910000443458557, + 0.0 + ], + "min": [ + 0.07600000500679016, + 0.0, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1852908, + "componentType": 5126, + "count": 99, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 874896, + "componentType": 5126, + "count": 99, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 875688, + "componentType": 5126, + "count": 99, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 876480, + "componentType": 5126, + "count": 99, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 902640, + "componentType": 5125, + "count": 285, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1854096, + "componentType": 5126, + "count": 14, + "max": [ + 0.7690000534057617, + 0.6820000410079956, + 0.0 + ], + "min": [ + 0.07600000500679016, + 0.0, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1854264, + "componentType": 5126, + "count": 14, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 877272, + "componentType": 5126, + "count": 14, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 877384, + "componentType": 5126, + "count": 14, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 877496, + "componentType": 5126, + "count": 14, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 903780, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1854432, + "componentType": 5126, + "count": 131, + "max": [ + 0.9340000152587891, + 0.6910000443458557, + 0.0 + ], + "min": [ + 0.07600000500679016, + -0.009000000543892384, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1856004, + "componentType": 5126, + "count": 131, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 877608, + "componentType": 5126, + "count": 131, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 878656, + "componentType": 5126, + "count": 131, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 879704, + "componentType": 5126, + "count": 131, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 903900, + "componentType": 5125, + "count": 387, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1857576, + "componentType": 5126, + "count": 16, + "max": [ + 0.9589999914169312, + 0.6820000410079956, + 0.0 + ], + "min": [ + 0.07600000500679016, + -0.009000000543892384, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1857768, + "componentType": 5126, + "count": 16, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 880752, + "componentType": 5126, + "count": 16, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 880880, + "componentType": 5126, + "count": 16, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 881008, + "componentType": 5126, + "count": 16, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 905448, + "componentType": 5125, + "count": 36, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1857960, + "componentType": 5126, + "count": 202, + "max": [ + 0.937000036239624, + 0.6910000443458557, + 0.0 + ], + "min": [ + 0.07600000500679016, + -0.009000000543892384, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1860384, + "componentType": 5126, + "count": 202, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 881136, + "componentType": 5126, + "count": 202, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 882752, + "componentType": 5126, + "count": 202, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 884368, + "componentType": 5126, + "count": 202, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 905592, + "componentType": 5125, + "count": 606, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1862808, + "componentType": 5126, + "count": 143, + "max": [ + 0.9300000667572021, + 0.6910000443458557, + 0.0 + ], + "min": [ + 0.07600000500679016, + -0.009000000543892384, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1864524, + "componentType": 5126, + "count": 143, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 885984, + "componentType": 5126, + "count": 143, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 887128, + "componentType": 5126, + "count": 143, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 888272, + "componentType": 5126, + "count": 143, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 908016, + "componentType": 5125, + "count": 423, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1866240, + "componentType": 5126, + "count": 110, + "max": [ + 1.4390000104904175, + 0.6910000443458557, + 0.0 + ], + "min": [ + 0.07600000500679016, + -0.009000000543892384, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1867560, + "componentType": 5126, + "count": 110, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 889416, + "componentType": 5126, + "count": 110, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 890296, + "componentType": 5126, + "count": 110, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 891176, + "componentType": 5126, + "count": 110, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 909708, + "componentType": 5125, + "count": 318, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1868880, + "componentType": 5126, + "count": 18, + "max": [ + 1.2690000534057617, + 0.6820000410079956, + 0.0 + ], + "min": [ + 0.07600000500679016, + 0.0, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1869096, + "componentType": 5126, + "count": 18, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 892056, + "componentType": 5126, + "count": 18, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 892200, + "componentType": 5126, + "count": 18, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 892344, + "componentType": 5126, + "count": 18, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 910980, + "componentType": 5125, + "count": 36, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1869312, + "componentType": 5126, + "count": 103, + "max": [ + 1.434999942779541, + 0.6910000443458557, + 0.0 + ], + "min": [ + 0.07600000500679016, + 0.0, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1870548, + "componentType": 5126, + "count": 103, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 892488, + "componentType": 5126, + "count": 103, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 893312, + "componentType": 5126, + "count": 103, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 894136, + "componentType": 5126, + "count": 103, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 911124, + "componentType": 5125, + "count": 291, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1871784, + "componentType": 5126, + "count": 7, + "max": [ + 0.44300001859664917, + 0.6820000410079956, + 0.0 + ], + "min": [ + 0.026000000536441803, + 0.29100000858306885, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1871868, + "componentType": 5126, + "count": 7, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 894960, + "componentType": 5126, + "count": 7, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 895016, + "componentType": 5126, + "count": 7, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 895072, + "componentType": 5126, + "count": 7, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 912288, + "componentType": 5125, + "count": 15, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1871952, + "componentType": 5126, + "count": 121, + "max": [ + 0.4650000333786011, + 0.6910000443458557, + 0.0 + ], + "min": [ + 0.04400000348687172, + -0.009000000543892384, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1873404, + "componentType": 5126, + "count": 121, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 895128, + "componentType": 5126, + "count": 121, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 896096, + "componentType": 5126, + "count": 121, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 897064, + "componentType": 5126, + "count": 121, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 912348, + "componentType": 5125, + "count": 363, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1874856, + "componentType": 5126, + "count": 198, + "max": [ + 0.6200000047683716, + 0.6690000295639038, + 0.0 + ], + "min": [ + 0.02800000086426735, + -0.009000000543892384, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1877232, + "componentType": 5126, + "count": 198, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 898032, + "componentType": 5126, + "count": 198, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 899616, + "componentType": 5126, + "count": 198, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 901200, + "componentType": 5126, + "count": 198, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 913800, + "componentType": 5125, + "count": 600, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1879608, + "componentType": 5126, + "count": 6, + "max": [ + 0.49000000953674316, + 0.6820000410079956, + 0.0 + ], + "min": [ + 0.049000002443790436, + -0.009000000543892384, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1879680, + "componentType": 5126, + "count": 6, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 902784, + "componentType": 5126, + "count": 6, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 902832, + "componentType": 5126, + "count": 6, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 902880, + "componentType": 5126, + "count": 6, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 916200, + "componentType": 5125, + "count": 12, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1879752, + "componentType": 5126, + "count": 228, + "max": [ + 0.407953143119812, + 0.7260000109672546, + 0.0 + ], + "min": [ + 0.010046877898275852, + 0.27800002694129944, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1882488, + "componentType": 5126, + "count": 228, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 902928, + "componentType": 5126, + "count": 228, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 904752, + "componentType": 5126, + "count": 228, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 906576, + "componentType": 5126, + "count": 228, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 916248, + "componentType": 5125, + "count": 678, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1885224, + "componentType": 5126, + "count": 192, + "max": [ + 0.46800002455711365, + 0.6910000443458557, + 0.0 + ], + "min": [ + 0.03200000151991844, + -0.009000000543892384, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1887528, + "componentType": 5126, + "count": 192, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 908400, + "componentType": 5126, + "count": 192, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 909936, + "componentType": 5126, + "count": 192, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 911472, + "componentType": 5126, + "count": 192, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 918960, + "componentType": 5125, + "count": 582, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1889832, + "componentType": 5126, + "count": 50, + "max": [ + 0.3110000193119049, + 0.6940000057220459, + 0.0 + ], + "min": [ + 0.06400000303983688, + -0.23000000417232513, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1890432, + "componentType": 5126, + "count": 50, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 913008, + "componentType": 5126, + "count": 50, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 913408, + "componentType": 5126, + "count": 50, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 913808, + "componentType": 5126, + "count": 50, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 921288, + "componentType": 5125, + "count": 144, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1891032, + "componentType": 5126, + "count": 50, + "max": [ + 0.3110000193119049, + 0.6940000057220459, + 0.0 + ], + "min": [ + 0.06400000303983688, + -0.23000000417232513, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1891632, + "componentType": 5126, + "count": 50, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 914208, + "componentType": 5126, + "count": 50, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 914608, + "componentType": 5126, + "count": 50, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 915008, + "componentType": 5126, + "count": 50, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 921864, + "componentType": 5125, + "count": 144, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1892232, + "componentType": 5126, + "count": 133, + "max": [ + 0.4610000252723694, + 0.6910000443458557, + 0.0 + ], + "min": [ + 0.036000002175569534, + -0.009000000543892384, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1893828, + "componentType": 5126, + "count": 133, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 915408, + "componentType": 5126, + "count": 133, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 916472, + "componentType": 5126, + "count": 133, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 917536, + "componentType": 5126, + "count": 133, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 922440, + "componentType": 5125, + "count": 399, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1895424, + "componentType": 5126, + "count": 96, + "max": [ + 0.4700000286102295, + 0.6910000443458557, + 0.0 + ], + "min": [ + 0.030000001192092896, + -0.009000000543892384, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1896576, + "componentType": 5126, + "count": 96, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 918600, + "componentType": 5126, + "count": 96, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 919368, + "componentType": 5126, + "count": 96, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 920136, + "componentType": 5126, + "count": 96, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 924036, + "componentType": 5125, + "count": 288, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1897728, + "componentType": 5126, + "count": 281, + "max": [ + 2.2090001106262207, + 0.6820000410079956, + 0.0 + ], + "min": [ + 0.07500000298023224, + -0.009000000543892384, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1901100, + "componentType": 5126, + "count": 281, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 920904, + "componentType": 5126, + "count": 281, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 923152, + "componentType": 5126, + "count": 281, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 925400, + "componentType": 5126, + "count": 281, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 925188, + "componentType": 5125, + "count": 813, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1904472, + "componentType": 5126, + "count": 7, + "max": [ + 0.5290000438690186, + 0.597000002861023, + 0.0 + ], + "min": [ + 0.055000003427267075, + 0.11100000888109207, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1904556, + "componentType": 5126, + "count": 7, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 927648, + "componentType": 5126, + "count": 7, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 927704, + "componentType": 5126, + "count": 7, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 927760, + "componentType": 5126, + "count": 7, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 928440, + "componentType": 5125, + "count": 15, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1904640, + "componentType": 5126, + "count": 125, + "max": [ + 0.2900000214576721, + 0.6910000443458557, + 0.0 + ], + "min": [ + 0.00800000037997961, + -1.0089999437332153, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1906140, + "componentType": 5126, + "count": 125, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 927816, + "componentType": 5126, + "count": 125, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 928816, + "componentType": 5126, + "count": 125, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 929816, + "componentType": 5126, + "count": 125, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 928500, + "componentType": 5125, + "count": 357, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1907640, + "componentType": 5126, + "count": 68, + "max": [ + 0.5290000438690186, + 0.597000002861023, + 0.0 + ], + "min": [ + 0.046000003814697266, + -1.1180000305175781, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1908456, + "componentType": 5126, + "count": 68, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 930816, + "componentType": 5126, + "count": 68, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 931360, + "componentType": 5126, + "count": 68, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 931904, + "componentType": 5126, + "count": 68, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 929928, + "componentType": 5125, + "count": 192, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1909272, + "componentType": 5126, + "count": 4, + "max": [ + 0.5060000419616699, + -0.07500000298023224, + 0.0 + ], + "min": [ + -0.006000000052154064, + -0.125, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1909320, + "componentType": 5126, + "count": 4, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 932448, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 932480, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 932512, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 930696, + "componentType": 5125, + "count": 6, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1909368, + "componentType": 5126, + "count": 55, + "max": [ + 0.5290000438690186, + 0.597000002861023, + 0.0 + ], + "min": [ + 0.049000002443790436, + -1.0089999437332153, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1910028, + "componentType": 5126, + "count": 55, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 932544, + "componentType": 5126, + "count": 55, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 932984, + "componentType": 5126, + "count": 55, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 933424, + "componentType": 5126, + "count": 55, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 930720, + "componentType": 5125, + "count": 153, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1910688, + "componentType": 5126, + "count": 4, + "max": [ + 0.27400001883506775, + 0.6910000443458557, + 0.0 + ], + "min": [ + 0.00800000037997961, + -0.009000000543892384, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1910736, + "componentType": 5126, + "count": 4, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 933864, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 933896, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 933928, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 931332, + "componentType": 5125, + "count": 6, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1910784, + "componentType": 5126, + "count": 189, + "max": [ + 3.0420000553131104, + 0.6820000410079956, + 0.0 + ], + "min": [ + 0.07400000095367432, + -0.009000000543892384, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1913052, + "componentType": 5126, + "count": 189, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 933960, + "componentType": 5126, + "count": 189, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 935472, + "componentType": 5126, + "count": 189, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 936984, + "componentType": 5126, + "count": 189, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 931356, + "componentType": 5125, + "count": 531, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1915320, + "componentType": 5126, + "count": 96, + "max": [ + 0.4700000286102295, + 0.6910000443458557, + 0.0 + ], + "min": [ + 0.030000001192092896, + -0.009000000543892384, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1916472, + "componentType": 5126, + "count": 96, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 938496, + "componentType": 5126, + "count": 96, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 939264, + "componentType": 5126, + "count": 96, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 940032, + "componentType": 5126, + "count": 96, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 933480, + "componentType": 5125, + "count": 288, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1917624, + "componentType": 5126, + "count": 195, + "max": [ + 1.0950000286102295, + 0.6820000410079956, + 0.0 + ], + "min": [ + 0.07600000500679016, + -0.009000000543892384, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1919964, + "componentType": 5126, + "count": 195, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 940800, + "componentType": 5126, + "count": 195, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 942360, + "componentType": 5126, + "count": 195, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 943920, + "componentType": 5126, + "count": 195, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 934632, + "componentType": 5125, + "count": 567, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1922304, + "componentType": 5126, + "count": 518, + "max": [ + 13.001998901367188, + 0.6910000443458557, + 0.0 + ], + "min": [ + 0.017000000923871994, + -0.009000000543892384, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1928520, + "componentType": 5126, + "count": 518, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 945480, + "componentType": 5126, + "count": 518, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 936900, + "componentType": 5125, + "count": 1470, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1934736, + "componentType": 5126, + "count": 1009, + "max": [ + 11.41200065612793, + 0.6910000443458557, + 0.0 + ], + "min": [ + 0.07600000500679016, + -0.009000000543892384, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1946844, + "componentType": 5126, + "count": 1009, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 949624, + "componentType": 5126, + "count": 1009, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 942780, + "componentType": 5125, + "count": 2979, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1958952, + "componentType": 5126, + "count": 20, + "max": [ + 2.50600004196167, + -0.07500000298023224, + 0.0 + ], + "min": [ + -0.006000000052154064, + -0.125, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1959192, + "componentType": 5126, + "count": 20, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 957696, + "componentType": 5126, + "count": 20, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 957856, + "componentType": 5126, + "count": 20, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 958016, + "componentType": 5126, + "count": 20, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 954696, + "componentType": 5125, + "count": 30, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1959432, + "componentType": 5126, + "count": 6, + "max": [ + 0.49000000953674316, + 0.6820000410079956, + 0.0 + ], + "min": [ + 0.049000002443790436, + -0.009000000543892384, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1959504, + "componentType": 5126, + "count": 6, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 958176, + "componentType": 5126, + "count": 6, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 958224, + "componentType": 5126, + "count": 6, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 958272, + "componentType": 5126, + "count": 6, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 954816, + "componentType": 5125, + "count": 12, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1959576, + "componentType": 5126, + "count": 314, + "max": [ + 2.498000144958496, + 0.6820000410079956, + 0.0 + ], + "min": [ + 0.07500000298023224, + -0.009000000543892384, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1963344, + "componentType": 5126, + "count": 314, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 958320, + "componentType": 5126, + "count": 314, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 960832, + "componentType": 5126, + "count": 314, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 963344, + "componentType": 5126, + "count": 314, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 954864, + "componentType": 5125, + "count": 930, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1967112, + "componentType": 5126, + "count": 468, + "max": [ + 2.1089999675750732, + 0.6820000410079956, + 0.0 + ], + "min": [ + 0.07000000029802322, + -0.23000000417232513, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1972728, + "componentType": 5126, + "count": 468, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 965856, + "componentType": 5126, + "count": 468, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 969600, + "componentType": 5126, + "count": 468, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 973344, + "componentType": 5126, + "count": 468, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 958584, + "componentType": 5125, + "count": 1404, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1978344, + "componentType": 5126, + "count": 205, + "max": [ + 0.17500001192092896, + 0.4580000340938568, + 0.0 + ], + "min": [ + 0.04800000041723251, + -1.1150000095367432, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1980804, + "componentType": 5126, + "count": 205, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 977088, + "componentType": 5126, + "count": 205, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 978728, + "componentType": 5126, + "count": 205, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 980368, + "componentType": 5126, + "count": 205, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 964200, + "componentType": 5125, + "count": 591, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1983264, + "componentType": 5126, + "count": 18, + "max": [ + 0.3060000240802765, + 0.7160000205039978, + 0.0 + ], + "min": [ + 0.04800000041723251, + -0.5379999876022339, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1983480, + "componentType": 5126, + "count": 18, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 982008, + "componentType": 5126, + "count": 18, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 982152, + "componentType": 5126, + "count": 18, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 982296, + "componentType": 5126, + "count": 18, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 966564, + "componentType": 5125, + "count": 36, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1983696, + "componentType": 5126, + "count": 192, + "max": [ + 0.46800002455711365, + 0.6910000443458557, + 0.0 + ], + "min": [ + 0.03200000151991844, + -0.009000000543892384, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1986000, + "componentType": 5126, + "count": 192, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 982440, + "componentType": 5126, + "count": 192, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 983976, + "componentType": 5126, + "count": 192, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 985512, + "componentType": 5126, + "count": 192, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 966708, + "componentType": 5125, + "count": 582, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1988304, + "componentType": 5126, + "count": 4, + "max": [ + 0.1680000126361847, + 0.6820000410079956, + 0.0 + ], + "min": [ + 0.09200000762939453, + -0.23000000417232513, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1988352, + "componentType": 5126, + "count": 4, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 987048, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 987080, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 987112, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 969036, + "componentType": 5125, + "count": 6, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1988400, + "componentType": 5126, + "count": 4, + "max": [ + 0.5060000419616699, + -0.07500000298023224, + 0.0 + ], + "min": [ + -0.006000000052154064, + -0.125, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1988448, + "componentType": 5126, + "count": 4, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 987144, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 987176, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 987208, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 969060, + "componentType": 5125, + "count": 6, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1988496, + "componentType": 5126, + "count": 4, + "max": [ + 0.5060000419616699, + -0.07500000298023224, + 0.0 + ], + "min": [ + -0.006000000052154064, + -0.125, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1988544, + "componentType": 5126, + "count": 4, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 987240, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 987272, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 987304, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 969084, + "componentType": 5125, + "count": 6, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1988592, + "componentType": 5126, + "count": 133, + "max": [ + 0.4610000252723694, + 0.6910000443458557, + 0.0 + ], + "min": [ + 0.036000002175569534, + -0.009000000543892384, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1990188, + "componentType": 5126, + "count": 133, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 987336, + "componentType": 5126, + "count": 133, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 988400, + "componentType": 5126, + "count": 133, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 989464, + "componentType": 5126, + "count": 133, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 969108, + "componentType": 5125, + "count": 399, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1991784, + "componentType": 5126, + "count": 7, + "max": [ + 0.5290000438690186, + 0.597000002861023, + 0.0 + ], + "min": [ + 0.055000003427267075, + 0.11100000888109207, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1991868, + "componentType": 5126, + "count": 7, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 990528, + "componentType": 5126, + "count": 7, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 990584, + "componentType": 5126, + "count": 7, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 990640, + "componentType": 5126, + "count": 7, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 970704, + "componentType": 5125, + "count": 15, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1991952, + "componentType": 5126, + "count": 389, + "max": [ + 2.1000001430511475, + 0.6910000443458557, + 0.0 + ], + "min": [ + 0.07000000029802322, + -0.009000000543892384, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1996620, + "componentType": 5126, + "count": 389, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 990696, + "componentType": 5126, + "count": 389, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 993808, + "componentType": 5126, + "count": 389, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 996920, + "componentType": 5126, + "count": 389, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 970764, + "componentType": 5125, + "count": 1137, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 2001288, + "componentType": 5126, + "count": 291, + "max": [ + 2.2820000648498535, + 0.6910000443458557, + 0.0 + ], + "min": [ + 0.04000000283122063, + -0.009000000543892384, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 2004780, + "componentType": 5126, + "count": 291, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1000032, + "componentType": 5126, + "count": 291, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1002360, + "componentType": 5126, + "count": 291, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1004688, + "componentType": 5126, + "count": 291, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 975312, + "componentType": 5125, + "count": 837, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 2008272, + "componentType": 5126, + "count": 519, + "max": [ + 2.2680001258850098, + 0.6820000410079956, + 0.0 + ], + "min": [ + 0.07000000029802322, + -0.009000000543892384, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 2014500, + "componentType": 5126, + "count": 519, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1007016, + "componentType": 5126, + "count": 519, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1011168, + "componentType": 5126, + "count": 519, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1015320, + "componentType": 5126, + "count": 519, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 978660, + "componentType": 5125, + "count": 1545, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 2020728, + "componentType": 5126, + "count": 15, + "max": [ + 0.4710000157356262, + 0.6910000443458557, + 0.0 + ], + "min": [ + 0.01100000087171793, + 0.0, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 2020908, + "componentType": 5126, + "count": 15, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1019472, + "componentType": 5126, + "count": 15, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1019592, + "componentType": 5126, + "count": 15, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1019712, + "componentType": 5126, + "count": 15, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 984840, + "componentType": 5125, + "count": 39, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 2021088, + "componentType": 5126, + "count": 7, + "max": [ + 0.5290000438690186, + 0.597000002861023, + 0.0 + ], + "min": [ + 0.055000003427267075, + 0.11100000888109207, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 2021172, + "componentType": 5126, + "count": 7, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1019832, + "componentType": 5126, + "count": 7, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1019888, + "componentType": 5126, + "count": 7, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1019944, + "componentType": 5126, + "count": 7, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 984996, + "componentType": 5125, + "count": 15, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 2021256, + "componentType": 5126, + "count": 78, + "max": [ + 0.43800002336502075, + 0.6820000410079956, + 0.0 + ], + "min": [ + 0.05000000074505806, + -0.009000000543892384, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 2022192, + "componentType": 5126, + "count": 78, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1020000, + "componentType": 5126, + "count": 78, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1020624, + "componentType": 5126, + "count": 78, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1021248, + "componentType": 5126, + "count": 78, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 985056, + "componentType": 5125, + "count": 228, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 2023128, + "componentType": 5126, + "count": 121, + "max": [ + 0.4650000333786011, + 0.6910000443458557, + 0.0 + ], + "min": [ + 0.04400000348687172, + -0.009000000543892384, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 2024580, + "componentType": 5126, + "count": 121, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1021872, + "componentType": 5126, + "count": 121, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1022840, + "componentType": 5126, + "count": 121, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1023808, + "componentType": 5126, + "count": 121, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 985968, + "componentType": 5125, + "count": 363, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 2026032, + "componentType": 5126, + "count": 7, + "max": [ + 0.5290000438690186, + 0.597000002861023, + 0.0 + ], + "min": [ + 0.055000003427267075, + 0.11100000888109207, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 2026116, + "componentType": 5126, + "count": 7, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1024776, + "componentType": 5126, + "count": 7, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1024832, + "componentType": 5126, + "count": 7, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1024888, + "componentType": 5126, + "count": 7, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 987420, + "componentType": 5125, + "count": 15, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 2026200, + "componentType": 5126, + "count": 205, + "max": [ + 1.383000135421753, + 0.11100000888109207, + 0.0 + ], + "min": [ + 0.049000002443790436, + -1.0089999437332153, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 2028660, + "componentType": 5126, + "count": 205, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1024944, + "componentType": 5126, + "count": 205, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1026584, + "componentType": 5126, + "count": 205, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1028224, + "componentType": 5126, + "count": 205, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 987480, + "componentType": 5125, + "count": 603, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 2031120, + "componentType": 5126, + "count": 4, + "max": [ + 0.1680000126361847, + 0.6820000410079956, + 0.0 + ], + "min": [ + 0.09200000762939453, + -0.23000000417232513, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 2031168, + "componentType": 5126, + "count": 4, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1029864, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1029896, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1029928, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 989892, + "componentType": 5125, + "count": 6, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 2031216, + "componentType": 5126, + "count": 4, + "max": [ + 0.5060000419616699, + -0.07500000298023224, + 0.0 + ], + "min": [ + -0.006000000052154064, + -0.125, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 2031264, + "componentType": 5126, + "count": 4, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1029960, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1029992, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1030024, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 989916, + "componentType": 5125, + "count": 6, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 2031312, + "componentType": 5126, + "count": 4, + "max": [ + 0.1680000126361847, + 0.6820000410079956, + 0.0 + ], + "min": [ + 0.09200000762939453, + -0.23000000417232513, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 2031360, + "componentType": 5126, + "count": 4, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1030056, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1030088, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1030120, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 989940, + "componentType": 5125, + "count": 6, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 2031408, + "componentType": 5126, + "count": 138, + "max": [ + 2.750999927520752, + 0.6820000410079956, + 0.0 + ], + "min": [ + 0.0, + -0.006000000052154064, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 2033064, + "componentType": 5126, + "count": 138, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1030152, + "componentType": 5126, + "count": 138, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1031256, + "componentType": 5126, + "count": 138, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1032360, + "componentType": 5126, + "count": 138, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 989964, + "componentType": 5125, + "count": 372, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 2034720, + "componentType": 5126, + "count": 67, + "max": [ + 0.9079999923706055, + 0.6820000410079956, + 0.0 + ], + "min": [ + 0.07600000500679016, + 0.0, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 2035524, + "componentType": 5126, + "count": 67, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1033464, + "componentType": 5126, + "count": 67, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1034000, + "componentType": 5126, + "count": 67, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1034536, + "componentType": 5126, + "count": 67, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 991452, + "componentType": 5125, + "count": 189, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 2036328, + "componentType": 5126, + "count": 73, + "max": [ + 1.218000054359436, + 0.6860000491142273, + 0.0 + ], + "min": [ + 0.0, + -0.009000000543892384, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 2037204, + "componentType": 5126, + "count": 73, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1035072, + "componentType": 5126, + "count": 73, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1035656, + "componentType": 5126, + "count": 73, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1036240, + "componentType": 5126, + "count": 73, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 992208, + "componentType": 5125, + "count": 201, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 2038080, + "componentType": 5126, + "count": 4, + "max": [ + 0.5060000419616699, + -0.07500000298023224, + 0.0 + ], + "min": [ + -0.006000000052154064, + -0.125, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 2038128, + "componentType": 5126, + "count": 4, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1036824, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1036856, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1036888, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 993012, + "componentType": 5125, + "count": 6, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 2038176, + "componentType": 5126, + "count": 4, + "max": [ + 0.5060000419616699, + -0.07500000298023224, + 0.0 + ], + "min": [ + -0.006000000052154064, + -0.125, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 2038224, + "componentType": 5126, + "count": 4, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1036920, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1036952, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1036984, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 993036, + "componentType": 5125, + "count": 6, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 2038272, + "componentType": 5126, + "count": 4, + "max": [ + 0.5060000419616699, + -0.07500000298023224, + 0.0 + ], + "min": [ + -0.006000000052154064, + -0.125, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 2038320, + "componentType": 5126, + "count": 4, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1037016, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1037048, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1037080, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 993060, + "componentType": 5125, + "count": 6, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 2038368, + "componentType": 5126, + "count": 4, + "max": [ + 0.5060000419616699, + -0.07500000298023224, + 0.0 + ], + "min": [ + -0.006000000052154064, + -0.125, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 2038416, + "componentType": 5126, + "count": 4, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1037112, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1037144, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1037176, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 993084, + "componentType": 5125, + "count": 6, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 2038464, + "componentType": 5126, + "count": 7, + "max": [ + 0.5290000438690186, + 0.597000002861023, + 0.0 + ], + "min": [ + 0.055000003427267075, + 0.11100000888109207, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 2038548, + "componentType": 5126, + "count": 7, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1037208, + "componentType": 5126, + "count": 7, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1037264, + "componentType": 5126, + "count": 7, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1037320, + "componentType": 5126, + "count": 7, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 993108, + "componentType": 5125, + "count": 15, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 2038632, + "componentType": 5126, + "count": 4, + "max": [ + 0.5060000419616699, + -0.07500000298023224, + 0.0 + ], + "min": [ + -0.006000000052154064, + -0.125, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 2038680, + "componentType": 5126, + "count": 4, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1037376, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1037408, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1037440, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 993168, + "componentType": 5125, + "count": 6, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 2038728, + "componentType": 5126, + "count": 4, + "max": [ + 0.5060000419616699, + -0.07500000298023224, + 0.0 + ], + "min": [ + -0.006000000052154064, + -0.125, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 2038776, + "componentType": 5126, + "count": 4, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1037472, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1037504, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1037536, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 993192, + "componentType": 5125, + "count": 6, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 2038824, + "componentType": 5126, + "count": 4, + "max": [ + 0.5060000419616699, + -0.07500000298023224, + 0.0 + ], + "min": [ + -0.006000000052154064, + -0.125, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 2038872, + "componentType": 5126, + "count": 4, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1037568, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1037600, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1037632, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 993216, + "componentType": 5125, + "count": 6, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 2038920, + "componentType": 5126, + "count": 4, + "max": [ + 0.5060000419616699, + -0.07500000298023224, + 0.0 + ], + "min": [ + -0.006000000052154064, + -0.125, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 2038968, + "componentType": 5126, + "count": 4, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1037664, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1037696, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1037728, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 993240, + "componentType": 5125, + "count": 6, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 2039016, + "componentType": 5126, + "count": 4, + "max": [ + 0.5060000419616699, + -0.07500000298023224, + 0.0 + ], + "min": [ + -0.006000000052154064, + -0.125, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 2039064, + "componentType": 5126, + "count": 4, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1037760, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1037792, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1037824, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 993264, + "componentType": 5125, + "count": 6, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 2039112, + "componentType": 5126, + "count": 4, + "max": [ + 0.5060000419616699, + -0.07500000298023224, + 0.0 + ], + "min": [ + -0.006000000052154064, + -0.125, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 2039160, + "componentType": 5126, + "count": 4, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1037856, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1037888, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1037920, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 993288, + "componentType": 5125, + "count": 6, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 2039208, + "componentType": 5126, + "count": 407, + "max": [ + 2.3420002460479736, + 0.6820000410079956, + 0.0 + ], + "min": [ + 0.07600000500679016, + -0.009000000543892384, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 2044092, + "componentType": 5126, + "count": 407, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1037952, + "componentType": 5126, + "count": 407, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1041208, + "componentType": 5126, + "count": 407, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1044464, + "componentType": 5126, + "count": 407, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 993312, + "componentType": 5125, + "count": 1185, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 2048976, + "componentType": 5126, + "count": 314, + "max": [ + 2.498000144958496, + 0.6820000410079956, + 0.0 + ], + "min": [ + 0.07500000298023224, + -0.009000000543892384, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 2052744, + "componentType": 5126, + "count": 314, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1047720, + "componentType": 5126, + "count": 314, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1050232, + "componentType": 5126, + "count": 314, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1052744, + "componentType": 5126, + "count": 314, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 998052, + "componentType": 5125, + "count": 930, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 2056512, + "componentType": 5126, + "count": 468, + "max": [ + 2.1089999675750732, + 0.6820000410079956, + 0.0 + ], + "min": [ + 0.07000000029802322, + -0.23000000417232513, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 2062128, + "componentType": 5126, + "count": 468, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1055256, + "componentType": 5126, + "count": 468, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1059000, + "componentType": 5126, + "count": 468, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1062744, + "componentType": 5126, + "count": 468, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 1001772, + "componentType": 5125, + "count": 1404, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 2067744, + "componentType": 5126, + "count": 12, + "max": [ + 0.527999997138977, + 0.5890000462532043, + 0.0 + ], + "min": [ + 0.0560000017285347, + 0.11700000613927841, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 2067888, + "componentType": 5126, + "count": 12, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1066488, + "componentType": 5126, + "count": 12, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1066584, + "componentType": 5126, + "count": 12, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1066680, + "componentType": 5126, + "count": 12, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 1007388, + "componentType": 5125, + "count": 24, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 2068032, + "componentType": 5126, + "count": 4, + "max": [ + 0.5060000419616699, + -0.07500000298023224, + 0.0 + ], + "min": [ + -0.006000000052154064, + -0.125, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 2068080, + "componentType": 5126, + "count": 4, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1066776, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1066808, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1066840, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 1007484, + "componentType": 5125, + "count": 6, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 2068128, + "componentType": 5126, + "count": 413, + "max": [ + 2.7060000896453857, + 0.6820000410079956, + 0.0 + ], + "min": [ + 0.07600000500679016, + -0.009000000543892384, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 2073084, + "componentType": 5126, + "count": 413, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1066872, + "componentType": 5126, + "count": 413, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1070176, + "componentType": 5126, + "count": 413, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1073480, + "componentType": 5126, + "count": 413, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 1007508, + "componentType": 5125, + "count": 1221, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 2078040, + "componentType": 5126, + "count": 147, + "max": [ + 1.4509999752044678, + 0.6820000410079956, + 0.0 + ], + "min": [ + 0.07500000298023224, + 0.0, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 2079804, + "componentType": 5126, + "count": 147, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1076784, + "componentType": 5126, + "count": 147, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1077960, + "componentType": 5126, + "count": 147, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1079136, + "componentType": 5126, + "count": 147, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 1012392, + "componentType": 5125, + "count": 429, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 2081568, + "componentType": 5126, + "count": 423, + "max": [ + 2.125999927520752, + 0.6820000410079956, + 0.0 + ], + "min": [ + 0.07000000029802322, + -0.23000000417232513, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 2086644, + "componentType": 5126, + "count": 423, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1080312, + "componentType": 5126, + "count": 423, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1083696, + "componentType": 5126, + "count": 423, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1087080, + "componentType": 5126, + "count": 423, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 1014108, + "componentType": 5125, + "count": 1269, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 2091720, + "componentType": 5126, + "count": 228, + "max": [ + 0.407953143119812, + 0.7260000109672546, + 0.0 + ], + "min": [ + 0.010046877898275852, + 0.27800002694129944, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 2094456, + "componentType": 5126, + "count": 228, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1090464, + "componentType": 5126, + "count": 228, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1092288, + "componentType": 5126, + "count": 228, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1094112, + "componentType": 5126, + "count": 228, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 1019184, + "componentType": 5125, + "count": 678, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 2097192, + "componentType": 5126, + "count": 8, + "max": [ + 0.27400001883506775, + 0.6820000410079956, + 0.0 + ], + "min": [ + 0.00800000037997961, + -2.009000062942505, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 2097288, + "componentType": 5126, + "count": 8, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1095936, + "componentType": 5126, + "count": 8, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1096000, + "componentType": 5126, + "count": 8, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1096064, + "componentType": 5126, + "count": 8, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 1021896, + "componentType": 5125, + "count": 12, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 2097384, + "componentType": 5126, + "count": 115, + "max": [ + 0.3050000071525574, + 0.7280000448226929, + 0.0 + ], + "min": [ + 0.014000000432133675, + -2.2209999561309814, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 2098764, + "componentType": 5126, + "count": 115, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1096128, + "componentType": 5126, + "count": 115, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1097048, + "componentType": 5126, + "count": 115, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1097968, + "componentType": 5126, + "count": 115, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 1021944, + "componentType": 5125, + "count": 333, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 2100144, + "componentType": 5126, + "count": 115, + "max": [ + 0.3190000057220459, + 0.7280000448226929, + 0.0 + ], + "min": [ + 0.02800000086426735, + -2.2209999561309814, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 2101524, + "componentType": 5126, + "count": 115, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1098888, + "componentType": 5126, + "count": 115, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 1023276, + "componentType": 5125, + "count": 333, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 2102904, + "componentType": 5126, + "count": 20, + "max": [ + 0.527999997138977, + 0.5890000462532043, + 0.0 + ], + "min": [ + 0.0560000017285347, + -0.796999990940094, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 2103144, + "componentType": 5126, + "count": 20, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1099808, + "componentType": 5126, + "count": 20, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1099968, + "componentType": 5126, + "count": 20, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1100128, + "componentType": 5126, + "count": 20, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 1024608, + "componentType": 5125, + "count": 36, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 2103384, + "componentType": 5126, + "count": 8, + "max": [ + 0.5060000419616699, + -0.07500000298023224, + 0.0 + ], + "min": [ + -0.006000000052154064, + -1.8259999752044678, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 2103480, + "componentType": 5126, + "count": 8, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1100288, + "componentType": 5126, + "count": 8, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1100352, + "componentType": 5126, + "count": 8, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1100416, + "componentType": 5126, + "count": 8, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 1024752, + "componentType": 5125, + "count": 12, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 2103576, + "componentType": 5126, + "count": 7, + "max": [ + 0.5290000438690186, + 0.597000002861023, + 0.0 + ], + "min": [ + 0.055000003427267075, + 0.11100000888109207, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 2103660, + "componentType": 5126, + "count": 7, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1100480, + "componentType": 5126, + "count": 7, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1100536, + "componentType": 5126, + "count": 7, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1100592, + "componentType": 5126, + "count": 7, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 1024800, + "componentType": 5125, + "count": 15, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 2103744, + "componentType": 5126, + "count": 89, + "max": [ + 0.4660000205039978, + 0.6910000443458557, + 0.0 + ], + "min": [ + 0.03400000184774399, + 0.0, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 2104812, + "componentType": 5126, + "count": 89, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1100648, + "componentType": 5126, + "count": 89, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1101360, + "componentType": 5126, + "count": 89, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1102072, + "componentType": 5126, + "count": 89, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 1024860, + "componentType": 5125, + "count": 261, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 2105880, + "componentType": 5126, + "count": 4, + "max": [ + 0.30000001192092896, + 0.6820000410079956, + 0.0 + ], + "min": [ + 0.20200000703334808, + 0.0, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 2105928, + "componentType": 5126, + "count": 4, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1102784, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1102816, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1102848, + "componentType": 5126, + "count": 4, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 1025904, + "componentType": 5125, + "count": 6, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 2105976, + "componentType": 5126, + "count": 147, + "max": [ + 1.4509999752044678, + 0.6820000410079956, + 0.0 + ], + "min": [ + 0.07500000298023224, + 0.0, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 2107740, + "componentType": 5126, + "count": 147, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1102880, + "componentType": 5126, + "count": 147, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1104056, + "componentType": 5126, + "count": 147, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1105232, + "componentType": 5126, + "count": 147, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 1025928, + "componentType": 5125, + "count": 429, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 2109504, + "componentType": 5126, + "count": 147, + "max": [ + 0.4240000247955322, + 0.6910000443458557, + 0.0 + ], + "min": [ + 0.06400000303983688, + -0.009000000543892384, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 2111268, + "componentType": 5126, + "count": 147, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1106408, + "componentType": 5126, + "count": 147, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1107584, + "componentType": 5126, + "count": 147, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1108760, + "componentType": 5126, + "count": 147, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 1027644, + "componentType": 5125, + "count": 435, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 2113032, + "componentType": 5126, + "count": 423, + "max": [ + 2.125999927520752, + 0.6820000410079956, + 0.0 + ], + "min": [ + 0.07000000029802322, + -0.23000000417232513, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 2118108, + "componentType": 5126, + "count": 423, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1109936, + "componentType": 5126, + "count": 423, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1113320, + "componentType": 5126, + "count": 423, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1116704, + "componentType": 5126, + "count": 423, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 1029384, + "componentType": 5125, + "count": 1269, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 2123184, + "componentType": 5126, + "count": 73, + "max": [ + 1.218000054359436, + 0.6860000491142273, + 0.0 + ], + "min": [ + 0.0, + -0.009000000543892384, + 0.0 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 2124060, + "componentType": 5126, + "count": 73, + "max": [ + 0.0, + 0.0, + 1.0 + ], + "min": [ + 0.0, + 0.0, + 1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1120088, + "componentType": 5126, + "count": 73, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1120672, + "componentType": 5126, + "count": 73, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 1, + "byteOffset": 1121256, + "componentType": 5126, + "count": 73, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 1.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 1034460, + "componentType": 5125, + "count": 201, + "type": "SCALAR" + } + ], + "asset": { + "extras": { + "author": "Yolala1232 (https://sketchfab.com/Yolala1232)", + "license": "CC-BY-4.0 (http://creativecommons.org/licenses/by/4.0/)", + "source": "https://sketchfab.com/3d-models/gaming-desktop-pc-d1d8282c9916438091f11aeb28787b66", + "title": "Gaming Desktop PC" + }, + "generator": "Sketchfab-12.82.3", + "version": "2.0" + }, + "bufferViews": [ + { + "buffer": 0, + "byteLength": 1035264, + "name": "floatBufferViews", + "target": 34963 + }, + { + "buffer": 0, + "byteLength": 1121840, + "byteOffset": 1035264, + "byteStride": 8, + "name": "floatBufferViews", + "target": 34962 + }, + { + "buffer": 0, + "byteLength": 2124936, + "byteOffset": 2157104, + "byteStride": 12, + "name": "floatBufferViews", + "target": 34962 + } + ], + "buffers": [ + { + "byteLength": 4282040, + "uri": "scene.bin" + } + ], + "images": [ + { + "uri": "textures/Material_baseColor.jpeg" + }, + { + "uri": "textures/Material_metallicRoughness.png" + }, + { + "uri": "textures/Material.074_baseColor.png" + }, + { + "uri": "textures/Material.074_0_baseColor.png" + }, + { + "uri": "textures/Material.074_1_baseColor.jpeg" + }, + { + "uri": "textures/Material.074_2_baseColor.jpeg" + }, + { + "uri": "textures/Material.074_3_baseColor.png" + }, + { + "uri": "textures/Material.074_4_baseColor.png" + }, + { + "uri": "textures/Material.074_4_emissive.png" + }, + { + "uri": "textures/Material.023_baseColor.jpeg" + }, + { + "uri": "textures/Material.024_baseColor.jpeg" + }, + { + "uri": "textures/Material.074_5_baseColor.png" + }, + { + "uri": "textures/Material.074_6_baseColor.png" + }, + { + "uri": "textures/Material.074_7_baseColor.png" + }, + { + "uri": "textures/Material.074_8_baseColor.png" + }, + { + "uri": "textures/Material.074_9_baseColor.png" + }, + { + "uri": "textures/Material.074_9_emissive.png" + }, + { + "uri": "textures/Material.074_10_baseColor.jpeg" + }, + { + "uri": "textures/Material.074_11_baseColor.png" + }, + { + "uri": "textures/Material.074_12_baseColor.jpeg" + }, + { + "uri": "textures/Material.074_13_baseColor.png" + }, + { + "uri": "textures/Material.074_14_baseColor.png" + }, + { + "uri": "textures/Material.074_15_baseColor.png" + }, + { + "uri": "textures/Material.074_16_baseColor.png" + }, + { + "uri": "textures/Material.074_17_baseColor.png" + }, + { + "uri": "textures/Material.074_18_baseColor.png" + }, + { + "uri": "textures/Material.074_18_emissive.png" + }, + { + "uri": "textures/Material.074_19_baseColor.png" + }, + { + "uri": "textures/Material.074_20_baseColor.png" + }, + { + "uri": "textures/Material.074_21_baseColor.png" + }, + { + "uri": "textures/Material.074_22_baseColor.png" + }, + { + "uri": "textures/Material.074_23_baseColor.png" + }, + { + "uri": "textures/Material.074_24_baseColor.png" + }, + { + "uri": "textures/Material.074_24_emissive.png" + }, + { + "uri": "textures/Material.074_25_baseColor.jpeg" + }, + { + "uri": "textures/Material.074_26_baseColor.png" + }, + { + "uri": "textures/Material.074_27_baseColor.png" + }, + { + "uri": "textures/Material.074_27_emissive.png" + }, + { + "uri": "textures/Material.074_28_baseColor.png" + }, + { + "uri": "textures/Material.074_29_baseColor.png" + }, + { + "uri": "textures/Material.074_30_baseColor.png" + }, + { + "uri": "textures/Material.074_31_baseColor.png" + }, + { + "uri": "textures/Material.002_baseColor.png" + }, + { + "uri": "textures/Material.074_32_baseColor.jpeg" + }, + { + "uri": "textures/Tasten_2_baseColor.jpeg" + }, + { + "uri": "textures/Material.074_33_baseColor.png" + }, + { + "uri": "textures/Material.074_34_baseColor.jpeg" + }, + { + "uri": "textures/Material.074_35_baseColor.png" + }, + { + "uri": "textures/Material.074_36_baseColor.jpeg" + }, + { + "uri": "textures/Material.074_39_baseColor.jpeg" + }, + { + "uri": "textures/Material.074_40_baseColor.png" + } + ], + "materials": [ + { + "doubleSided": true, + "name": "Material", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 0 + }, + "metallicFactor": 0.0, + "metallicRoughnessTexture": { + "index": 1 + } + } + }, + { + "doubleSided": true, + "name": "Material.074", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 2 + }, + "metallicFactor": 0.760195266356939, + "roughnessFactor": 0.27013239368212294 + } + }, + { + "doubleSided": true, + "name": "Material.025", + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.0, + 0.0, + 0.0, + 1.0 + ], + "metallicFactor": 0.0, + "roughnessFactor": 0.0 + } + }, + { + "doubleSided": true, + "name": "Material.017", + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.03741, + 0.03741, + 0.03741, + 1.0 + ], + "metallicFactor": 0.0, + "roughnessFactor": 0.9916348696961733 + } + }, + { + "doubleSided": true, + "emissiveFactor": [ + 1.0, + 1.0, + 1.0 + ], + "emissiveTexture": { + "index": 4 + }, + "name": "Material.074_0", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 3 + }, + "metallicFactor": 0.0, + "roughnessFactor": 0.8211145618000169 + } + }, + { + "doubleSided": true, + "name": "Material.074_1", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 5 + }, + "roughnessFactor": 0.5309502700180564 + } + }, + { + "doubleSided": true, + "name": "Material.074_2", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 6 + }, + "metallicFactor": 0.638884626200691, + "roughnessFactor": 0.40963962986180824 + } + }, + { + "doubleSided": true, + "name": "Material.074_3", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 7 + }, + "metallicFactor": 0.2931493017553839, + "roughnessFactor": 0.23373920163524853 + } + }, + { + "alphaCutoff": 0.3780667498647576, + "alphaMode": "MASK", + "doubleSided": true, + "emissiveFactor": [ + 1.0, + 1.0, + 1.0 + ], + "emissiveTexture": { + "index": 9 + }, + "name": "Material.074_4", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 8 + }, + "metallicFactor": 0.0, + "roughnessFactor": 0.8211145618000169 + } + }, + { + "doubleSided": true, + "emissiveFactor": [ + 1.0, + 0.7195414379581087, + 0.0 + ], + "name": "Material.023", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 10 + }, + "metallicFactor": 0.0, + "roughnessFactor": 0.9466496360574033 + } + }, + { + "doubleSided": true, + "emissiveFactor": [ + 1.0, + 0.48144221951631094, + 0.0 + ], + "name": "Material.024", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 11 + }, + "metallicFactor": 0.0, + "roughnessFactor": 0.9562547057941537 + } + }, + { + "alphaCutoff": 0.3295424938022583, + "alphaMode": "MASK", + "doubleSided": true, + "name": "Material.074_5", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 12 + }, + "metallicFactor": 0.0, + "roughnessFactor": 0.0 + } + }, + { + "doubleSided": true, + "emissiveFactor": [ + 1.0, + 1.0, + 1.0 + ], + "emissiveTexture": { + "index": 13 + }, + "name": "Material.074_6", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 13 + }, + "metallicFactor": 0.0, + "roughnessFactor": 0.8211145618000169 + } + }, + { + "doubleSided": true, + "name": "Material.074_7", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 14 + }, + "metallicFactor": 0.0, + "roughnessFactor": 0.8211145618000169 + } + }, + { + "doubleSided": true, + "name": "Material.074_8", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 15 + }, + "metallicFactor": 0.0 + } + }, + { + "alphaCutoff": 0.8147850544272507, + "alphaMode": "MASK", + "doubleSided": true, + "emissiveFactor": [ + 1.0, + 1.0, + 1.0 + ], + "emissiveTexture": { + "index": 17 + }, + "name": "Material.074_9", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 16 + }, + "metallicFactor": 0.0, + "roughnessFactor": 0.8211145618000169 + } + }, + { + "doubleSided": true, + "emissiveFactor": [ + 1.0, + 1.0, + 1.0 + ], + "emissiveTexture": { + "index": 19 + }, + "name": "Material.074_10", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 18 + }, + "metallicFactor": 0.0, + "roughnessFactor": 0.0 + } + }, + { + "doubleSided": true, + "emissiveFactor": [ + 1.0, + 1.0, + 1.0 + ], + "emissiveTexture": { + "index": 20 + }, + "name": "Material.074_11", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 20 + }, + "metallicFactor": 0.0, + "roughnessFactor": 0.8160302743852395 + } + }, + { + "doubleSided": true, + "name": "Material.074_12", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 21 + }, + "metallicFactor": 0.0, + "roughnessFactor": 0.8211145618000169 + } + }, + { + "doubleSided": true, + "name": "Material.074_13", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 22 + }, + "metallicFactor": 0.49331185801319327, + "roughnessFactor": 0.0 + } + }, + { + "doubleSided": true, + "name": "Material.074_14", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 23 + }, + "metallicFactor": 0.7965884584038135, + "roughnessFactor": 0.8211145618000169 + } + }, + { + "doubleSided": true, + "name": "Material.013", + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.0198258, + 0.367238, + 0.0, + 1.0 + ], + "metallicFactor": 0.0, + "roughnessFactor": 0.9403274888408384 + } + }, + { + "doubleSided": true, + "name": "Material.032", + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.8, + 0.00166052, + 0.0, + 1.0 + ], + "metallicFactor": 0.0, + "roughnessFactor": 0.9617033995327148 + } + }, + { + "doubleSided": true, + "name": "Material.034", + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.0236505, + 0.0236505, + 0.0236505, + 1.0 + ], + "metallicFactor": 0.0, + "roughnessFactor": 0.9947115874298141 + } + }, + { + "doubleSided": true, + "emissiveFactor": [ + 0.8085568148194973, + 0.8085568148194973, + 0.8085568148194973 + ], + "emissiveTexture": { + "index": 24 + }, + "name": "Material.074_15", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 24 + }, + "metallicFactor": 0.0, + "roughnessFactor": 0.0 + } + }, + { + "doubleSided": true, + "name": "Material.074_16", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 25 + }, + "metallicFactor": 0.0, + "roughnessFactor": 0.8211145618000169 + } + }, + { + "doubleSided": true, + "name": "Material.042", + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.0203788, + 0.0203788, + 0.0203788, + 1.0 + ], + "metallicFactor": 0.0, + "roughnessFactor": 0.9954431617900127 + } + }, + { + "doubleSided": true, + "emissiveFactor": [ + 1.0, + 1.0, + 1.0 + ], + "emissiveTexture": { + "index": 26 + }, + "name": "Material.074_17", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 26 + }, + "metallicFactor": 0.0, + "roughnessFactor": 0.8211145618000169 + } + }, + { + "doubleSided": true, + "name": "Material.045", + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.438544, + 0.438544, + 0.438544, + 1.0 + ], + "metallicFactor": 0.8152405797808145, + "roughnessFactor": 0.32495032365812926 + } + }, + { + "doubleSided": true, + "name": "Material.046", + "pbrMetallicRoughness": { + "metallicFactor": 0.0, + "roughnessFactor": 0.7763932022500211 + } + }, + { + "alphaCutoff": 0.5721637741147545, + "alphaMode": "MASK", + "doubleSided": true, + "emissiveFactor": [ + 1.0, + 1.0, + 1.0 + ], + "emissiveTexture": { + "index": 28 + }, + "name": "Material.074_18", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 27 + }, + "metallicFactor": 0.0, + "roughnessFactor": 0.8211145618000169 + } + }, + { + "doubleSided": true, + "name": "Material.048", + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.603816, + 0.134338, + 0.0197827, + 1.0 + ], + "metallicFactor": 0.0, + "roughnessFactor": 0.9494921146376416 + } + }, + { + "doubleSided": true, + "emissiveFactor": [ + 1.0, + 0.2827304251440078, + 0.0 + ], + "name": "Material.049", + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.581463, + 0.1990159999999999, + 0.04594239999999997, + 1.0 + ], + "metallicFactor": 0.0, + "roughnessFactor": 0.9397888791866961 + } + }, + { + "doubleSided": true, + "name": "Material.054", + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.00560457, + 0.00560457, + 0.00560457, + 1.0 + ], + "metallicFactor": 0.0, + "roughnessFactor": 0.9987467800495344 + } + }, + { + "doubleSided": true, + "name": "Material.061", + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.00807573, + 0.00807573, + 0.00807573, + 1.0 + ], + "metallicFactor": 0.0, + "roughnessFactor": 0.9981942118752065 + } + }, + { + "doubleSided": true, + "emissiveFactor": [ + 1.0, + 1.0, + 1.0 + ], + "emissiveTexture": { + "index": 29 + }, + "name": "Material.074_19", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 29 + }, + "roughnessFactor": 0.8211145618000169 + } + }, + { + "doubleSided": true, + "emissiveFactor": [ + 1.0, + 1.0, + 1.0 + ], + "emissiveTexture": { + "index": 30 + }, + "name": "Material.074_20", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 30 + }, + "roughnessFactor": 0.8211145618000169 + } + }, + { + "doubleSided": true, + "name": "Material.074_21", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 31 + }, + "metallicFactor": 0.0, + "roughnessFactor": 0.6461953781664921 + } + }, + { + "doubleSided": true, + "emissiveFactor": [ + 0.14029358876613432, + 0.9666009769255408, + 0.003380460688173319 + ], + "name": "Material.056", + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.28243099999999977, + 0.7999999999999999, + 0.04308959999999994, + 1.0 + ], + "metallicFactor": 0.4387220699428816, + "roughnessFactor": 0.0 + } + }, + { + "doubleSided": true, + "name": "Material.074_22", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 32 + }, + "metallicFactor": 0.0, + "roughnessFactor": 0.8211145618000169 + } + }, + { + "doubleSided": true, + "name": "Material.058", + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.0100217, + 0.0100217, + 0.0100217, + 1.0 + ], + "metallicFactor": 0.0, + "roughnessFactor": 0.997759079754989 + } + }, + { + "doubleSided": true, + "name": "Material.062", + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.0130444, + 0.0150815, + 0.0188485, + 1.0 + ], + "metallicFactor": 0.0, + "roughnessFactor": 0.9966636993843356 + } + }, + { + "doubleSided": true, + "name": "Material.074_23", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 33 + }, + "metallicFactor": 0.21429738565382264, + "roughnessFactor": 0.4399672899008703 + } + }, + { + "alphaCutoff": 0.11118334152101175, + "alphaMode": "MASK", + "doubleSided": true, + "emissiveFactor": [ + 1.0, + 1.0, + 1.0 + ], + "emissiveTexture": { + "index": 35 + }, + "name": "Material.074_24", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 34 + }, + "metallicFactor": 0.0, + "roughnessFactor": 0.8211145618000169 + } + }, + { + "doubleSided": true, + "name": "Material.074_25", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 36 + }, + "metallicFactor": 0.2567561097085095, + "roughnessFactor": 0.47029494993993237 + } + }, + { + "doubleSided": true, + "name": "Material.075", + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.0310633, + 0.0310633, + 0.0310633, + 1.0 + ], + "roughnessFactor": 0.47029494993993237 + } + }, + { + "doubleSided": true, + "name": "Material.076", + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.0122168, + 0.0122168, + 0.0122168, + 1.0 + ], + "metallicFactor": 0.0, + "roughnessFactor": 0.997268240473248 + } + }, + { + "doubleSided": true, + "emissiveFactor": [ + 0.23572214716340706, + 1.0, + 1.0 + ], + "name": "Material.077", + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.0, + 0.5381999999999998, + 0.7999999999999999, + 1.0 + ], + "metallicFactor": 0.0, + "roughnessFactor": 0.9010135996636888 + } + }, + { + "doubleSided": true, + "emissiveFactor": [ + 0.007907801201354252, + 1.0, + 1.0 + ], + "name": "Material.082", + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.0, + 0.425019, + 0.8, + 1.0 + ], + "metallicFactor": 0.0, + "roughnessFactor": 0.9191139105698244 + } + }, + { + "doubleSided": true, + "name": "Material.085", + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.0765793, + 0.0715, + 0.06761, + 1.0 + ], + "metallicFactor": 0.0 + } + }, + { + "doubleSided": true, + "name": "Material.074_26", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 37 + }, + "roughnessFactor": 0.09423196545556323 + } + }, + { + "doubleSided": true, + "name": "Material.087", + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.147313, + 0.143179, + 0.143179, + 1.0 + ], + "metallicFactor": 0.0, + "roughnessFactor": 0.9677876768842522 + } + }, + { + "doubleSided": true, + "name": "Material.088", + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.0871394, + 0.0871394, + 0.0871394, + 1.0 + ], + "metallicFactor": 0.0, + "roughnessFactor": 0.9805150378081455 + } + }, + { + "doubleSided": true, + "name": "Material.090", + "pbrMetallicRoughness": { + "baseColorFactor": [ + 1.0, + 0.03647280000000001, + 0.06112950000000011, + 1.0 + ], + "roughnessFactor": 0.2761979256899354 + } + }, + { + "doubleSided": true, + "name": "Material.092", + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.02767816025677209, + 0.02722443008817746, + 0.02722443008817746, + 1.0 + ] + } + }, + { + "alphaCutoff": 0.9118335665522491, + "alphaMode": "MASK", + "doubleSided": true, + "emissiveFactor": [ + 1.0, + 1.0, + 1.0 + ], + "emissiveTexture": { + "index": 39 + }, + "name": "Material.074_27", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 38 + }, + "metallicFactor": 0.0, + "roughnessFactor": 0.0 + } + }, + { + "doubleSided": true, + "name": "Material.094", + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.0835308, + 0.0835308, + 0.0835308, + 1.0 + ], + "metallicFactor": 0.0, + "roughnessFactor": 0.981321945298506 + } + }, + { + "doubleSided": true, + "name": "Material.098", + "pbrMetallicRoughness": { + "baseColorFactor": [ + 1.0, + 0.0, + 0.05342299999999994, + 1.0 + ], + "roughnessFactor": 0.37324643781493383 + } + }, + { + "doubleSided": true, + "emissiveFactor": [ + 1.0, + 0.12542712947243298, + 0.0 + ], + "name": "Material.104", + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.8, + 0.222378, + 0.0, + 1.0 + ], + "metallicFactor": 0.0, + "roughnessFactor": 0.9264054695761075 + } + }, + { + "doubleSided": true, + "name": "Material.055", + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.0374098, + 0.0374098, + 0.0374098, + 1.0 + ], + "metallicFactor": 0.5600327100991297, + "roughnessFactor": 0.361115373799309 + } + }, + { + "doubleSided": true, + "name": "Material.044", + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.026886529690531485, + 0.026886529690531485, + 0.026886529690531485, + 1.0 + ], + "metallicFactor": 0.4083944099038196, + "roughnessFactor": 0.5309502700180564 + } + }, + { + "alphaCutoff": 0.5539671780913173, + "alphaMode": "MASK", + "doubleSided": true, + "name": "Material.074_28", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 40 + }, + "roughnessFactor": 0.0 + } + }, + { + "alphaCutoff": 0.11118334152101175, + "alphaMode": "MASK", + "doubleSided": true, + "name": "Material.074_29", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 41 + }, + "metallicFactor": 0.0, + "roughnessFactor": 0.5066881419868068 + } + }, + { + "doubleSided": true, + "emissiveFactor": [ + 1.0, + 1.0, + 1.0 + ], + "emissiveTexture": { + "index": 43 + }, + "name": "Material.074_30", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 42 + }, + "metallicFactor": 0.0, + "roughnessFactor": 0.4399672899008703 + } + }, + { + "alphaCutoff": 0.6570812222241281, + "alphaMode": "MASK", + "doubleSided": true, + "name": "Material.074_31", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 44 + }, + "metallicFactor": 0.832981650450688, + "roughnessFactor": 0.0 + } + }, + { + "doubleSided": true, + "name": "Material.002", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 45 + } + } + }, + { + "doubleSided": true, + "name": "Material.003", + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.0122865, + 0.0122865, + 0.0122865, + 1.0 + ], + "metallicFactor": 0.0, + "roughnessFactor": 0.9972526550794449 + } + }, + { + "doubleSided": true, + "name": "Material.043", + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.0607193, + 0.0607193, + 0.0607193, + 1.0 + ], + "metallicFactor": 0.5357705820678801, + "roughnessFactor": 0.20947707360399892 + } + }, + { + "doubleSided": true, + "name": "Material.037", + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.0578023, + 0.0564418, + 0.0551006, + 1.0 + ], + "metallicFactor": 0.0, + "roughnessFactor": 0.3914430338383711 + } + }, + { + "doubleSided": true, + "name": "Material.039", + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.0578023, + 0.0578023, + 0.0578023, + 1.0 + ], + "metallicFactor": 0.0, + "roughnessFactor": 0.39750856584618344 + } + }, + { + "doubleSided": true, + "name": "Material.006", + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.0522178, + 0.0522178, + 0.0522178, + 1.0 + ], + "metallicFactor": 0.0, + "roughnessFactor": 0.4278362258852455 + } + }, + { + "doubleSided": true, + "name": "Tastatur_Seite", + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.0542946, + 0.0542946, + 0.0542946, + 1.0 + ], + "metallicFactor": 0.0, + "roughnessFactor": 0.9889575366257216 + } + }, + { + "doubleSided": true, + "name": "Tastatur_Unterseite", + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.235324, + 0.215442, + 0.215442, + 1.0 + ], + "metallicFactor": 0.8147850544272507, + "roughnessFactor": 0.21554260561181138 + } + }, + { + "doubleSided": true, + "name": "Material.004", + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.0187621, + 0.012891, + 0.012891, + 1.0 + ], + "metallicFactor": 0.0, + "roughnessFactor": 0.9968383796909857 + } + }, + { + "doubleSided": true, + "name": "Material.007", + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.00303527, + 0.00303527, + 0.00303527, + 1.0 + ], + "metallicFactor": 0.0, + "roughnessFactor": 0.9993212929949934 + } + }, + { + "doubleSided": true, + "emissiveFactor": [ + 1.0, + 1.0, + 1.0 + ], + "emissiveTexture": { + "index": 46 + }, + "name": "Material.074_32", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 46 + }, + "metallicFactor": 0.0, + "roughnessFactor": 0.8211145618000169 + } + }, + { + "doubleSided": true, + "emissiveFactor": [ + 1.0, + 1.0, + 1.0 + ], + "emissiveTexture": { + "index": 47 + }, + "name": "Tasten_2", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 47 + }, + "metallicFactor": 0.0, + "roughnessFactor": 0.8144478924 + } + }, + { + "doubleSided": true, + "emissiveFactor": [ + 1.0, + 1.0, + 1.0 + ], + "emissiveTexture": { + "index": 48 + }, + "name": "Material.074_33", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 48 + }, + "metallicFactor": 0.0, + "roughnessFactor": 0.8211145618000169 + } + }, + { + "doubleSided": true, + "emissiveFactor": [ + 1.0, + 1.0, + 1.0 + ], + "emissiveTexture": { + "index": 49 + }, + "name": "Material.074_34", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 49 + }, + "metallicFactor": 0.0, + "roughnessFactor": 0.8211145618000169 + } + }, + { + "doubleSided": true, + "emissiveFactor": [ + 1.0, + 1.0, + 1.0 + ], + "emissiveTexture": { + "index": 50 + }, + "name": "Material.074_35", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 50 + }, + "metallicFactor": 0.0, + "roughnessFactor": 0.8211145618000169 + } + }, + { + "doubleSided": true, + "emissiveFactor": [ + 1.0, + 1.0, + 1.0 + ], + "emissiveTexture": { + "index": 51 + }, + "name": "Material.074_36", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 51 + }, + "metallicFactor": 0.0, + "roughnessFactor": 0.8211145618000169 + } + }, + { + "doubleSided": true, + "emissiveFactor": [ + 1.0, + 1.0, + 1.0 + ], + "emissiveTexture": { + "index": 10 + }, + "name": "Material.074_37", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 10 + }, + "metallicFactor": 0.0, + "roughnessFactor": 0.8211145618000169 + } + }, + { + "doubleSided": true, + "emissiveFactor": [ + 1.0, + 1.0, + 1.0 + ], + "emissiveTexture": { + "index": 11 + }, + "name": "Material.074_38", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 11 + }, + "metallicFactor": 0.0, + "roughnessFactor": 0.8211145618000169 + } + }, + { + "doubleSided": true, + "emissiveFactor": [ + 1.0, + 1.0, + 1.0 + ], + "emissiveTexture": { + "index": 52 + }, + "name": "Material.074_39", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 52 + }, + "metallicFactor": 0.0, + "roughnessFactor": 0.8211145618000169 + } + }, + { + "alphaCutoff": 0.3538046218335079, + "alphaMode": "MASK", + "doubleSided": true, + "name": "Material.074_40", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 53 + }, + "metallicFactor": 0.12937993754444896, + "roughnessFactor": 0.0 + } + }, + { + "doubleSided": true, + "name": "Material.073", + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.0, + 0.700297, + 1.0, + 1.0 + ], + "metallicFactor": 0.0, + "roughnessFactor": 0.871861584673122 + } + } + ], + "meshes": [ + { + "name": "Cube_Material_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1, + "POSITION": 0, + "TEXCOORD_0": 2 + }, + "indices": 3, + "material": 0, + "mode": 4 + } + ] + }, + { + "name": "Cube.011_Material.010_0", + "primitives": [ + { + "attributes": { + "NORMAL": 5, + "POSITION": 4, + "TEXCOORD_0": 6 + }, + "indices": 7, + "material": 1, + "mode": 4 + } + ] + }, + { + "name": "Cube.012_Material.011_0", + "primitives": [ + { + "attributes": { + "NORMAL": 9, + "POSITION": 8, + "TEXCOORD_0": 10 + }, + "indices": 11, + "material": 1, + "mode": 4 + } + ] + }, + { + "name": "Cube.013_Material.015_0", + "primitives": [ + { + "attributes": { + "NORMAL": 13, + "POSITION": 12, + "TEXCOORD_0": 14 + }, + "indices": 15, + "material": 1, + "mode": 4 + } + ] + }, + { + "name": "Cube.014_Material.014_0", + "primitives": [ + { + "attributes": { + "NORMAL": 17, + "POSITION": 16, + "TEXCOORD_0": 18 + }, + "indices": 19, + "material": 1, + "mode": 4 + } + ] + }, + { + "name": "Cylinder_Material.009_0", + "primitives": [ + { + "attributes": { + "NORMAL": 21, + "POSITION": 20, + "TEXCOORD_0": 22 + }, + "indices": 23, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Cube.018_Material.017_0", + "primitives": [ + { + "attributes": { + "NORMAL": 25, + "POSITION": 24, + "TEXCOORD_0": 26 + }, + "indices": 27, + "material": 3, + "mode": 4 + } + ] + }, + { + "name": "aorus case fans_aorus case fans_0", + "primitives": [ + { + "attributes": { + "NORMAL": 29, + "POSITION": 28, + "TEXCOORD_0": 30 + }, + "indices": 31, + "material": 4, + "mode": 4 + } + ] + }, + { + "name": "aorus case fans.001_aorus case fans_0", + "primitives": [ + { + "attributes": { + "NORMAL": 33, + "POSITION": 32, + "TEXCOORD_0": 34 + }, + "indices": 35, + "material": 4, + "mode": 4 + } + ] + }, + { + "name": "Cube.015_Material.016_0", + "primitives": [ + { + "attributes": { + "NORMAL": 37, + "POSITION": 36, + "TEXCOORD_0": 38 + }, + "indices": 39, + "material": 5, + "mode": 4 + } + ] + }, + { + "name": "Cube.016_Material.017_0", + "primitives": [ + { + "attributes": { + "NORMAL": 41, + "POSITION": 40, + "TEXCOORD_0": 42 + }, + "indices": 43, + "material": 3, + "mode": 4 + } + ] + }, + { + "name": "aorus case fans.002_aorus case fans_0", + "primitives": [ + { + "attributes": { + "NORMAL": 45, + "POSITION": 44, + "TEXCOORD_0": 46 + }, + "indices": 47, + "material": 4, + "mode": 4 + } + ] + }, + { + "name": "aorus case fans.003_aorus case fans_0", + "primitives": [ + { + "attributes": { + "NORMAL": 49, + "POSITION": 48, + "TEXCOORD_0": 50 + }, + "indices": 51, + "material": 4, + "mode": 4 + } + ] + }, + { + "name": "Cube.017_Material.017_0", + "primitives": [ + { + "attributes": { + "NORMAL": 53, + "POSITION": 52, + "TEXCOORD_0": 54 + }, + "indices": 55, + "material": 3, + "mode": 4 + } + ] + }, + { + "name": "aorus case fans.004_aorus case fans_0", + "primitives": [ + { + "attributes": { + "NORMAL": 57, + "POSITION": 56, + "TEXCOORD_0": 58 + }, + "indices": 59, + "material": 4, + "mode": 4 + } + ] + }, + { + "name": "aorus case fans.005_aorus case fans_0", + "primitives": [ + { + "attributes": { + "NORMAL": 61, + "POSITION": 60, + "TEXCOORD_0": 62 + }, + "indices": 63, + "material": 4, + "mode": 4 + } + ] + }, + { + "name": "Cube.019_Material.017_0", + "primitives": [ + { + "attributes": { + "NORMAL": 65, + "POSITION": 64, + "TEXCOORD_0": 66 + }, + "indices": 67, + "material": 3, + "mode": 4 + } + ] + }, + { + "name": "aorus case fans.006_aorus case fans_0", + "primitives": [ + { + "attributes": { + "NORMAL": 69, + "POSITION": 68, + "TEXCOORD_0": 70 + }, + "indices": 71, + "material": 4, + "mode": 4 + } + ] + }, + { + "name": "aorus case fans.007_aorus case fans_0", + "primitives": [ + { + "attributes": { + "NORMAL": 73, + "POSITION": 72, + "TEXCOORD_0": 74 + }, + "indices": 75, + "material": 4, + "mode": 4 + } + ] + }, + { + "name": "Cube.020_Material.020_0", + "primitives": [ + { + "attributes": { + "NORMAL": 77, + "POSITION": 76, + "TEXCOORD_0": 78 + }, + "indices": 79, + "material": 6, + "mode": 4 + } + ] + }, + { + "name": "Cube.021_Material.018_0", + "primitives": [ + { + "attributes": { + "NORMAL": 81, + "POSITION": 80, + "TEXCOORD_0": 82 + }, + "indices": 83, + "material": 1, + "mode": 4 + } + ] + }, + { + "name": "Cube.022_Material.017_0", + "primitives": [ + { + "attributes": { + "NORMAL": 85, + "POSITION": 84, + "TEXCOORD_0": 86 + }, + "indices": 87, + "material": 3, + "mode": 4 + } + ] + }, + { + "name": "aorus case fans.008_aorus case fans_0", + "primitives": [ + { + "attributes": { + "NORMAL": 89, + "POSITION": 88, + "TEXCOORD_0": 90 + }, + "indices": 91, + "material": 4, + "mode": 4 + } + ] + }, + { + "name": "aorus case fans.009_aorus case fans_0", + "primitives": [ + { + "attributes": { + "NORMAL": 93, + "POSITION": 92, + "TEXCOORD_0": 94 + }, + "indices": 95, + "material": 4, + "mode": 4 + } + ] + }, + { + "name": "Sphere_Material.019_0", + "primitives": [ + { + "attributes": { + "NORMAL": 97, + "POSITION": 96, + "TEXCOORD_0": 98 + }, + "indices": 99, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Sphere.001_Material.019_0", + "primitives": [ + { + "attributes": { + "NORMAL": 101, + "POSITION": 100, + "TEXCOORD_0": 102 + }, + "indices": 103, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "IOSHIELD_IOSHIELD_0", + "primitives": [ + { + "attributes": { + "NORMAL": 105, + "POSITION": 104, + "TEXCOORD_0": 106 + }, + "indices": 107, + "material": 7, + "mode": 4 + } + ] + }, + { + "name": "Cube.023_Material.021_0", + "primitives": [ + { + "attributes": { + "NORMAL": 109, + "POSITION": 108, + "TEXCOORD_0": 110 + }, + "indices": 111, + "material": 1, + "mode": 4 + } + ] + }, + { + "name": "Cube.024_Material.022_0", + "primitives": [ + { + "attributes": { + "NORMAL": 113, + "POSITION": 112, + "TEXCOORD_0": 114 + }, + "indices": 115, + "material": 1, + "mode": 4 + } + ] + }, + { + "name": "MOBOAORUSORANGETRANS_MOBOAORUSORANGETRANS_0", + "primitives": [ + { + "attributes": { + "NORMAL": 117, + "POSITION": 116, + "TEXCOORD_0": 118 + }, + "indices": 119, + "material": 8, + "mode": 4 + } + ] + }, + { + "name": "Cube.025_Material.023_0", + "primitives": [ + { + "attributes": { + "NORMAL": 121, + "POSITION": 120, + "TEXCOORD_0": 122 + }, + "indices": 123, + "material": 9, + "mode": 4 + } + ] + }, + { + "name": "Cube.026_Material.024_0", + "primitives": [ + { + "attributes": { + "NORMAL": 125, + "POSITION": 124, + "TEXCOORD_0": 126 + }, + "indices": 127, + "material": 10, + "mode": 4 + } + ] + }, + { + "name": "metal-mesh-500x500_metal-mesh-500x500_0", + "primitives": [ + { + "attributes": { + "NORMAL": 129, + "POSITION": 128, + "TEXCOORD_0": 130 + }, + "indices": 131, + "material": 11, + "mode": 4 + } + ] + }, + { + "name": "metal-mesh-500x500.001_metal-mesh-500x500_0", + "primitives": [ + { + "attributes": { + "NORMAL": 133, + "POSITION": 132, + "TEXCOORD_0": 134 + }, + "indices": 135, + "material": 11, + "mode": 4 + } + ] + }, + { + "name": "metal-mesh-500x500.002_metal-mesh-500x500_0", + "primitives": [ + { + "attributes": { + "NORMAL": 137, + "POSITION": 136, + "TEXCOORD_0": 138 + }, + "indices": 139, + "material": 11, + "mode": 4 + } + ] + }, + { + "name": "Cube.027_Material.008_0", + "primitives": [ + { + "attributes": { + "NORMAL": 141, + "POSITION": 140, + "TEXCOORD_0": 142 + }, + "indices": 143, + "material": 12, + "mode": 4 + } + ] + }, + { + "name": "Cube.028_Material.026_0", + "primitives": [ + { + "attributes": { + "NORMAL": 145, + "POSITION": 144, + "TEXCOORD_0": 146 + }, + "indices": 147, + "material": 13, + "mode": 4 + } + ] + }, + { + "name": "Cube.029_Material.025_0", + "primitives": [ + { + "attributes": { + "NORMAL": 149, + "POSITION": 148, + "TEXCOORD_0": 150 + }, + "indices": 151, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Cube.030_Material.026_0", + "primitives": [ + { + "attributes": { + "NORMAL": 153, + "POSITION": 152, + "TEXCOORD_0": 154 + }, + "indices": 155, + "material": 13, + "mode": 4 + } + ] + }, + { + "name": "Cube.031_Material.008_0", + "primitives": [ + { + "attributes": { + "NORMAL": 157, + "POSITION": 156, + "TEXCOORD_0": 158 + }, + "indices": 159, + "material": 12, + "mode": 4 + } + ] + }, + { + "name": "Cube.032_Material.026_0", + "primitives": [ + { + "attributes": { + "NORMAL": 161, + "POSITION": 160, + "TEXCOORD_0": 162 + }, + "indices": 163, + "material": 13, + "mode": 4 + } + ] + }, + { + "name": "Cube.033_Material.025_0", + "primitives": [ + { + "attributes": { + "NORMAL": 165, + "POSITION": 164, + "TEXCOORD_0": 166 + }, + "indices": 167, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Cube.034_Material.026_0", + "primitives": [ + { + "attributes": { + "NORMAL": 169, + "POSITION": 168, + "TEXCOORD_0": 170 + }, + "indices": 171, + "material": 13, + "mode": 4 + } + ] + }, + { + "name": "Cube.035_Material.008_0", + "primitives": [ + { + "attributes": { + "NORMAL": 173, + "POSITION": 172, + "TEXCOORD_0": 174 + }, + "indices": 175, + "material": 12, + "mode": 4 + } + ] + }, + { + "name": "Cube.036_Material.026_0", + "primitives": [ + { + "attributes": { + "NORMAL": 177, + "POSITION": 176, + "TEXCOORD_0": 178 + }, + "indices": 179, + "material": 13, + "mode": 4 + } + ] + }, + { + "name": "Cube.037_Material.025_0", + "primitives": [ + { + "attributes": { + "NORMAL": 181, + "POSITION": 180, + "TEXCOORD_0": 182 + }, + "indices": 183, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Cube.038_Material.026_0", + "primitives": [ + { + "attributes": { + "NORMAL": 185, + "POSITION": 184, + "TEXCOORD_0": 186 + }, + "indices": 187, + "material": 13, + "mode": 4 + } + ] + }, + { + "name": "Cube.039_Material.008_0", + "primitives": [ + { + "attributes": { + "NORMAL": 189, + "POSITION": 188, + "TEXCOORD_0": 190 + }, + "indices": 191, + "material": 12, + "mode": 4 + } + ] + }, + { + "name": "Cube.040_Material.026_0", + "primitives": [ + { + "attributes": { + "NORMAL": 193, + "POSITION": 192, + "TEXCOORD_0": 194 + }, + "indices": 195, + "material": 13, + "mode": 4 + } + ] + }, + { + "name": "Cube.041_Material.025_0", + "primitives": [ + { + "attributes": { + "NORMAL": 197, + "POSITION": 196, + "TEXCOORD_0": 198 + }, + "indices": 199, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Cube.042_Material.026_0", + "primitives": [ + { + "attributes": { + "NORMAL": 201, + "POSITION": 200, + "TEXCOORD_0": 202 + }, + "indices": 203, + "material": 13, + "mode": 4 + } + ] + }, + { + "name": "metal-mesh-500x500.003_metal-mesh-500x500_0", + "primitives": [ + { + "attributes": { + "NORMAL": 205, + "POSITION": 204, + "TEXCOORD_0": 206 + }, + "indices": 207, + "material": 11, + "mode": 4 + } + ] + }, + { + "name": "Cube.043_Material.012_0", + "primitives": [ + { + "attributes": { + "NORMAL": 209, + "POSITION": 208, + "TEXCOORD_0": 210 + }, + "indices": 211, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Cube.045_Material.027_0", + "primitives": [ + { + "attributes": { + "NORMAL": 213, + "POSITION": 212, + "TEXCOORD_0": 214 + }, + "indices": 215, + "material": 14, + "mode": 4 + } + ] + }, + { + "name": "rgb-hdd-cover-aorus-v1_rgb-hdd-cover-aorus-v1_0", + "primitives": [ + { + "attributes": { + "NORMAL": 217, + "POSITION": 216, + "TEXCOORD_0": 218 + }, + "indices": 219, + "material": 15, + "mode": 4 + } + ] + }, + { + "name": "maxresdefault (1)_maxresdefault (1)_0", + "primitives": [ + { + "attributes": { + "NORMAL": 221, + "POSITION": 220, + "TEXCOORD_0": 222 + }, + "indices": 223, + "material": 16, + "mode": 4 + } + ] + }, + { + "name": "Cylinder.001_Material.028_0", + "primitives": [ + { + "attributes": { + "NORMAL": 225, + "POSITION": 224, + "TEXCOORD_0": 226 + }, + "indices": 227, + "material": 17, + "mode": 4 + } + ] + }, + { + "name": "Cylinder.002_Material.029_0", + "primitives": [ + { + "attributes": { + "NORMAL": 229, + "POSITION": 228, + "TEXCOORD_0": 230 + }, + "indices": 231, + "material": 17, + "mode": 4 + } + ] + }, + { + "name": "Cube.044_Material.012_0", + "primitives": [ + { + "attributes": { + "NORMAL": 233, + "POSITION": 232, + "TEXCOORD_0": 234 + }, + "indices": 235, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Cylinder.003_Material.031_0", + "primitives": [ + { + "attributes": { + "NORMAL": 237, + "POSITION": 236, + "TEXCOORD_0": 238 + }, + "indices": 239, + "material": 17, + "mode": 4 + } + ] + }, + { + "name": "Cylinder.004_Material.030_0", + "primitives": [ + { + "attributes": { + "NORMAL": 241, + "POSITION": 240, + "TEXCOORD_0": 242 + }, + "indices": 243, + "material": 17, + "mode": 4 + } + ] + }, + { + "name": "NVIDIA LOGO_NVIDIA LOGO_0", + "primitives": [ + { + "attributes": { + "NORMAL": 245, + "POSITION": 244, + "TEXCOORD_0": 246 + }, + "indices": 247, + "material": 18, + "mode": 4 + } + ] + }, + { + "name": "psuback_psuback_0", + "primitives": [ + { + "attributes": { + "NORMAL": 249, + "POSITION": 248, + "TEXCOORD_0": 250 + }, + "indices": 251, + "material": 19, + "mode": 4 + } + ] + }, + { + "name": "usb_usb_0", + "primitives": [ + { + "attributes": { + "NORMAL": 253, + "POSITION": 252, + "TEXCOORD_0": 254 + }, + "indices": 255, + "material": 20, + "mode": 4 + } + ] + }, + { + "name": "usb.001_usb_0", + "primitives": [ + { + "attributes": { + "NORMAL": 257, + "POSITION": 256, + "TEXCOORD_0": 258 + }, + "indices": 259, + "material": 20, + "mode": 4 + } + ] + }, + { + "name": "usb.002_usb_0", + "primitives": [ + { + "attributes": { + "NORMAL": 261, + "POSITION": 260, + "TEXCOORD_0": 262 + }, + "indices": 263, + "material": 20, + "mode": 4 + } + ] + }, + { + "name": "Torus_Material.013_0", + "primitives": [ + { + "attributes": { + "NORMAL": 265, + "POSITION": 264, + "TEXCOORD_0": 266 + }, + "indices": 267, + "material": 21, + "mode": 4 + } + ] + }, + { + "name": "Torus.001_Material.032_0", + "primitives": [ + { + "attributes": { + "NORMAL": 269, + "POSITION": 268, + "TEXCOORD_0": 270 + }, + "indices": 271, + "material": 22, + "mode": 4 + } + ] + }, + { + "name": "usb.003_usb_0", + "primitives": [ + { + "attributes": { + "NORMAL": 273, + "POSITION": 272, + "TEXCOORD_0": 274 + }, + "indices": 275, + "material": 20, + "mode": 4 + } + ] + }, + { + "name": "Cube.046_Material.034_0", + "primitives": [ + { + "attributes": { + "NORMAL": 277, + "POSITION": 276, + "TEXCOORD_0": 278 + }, + "indices": 279, + "material": 23, + "mode": 4 + } + ] + }, + { + "name": "Cube.047_Material.033_0", + "primitives": [ + { + "attributes": { + "NORMAL": 281, + "POSITION": 280, + "TEXCOORD_0": 282 + }, + "indices": 283, + "material": 23, + "mode": 4 + } + ] + }, + { + "name": "Cube.048_Material.035_0", + "primitives": [ + { + "attributes": { + "NORMAL": 285, + "POSITION": 284, + "TEXCOORD_0": 286 + }, + "indices": 287, + "material": 24, + "mode": 4 + } + ] + }, + { + "name": "Cube.049_Material.040_0", + "primitives": [ + { + "attributes": { + "NORMAL": 289, + "POSITION": 288, + "TEXCOORD_0": 290 + }, + "indices": 291, + "material": 25, + "mode": 4 + } + ] + }, + { + "name": "Cube.050_Material.038_0", + "primitives": [ + { + "attributes": { + "NORMAL": 293, + "POSITION": 292, + "TEXCOORD_0": 294 + }, + "indices": 295, + "material": 25, + "mode": 4 + } + ] + }, + { + "name": "Cube.051_Material.042_0", + "primitives": [ + { + "attributes": { + "NORMAL": 297, + "POSITION": 296, + "TEXCOORD_0": 298 + }, + "indices": 299, + "material": 26, + "mode": 4 + } + ] + }, + { + "name": "Cylinder.005_Material.041_0", + "primitives": [ + { + "attributes": { + "NORMAL": 301, + "POSITION": 300, + "TEXCOORD_0": 302 + }, + "indices": 303, + "material": 27, + "mode": 4 + } + ] + }, + { + "name": "Cylinder.011_Material.045_0", + "primitives": [ + { + "attributes": { + "NORMAL": 305, + "POSITION": 304, + "TEXCOORD_0": 306 + }, + "indices": 307, + "material": 28, + "mode": 4 + } + ] + }, + { + "name": "metal-mesh-500x500.004_metal-mesh-500x500_0", + "primitives": [ + { + "attributes": { + "NORMAL": 309, + "POSITION": 308, + "TEXCOORD_0": 310 + }, + "indices": 311, + "material": 11, + "mode": 4 + } + ] + }, + { + "name": "Text_Material.046_0", + "primitives": [ + { + "attributes": { + "NORMAL": 313, + "POSITION": 312, + "TEXCOORD_0": 314 + }, + "indices": 315, + "material": 29, + "mode": 4 + } + ] + }, + { + "name": "Cube.052_Material.047_0", + "primitives": [ + { + "attributes": { + "NORMAL": 317, + "POSITION": 316, + "TEXCOORD_0": 318 + }, + "indices": 319, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "test-aorus-m2-souris-aorus-rgb2_test-aorus-m2-souris-aorus-rgb2_0", + "primitives": [ + { + "attributes": { + "NORMAL": 321, + "POSITION": 320, + "TEXCOORD_0": 322 + }, + "indices": 323, + "material": 30, + "mode": 4 + } + ] + }, + { + "name": "Cube.053_Material.048_0", + "primitives": [ + { + "attributes": { + "NORMAL": 325, + "POSITION": 324, + "TEXCOORD_0": 326 + }, + "indices": 327, + "material": 31, + "mode": 4 + } + ] + }, + { + "name": "Cube.054_Material.049_0", + "primitives": [ + { + "attributes": { + "NORMAL": 329, + "POSITION": 328, + "TEXCOORD_0": 330 + }, + "indices": 331, + "material": 32, + "mode": 4 + } + ] + }, + { + "name": "Cube.055_Material.054_0", + "primitives": [ + { + "attributes": { + "NORMAL": 333, + "POSITION": 332, + "TEXCOORD_0": 334 + }, + "indices": 335, + "material": 33, + "mode": 4 + } + ] + }, + { + "name": "Cube.056_Material.061_0", + "primitives": [ + { + "attributes": { + "NORMAL": 337, + "POSITION": 336, + "TEXCOORD_0": 338 + }, + "indices": 339, + "material": 34, + "mode": 4 + } + ] + }, + { + "name": "Cylinder.006_Material.050_0", + "primitives": [ + { + "attributes": { + "NORMAL": 341, + "POSITION": 340, + "TEXCOORD_0": 342 + }, + "indices": 343, + "material": 35, + "mode": 4 + } + ] + }, + { + "name": "Cylinder.007_Material.051_0", + "primitives": [ + { + "attributes": { + "NORMAL": 345, + "POSITION": 344, + "TEXCOORD_0": 346 + }, + "indices": 347, + "material": 36, + "mode": 4 + } + ] + }, + { + "name": "Cylinder.008_Material.052_0", + "primitives": [ + { + "attributes": { + "NORMAL": 349, + "POSITION": 348, + "TEXCOORD_0": 350 + }, + "indices": 351, + "material": 35, + "mode": 4 + } + ] + }, + { + "name": "Plane_Material.053_0", + "primitives": [ + { + "attributes": { + "NORMAL": 353, + "POSITION": 352, + "TEXCOORD_0": 354 + }, + "indices": 355, + "material": 37, + "mode": 4 + } + ] + }, + { + "name": "geforcertx_Material.056_0", + "primitives": [ + { + "attributes": { + "NORMAL": 357, + "POSITION": 356, + "TEXCOORD_0": 358 + }, + "indices": 359, + "material": 38, + "mode": 4 + } + ] + }, + { + "name": "Cube.057_Material.059_0", + "primitives": [ + { + "attributes": { + "NORMAL": 361, + "POSITION": 360, + "TEXCOORD_0": 362 + }, + "indices": 363, + "material": 39, + "mode": 4 + } + ] + }, + { + "name": "Cube.059_Material.058_0", + "primitives": [ + { + "attributes": { + "NORMAL": 365, + "POSITION": 364, + "TEXCOORD_0": 366 + }, + "indices": 367, + "material": 40, + "mode": 4 + } + ] + }, + { + "name": "Cube.060_Material.062_0", + "primitives": [ + { + "attributes": { + "NORMAL": 369, + "POSITION": 368, + "TEXCOORD_0": 370 + }, + "indices": 371, + "material": 41, + "mode": 4 + } + ] + }, + { + "name": "Cube.058_Material.063_0", + "primitives": [ + { + "attributes": { + "NORMAL": 373, + "POSITION": 372, + "TEXCOORD_0": 374 + }, + "indices": 375, + "material": 42, + "mode": 4 + } + ] + }, + { + "name": "aorus logotranspa_aorus logotranspa_0", + "primitives": [ + { + "attributes": { + "NORMAL": 377, + "POSITION": 376, + "TEXCOORD_0": 378 + }, + "indices": 379, + "material": 43, + "mode": 4 + } + ] + }, + { + "name": "Cube.061_Material.064_0", + "primitives": [ + { + "attributes": { + "NORMAL": 381, + "POSITION": 380, + "TEXCOORD_0": 382 + }, + "indices": 383, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Cube.062_Material.065_0", + "primitives": [ + { + "attributes": { + "NORMAL": 385, + "POSITION": 384, + "TEXCOORD_0": 386 + }, + "indices": 387, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Cube.064_Material.074_0", + "primitives": [ + { + "attributes": { + "NORMAL": 389, + "POSITION": 388, + "TEXCOORD_0": 390 + }, + "indices": 391, + "material": 44, + "mode": 4 + } + ] + }, + { + "name": "Cube.067_Material.075_0", + "primitives": [ + { + "attributes": { + "NORMAL": 393, + "POSITION": 392, + "TEXCOORD_0": 394 + }, + "indices": 395, + "material": 45, + "mode": 4 + } + ] + }, + { + "name": "Cube.063_Material.074_0", + "primitives": [ + { + "attributes": { + "NORMAL": 397, + "POSITION": 396, + "TEXCOORD_0": 398 + }, + "indices": 399, + "material": 44, + "mode": 4 + } + ] + }, + { + "name": "Cube.065_Material.074_0", + "primitives": [ + { + "attributes": { + "NORMAL": 401, + "POSITION": 400, + "TEXCOORD_0": 402 + }, + "indices": 403, + "material": 44, + "mode": 4 + } + ] + }, + { + "name": "Cube.066_Material.076_0", + "primitives": [ + { + "attributes": { + "NORMAL": 405, + "POSITION": 404, + "TEXCOORD_0": 406 + }, + "indices": 407, + "material": 46, + "mode": 4 + } + ] + }, + { + "name": "Cube.072_Material.078_0", + "primitives": [ + { + "attributes": { + "NORMAL": 409, + "POSITION": 408, + "TEXCOORD_0": 410 + }, + "indices": 411, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Cube.073_Material.079_0", + "primitives": [ + { + "attributes": { + "NORMAL": 413, + "POSITION": 412, + "TEXCOORD_0": 414 + }, + "indices": 415, + "material": 12, + "mode": 4 + } + ] + }, + { + "name": "Cube.076_Material.080_0", + "primitives": [ + { + "attributes": { + "NORMAL": 417, + "POSITION": 416, + "TEXCOORD_0": 418 + }, + "indices": 419, + "material": 44, + "mode": 4 + } + ] + }, + { + "name": "Cylinder.009_Material.081_0", + "primitives": [ + { + "attributes": { + "NORMAL": 421, + "POSITION": 420, + "TEXCOORD_0": 422 + }, + "indices": 423, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Cylinder.010_Material.077_0", + "primitives": [ + { + "attributes": { + "NORMAL": 425, + "POSITION": 424, + "TEXCOORD_0": 426 + }, + "indices": 427, + "material": 47, + "mode": 4 + } + ] + }, + { + "name": "Cylinder.012_Material.082_0", + "primitives": [ + { + "attributes": { + "NORMAL": 429, + "POSITION": 428, + "TEXCOORD_0": 430 + }, + "indices": 431, + "material": 48, + "mode": 4 + } + ] + }, + { + "name": "BezierCurve.001_Material.085_0", + "primitives": [ + { + "attributes": { + "NORMAL": 433, + "POSITION": 432, + "TEXCOORD_0": 434 + }, + "indices": 435, + "material": 49, + "mode": 4 + } + ] + }, + { + "name": "Cube.074_Material.084_0", + "primitives": [ + { + "attributes": { + "NORMAL": 437, + "POSITION": 436, + "TEXCOORD_0": 438 + }, + "indices": 439, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Cube.075_Material.086_0", + "primitives": [ + { + "attributes": { + "NORMAL": 441, + "POSITION": 440, + "TEXCOORD_0": 442 + }, + "indices": 443, + "material": 50, + "mode": 4 + } + ] + }, + { + "name": "BezierCurve.002_Material.087_0", + "primitives": [ + { + "attributes": { + "NORMAL": 445, + "POSITION": 444, + "TEXCOORD_0": 446 + }, + "indices": 447, + "material": 51, + "mode": 4 + } + ] + }, + { + "name": "Cube.077_Material.083_0", + "primitives": [ + { + "attributes": { + "NORMAL": 449, + "POSITION": 448, + "TEXCOORD_0": 450 + }, + "indices": 451, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Cube.078_Material.083_0", + "primitives": [ + { + "attributes": { + "NORMAL": 453, + "POSITION": 452, + "TEXCOORD_0": 454 + }, + "indices": 455, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "BezierCurve_Material.088_0", + "primitives": [ + { + "attributes": { + "NORMAL": 457, + "POSITION": 456, + "TEXCOORD_0": 458 + }, + "indices": 459, + "material": 52, + "mode": 4 + } + ] + }, + { + "name": "Cube.079_Material.089_0", + "primitives": [ + { + "attributes": { + "NORMAL": 461, + "POSITION": 460, + "TEXCOORD_0": 462 + }, + "indices": 463, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Cube.080_Material.089_0", + "primitives": [ + { + "attributes": { + "NORMAL": 465, + "POSITION": 464, + "TEXCOORD_0": 466 + }, + "indices": 467, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "BezierCurve.003_Material.091_0", + "primitives": [ + { + "attributes": { + "NORMAL": 469, + "POSITION": 468, + "TEXCOORD_0": 470 + }, + "indices": 471, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Cube.081_Material.090_0", + "primitives": [ + { + "attributes": { + "NORMAL": 473, + "POSITION": 472, + "TEXCOORD_0": 474 + }, + "indices": 475, + "material": 53, + "mode": 4 + } + ] + }, + { + "name": "Cube.068_Material.092_0", + "primitives": [ + { + "attributes": { + "NORMAL": 477, + "POSITION": 476, + "TEXCOORD_0": 478 + }, + "indices": 479, + "material": 54, + "mode": 4 + } + ] + }, + { + "name": "Color-PewDiePie-Logo_Color-PewDiePie-Logo_0", + "primitives": [ + { + "attributes": { + "NORMAL": 481, + "POSITION": 480, + "TEXCOORD_0": 482 + }, + "indices": 483, + "material": 55, + "mode": 4 + } + ] + }, + { + "name": "Cube.069_Material.093_0", + "primitives": [ + { + "attributes": { + "NORMAL": 485, + "POSITION": 484, + "TEXCOORD_0": 486 + }, + "indices": 487, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Cylinder.013_Material.094_0", + "primitives": [ + { + "attributes": { + "NORMAL": 489, + "POSITION": 488, + "TEXCOORD_0": 490 + }, + "indices": 491, + "material": 56, + "mode": 4 + } + ] + }, + { + "name": "Cylinder.014_Material.095_0", + "primitives": [ + { + "attributes": { + "NORMAL": 493, + "POSITION": 492, + "TEXCOORD_0": 494 + }, + "indices": 495, + "material": 52, + "mode": 4 + } + ] + }, + { + "name": "Cylinder.015_Material.096_0", + "primitives": [ + { + "attributes": { + "NORMAL": 497, + "POSITION": 496, + "TEXCOORD_0": 498 + }, + "indices": 499, + "material": 52, + "mode": 4 + } + ] + }, + { + "name": "Text.001_Material.097_0", + "primitives": [ + { + "attributes": { + "NORMAL": 501, + "POSITION": 500, + "TEXCOORD_0": 502 + }, + "indices": 503, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Cube.088_Material.098_0", + "primitives": [ + { + "attributes": { + "NORMAL": 505, + "POSITION": 504, + "TEXCOORD_0": 506 + }, + "indices": 507, + "material": 57, + "mode": 4 + } + ] + }, + { + "name": "BezierCurve.004_Material.099_0", + "primitives": [ + { + "attributes": { + "NORMAL": 509, + "POSITION": 508, + "TEXCOORD_0": 510 + }, + "indices": 511, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Cube.070_Material.100_0", + "primitives": [ + { + "attributes": { + "NORMAL": 513, + "POSITION": 512, + "TEXCOORD_0": 514 + }, + "indices": 515, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Cube.071_Material.101_0", + "primitives": [ + { + "attributes": { + "NORMAL": 517, + "POSITION": 516, + "TEXCOORD_0": 518 + }, + "indices": 519, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Cube.082_Material.101_0", + "primitives": [ + { + "attributes": { + "NORMAL": 521, + "POSITION": 520, + "TEXCOORD_0": 522 + }, + "indices": 523, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Cylinder.016_Material.102_0", + "primitives": [ + { + "attributes": { + "NORMAL": 525, + "POSITION": 524, + "TEXCOORD_0": 526 + }, + "indices": 527, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "BezierCircle_Material.104_0", + "primitives": [ + { + "attributes": { + "NORMAL": 529, + "POSITION": 528, + "TEXCOORD_0": 530 + }, + "indices": 531, + "material": 58, + "mode": 4 + } + ] + }, + { + "name": "BezierCurve.005_Material.103_0", + "primitives": [ + { + "attributes": { + "NORMAL": 533, + "POSITION": 532, + "TEXCOORD_0": 534 + }, + "indices": 535, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "BezierCurve.006_Material.106_0", + "primitives": [ + { + "attributes": { + "NORMAL": 537, + "POSITION": 536, + "TEXCOORD_0": 538 + }, + "indices": 539, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "BezierCurve.007_Material.105_0", + "primitives": [ + { + "attributes": { + "NORMAL": 541, + "POSITION": 540, + "TEXCOORD_0": 542 + }, + "indices": 543, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "BezierCurve.008_Material.107_0", + "primitives": [ + { + "attributes": { + "NORMAL": 545, + "POSITION": 544, + "TEXCOORD_0": 546 + }, + "indices": 547, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Cube.001_Material.055_0", + "primitives": [ + { + "attributes": { + "NORMAL": 549, + "POSITION": 548, + "TEXCOORD_0": 550 + }, + "indices": 551, + "material": 59, + "mode": 4 + } + ] + }, + { + "name": "Cube.002_Material.044_0", + "primitives": [ + { + "attributes": { + "NORMAL": 553, + "POSITION": 552, + "TEXCOORD_0": 554 + }, + "indices": 555, + "material": 60, + "mode": 4 + } + ] + }, + { + "name": "gallerymodel_gallerymodel_0", + "primitives": [ + { + "attributes": { + "NORMAL": 557, + "POSITION": 556, + "TEXCOORD_0": 558 + }, + "indices": 559, + "material": 61, + "mode": 4 + } + ] + }, + { + "name": "Cube.003_Material.001_0", + "primitives": [ + { + "attributes": { + "NORMAL": 561, + "POSITION": 560, + "TEXCOORD_0": 562 + }, + "indices": 563, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "bg2_bg2_0", + "primitives": [ + { + "attributes": { + "NORMAL": 565, + "POSITION": 564, + "TEXCOORD_0": 566 + }, + "indices": 567, + "material": 62, + "mode": 4 + } + ] + }, + { + "name": "MY SCREEN_MY SCREEN_0", + "primitives": [ + { + "attributes": { + "NORMAL": 569, + "POSITION": 568, + "TEXCOORD_0": 570 + }, + "indices": 571, + "material": 63, + "mode": 4 + } + ] + }, + { + "name": "gigabyte-logo_gigabyte-logo_0", + "primitives": [ + { + "attributes": { + "NORMAL": 573, + "POSITION": 572, + "TEXCOORD_0": 574 + }, + "indices": 575, + "material": 64, + "mode": 4 + } + ] + }, + { + "name": "gigabyte-logo.001_gigabyte-logo_0", + "primitives": [ + { + "attributes": { + "NORMAL": 577, + "POSITION": 576, + "TEXCOORD_0": 578 + }, + "indices": 579, + "material": 64, + "mode": 4 + } + ] + }, + { + "name": "Cube.004_Material.002_0", + "primitives": [ + { + "attributes": { + "NORMAL": 581, + "POSITION": 580, + "TEXCOORD_0": 582 + }, + "indices": 583, + "material": 65, + "mode": 4 + } + ] + }, + { + "name": "Cube.005_Material.003_0", + "primitives": [ + { + "attributes": { + "NORMAL": 585, + "POSITION": 584, + "TEXCOORD_0": 586 + }, + "indices": 587, + "material": 66, + "mode": 4 + } + ] + }, + { + "name": "Cube.006_Material.043_0", + "primitives": [ + { + "attributes": { + "NORMAL": 589, + "POSITION": 588, + "TEXCOORD_0": 590 + }, + "indices": 591, + "material": 67, + "mode": 4 + } + ] + }, + { + "name": "Cube.007_Material.037_0", + "primitives": [ + { + "attributes": { + "NORMAL": 593, + "POSITION": 592, + "TEXCOORD_0": 594 + }, + "indices": 595, + "material": 68, + "mode": 4 + } + ] + }, + { + "name": "Cube.008_Material.036_0", + "primitives": [ + { + "attributes": { + "NORMAL": 597, + "POSITION": 596, + "TEXCOORD_0": 598 + }, + "indices": 599, + "material": 69, + "mode": 4 + } + ] + }, + { + "name": "Cube.009_Material.039_0", + "primitives": [ + { + "attributes": { + "NORMAL": 601, + "POSITION": 600, + "TEXCOORD_0": 602 + }, + "indices": 603, + "material": 69, + "mode": 4 + } + ] + }, + { + "name": "Cube.010_Material.006_0", + "primitives": [ + { + "attributes": { + "NORMAL": 605, + "POSITION": 604, + "TEXCOORD_0": 606 + }, + "indices": 607, + "material": 70, + "mode": 4 + } + ] + }, + { + "name": "Object_8_Tastatur_Seite_0", + "primitives": [ + { + "attributes": { + "NORMAL": 609, + "POSITION": 608, + "TEXCOORD_0": 610, + "TEXCOORD_1": 611, + "TEXCOORD_2": 612 + }, + "indices": 613, + "material": 71, + "mode": 4 + } + ] + }, + { + "name": "Object_10_Tastatur_Unterseite_0", + "primitives": [ + { + "attributes": { + "NORMAL": 615, + "POSITION": 614, + "TEXCOORD_0": 616, + "TEXCOORD_1": 617, + "TEXCOORD_2": 618 + }, + "indices": 619, + "material": 72, + "mode": 4 + } + ] + }, + { + "name": "Object_12_Tastatur_Unterseite_0", + "primitives": [ + { + "attributes": { + "NORMAL": 621, + "POSITION": 620, + "TEXCOORD_0": 622, + "TEXCOORD_1": 623, + "TEXCOORD_2": 624 + }, + "indices": 625, + "material": 72, + "mode": 4 + } + ] + }, + { + "name": "Object_14_Material.004_0", + "primitives": [ + { + "attributes": { + "NORMAL": 627, + "POSITION": 626, + "TEXCOORD_0": 628, + "TEXCOORD_1": 629, + "TEXCOORD_2": 630 + }, + "indices": 631, + "material": 73, + "mode": 4 + } + ] + }, + { + "name": "Object_16_Material.004_0", + "primitives": [ + { + "attributes": { + "NORMAL": 633, + "POSITION": 632, + "TEXCOORD_0": 634, + "TEXCOORD_1": 635, + "TEXCOORD_2": 636 + }, + "indices": 637, + "material": 73, + "mode": 4 + } + ] + }, + { + "name": "Object_18_Material.004_0", + "primitives": [ + { + "attributes": { + "NORMAL": 639, + "POSITION": 638, + "TEXCOORD_0": 640, + "TEXCOORD_1": 641, + "TEXCOORD_2": 642 + }, + "indices": 643, + "material": 73, + "mode": 4 + } + ] + }, + { + "name": "Object_20_Material.004_0", + "primitives": [ + { + "attributes": { + "NORMAL": 645, + "POSITION": 644, + "TEXCOORD_0": 646, + "TEXCOORD_1": 647, + "TEXCOORD_2": 648 + }, + "indices": 649, + "material": 73, + "mode": 4 + } + ] + }, + { + "name": "Object_22_Material.004_0", + "primitives": [ + { + "attributes": { + "NORMAL": 651, + "POSITION": 650, + "TEXCOORD_0": 652, + "TEXCOORD_1": 653, + "TEXCOORD_2": 654 + }, + "indices": 655, + "material": 73, + "mode": 4 + } + ] + }, + { + "name": "Object_24_Tastatur_Seite_0", + "primitives": [ + { + "attributes": { + "NORMAL": 657, + "POSITION": 656, + "TEXCOORD_0": 658, + "TEXCOORD_1": 659, + "TEXCOORD_2": 660 + }, + "indices": 661, + "material": 71, + "mode": 4 + } + ] + }, + { + "name": "Object_26_Material.004_0", + "primitives": [ + { + "attributes": { + "NORMAL": 663, + "POSITION": 662, + "TEXCOORD_0": 664, + "TEXCOORD_1": 665, + "TEXCOORD_2": 666 + }, + "indices": 667, + "material": 73, + "mode": 4 + } + ] + }, + { + "name": "Object_28_Material.004_0", + "primitives": [ + { + "attributes": { + "NORMAL": 669, + "POSITION": 668, + "TEXCOORD_0": 670, + "TEXCOORD_1": 671, + "TEXCOORD_2": 672 + }, + "indices": 673, + "material": 73, + "mode": 4 + } + ] + }, + { + "name": "Object_30_Material.007_0", + "primitives": [ + { + "attributes": { + "NORMAL": 675, + "POSITION": 674, + "TEXCOORD_0": 676, + "TEXCOORD_1": 677, + "TEXCOORD_2": 678 + }, + "indices": 679, + "material": 74, + "mode": 4 + } + ] + }, + { + "name": "Object_32_Material.004_0", + "primitives": [ + { + "attributes": { + "NORMAL": 681, + "POSITION": 680, + "TEXCOORD_0": 682, + "TEXCOORD_1": 683, + "TEXCOORD_2": 684 + }, + "indices": 685, + "material": 73, + "mode": 4 + } + ] + }, + { + "name": "Object_34_Material.004_0", + "primitives": [ + { + "attributes": { + "NORMAL": 687, + "POSITION": 686, + "TEXCOORD_0": 688, + "TEXCOORD_1": 689, + "TEXCOORD_2": 690 + }, + "indices": 691, + "material": 73, + "mode": 4 + } + ] + }, + { + "name": "Object_36_Tastatur_Seite_0", + "primitives": [ + { + "attributes": { + "NORMAL": 693, + "POSITION": 692, + "TEXCOORD_0": 694, + "TEXCOORD_1": 695, + "TEXCOORD_2": 696 + }, + "indices": 697, + "material": 71, + "mode": 4 + } + ] + }, + { + "name": "Object_38_Tastatur_Seite_0", + "primitives": [ + { + "attributes": { + "NORMAL": 699, + "POSITION": 698, + "TEXCOORD_0": 700, + "TEXCOORD_1": 701, + "TEXCOORD_2": 702 + }, + "indices": 703, + "material": 71, + "mode": 4 + } + ] + }, + { + "name": "Object_40_Tastatur_Seite_0", + "primitives": [ + { + "attributes": { + "NORMAL": 705, + "POSITION": 704, + "TEXCOORD_0": 706, + "TEXCOORD_1": 707, + "TEXCOORD_2": 708 + }, + "indices": 709, + "material": 71, + "mode": 4 + } + ] + }, + { + "name": "Object_42_Tastatur_Seite_0", + "primitives": [ + { + "attributes": { + "NORMAL": 711, + "POSITION": 710, + "TEXCOORD_0": 712, + "TEXCOORD_1": 713, + "TEXCOORD_2": 714 + }, + "indices": 715, + "material": 71, + "mode": 4 + } + ] + }, + { + "name": "Object_44_Tastatur_Seite_0", + "primitives": [ + { + "attributes": { + "NORMAL": 717, + "POSITION": 716, + "TEXCOORD_0": 718, + "TEXCOORD_1": 719, + "TEXCOORD_2": 720 + }, + "indices": 721, + "material": 71, + "mode": 4 + } + ] + }, + { + "name": "Object_47_Material.005_0", + "primitives": [ + { + "attributes": { + "NORMAL": 723, + "POSITION": 722, + "TEXCOORD_0": 724, + "TEXCOORD_1": 725, + "TEXCOORD_2": 726 + }, + "indices": 727, + "material": 75, + "mode": 4 + } + ] + }, + { + "name": "Object_49_Tasten_2_0", + "primitives": [ + { + "attributes": { + "NORMAL": 729, + "POSITION": 728, + "TEXCOORD_0": 730, + "TEXCOORD_1": 731, + "TEXCOORD_2": 732 + }, + "indices": 733, + "material": 76, + "mode": 4 + } + ] + }, + { + "name": "Object_51_Tasten_2_0", + "primitives": [ + { + "attributes": { + "NORMAL": 735, + "POSITION": 734, + "TEXCOORD_0": 736, + "TEXCOORD_1": 737, + "TEXCOORD_2": 738 + }, + "indices": 739, + "material": 76, + "mode": 4 + } + ] + }, + { + "name": "Object_53_Tasten_2_0", + "primitives": [ + { + "attributes": { + "NORMAL": 741, + "POSITION": 740, + "TEXCOORD_0": 742, + "TEXCOORD_1": 743, + "TEXCOORD_2": 744 + }, + "indices": 745, + "material": 76, + "mode": 4 + } + ] + }, + { + "name": "Object_55_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 747, + "POSITION": 746, + "TEXCOORD_0": 748, + "TEXCOORD_1": 749, + "TEXCOORD_2": 750 + }, + "indices": 751, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_57_Tasten_2_0", + "primitives": [ + { + "attributes": { + "NORMAL": 753, + "POSITION": 752, + "TEXCOORD_0": 754, + "TEXCOORD_1": 755, + "TEXCOORD_2": 756 + }, + "indices": 757, + "material": 76, + "mode": 4 + } + ] + }, + { + "name": "Object_59_Material.060_0", + "primitives": [ + { + "attributes": { + "NORMAL": 759, + "POSITION": 758, + "TEXCOORD_0": 760, + "TEXCOORD_1": 761, + "TEXCOORD_2": 762 + }, + "indices": 763, + "material": 78, + "mode": 4 + } + ] + }, + { + "name": "Object_61_Tasten_2_0", + "primitives": [ + { + "attributes": { + "NORMAL": 765, + "POSITION": 764, + "TEXCOORD_0": 766, + "TEXCOORD_1": 767, + "TEXCOORD_2": 768 + }, + "indices": 769, + "material": 76, + "mode": 4 + } + ] + }, + { + "name": "Object_63_Material.060_0", + "primitives": [ + { + "attributes": { + "NORMAL": 771, + "POSITION": 770, + "TEXCOORD_0": 772, + "TEXCOORD_1": 773, + "TEXCOORD_2": 774 + }, + "indices": 775, + "material": 78, + "mode": 4 + } + ] + }, + { + "name": "Object_65_Material.066_0", + "primitives": [ + { + "attributes": { + "NORMAL": 777, + "POSITION": 776, + "TEXCOORD_0": 778, + "TEXCOORD_1": 779, + "TEXCOORD_2": 780 + }, + "indices": 781, + "material": 79, + "mode": 4 + } + ] + }, + { + "name": "Object_67_Material.067_0", + "primitives": [ + { + "attributes": { + "NORMAL": 783, + "POSITION": 782, + "TEXCOORD_0": 784, + "TEXCOORD_1": 785, + "TEXCOORD_2": 786 + }, + "indices": 787, + "material": 80, + "mode": 4 + } + ] + }, + { + "name": "Object_69_Material.066_0", + "primitives": [ + { + "attributes": { + "NORMAL": 789, + "POSITION": 788, + "TEXCOORD_0": 790, + "TEXCOORD_1": 791, + "TEXCOORD_2": 792 + }, + "indices": 793, + "material": 79, + "mode": 4 + } + ] + }, + { + "name": "Object_71_Tasten_2_0", + "primitives": [ + { + "attributes": { + "NORMAL": 795, + "POSITION": 794, + "TEXCOORD_0": 796, + "TEXCOORD_1": 797, + "TEXCOORD_2": 798 + }, + "indices": 799, + "material": 76, + "mode": 4 + } + ] + }, + { + "name": "Object_73_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 801, + "POSITION": 800, + "TEXCOORD_0": 802, + "TEXCOORD_1": 803, + "TEXCOORD_2": 804 + }, + "indices": 805, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_75_Material.066_0", + "primitives": [ + { + "attributes": { + "NORMAL": 807, + "POSITION": 806, + "TEXCOORD_0": 808, + "TEXCOORD_1": 809, + "TEXCOORD_2": 810 + }, + "indices": 811, + "material": 79, + "mode": 4 + } + ] + }, + { + "name": "Object_77_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 813, + "POSITION": 812, + "TEXCOORD_0": 814, + "TEXCOORD_1": 815, + "TEXCOORD_2": 816 + }, + "indices": 817, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_79_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 819, + "POSITION": 818, + "TEXCOORD_0": 820, + "TEXCOORD_1": 821, + "TEXCOORD_2": 822 + }, + "indices": 823, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_81_Material.068_0", + "primitives": [ + { + "attributes": { + "NORMAL": 825, + "POSITION": 824, + "TEXCOORD_0": 826, + "TEXCOORD_1": 827, + "TEXCOORD_2": 828 + }, + "indices": 829, + "material": 81, + "mode": 4 + } + ] + }, + { + "name": "Object_83_Tasten_2_0", + "primitives": [ + { + "attributes": { + "NORMAL": 831, + "POSITION": 830, + "TEXCOORD_0": 832, + "TEXCOORD_1": 833, + "TEXCOORD_2": 834 + }, + "indices": 835, + "material": 76, + "mode": 4 + } + ] + }, + { + "name": "Object_85_Material.068_0", + "primitives": [ + { + "attributes": { + "NORMAL": 837, + "POSITION": 836, + "TEXCOORD_0": 838, + "TEXCOORD_1": 839, + "TEXCOORD_2": 840 + }, + "indices": 841, + "material": 81, + "mode": 4 + } + ] + }, + { + "name": "Object_87_Tasten_2_0", + "primitives": [ + { + "attributes": { + "NORMAL": 843, + "POSITION": 842, + "TEXCOORD_0": 844, + "TEXCOORD_1": 845, + "TEXCOORD_2": 846 + }, + "indices": 847, + "material": 76, + "mode": 4 + } + ] + }, + { + "name": "Object_89_Material.068_0", + "primitives": [ + { + "attributes": { + "NORMAL": 849, + "POSITION": 848, + "TEXCOORD_0": 850, + "TEXCOORD_1": 851, + "TEXCOORD_2": 852 + }, + "indices": 853, + "material": 81, + "mode": 4 + } + ] + }, + { + "name": "Object_91_Material.067_0", + "primitives": [ + { + "attributes": { + "NORMAL": 855, + "POSITION": 854, + "TEXCOORD_0": 856, + "TEXCOORD_1": 857, + "TEXCOORD_2": 858 + }, + "indices": 859, + "material": 80, + "mode": 4 + } + ] + }, + { + "name": "Object_93_Material.069_0", + "primitives": [ + { + "attributes": { + "NORMAL": 861, + "POSITION": 860, + "TEXCOORD_0": 862, + "TEXCOORD_1": 863, + "TEXCOORD_2": 864 + }, + "indices": 865, + "material": 82, + "mode": 4 + } + ] + }, + { + "name": "Object_95_Tasten_2_0", + "primitives": [ + { + "attributes": { + "NORMAL": 867, + "POSITION": 866, + "TEXCOORD_0": 868, + "TEXCOORD_1": 869, + "TEXCOORD_2": 870 + }, + "indices": 871, + "material": 76, + "mode": 4 + } + ] + }, + { + "name": "Object_97_Material.005_0", + "primitives": [ + { + "attributes": { + "NORMAL": 873, + "POSITION": 872, + "TEXCOORD_0": 874, + "TEXCOORD_1": 875, + "TEXCOORD_2": 876 + }, + "indices": 877, + "material": 75, + "mode": 4 + } + ] + }, + { + "name": "Object_99_Tasten_2_0", + "primitives": [ + { + "attributes": { + "NORMAL": 879, + "POSITION": 878, + "TEXCOORD_0": 880, + "TEXCOORD_1": 881, + "TEXCOORD_2": 882 + }, + "indices": 883, + "material": 76, + "mode": 4 + } + ] + }, + { + "name": "Object_101_Material.067_0", + "primitives": [ + { + "attributes": { + "NORMAL": 885, + "POSITION": 884, + "TEXCOORD_0": 886, + "TEXCOORD_1": 887, + "TEXCOORD_2": 888 + }, + "indices": 889, + "material": 80, + "mode": 4 + } + ] + }, + { + "name": "Object_103_Material.070_0", + "primitives": [ + { + "attributes": { + "NORMAL": 891, + "POSITION": 890, + "TEXCOORD_0": 892, + "TEXCOORD_1": 893, + "TEXCOORD_2": 894 + }, + "indices": 895, + "material": 83, + "mode": 4 + } + ] + }, + { + "name": "Object_105_Tasten_2_0", + "primitives": [ + { + "attributes": { + "NORMAL": 897, + "POSITION": 896, + "TEXCOORD_0": 898, + "TEXCOORD_1": 899, + "TEXCOORD_2": 900 + }, + "indices": 901, + "material": 76, + "mode": 4 + } + ] + }, + { + "name": "Object_107_Material.070_0", + "primitives": [ + { + "attributes": { + "NORMAL": 903, + "POSITION": 902, + "TEXCOORD_0": 904, + "TEXCOORD_1": 905, + "TEXCOORD_2": 906 + }, + "indices": 907, + "material": 83, + "mode": 4 + } + ] + }, + { + "name": "Object_109_Material.069_0", + "primitives": [ + { + "attributes": { + "NORMAL": 909, + "POSITION": 908, + "TEXCOORD_0": 910, + "TEXCOORD_1": 911, + "TEXCOORD_2": 912 + }, + "indices": 913, + "material": 82, + "mode": 4 + } + ] + }, + { + "name": "Object_111_Material.067_0", + "primitives": [ + { + "attributes": { + "NORMAL": 915, + "POSITION": 914, + "TEXCOORD_0": 916, + "TEXCOORD_1": 917, + "TEXCOORD_2": 918 + }, + "indices": 919, + "material": 80, + "mode": 4 + } + ] + }, + { + "name": "Object_113_Material.068_0", + "primitives": [ + { + "attributes": { + "NORMAL": 921, + "POSITION": 920, + "TEXCOORD_0": 922, + "TEXCOORD_1": 923, + "TEXCOORD_2": 924 + }, + "indices": 925, + "material": 81, + "mode": 4 + } + ] + }, + { + "name": "Object_115_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 927, + "POSITION": 926, + "TEXCOORD_0": 928, + "TEXCOORD_1": 929, + "TEXCOORD_2": 930 + }, + "indices": 931, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_117_Material.068_0", + "primitives": [ + { + "attributes": { + "NORMAL": 933, + "POSITION": 932, + "TEXCOORD_0": 934, + "TEXCOORD_1": 935, + "TEXCOORD_2": 936 + }, + "indices": 937, + "material": 81, + "mode": 4 + } + ] + }, + { + "name": "Object_119_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 939, + "POSITION": 938, + "TEXCOORD_0": 940, + "TEXCOORD_1": 941, + "TEXCOORD_2": 942 + }, + "indices": 943, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_121_Material.066_0", + "primitives": [ + { + "attributes": { + "NORMAL": 945, + "POSITION": 944, + "TEXCOORD_0": 946, + "TEXCOORD_1": 947, + "TEXCOORD_2": 948 + }, + "indices": 949, + "material": 79, + "mode": 4 + } + ] + }, + { + "name": "Object_123_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 951, + "POSITION": 950, + "TEXCOORD_0": 952, + "TEXCOORD_1": 953, + "TEXCOORD_2": 954 + }, + "indices": 955, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_125_Material.066_0", + "primitives": [ + { + "attributes": { + "NORMAL": 957, + "POSITION": 956, + "TEXCOORD_0": 958, + "TEXCOORD_1": 959, + "TEXCOORD_2": 960 + }, + "indices": 961, + "material": 79, + "mode": 4 + } + ] + }, + { + "name": "Object_127_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 963, + "POSITION": 962, + "TEXCOORD_0": 964, + "TEXCOORD_1": 965, + "TEXCOORD_2": 966 + }, + "indices": 967, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_129_Material.066_0", + "primitives": [ + { + "attributes": { + "NORMAL": 969, + "POSITION": 968, + "TEXCOORD_0": 970, + "TEXCOORD_1": 971, + "TEXCOORD_2": 972 + }, + "indices": 973, + "material": 79, + "mode": 4 + } + ] + }, + { + "name": "Object_131_Material.060_0", + "primitives": [ + { + "attributes": { + "NORMAL": 975, + "POSITION": 974, + "TEXCOORD_0": 976, + "TEXCOORD_1": 977, + "TEXCOORD_2": 978 + }, + "indices": 979, + "material": 78, + "mode": 4 + } + ] + }, + { + "name": "Object_133_Material.060_0", + "primitives": [ + { + "attributes": { + "NORMAL": 981, + "POSITION": 980, + "TEXCOORD_0": 982, + "TEXCOORD_1": 983, + "TEXCOORD_2": 984 + }, + "indices": 985, + "material": 78, + "mode": 4 + } + ] + }, + { + "name": "Object_135_Material.060_0", + "primitives": [ + { + "attributes": { + "NORMAL": 987, + "POSITION": 986, + "TEXCOORD_0": 988, + "TEXCOORD_1": 989, + "TEXCOORD_2": 990 + }, + "indices": 991, + "material": 78, + "mode": 4 + } + ] + }, + { + "name": "Object_137_Material.005_0", + "primitives": [ + { + "attributes": { + "NORMAL": 993, + "POSITION": 992, + "TEXCOORD_0": 994, + "TEXCOORD_1": 995, + "TEXCOORD_2": 996 + }, + "indices": 997, + "material": 75, + "mode": 4 + } + ] + }, + { + "name": "Object_139_Material.005_0", + "primitives": [ + { + "attributes": { + "NORMAL": 999, + "POSITION": 998, + "TEXCOORD_0": 1000, + "TEXCOORD_1": 1001, + "TEXCOORD_2": 1002 + }, + "indices": 1003, + "material": 75, + "mode": 4 + } + ] + }, + { + "name": "Object_141_Material.069_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1005, + "POSITION": 1004, + "TEXCOORD_0": 1006, + "TEXCOORD_1": 1007, + "TEXCOORD_2": 1008 + }, + "indices": 1009, + "material": 82, + "mode": 4 + } + ] + }, + { + "name": "Object_143_Material.068_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1011, + "POSITION": 1010, + "TEXCOORD_0": 1012, + "TEXCOORD_1": 1013, + "TEXCOORD_2": 1014 + }, + "indices": 1015, + "material": 81, + "mode": 4 + } + ] + }, + { + "name": "Object_145_Material.066_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1017, + "POSITION": 1016, + "TEXCOORD_0": 1018, + "TEXCOORD_1": 1019, + "TEXCOORD_2": 1020 + }, + "indices": 1021, + "material": 79, + "mode": 4 + } + ] + }, + { + "name": "Object_147_Material.066_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1023, + "POSITION": 1022, + "TEXCOORD_0": 1024, + "TEXCOORD_1": 1025, + "TEXCOORD_2": 1026 + }, + "indices": 1027, + "material": 79, + "mode": 4 + } + ] + }, + { + "name": "Object_149_Material.005_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1029, + "POSITION": 1028, + "TEXCOORD_0": 1030, + "TEXCOORD_1": 1031, + "TEXCOORD_2": 1032 + }, + "indices": 1033, + "material": 75, + "mode": 4 + } + ] + }, + { + "name": "Object_151_Material.068_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1035, + "POSITION": 1034, + "TEXCOORD_0": 1036, + "TEXCOORD_1": 1037, + "TEXCOORD_2": 1038 + }, + "indices": 1039, + "material": 81, + "mode": 4 + } + ] + }, + { + "name": "Object_153_Material.066_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1041, + "POSITION": 1040, + "TEXCOORD_0": 1042, + "TEXCOORD_1": 1043, + "TEXCOORD_2": 1044 + }, + "indices": 1045, + "material": 79, + "mode": 4 + } + ] + }, + { + "name": "Object_155_Material.068_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1047, + "POSITION": 1046, + "TEXCOORD_0": 1048, + "TEXCOORD_1": 1049, + "TEXCOORD_2": 1050 + }, + "indices": 1051, + "material": 81, + "mode": 4 + } + ] + }, + { + "name": "Object_157_Material.066_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1053, + "POSITION": 1052, + "TEXCOORD_0": 1054, + "TEXCOORD_1": 1055, + "TEXCOORD_2": 1056 + }, + "indices": 1057, + "material": 79, + "mode": 4 + } + ] + }, + { + "name": "Object_159_Material.066_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1059, + "POSITION": 1058, + "TEXCOORD_0": 1060, + "TEXCOORD_1": 1061, + "TEXCOORD_2": 1062 + }, + "indices": 1063, + "material": 79, + "mode": 4 + } + ] + }, + { + "name": "Object_161_Material.066_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1065, + "POSITION": 1064, + "TEXCOORD_0": 1066, + "TEXCOORD_1": 1067, + "TEXCOORD_2": 1068 + }, + "indices": 1069, + "material": 79, + "mode": 4 + } + ] + }, + { + "name": "Object_163_Material.066_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1071, + "POSITION": 1070, + "TEXCOORD_0": 1072, + "TEXCOORD_1": 1073, + "TEXCOORD_2": 1074 + }, + "indices": 1075, + "material": 79, + "mode": 4 + } + ] + }, + { + "name": "Object_165_Material.066_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1077, + "POSITION": 1076, + "TEXCOORD_0": 1078, + "TEXCOORD_1": 1079, + "TEXCOORD_2": 1080 + }, + "indices": 1081, + "material": 79, + "mode": 4 + } + ] + }, + { + "name": "Object_167_Material.060_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1083, + "POSITION": 1082, + "TEXCOORD_0": 1084, + "TEXCOORD_1": 1085, + "TEXCOORD_2": 1086 + }, + "indices": 1087, + "material": 78, + "mode": 4 + } + ] + }, + { + "name": "Object_169_Material.060_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1089, + "POSITION": 1088, + "TEXCOORD_0": 1090, + "TEXCOORD_1": 1091, + "TEXCOORD_2": 1092 + }, + "indices": 1093, + "material": 78, + "mode": 4 + } + ] + }, + { + "name": "Object_171_Material.005_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1095, + "POSITION": 1094, + "TEXCOORD_0": 1096, + "TEXCOORD_1": 1097, + "TEXCOORD_2": 1098 + }, + "indices": 1099, + "material": 75, + "mode": 4 + } + ] + }, + { + "name": "Object_173_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1101, + "POSITION": 1100, + "TEXCOORD_0": 1102, + "TEXCOORD_1": 1103, + "TEXCOORD_2": 1104 + }, + "indices": 1105, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_175_Material.069_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1107, + "POSITION": 1106, + "TEXCOORD_0": 1108, + "TEXCOORD_1": 1109, + "TEXCOORD_2": 1110 + }, + "indices": 1111, + "material": 82, + "mode": 4 + } + ] + }, + { + "name": "Object_177_Material.068_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1113, + "POSITION": 1112, + "TEXCOORD_0": 1114, + "TEXCOORD_1": 1115, + "TEXCOORD_2": 1116 + }, + "indices": 1117, + "material": 81, + "mode": 4 + } + ] + }, + { + "name": "Object_179_Material.060_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1119, + "POSITION": 1118, + "TEXCOORD_0": 1120, + "TEXCOORD_1": 1121, + "TEXCOORD_2": 1122 + }, + "indices": 1123, + "material": 78, + "mode": 4 + } + ] + }, + { + "name": "Object_181_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1125, + "POSITION": 1124, + "TEXCOORD_0": 1126, + "TEXCOORD_1": 1127, + "TEXCOORD_2": 1128 + }, + "indices": 1129, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_183_Material.070_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1131, + "POSITION": 1130, + "TEXCOORD_0": 1132, + "TEXCOORD_1": 1133, + "TEXCOORD_2": 1134 + }, + "indices": 1135, + "material": 83, + "mode": 4 + } + ] + }, + { + "name": "Object_185_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1137, + "POSITION": 1136, + "TEXCOORD_0": 1138, + "TEXCOORD_1": 1139, + "TEXCOORD_2": 1140 + }, + "indices": 1141, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_187_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1143, + "POSITION": 1142, + "TEXCOORD_0": 1144, + "TEXCOORD_1": 1145, + "TEXCOORD_2": 1146 + }, + "indices": 1147, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_189_Material.069_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1149, + "POSITION": 1148, + "TEXCOORD_0": 1150, + "TEXCOORD_1": 1151, + "TEXCOORD_2": 1152 + }, + "indices": 1153, + "material": 82, + "mode": 4 + } + ] + }, + { + "name": "Object_191_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1155, + "POSITION": 1154, + "TEXCOORD_0": 1156, + "TEXCOORD_1": 1157, + "TEXCOORD_2": 1158 + }, + "indices": 1159, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_193_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1161, + "POSITION": 1160, + "TEXCOORD_0": 1162, + "TEXCOORD_1": 1163, + "TEXCOORD_2": 1164 + }, + "indices": 1165, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_195_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1167, + "POSITION": 1166, + "TEXCOORD_0": 1168, + "TEXCOORD_1": 1169, + "TEXCOORD_2": 1170 + }, + "indices": 1171, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_197_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1173, + "POSITION": 1172, + "TEXCOORD_0": 1174, + "TEXCOORD_1": 1175, + "TEXCOORD_2": 1176 + }, + "indices": 1177, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_199_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1179, + "POSITION": 1178, + "TEXCOORD_0": 1180, + "TEXCOORD_1": 1181, + "TEXCOORD_2": 1182 + }, + "indices": 1183, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_201_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1185, + "POSITION": 1184, + "TEXCOORD_0": 1186, + "TEXCOORD_1": 1187, + "TEXCOORD_2": 1188 + }, + "indices": 1189, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_203_Material.060_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1191, + "POSITION": 1190, + "TEXCOORD_0": 1192, + "TEXCOORD_1": 1193, + "TEXCOORD_2": 1194 + }, + "indices": 1195, + "material": 78, + "mode": 4 + } + ] + }, + { + "name": "Object_205_Material.066_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1197, + "POSITION": 1196, + "TEXCOORD_0": 1198, + "TEXCOORD_1": 1199, + "TEXCOORD_2": 1200 + }, + "indices": 1201, + "material": 79, + "mode": 4 + } + ] + }, + { + "name": "Object_207_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1203, + "POSITION": 1202, + "TEXCOORD_0": 1204, + "TEXCOORD_1": 1205, + "TEXCOORD_2": 1206 + }, + "indices": 1207, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_209_Material.070_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1209, + "POSITION": 1208, + "TEXCOORD_0": 1210, + "TEXCOORD_1": 1211, + "TEXCOORD_2": 1212 + }, + "indices": 1213, + "material": 83, + "mode": 4 + } + ] + }, + { + "name": "Object_211_Material.067_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1215, + "POSITION": 1214, + "TEXCOORD_0": 1216, + "TEXCOORD_1": 1217, + "TEXCOORD_2": 1218 + }, + "indices": 1219, + "material": 80, + "mode": 4 + } + ] + }, + { + "name": "Object_213_Tasten_2_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1221, + "POSITION": 1220, + "TEXCOORD_0": 1222, + "TEXCOORD_1": 1223, + "TEXCOORD_2": 1224 + }, + "indices": 1225, + "material": 76, + "mode": 4 + } + ] + }, + { + "name": "Object_215_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1227, + "POSITION": 1226, + "TEXCOORD_0": 1228, + "TEXCOORD_1": 1229, + "TEXCOORD_2": 1230 + }, + "indices": 1231, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_217_Material.060_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1233, + "POSITION": 1232, + "TEXCOORD_0": 1234, + "TEXCOORD_1": 1235, + "TEXCOORD_2": 1236 + }, + "indices": 1237, + "material": 78, + "mode": 4 + } + ] + }, + { + "name": "Object_219_Material.060_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1239, + "POSITION": 1238, + "TEXCOORD_0": 1240, + "TEXCOORD_1": 1241, + "TEXCOORD_2": 1242 + }, + "indices": 1243, + "material": 78, + "mode": 4 + } + ] + }, + { + "name": "Object_221_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1245, + "POSITION": 1244, + "TEXCOORD_0": 1246, + "TEXCOORD_1": 1247, + "TEXCOORD_2": 1248 + }, + "indices": 1249, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_223_Material.005_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1251, + "POSITION": 1250, + "TEXCOORD_0": 1252, + "TEXCOORD_1": 1253, + "TEXCOORD_2": 1254 + }, + "indices": 1255, + "material": 75, + "mode": 4 + } + ] + }, + { + "name": "Object_225_Material.005_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1257, + "POSITION": 1256, + "TEXCOORD_0": 1258, + "TEXCOORD_1": 1259, + "TEXCOORD_2": 1260 + }, + "indices": 1261, + "material": 75, + "mode": 4 + } + ] + }, + { + "name": "Object_227_Material.069_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1263, + "POSITION": 1262, + "TEXCOORD_0": 1264, + "TEXCOORD_1": 1265, + "TEXCOORD_2": 1266 + }, + "indices": 1267, + "material": 82, + "mode": 4 + } + ] + }, + { + "name": "Object_229_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1269, + "POSITION": 1268, + "TEXCOORD_0": 1270, + "TEXCOORD_1": 1271, + "TEXCOORD_2": 1272 + }, + "indices": 1273, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_231_Material.068_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1275, + "POSITION": 1274, + "TEXCOORD_0": 1276, + "TEXCOORD_1": 1277, + "TEXCOORD_2": 1278 + }, + "indices": 1279, + "material": 81, + "mode": 4 + } + ] + }, + { + "name": "Object_233_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1281, + "POSITION": 1280, + "TEXCOORD_0": 1282, + "TEXCOORD_1": 1283, + "TEXCOORD_2": 1284 + }, + "indices": 1285, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_235_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1287, + "POSITION": 1286, + "TEXCOORD_0": 1288, + "TEXCOORD_1": 1289, + "TEXCOORD_2": 1290 + }, + "indices": 1291, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_237_Material.066_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1293, + "POSITION": 1292, + "TEXCOORD_0": 1294, + "TEXCOORD_1": 1295, + "TEXCOORD_2": 1296 + }, + "indices": 1297, + "material": 79, + "mode": 4 + } + ] + }, + { + "name": "Object_239_Material.066_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1299, + "POSITION": 1298, + "TEXCOORD_0": 1300, + "TEXCOORD_1": 1301, + "TEXCOORD_2": 1302 + }, + "indices": 1303, + "material": 79, + "mode": 4 + } + ] + }, + { + "name": "Object_241_Material.070_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1305, + "POSITION": 1304, + "TEXCOORD_0": 1306, + "TEXCOORD_1": 1307, + "TEXCOORD_2": 1308 + }, + "indices": 1309, + "material": 83, + "mode": 4 + } + ] + }, + { + "name": "Object_243_Material.066_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1311, + "POSITION": 1310, + "TEXCOORD_0": 1312, + "TEXCOORD_1": 1313, + "TEXCOORD_2": 1314 + }, + "indices": 1315, + "material": 79, + "mode": 4 + } + ] + }, + { + "name": "Object_245_Material.070_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1317, + "POSITION": 1316, + "TEXCOORD_0": 1318, + "TEXCOORD_1": 1319, + "TEXCOORD_2": 1320 + }, + "indices": 1321, + "material": 83, + "mode": 4 + } + ] + }, + { + "name": "Object_247_Material.066_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1323, + "POSITION": 1322, + "TEXCOORD_0": 1324, + "TEXCOORD_1": 1325, + "TEXCOORD_2": 1326 + }, + "indices": 1327, + "material": 79, + "mode": 4 + } + ] + }, + { + "name": "Object_249_Material.060_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1329, + "POSITION": 1328, + "TEXCOORD_0": 1330, + "TEXCOORD_1": 1331, + "TEXCOORD_2": 1332 + }, + "indices": 1333, + "material": 78, + "mode": 4 + } + ] + }, + { + "name": "Object_251_Material.070_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1335, + "POSITION": 1334, + "TEXCOORD_0": 1336, + "TEXCOORD_1": 1337, + "TEXCOORD_2": 1338 + }, + "indices": 1339, + "material": 83, + "mode": 4 + } + ] + }, + { + "name": "Object_253_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1341, + "POSITION": 1340, + "TEXCOORD_0": 1342, + "TEXCOORD_1": 1343, + "TEXCOORD_2": 1344 + }, + "indices": 1345, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_255_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1347, + "POSITION": 1346, + "TEXCOORD_0": 1348, + "TEXCOORD_1": 1349, + "TEXCOORD_2": 1350 + }, + "indices": 1351, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_257_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1353, + "POSITION": 1352, + "TEXCOORD_0": 1354, + "TEXCOORD_1": 1355, + "TEXCOORD_2": 1356 + }, + "indices": 1357, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_259_Material.060_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1359, + "POSITION": 1358, + "TEXCOORD_0": 1360, + "TEXCOORD_1": 1361, + "TEXCOORD_2": 1362 + }, + "indices": 1363, + "material": 78, + "mode": 4 + } + ] + }, + { + "name": "Object_261_Material.060_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1365, + "POSITION": 1364, + "TEXCOORD_0": 1366, + "TEXCOORD_1": 1367, + "TEXCOORD_2": 1368 + }, + "indices": 1369, + "material": 78, + "mode": 4 + } + ] + }, + { + "name": "Object_263_Material.060_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1371, + "POSITION": 1370, + "TEXCOORD_0": 1372, + "TEXCOORD_1": 1373, + "TEXCOORD_2": 1374 + }, + "indices": 1375, + "material": 78, + "mode": 4 + } + ] + }, + { + "name": "Object_265_Material.060_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1377, + "POSITION": 1376, + "TEXCOORD_0": 1378, + "TEXCOORD_1": 1379, + "TEXCOORD_2": 1380 + }, + "indices": 1381, + "material": 78, + "mode": 4 + } + ] + }, + { + "name": "Object_267_Tasten_2_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1383, + "POSITION": 1382, + "TEXCOORD_0": 1384, + "TEXCOORD_1": 1385, + "TEXCOORD_2": 1386 + }, + "indices": 1387, + "material": 76, + "mode": 4 + } + ] + }, + { + "name": "Object_269_Material.070_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1389, + "POSITION": 1388, + "TEXCOORD_0": 1390, + "TEXCOORD_1": 1391, + "TEXCOORD_2": 1392 + }, + "indices": 1393, + "material": 83, + "mode": 4 + } + ] + }, + { + "name": "Object_271_Material.070_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1395, + "POSITION": 1394, + "TEXCOORD_0": 1396, + "TEXCOORD_1": 1397, + "TEXCOORD_2": 1398 + }, + "indices": 1399, + "material": 83, + "mode": 4 + } + ] + }, + { + "name": "Object_273_Material.067_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1401, + "POSITION": 1400, + "TEXCOORD_0": 1402, + "TEXCOORD_1": 1403, + "TEXCOORD_2": 1404 + }, + "indices": 1405, + "material": 80, + "mode": 4 + } + ] + }, + { + "name": "Object_275_Material.005_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1407, + "POSITION": 1406, + "TEXCOORD_0": 1408, + "TEXCOORD_1": 1409, + "TEXCOORD_2": 1410 + }, + "indices": 1411, + "material": 75, + "mode": 4 + } + ] + }, + { + "name": "Object_277_Tasten_2_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1413, + "POSITION": 1412, + "TEXCOORD_0": 1414, + "TEXCOORD_1": 1415, + "TEXCOORD_2": 1416 + }, + "indices": 1417, + "material": 76, + "mode": 4 + } + ] + }, + { + "name": "Object_279_Tasten_2_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1419, + "POSITION": 1418, + "TEXCOORD_0": 1420, + "TEXCOORD_1": 1421, + "TEXCOORD_2": 1422 + }, + "indices": 1423, + "material": 76, + "mode": 4 + } + ] + }, + { + "name": "Object_281_Material.069_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1425, + "POSITION": 1424, + "TEXCOORD_0": 1426, + "TEXCOORD_1": 1427, + "TEXCOORD_2": 1428 + }, + "indices": 1429, + "material": 82, + "mode": 4 + } + ] + }, + { + "name": "Object_283_Material.068_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1431, + "POSITION": 1430, + "TEXCOORD_0": 1432, + "TEXCOORD_1": 1433, + "TEXCOORD_2": 1434 + }, + "indices": 1435, + "material": 81, + "mode": 4 + } + ] + }, + { + "name": "Object_285_Material.068_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1437, + "POSITION": 1436, + "TEXCOORD_0": 1438, + "TEXCOORD_1": 1439, + "TEXCOORD_2": 1440 + }, + "indices": 1441, + "material": 81, + "mode": 4 + } + ] + }, + { + "name": "Object_287_Tasten_2_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1443, + "POSITION": 1442, + "TEXCOORD_0": 1444, + "TEXCOORD_1": 1445, + "TEXCOORD_2": 1446 + }, + "indices": 1447, + "material": 76, + "mode": 4 + } + ] + }, + { + "name": "Object_289_Material.068_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1449, + "POSITION": 1448, + "TEXCOORD_0": 1450, + "TEXCOORD_1": 1451, + "TEXCOORD_2": 1452 + }, + "indices": 1453, + "material": 81, + "mode": 4 + } + ] + }, + { + "name": "Object_291_Material.066_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1455, + "POSITION": 1454, + "TEXCOORD_0": 1456, + "TEXCOORD_1": 1457, + "TEXCOORD_2": 1458 + }, + "indices": 1459, + "material": 79, + "mode": 4 + } + ] + }, + { + "name": "Object_293_Material.066_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1461, + "POSITION": 1460, + "TEXCOORD_0": 1462, + "TEXCOORD_1": 1463, + "TEXCOORD_2": 1464 + }, + "indices": 1465, + "material": 79, + "mode": 4 + } + ] + }, + { + "name": "Object_295_Tasten_2_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1467, + "POSITION": 1466, + "TEXCOORD_0": 1468, + "TEXCOORD_1": 1469, + "TEXCOORD_2": 1470 + }, + "indices": 1471, + "material": 76, + "mode": 4 + } + ] + }, + { + "name": "Object_297_Material.067_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1473, + "POSITION": 1472, + "TEXCOORD_0": 1474, + "TEXCOORD_1": 1475, + "TEXCOORD_2": 1476 + }, + "indices": 1477, + "material": 80, + "mode": 4 + } + ] + }, + { + "name": "Object_299_Material.066_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1479, + "POSITION": 1478, + "TEXCOORD_0": 1480, + "TEXCOORD_1": 1481, + "TEXCOORD_2": 1482 + }, + "indices": 1483, + "material": 79, + "mode": 4 + } + ] + }, + { + "name": "Object_301_Material.060_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1485, + "POSITION": 1484, + "TEXCOORD_0": 1486, + "TEXCOORD_1": 1487, + "TEXCOORD_2": 1488 + }, + "indices": 1489, + "material": 78, + "mode": 4 + } + ] + }, + { + "name": "Object_303_Tasten_2_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1491, + "POSITION": 1490, + "TEXCOORD_0": 1492, + "TEXCOORD_1": 1493, + "TEXCOORD_2": 1494 + }, + "indices": 1495, + "material": 76, + "mode": 4 + } + ] + }, + { + "name": "Object_305_Material.060_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1497, + "POSITION": 1496, + "TEXCOORD_0": 1498, + "TEXCOORD_1": 1499, + "TEXCOORD_2": 1500 + }, + "indices": 1501, + "material": 78, + "mode": 4 + } + ] + }, + { + "name": "Object_307_Tasten_2_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1503, + "POSITION": 1502, + "TEXCOORD_0": 1504, + "TEXCOORD_1": 1505, + "TEXCOORD_2": 1506 + }, + "indices": 1507, + "material": 76, + "mode": 4 + } + ] + }, + { + "name": "Object_309_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1509, + "POSITION": 1508, + "TEXCOORD_0": 1510, + "TEXCOORD_1": 1511, + "TEXCOORD_2": 1512 + }, + "indices": 1513, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_311_Tasten_2_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1515, + "POSITION": 1514, + "TEXCOORD_0": 1516, + "TEXCOORD_1": 1517, + "TEXCOORD_2": 1518 + }, + "indices": 1519, + "material": 76, + "mode": 4 + } + ] + }, + { + "name": "Object_313_Tasten_2_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1521, + "POSITION": 1520, + "TEXCOORD_0": 1522, + "TEXCOORD_1": 1523, + "TEXCOORD_2": 1524 + }, + "indices": 1525, + "material": 76, + "mode": 4 + } + ] + }, + { + "name": "Object_315_Material.005_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1527, + "POSITION": 1526, + "TEXCOORD_0": 1528, + "TEXCOORD_1": 1529, + "TEXCOORD_2": 1530 + }, + "indices": 1531, + "material": 75, + "mode": 4 + } + ] + }, + { + "name": "Object_317_Tasten_2_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1533, + "POSITION": 1532, + "TEXCOORD_0": 1534, + "TEXCOORD_1": 1535, + "TEXCOORD_2": 1536 + }, + "indices": 1537, + "material": 76, + "mode": 4 + } + ] + }, + { + "name": "Object_319_Tasten_2_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1539, + "POSITION": 1538, + "TEXCOORD_0": 1540, + "TEXCOORD_1": 1541, + "TEXCOORD_2": 1542 + }, + "indices": 1543, + "material": 76, + "mode": 4 + } + ] + }, + { + "name": "Object_321_Material.068_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1545, + "POSITION": 1544, + "TEXCOORD_0": 1546, + "TEXCOORD_1": 1547, + "TEXCOORD_2": 1548 + }, + "indices": 1549, + "material": 81, + "mode": 4 + } + ] + }, + { + "name": "Object_323_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1551, + "POSITION": 1550, + "TEXCOORD_0": 1552, + "TEXCOORD_1": 1553, + "TEXCOORD_2": 1554 + }, + "indices": 1555, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_325_Material.066_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1557, + "POSITION": 1556, + "TEXCOORD_0": 1558, + "TEXCOORD_1": 1559, + "TEXCOORD_2": 1560 + }, + "indices": 1561, + "material": 79, + "mode": 4 + } + ] + }, + { + "name": "Object_327_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1563, + "POSITION": 1562, + "TEXCOORD_0": 1564, + "TEXCOORD_1": 1565, + "TEXCOORD_2": 1566 + }, + "indices": 1567, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_329_Material.066_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1569, + "POSITION": 1568, + "TEXCOORD_0": 1570, + "TEXCOORD_1": 1571, + "TEXCOORD_2": 1572 + }, + "indices": 1573, + "material": 79, + "mode": 4 + } + ] + }, + { + "name": "Object_331_Material.060_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1575, + "POSITION": 1574, + "TEXCOORD_0": 1576, + "TEXCOORD_1": 1577, + "TEXCOORD_2": 1578 + }, + "indices": 1579, + "material": 78, + "mode": 4 + } + ] + }, + { + "name": "Object_333_Material.060_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1581, + "POSITION": 1580, + "TEXCOORD_0": 1582, + "TEXCOORD_1": 1583, + "TEXCOORD_2": 1584 + }, + "indices": 1585, + "material": 78, + "mode": 4 + } + ] + }, + { + "name": "Object_335_Material.005_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1587, + "POSITION": 1586, + "TEXCOORD_0": 1588, + "TEXCOORD_1": 1589, + "TEXCOORD_2": 1590 + }, + "indices": 1591, + "material": 75, + "mode": 4 + } + ] + }, + { + "name": "Object_337_Material.068_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1593, + "POSITION": 1592, + "TEXCOORD_0": 1594, + "TEXCOORD_1": 1595, + "TEXCOORD_2": 1596 + }, + "indices": 1597, + "material": 81, + "mode": 4 + } + ] + }, + { + "name": "Object_339_Material.066_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1599, + "POSITION": 1598, + "TEXCOORD_0": 1600, + "TEXCOORD_1": 1601, + "TEXCOORD_2": 1602 + }, + "indices": 1603, + "material": 79, + "mode": 4 + } + ] + }, + { + "name": "Object_341_Material.068_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1605, + "POSITION": 1604, + "TEXCOORD_0": 1606, + "TEXCOORD_1": 1607, + "TEXCOORD_2": 1608 + }, + "indices": 1609, + "material": 81, + "mode": 4 + } + ] + }, + { + "name": "Object_343_Material.066_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1611, + "POSITION": 1610, + "TEXCOORD_0": 1612, + "TEXCOORD_1": 1613, + "TEXCOORD_2": 1614 + }, + "indices": 1615, + "material": 79, + "mode": 4 + } + ] + }, + { + "name": "Object_345_Material.066_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1617, + "POSITION": 1616, + "TEXCOORD_0": 1618, + "TEXCOORD_1": 1619, + "TEXCOORD_2": 1620 + }, + "indices": 1621, + "material": 79, + "mode": 4 + } + ] + }, + { + "name": "Object_347_Material.066_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1623, + "POSITION": 1622, + "TEXCOORD_0": 1624, + "TEXCOORD_1": 1625, + "TEXCOORD_2": 1626 + }, + "indices": 1627, + "material": 79, + "mode": 4 + } + ] + }, + { + "name": "Object_349_Material.066_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1629, + "POSITION": 1628, + "TEXCOORD_0": 1630, + "TEXCOORD_1": 1631, + "TEXCOORD_2": 1632 + }, + "indices": 1633, + "material": 79, + "mode": 4 + } + ] + }, + { + "name": "Object_351_Material.060_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1635, + "POSITION": 1634, + "TEXCOORD_0": 1636, + "TEXCOORD_1": 1637, + "TEXCOORD_2": 1638 + }, + "indices": 1639, + "material": 78, + "mode": 4 + } + ] + }, + { + "name": "Object_353_Material.060_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1641, + "POSITION": 1640, + "TEXCOORD_0": 1642, + "TEXCOORD_1": 1643, + "TEXCOORD_2": 1644 + }, + "indices": 1645, + "material": 78, + "mode": 4 + } + ] + }, + { + "name": "Object_355_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1647, + "POSITION": 1646, + "TEXCOORD_0": 1648, + "TEXCOORD_1": 1649, + "TEXCOORD_2": 1650 + }, + "indices": 1651, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_357_Material.069_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1653, + "POSITION": 1652, + "TEXCOORD_0": 1654, + "TEXCOORD_1": 1655, + "TEXCOORD_2": 1656 + }, + "indices": 1657, + "material": 82, + "mode": 4 + } + ] + }, + { + "name": "Object_359_Material.066_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1659, + "POSITION": 1658, + "TEXCOORD_0": 1660, + "TEXCOORD_1": 1661, + "TEXCOORD_2": 1662 + }, + "indices": 1663, + "material": 79, + "mode": 4 + } + ] + }, + { + "name": "Object_361_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1665, + "POSITION": 1664, + "TEXCOORD_0": 1666, + "TEXCOORD_1": 1667, + "TEXCOORD_2": 1668 + }, + "indices": 1669, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_363_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1671, + "POSITION": 1670, + "TEXCOORD_0": 1672, + "TEXCOORD_1": 1673, + "TEXCOORD_2": 1674 + }, + "indices": 1675, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_365_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1677, + "POSITION": 1676, + "TEXCOORD_0": 1678, + "TEXCOORD_1": 1679, + "TEXCOORD_2": 1680 + }, + "indices": 1681, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_367_Material.069_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1683, + "POSITION": 1682, + "TEXCOORD_0": 1684, + "TEXCOORD_1": 1685, + "TEXCOORD_2": 1686 + }, + "indices": 1687, + "material": 82, + "mode": 4 + } + ] + }, + { + "name": "Object_369_Material.060_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1689, + "POSITION": 1688, + "TEXCOORD_0": 1690, + "TEXCOORD_1": 1691, + "TEXCOORD_2": 1692 + }, + "indices": 1693, + "material": 78, + "mode": 4 + } + ] + }, + { + "name": "Object_371_Material.070_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1695, + "POSITION": 1694, + "TEXCOORD_0": 1696, + "TEXCOORD_1": 1697, + "TEXCOORD_2": 1698 + }, + "indices": 1699, + "material": 83, + "mode": 4 + } + ] + }, + { + "name": "Object_373_Material.070_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1701, + "POSITION": 1700, + "TEXCOORD_0": 1702, + "TEXCOORD_1": 1703, + "TEXCOORD_2": 1704 + }, + "indices": 1705, + "material": 83, + "mode": 4 + } + ] + }, + { + "name": "Object_375_Material.067_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1707, + "POSITION": 1706, + "TEXCOORD_0": 1708, + "TEXCOORD_1": 1709, + "TEXCOORD_2": 1710 + }, + "indices": 1711, + "material": 80, + "mode": 4 + } + ] + }, + { + "name": "Object_377_Tasten_2_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1713, + "POSITION": 1712, + "TEXCOORD_0": 1714, + "TEXCOORD_1": 1715, + "TEXCOORD_2": 1716 + }, + "indices": 1717, + "material": 76, + "mode": 4 + } + ] + }, + { + "name": "Object_379_Material.066_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1719, + "POSITION": 1718, + "TEXCOORD_0": 1720, + "TEXCOORD_1": 1721, + "TEXCOORD_2": 1722 + }, + "indices": 1723, + "material": 79, + "mode": 4 + } + ] + }, + { + "name": "Object_381_Material.005_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1725, + "POSITION": 1724, + "TEXCOORD_0": 1726, + "TEXCOORD_1": 1727, + "TEXCOORD_2": 1728 + }, + "indices": 1729, + "material": 75, + "mode": 4 + } + ] + }, + { + "name": "Object_383_Material.005_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1731, + "POSITION": 1730, + "TEXCOORD_0": 1732, + "TEXCOORD_1": 1733, + "TEXCOORD_2": 1734 + }, + "indices": 1735, + "material": 75, + "mode": 4 + } + ] + }, + { + "name": "Object_385_Material.069_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1737, + "POSITION": 1736, + "TEXCOORD_0": 1738, + "TEXCOORD_1": 1739, + "TEXCOORD_2": 1740 + }, + "indices": 1741, + "material": 82, + "mode": 4 + } + ] + }, + { + "name": "Object_387_Material.005_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1743, + "POSITION": 1742, + "TEXCOORD_0": 1744, + "TEXCOORD_1": 1745, + "TEXCOORD_2": 1746 + }, + "indices": 1747, + "material": 75, + "mode": 4 + } + ] + }, + { + "name": "Object_389_Material.068_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1749, + "POSITION": 1748, + "TEXCOORD_0": 1750, + "TEXCOORD_1": 1751, + "TEXCOORD_2": 1752 + }, + "indices": 1753, + "material": 81, + "mode": 4 + } + ] + }, + { + "name": "Object_391_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1755, + "POSITION": 1754, + "TEXCOORD_0": 1756, + "TEXCOORD_1": 1757, + "TEXCOORD_2": 1758 + }, + "indices": 1759, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_393_Material.068_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1761, + "POSITION": 1760, + "TEXCOORD_0": 1762, + "TEXCOORD_1": 1763, + "TEXCOORD_2": 1764 + }, + "indices": 1765, + "material": 81, + "mode": 4 + } + ] + }, + { + "name": "Object_395_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1767, + "POSITION": 1766, + "TEXCOORD_0": 1768, + "TEXCOORD_1": 1769, + "TEXCOORD_2": 1770 + }, + "indices": 1771, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_397_Material.066_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1773, + "POSITION": 1772, + "TEXCOORD_0": 1774, + "TEXCOORD_1": 1775, + "TEXCOORD_2": 1776 + }, + "indices": 1777, + "material": 79, + "mode": 4 + } + ] + }, + { + "name": "Object_399_Material.066_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1779, + "POSITION": 1778, + "TEXCOORD_0": 1780, + "TEXCOORD_1": 1781, + "TEXCOORD_2": 1782 + }, + "indices": 1783, + "material": 79, + "mode": 4 + } + ] + }, + { + "name": "Object_401_Material.070_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1785, + "POSITION": 1784, + "TEXCOORD_0": 1786, + "TEXCOORD_1": 1787, + "TEXCOORD_2": 1788 + }, + "indices": 1789, + "material": 83, + "mode": 4 + } + ] + }, + { + "name": "Object_403_Material.066_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1791, + "POSITION": 1790, + "TEXCOORD_0": 1792, + "TEXCOORD_1": 1793, + "TEXCOORD_2": 1794 + }, + "indices": 1795, + "material": 79, + "mode": 4 + } + ] + }, + { + "name": "Object_405_Material.060_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1797, + "POSITION": 1796, + "TEXCOORD_0": 1798, + "TEXCOORD_1": 1799, + "TEXCOORD_2": 1800 + }, + "indices": 1801, + "material": 78, + "mode": 4 + } + ] + }, + { + "name": "Object_407_Material.070_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1803, + "POSITION": 1802, + "TEXCOORD_0": 1804, + "TEXCOORD_1": 1805, + "TEXCOORD_2": 1806 + }, + "indices": 1807, + "material": 83, + "mode": 4 + } + ] + }, + { + "name": "Object_409_Material.067_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1809, + "POSITION": 1808, + "TEXCOORD_0": 1810, + "TEXCOORD_1": 1811, + "TEXCOORD_2": 1812 + }, + "indices": 1813, + "material": 80, + "mode": 4 + } + ] + }, + { + "name": "Object_411_Tasten_2_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1815, + "POSITION": 1814, + "TEXCOORD_0": 1816, + "TEXCOORD_1": 1817, + "TEXCOORD_2": 1818 + }, + "indices": 1819, + "material": 76, + "mode": 4 + } + ] + }, + { + "name": "Object_413_Material.066_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1821, + "POSITION": 1820, + "TEXCOORD_0": 1822, + "TEXCOORD_1": 1823, + "TEXCOORD_2": 1824 + }, + "indices": 1825, + "material": 79, + "mode": 4 + } + ] + }, + { + "name": "Object_415_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1827, + "POSITION": 1826, + "TEXCOORD_0": 1828, + "TEXCOORD_1": 1829, + "TEXCOORD_2": 1830 + }, + "indices": 1831, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_418_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1833, + "POSITION": 1832, + "TEXCOORD_0": 1834, + "TEXCOORD_1": 1835 + }, + "indices": 1836, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_420_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1838, + "POSITION": 1837, + "TEXCOORD_0": 1839, + "TEXCOORD_1": 1840 + }, + "indices": 1841, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_422_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1843, + "POSITION": 1842, + "TEXCOORD_0": 1844, + "TEXCOORD_1": 1845 + }, + "indices": 1846, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_424_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1848, + "POSITION": 1847, + "TEXCOORD_0": 1849, + "TEXCOORD_1": 1850 + }, + "indices": 1851, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_426_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1853, + "POSITION": 1852, + "TEXCOORD_0": 1854, + "TEXCOORD_1": 1855 + }, + "indices": 1856, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_428_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1858, + "POSITION": 1857, + "TEXCOORD_0": 1859, + "TEXCOORD_1": 1860 + }, + "indices": 1861, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_430_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1863, + "POSITION": 1862, + "TEXCOORD_0": 1864, + "TEXCOORD_1": 1865 + }, + "indices": 1866, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_432_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1868, + "POSITION": 1867, + "TEXCOORD_0": 1869, + "TEXCOORD_1": 1870 + }, + "indices": 1871, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_434_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1873, + "POSITION": 1872, + "TEXCOORD_0": 1874, + "TEXCOORD_1": 1875 + }, + "indices": 1876, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_436_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1878, + "POSITION": 1877, + "TEXCOORD_0": 1879, + "TEXCOORD_1": 1880 + }, + "indices": 1881, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_438_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1883, + "POSITION": 1882, + "TEXCOORD_0": 1884, + "TEXCOORD_1": 1885 + }, + "indices": 1886, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_440_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1888, + "POSITION": 1887, + "TEXCOORD_0": 1889, + "TEXCOORD_1": 1890 + }, + "indices": 1891, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_442_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1893, + "POSITION": 1892, + "TEXCOORD_0": 1894, + "TEXCOORD_1": 1895 + }, + "indices": 1896, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_444_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1898, + "POSITION": 1897, + "TEXCOORD_0": 1899, + "TEXCOORD_1": 1900 + }, + "indices": 1901, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_446_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1903, + "POSITION": 1902, + "TEXCOORD_0": 1904, + "TEXCOORD_1": 1905 + }, + "indices": 1906, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_448_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1908, + "POSITION": 1907, + "TEXCOORD_0": 1909, + "TEXCOORD_1": 1910 + }, + "indices": 1911, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_450_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1913, + "POSITION": 1912, + "TEXCOORD_0": 1914, + "TEXCOORD_1": 1915 + }, + "indices": 1916, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_452_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1918, + "POSITION": 1917, + "TEXCOORD_0": 1919, + "TEXCOORD_1": 1920 + }, + "indices": 1921, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_454_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1923, + "POSITION": 1922, + "TEXCOORD_0": 1924, + "TEXCOORD_1": 1925 + }, + "indices": 1926, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_456_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1928, + "POSITION": 1927, + "TEXCOORD_0": 1929, + "TEXCOORD_1": 1930 + }, + "indices": 1931, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_458_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1933, + "POSITION": 1932, + "TEXCOORD_0": 1934, + "TEXCOORD_1": 1935 + }, + "indices": 1936, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_460_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1938, + "POSITION": 1937, + "TEXCOORD_0": 1939, + "TEXCOORD_1": 1940 + }, + "indices": 1941, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_462_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1943, + "POSITION": 1942, + "TEXCOORD_0": 1944, + "TEXCOORD_1": 1945 + }, + "indices": 1946, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_464_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1948, + "POSITION": 1947, + "TEXCOORD_0": 1949, + "TEXCOORD_1": 1950 + }, + "indices": 1951, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_466_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1953, + "POSITION": 1952, + "TEXCOORD_0": 1954, + "TEXCOORD_1": 1955 + }, + "indices": 1956, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_468_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1958, + "POSITION": 1957, + "TEXCOORD_0": 1959, + "TEXCOORD_1": 1960 + }, + "indices": 1961, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_470_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1963, + "POSITION": 1962, + "TEXCOORD_0": 1964, + "TEXCOORD_1": 1965 + }, + "indices": 1966, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_472_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1968, + "POSITION": 1967, + "TEXCOORD_0": 1969, + "TEXCOORD_1": 1970 + }, + "indices": 1971, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_474_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1973, + "POSITION": 1972, + "TEXCOORD_0": 1974, + "TEXCOORD_1": 1975 + }, + "indices": 1976, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_476_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1978, + "POSITION": 1977, + "TEXCOORD_0": 1979, + "TEXCOORD_1": 1980 + }, + "indices": 1981, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_478_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1983, + "POSITION": 1982, + "TEXCOORD_0": 1984, + "TEXCOORD_1": 1985 + }, + "indices": 1986, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_480_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1988, + "POSITION": 1987, + "TEXCOORD_0": 1989, + "TEXCOORD_1": 1990 + }, + "indices": 1991, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_482_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1993, + "POSITION": 1992, + "TEXCOORD_0": 1994, + "TEXCOORD_1": 1995 + }, + "indices": 1996, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_484_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1998, + "POSITION": 1997, + "TEXCOORD_0": 1999, + "TEXCOORD_1": 2000 + }, + "indices": 2001, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_486_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2003, + "POSITION": 2002, + "TEXCOORD_0": 2004, + "TEXCOORD_1": 2005 + }, + "indices": 2006, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_488_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2008, + "POSITION": 2007, + "TEXCOORD_0": 2009, + "TEXCOORD_1": 2010 + }, + "indices": 2011, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_490_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2013, + "POSITION": 2012, + "TEXCOORD_0": 2014, + "TEXCOORD_1": 2015 + }, + "indices": 2016, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_492_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2018, + "POSITION": 2017, + "TEXCOORD_0": 2019, + "TEXCOORD_1": 2020 + }, + "indices": 2021, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_494_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2023, + "POSITION": 2022, + "TEXCOORD_0": 2024, + "TEXCOORD_1": 2025 + }, + "indices": 2026, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_496_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2028, + "POSITION": 2027, + "TEXCOORD_0": 2029, + "TEXCOORD_1": 2030 + }, + "indices": 2031, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_498_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2033, + "POSITION": 2032, + "TEXCOORD_0": 2034, + "TEXCOORD_1": 2035 + }, + "indices": 2036, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_500_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2038, + "POSITION": 2037, + "TEXCOORD_0": 2039, + "TEXCOORD_1": 2040 + }, + "indices": 2041, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_502_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2043, + "POSITION": 2042, + "TEXCOORD_0": 2044, + "TEXCOORD_1": 2045 + }, + "indices": 2046, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_504_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2048, + "POSITION": 2047, + "TEXCOORD_0": 2049, + "TEXCOORD_1": 2050 + }, + "indices": 2051, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_506_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2053, + "POSITION": 2052, + "TEXCOORD_0": 2054, + "TEXCOORD_1": 2055 + }, + "indices": 2056, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_508_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2058, + "POSITION": 2057, + "TEXCOORD_0": 2059, + "TEXCOORD_1": 2060 + }, + "indices": 2061, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_510_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2063, + "POSITION": 2062, + "TEXCOORD_0": 2064, + "TEXCOORD_1": 2065 + }, + "indices": 2066, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_512_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2068, + "POSITION": 2067, + "TEXCOORD_0": 2069, + "TEXCOORD_1": 2070 + }, + "indices": 2071, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_514_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2073, + "POSITION": 2072, + "TEXCOORD_0": 2074, + "TEXCOORD_1": 2075 + }, + "indices": 2076, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_516_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2078, + "POSITION": 2077, + "TEXCOORD_0": 2079, + "TEXCOORD_1": 2080 + }, + "indices": 2081, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_518_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2083, + "POSITION": 2082, + "TEXCOORD_0": 2084, + "TEXCOORD_1": 2085 + }, + "indices": 2086, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_520_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2088, + "POSITION": 2087, + "TEXCOORD_0": 2089, + "TEXCOORD_1": 2090 + }, + "indices": 2091, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_522_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2093, + "POSITION": 2092, + "TEXCOORD_0": 2094, + "TEXCOORD_1": 2095 + }, + "indices": 2096, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_524_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2098, + "POSITION": 2097, + "TEXCOORD_0": 2099, + "TEXCOORD_1": 2100 + }, + "indices": 2101, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_526_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2103, + "POSITION": 2102, + "TEXCOORD_0": 2104, + "TEXCOORD_1": 2105 + }, + "indices": 2106, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_528_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2108, + "POSITION": 2107, + "TEXCOORD_0": 2109, + "TEXCOORD_1": 2110 + }, + "indices": 2111, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_530_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2113, + "POSITION": 2112, + "TEXCOORD_0": 2114, + "TEXCOORD_1": 2115 + }, + "indices": 2116, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_532_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2118, + "POSITION": 2117, + "TEXCOORD_0": 2119, + "TEXCOORD_1": 2120 + }, + "indices": 2121, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_534_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2123, + "POSITION": 2122, + "TEXCOORD_0": 2124, + "TEXCOORD_1": 2125 + }, + "indices": 2126, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_536_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2128, + "POSITION": 2127, + "TEXCOORD_0": 2129, + "TEXCOORD_1": 2130 + }, + "indices": 2131, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_538_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2133, + "POSITION": 2132, + "TEXCOORD_0": 2134, + "TEXCOORD_1": 2135 + }, + "indices": 2136, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_540_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2138, + "POSITION": 2137, + "TEXCOORD_0": 2139, + "TEXCOORD_1": 2140 + }, + "indices": 2141, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_542_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2143, + "POSITION": 2142, + "TEXCOORD_0": 2144, + "TEXCOORD_1": 2145 + }, + "indices": 2146, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_544_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2148, + "POSITION": 2147, + "TEXCOORD_0": 2149, + "TEXCOORD_1": 2150 + }, + "indices": 2151, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_546_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2153, + "POSITION": 2152, + "TEXCOORD_0": 2154, + "TEXCOORD_1": 2155 + }, + "indices": 2156, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_548_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2158, + "POSITION": 2157, + "TEXCOORD_0": 2159, + "TEXCOORD_1": 2160 + }, + "indices": 2161, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_550_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2163, + "POSITION": 2162, + "TEXCOORD_0": 2164, + "TEXCOORD_1": 2165 + }, + "indices": 2166, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_552_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2168, + "POSITION": 2167, + "TEXCOORD_0": 2169, + "TEXCOORD_1": 2170 + }, + "indices": 2171, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_554_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2173, + "POSITION": 2172, + "TEXCOORD_0": 2174, + "TEXCOORD_1": 2175 + }, + "indices": 2176, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_556_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2178, + "POSITION": 2177, + "TEXCOORD_0": 2179, + "TEXCOORD_1": 2180 + }, + "indices": 2181, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_558_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2183, + "POSITION": 2182, + "TEXCOORD_0": 2184, + "TEXCOORD_1": 2185 + }, + "indices": 2186, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_560_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2188, + "POSITION": 2187, + "TEXCOORD_0": 2189, + "TEXCOORD_1": 2190 + }, + "indices": 2191, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_562_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2193, + "POSITION": 2192, + "TEXCOORD_0": 2194, + "TEXCOORD_1": 2195 + }, + "indices": 2196, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_564_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2198, + "POSITION": 2197, + "TEXCOORD_0": 2199, + "TEXCOORD_1": 2200 + }, + "indices": 2201, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_566_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2203, + "POSITION": 2202, + "TEXCOORD_0": 2204, + "TEXCOORD_1": 2205 + }, + "indices": 2206, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_568_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2208, + "POSITION": 2207, + "TEXCOORD_0": 2209, + "TEXCOORD_1": 2210 + }, + "indices": 2211, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_570_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2213, + "POSITION": 2212, + "TEXCOORD_0": 2214, + "TEXCOORD_1": 2215 + }, + "indices": 2216, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_572_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2218, + "POSITION": 2217, + "TEXCOORD_0": 2219, + "TEXCOORD_1": 2220 + }, + "indices": 2221, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_574_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2223, + "POSITION": 2222, + "TEXCOORD_0": 2224, + "TEXCOORD_1": 2225 + }, + "indices": 2226, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_576_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2228, + "POSITION": 2227, + "TEXCOORD_0": 2229, + "TEXCOORD_1": 2230 + }, + "indices": 2231, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_578_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2233, + "POSITION": 2232, + "TEXCOORD_0": 2234, + "TEXCOORD_1": 2235 + }, + "indices": 2236, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_580_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2238, + "POSITION": 2237, + "TEXCOORD_0": 2239, + "TEXCOORD_1": 2240 + }, + "indices": 2241, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_582_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2243, + "POSITION": 2242, + "TEXCOORD_0": 2244, + "TEXCOORD_1": 2245 + }, + "indices": 2246, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_584_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2248, + "POSITION": 2247, + "TEXCOORD_0": 2249, + "TEXCOORD_1": 2250 + }, + "indices": 2251, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_586_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2253, + "POSITION": 2252, + "TEXCOORD_0": 2254, + "TEXCOORD_1": 2255 + }, + "indices": 2256, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_588_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2258, + "POSITION": 2257, + "TEXCOORD_0": 2259, + "TEXCOORD_1": 2260 + }, + "indices": 2261, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_590_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2263, + "POSITION": 2262, + "TEXCOORD_0": 2264, + "TEXCOORD_1": 2265 + }, + "indices": 2266, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_592_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2268, + "POSITION": 2267, + "TEXCOORD_0": 2269, + "TEXCOORD_1": 2270 + }, + "indices": 2271, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_594_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2273, + "POSITION": 2272, + "TEXCOORD_0": 2274, + "TEXCOORD_1": 2275 + }, + "indices": 2276, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_596_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2278, + "POSITION": 2277, + "TEXCOORD_0": 2279, + "TEXCOORD_1": 2280 + }, + "indices": 2281, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_598_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2283, + "POSITION": 2282, + "TEXCOORD_0": 2284, + "TEXCOORD_1": 2285 + }, + "indices": 2286, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_600_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2288, + "POSITION": 2287, + "TEXCOORD_0": 2289, + "TEXCOORD_1": 2290 + }, + "indices": 2291, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_602_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2293, + "POSITION": 2292, + "TEXCOORD_0": 2294, + "TEXCOORD_1": 2295 + }, + "indices": 2296, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_604_Material.071_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2298, + "POSITION": 2297, + "TEXCOORD_0": 2299, + "TEXCOORD_1": 2300 + }, + "indices": 2301, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_606_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2303, + "POSITION": 2302, + "TEXCOORD_0": 2304, + "TEXCOORD_1": 2305 + }, + "indices": 2306, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_608_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2308, + "POSITION": 2307, + "TEXCOORD_0": 2309, + "TEXCOORD_1": 2310 + }, + "indices": 2311, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_610_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2313, + "POSITION": 2312, + "TEXCOORD_0": 2314, + "TEXCOORD_1": 2315 + }, + "indices": 2316, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_612_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2318, + "POSITION": 2317, + "TEXCOORD_0": 2319, + "TEXCOORD_1": 2320 + }, + "indices": 2321, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_614_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2323, + "POSITION": 2322, + "TEXCOORD_0": 2324, + "TEXCOORD_1": 2325 + }, + "indices": 2326, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_616_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2328, + "POSITION": 2327, + "TEXCOORD_0": 2329, + "TEXCOORD_1": 2330 + }, + "indices": 2331, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_618_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2333, + "POSITION": 2332, + "TEXCOORD_0": 2334, + "TEXCOORD_1": 2335 + }, + "indices": 2336, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_620_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2338, + "POSITION": 2337, + "TEXCOORD_0": 2339, + "TEXCOORD_1": 2340 + }, + "indices": 2341, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_622_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2343, + "POSITION": 2342, + "TEXCOORD_0": 2344, + "TEXCOORD_1": 2345 + }, + "indices": 2346, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_624_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2348, + "POSITION": 2347, + "TEXCOORD_0": 2349, + "TEXCOORD_1": 2350 + }, + "indices": 2351, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_626_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2353, + "POSITION": 2352, + "TEXCOORD_0": 2354, + "TEXCOORD_1": 2355 + }, + "indices": 2356, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_628_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2358, + "POSITION": 2357, + "TEXCOORD_0": 2359, + "TEXCOORD_1": 2360 + }, + "indices": 2361, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_630_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2363, + "POSITION": 2362, + "TEXCOORD_0": 2364, + "TEXCOORD_1": 2365 + }, + "indices": 2366, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_632_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2368, + "POSITION": 2367, + "TEXCOORD_0": 2369, + "TEXCOORD_1": 2370 + }, + "indices": 2371, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_634_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2373, + "POSITION": 2372, + "TEXCOORD_0": 2374, + "TEXCOORD_1": 2375 + }, + "indices": 2376, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_636_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2378, + "POSITION": 2377, + "TEXCOORD_0": 2379, + "TEXCOORD_1": 2380 + }, + "indices": 2381, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_638_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2383, + "POSITION": 2382, + "TEXCOORD_0": 2384, + "TEXCOORD_1": 2385 + }, + "indices": 2386, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_640_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2388, + "POSITION": 2387, + "TEXCOORD_0": 2389, + "TEXCOORD_1": 2390 + }, + "indices": 2391, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_642_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2393, + "POSITION": 2392, + "TEXCOORD_0": 2394, + "TEXCOORD_1": 2395 + }, + "indices": 2396, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_644_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2398, + "POSITION": 2397, + "TEXCOORD_0": 2399, + "TEXCOORD_1": 2400 + }, + "indices": 2401, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_646_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2403, + "POSITION": 2402, + "TEXCOORD_0": 2404, + "TEXCOORD_1": 2405 + }, + "indices": 2406, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_648_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2408, + "POSITION": 2407, + "TEXCOORD_0": 2409, + "TEXCOORD_1": 2410 + }, + "indices": 2411, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_650_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2413, + "POSITION": 2412, + "TEXCOORD_0": 2414, + "TEXCOORD_1": 2415 + }, + "indices": 2416, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_652_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2418, + "POSITION": 2417, + "TEXCOORD_0": 2419, + "TEXCOORD_1": 2420 + }, + "indices": 2421, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_654_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2423, + "POSITION": 2422, + "TEXCOORD_0": 2424, + "TEXCOORD_1": 2425 + }, + "indices": 2426, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_656_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2428, + "POSITION": 2427, + "TEXCOORD_0": 2429, + "TEXCOORD_1": 2430 + }, + "indices": 2431, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_658_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2433, + "POSITION": 2432, + "TEXCOORD_0": 2434, + "TEXCOORD_1": 2435 + }, + "indices": 2436, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_660_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2438, + "POSITION": 2437, + "TEXCOORD_0": 2439, + "TEXCOORD_1": 2440 + }, + "indices": 2441, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_662_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2443, + "POSITION": 2442, + "TEXCOORD_0": 2444, + "TEXCOORD_1": 2445 + }, + "indices": 2446, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_664_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2448, + "POSITION": 2447, + "TEXCOORD_0": 2449, + "TEXCOORD_1": 2450 + }, + "indices": 2451, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_666_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2453, + "POSITION": 2452, + "TEXCOORD_0": 2454, + "TEXCOORD_1": 2455 + }, + "indices": 2456, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_668_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2458, + "POSITION": 2457, + "TEXCOORD_0": 2459, + "TEXCOORD_1": 2460 + }, + "indices": 2461, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_670_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2463, + "POSITION": 2462, + "TEXCOORD_0": 2464, + "TEXCOORD_1": 2465 + }, + "indices": 2466, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_672_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2468, + "POSITION": 2467, + "TEXCOORD_0": 2469, + "TEXCOORD_1": 2470 + }, + "indices": 2471, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_674_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2473, + "POSITION": 2472, + "TEXCOORD_0": 2474, + "TEXCOORD_1": 2475 + }, + "indices": 2476, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_676_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2478, + "POSITION": 2477, + "TEXCOORD_0": 2479, + "TEXCOORD_1": 2480 + }, + "indices": 2481, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_678_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2483, + "POSITION": 2482, + "TEXCOORD_0": 2484, + "TEXCOORD_1": 2485 + }, + "indices": 2486, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_680_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2488, + "POSITION": 2487, + "TEXCOORD_0": 2489, + "TEXCOORD_1": 2490 + }, + "indices": 2491, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_682_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2493, + "POSITION": 2492, + "TEXCOORD_0": 2494, + "TEXCOORD_1": 2495 + }, + "indices": 2496, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_684_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2498, + "POSITION": 2497, + "TEXCOORD_0": 2499, + "TEXCOORD_1": 2500 + }, + "indices": 2501, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_686_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2503, + "POSITION": 2502, + "TEXCOORD_0": 2504, + "TEXCOORD_1": 2505 + }, + "indices": 2506, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_688_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2508, + "POSITION": 2507, + "TEXCOORD_0": 2509, + "TEXCOORD_1": 2510 + }, + "indices": 2511, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_690_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2513, + "POSITION": 2512, + "TEXCOORD_0": 2514, + "TEXCOORD_1": 2515 + }, + "indices": 2516, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_692_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2518, + "POSITION": 2517, + "TEXCOORD_0": 2519, + "TEXCOORD_1": 2520 + }, + "indices": 2521, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_694_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2523, + "POSITION": 2522, + "TEXCOORD_0": 2524, + "TEXCOORD_1": 2525 + }, + "indices": 2526, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_696_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2528, + "POSITION": 2527, + "TEXCOORD_0": 2529, + "TEXCOORD_1": 2530 + }, + "indices": 2531, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_698_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2533, + "POSITION": 2532, + "TEXCOORD_0": 2534, + "TEXCOORD_1": 2535 + }, + "indices": 2536, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_700_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2538, + "POSITION": 2537, + "TEXCOORD_0": 2539, + "TEXCOORD_1": 2540 + }, + "indices": 2541, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_702_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2543, + "POSITION": 2542, + "TEXCOORD_0": 2544, + "TEXCOORD_1": 2545 + }, + "indices": 2546, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_704_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2548, + "POSITION": 2547, + "TEXCOORD_0": 2549, + "TEXCOORD_1": 2550 + }, + "indices": 2551, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_706_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2553, + "POSITION": 2552, + "TEXCOORD_0": 2554, + "TEXCOORD_1": 2555 + }, + "indices": 2556, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_708_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2558, + "POSITION": 2557, + "TEXCOORD_0": 2559, + "TEXCOORD_1": 2560 + }, + "indices": 2561, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_710_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2563, + "POSITION": 2562, + "TEXCOORD_0": 2564, + "TEXCOORD_1": 2565 + }, + "indices": 2566, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_712_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2568, + "POSITION": 2567, + "TEXCOORD_0": 2569, + "TEXCOORD_1": 2570 + }, + "indices": 2571, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_714_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2573, + "POSITION": 2572, + "TEXCOORD_0": 2574, + "TEXCOORD_1": 2575 + }, + "indices": 2576, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_716_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2578, + "POSITION": 2577, + "TEXCOORD_0": 2579, + "TEXCOORD_1": 2580 + }, + "indices": 2581, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_718_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2583, + "POSITION": 2582, + "TEXCOORD_0": 2584, + "TEXCOORD_1": 2585 + }, + "indices": 2586, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_720_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2588, + "POSITION": 2587, + "TEXCOORD_0": 2589, + "TEXCOORD_1": 2590 + }, + "indices": 2591, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_722_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2593, + "POSITION": 2592, + "TEXCOORD_0": 2594, + "TEXCOORD_1": 2595 + }, + "indices": 2596, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_724_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2598, + "POSITION": 2597, + "TEXCOORD_0": 2599, + "TEXCOORD_1": 2600 + }, + "indices": 2601, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_726_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2603, + "POSITION": 2602, + "TEXCOORD_0": 2604, + "TEXCOORD_1": 2605 + }, + "indices": 2606, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_728_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2608, + "POSITION": 2607, + "TEXCOORD_0": 2609, + "TEXCOORD_1": 2610 + }, + "indices": 2611, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_730_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2613, + "POSITION": 2612, + "TEXCOORD_0": 2614, + "TEXCOORD_1": 2615 + }, + "indices": 2616, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_732_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2618, + "POSITION": 2617, + "TEXCOORD_0": 2619, + "TEXCOORD_1": 2620 + }, + "indices": 2621, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_734_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2623, + "POSITION": 2622, + "TEXCOORD_0": 2624, + "TEXCOORD_1": 2625 + }, + "indices": 2626, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_736_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2628, + "POSITION": 2627, + "TEXCOORD_0": 2629, + "TEXCOORD_1": 2630 + }, + "indices": 2631, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_738_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2633, + "POSITION": 2632, + "TEXCOORD_0": 2634, + "TEXCOORD_1": 2635 + }, + "indices": 2636, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_740_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2638, + "POSITION": 2637, + "TEXCOORD_0": 2639, + "TEXCOORD_1": 2640 + }, + "indices": 2641, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_742_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2643, + "POSITION": 2642, + "TEXCOORD_0": 2644, + "TEXCOORD_1": 2645 + }, + "indices": 2646, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_744_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2648, + "POSITION": 2647, + "TEXCOORD_0": 2649, + "TEXCOORD_1": 2650 + }, + "indices": 2651, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_746_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2653, + "POSITION": 2652, + "TEXCOORD_0": 2654, + "TEXCOORD_1": 2655 + }, + "indices": 2656, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_748_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2658, + "POSITION": 2657, + "TEXCOORD_0": 2659, + "TEXCOORD_1": 2660 + }, + "indices": 2661, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_750_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2663, + "POSITION": 2662, + "TEXCOORD_0": 2664, + "TEXCOORD_1": 2665 + }, + "indices": 2666, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_752_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2668, + "POSITION": 2667, + "TEXCOORD_0": 2669, + "TEXCOORD_1": 2670 + }, + "indices": 2671, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_754_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2673, + "POSITION": 2672, + "TEXCOORD_0": 2674, + "TEXCOORD_1": 2675 + }, + "indices": 2676, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_756_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2678, + "POSITION": 2677, + "TEXCOORD_0": 2679, + "TEXCOORD_1": 2680 + }, + "indices": 2681, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_758_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2683, + "POSITION": 2682, + "TEXCOORD_0": 2684, + "TEXCOORD_1": 2685 + }, + "indices": 2686, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_760_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2688, + "POSITION": 2687, + "TEXCOORD_0": 2689, + "TEXCOORD_1": 2690 + }, + "indices": 2691, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_762_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2693, + "POSITION": 2692, + "TEXCOORD_0": 2694, + "TEXCOORD_1": 2695 + }, + "indices": 2696, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_764_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2698, + "POSITION": 2697, + "TEXCOORD_0": 2699, + "TEXCOORD_1": 2700 + }, + "indices": 2701, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_766_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2703, + "POSITION": 2702, + "TEXCOORD_0": 2704, + "TEXCOORD_1": 2705 + }, + "indices": 2706, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_768_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2708, + "POSITION": 2707, + "TEXCOORD_0": 2709, + "TEXCOORD_1": 2710 + }, + "indices": 2711, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_770_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2713, + "POSITION": 2712, + "TEXCOORD_0": 2714, + "TEXCOORD_1": 2715 + }, + "indices": 2716, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_772_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2718, + "POSITION": 2717, + "TEXCOORD_0": 2719, + "TEXCOORD_1": 2720 + }, + "indices": 2721, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_774_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2723, + "POSITION": 2722, + "TEXCOORD_0": 2724, + "TEXCOORD_1": 2725 + }, + "indices": 2726, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_776_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2728, + "POSITION": 2727, + "TEXCOORD_0": 2729, + "TEXCOORD_1": 2730 + }, + "indices": 2731, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_778_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2733, + "POSITION": 2732, + "TEXCOORD_0": 2734, + "TEXCOORD_1": 2735 + }, + "indices": 2736, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_780_Tasten_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2738, + "POSITION": 2737, + "TEXCOORD_0": 2739, + "TEXCOORD_1": 2740 + }, + "indices": 2741, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_782_OnTheFly-bg_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2743, + "POSITION": 2742, + "TEXCOORD_0": 2744 + }, + "indices": 2745, + "material": 84, + "mode": 4 + } + ] + }, + { + "name": "Object_784_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2747, + "POSITION": 2746, + "TEXCOORD_0": 2748, + "TEXCOORD_1": 2749, + "TEXCOORD_2": 2750 + }, + "indices": 2751, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_786_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2753, + "POSITION": 2752, + "TEXCOORD_0": 2754, + "TEXCOORD_1": 2755, + "TEXCOORD_2": 2756 + }, + "indices": 2757, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_788_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2759, + "POSITION": 2758, + "TEXCOORD_0": 2760, + "TEXCOORD_1": 2761, + "TEXCOORD_2": 2762 + }, + "indices": 2763, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_790_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2765, + "POSITION": 2764, + "TEXCOORD_0": 2766, + "TEXCOORD_1": 2767, + "TEXCOORD_2": 2768 + }, + "indices": 2769, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_792_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2771, + "POSITION": 2770, + "TEXCOORD_0": 2772, + "TEXCOORD_1": 2773, + "TEXCOORD_2": 2774 + }, + "indices": 2775, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_794_Material.070_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2777, + "POSITION": 2776, + "TEXCOORD_0": 2778, + "TEXCOORD_1": 2779, + "TEXCOORD_2": 2780 + }, + "indices": 2781, + "material": 83, + "mode": 4 + } + ] + }, + { + "name": "Object_796_Material.070_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2783, + "POSITION": 2782, + "TEXCOORD_0": 2784, + "TEXCOORD_1": 2785, + "TEXCOORD_2": 2786 + }, + "indices": 2787, + "material": 83, + "mode": 4 + } + ] + }, + { + "name": "Object_798_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2789, + "POSITION": 2788, + "TEXCOORD_0": 2790, + "TEXCOORD_1": 2791, + "TEXCOORD_2": 2792 + }, + "indices": 2793, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_800_Material.005_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2795, + "POSITION": 2794, + "TEXCOORD_0": 2796, + "TEXCOORD_1": 2797, + "TEXCOORD_2": 2798 + }, + "indices": 2799, + "material": 75, + "mode": 4 + } + ] + }, + { + "name": "Object_802_Material.005_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2801, + "POSITION": 2800, + "TEXCOORD_0": 2802, + "TEXCOORD_1": 2803, + "TEXCOORD_2": 2804 + }, + "indices": 2805, + "material": 75, + "mode": 4 + } + ] + }, + { + "name": "Object_804_Material.005_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2807, + "POSITION": 2806, + "TEXCOORD_0": 2808, + "TEXCOORD_1": 2809, + "TEXCOORD_2": 2810 + }, + "indices": 2811, + "material": 75, + "mode": 4 + } + ] + }, + { + "name": "Object_806_Material.005_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2813, + "POSITION": 2812, + "TEXCOORD_0": 2814, + "TEXCOORD_1": 2815, + "TEXCOORD_2": 2816 + }, + "indices": 2817, + "material": 75, + "mode": 4 + } + ] + }, + { + "name": "Object_808_Material.005_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2819, + "POSITION": 2818, + "TEXCOORD_0": 2820, + "TEXCOORD_1": 2821, + "TEXCOORD_2": 2822 + }, + "indices": 2823, + "material": 75, + "mode": 4 + } + ] + }, + { + "name": "Object_810_Material.005_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2825, + "POSITION": 2824, + "TEXCOORD_0": 2826, + "TEXCOORD_1": 2827, + "TEXCOORD_2": 2828 + }, + "indices": 2829, + "material": 75, + "mode": 4 + } + ] + }, + { + "name": "Object_812_Material.068_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2831, + "POSITION": 2830, + "TEXCOORD_0": 2832, + "TEXCOORD_1": 2833, + "TEXCOORD_2": 2834 + }, + "indices": 2835, + "material": 81, + "mode": 4 + } + ] + }, + { + "name": "Object_814_Material.068_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2837, + "POSITION": 2836, + "TEXCOORD_0": 2838, + "TEXCOORD_1": 2839, + "TEXCOORD_2": 2840 + }, + "indices": 2841, + "material": 81, + "mode": 4 + } + ] + }, + { + "name": "Object_816_Material.068_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2843, + "POSITION": 2842, + "TEXCOORD_0": 2844, + "TEXCOORD_1": 2845, + "TEXCOORD_2": 2846 + }, + "indices": 2847, + "material": 81, + "mode": 4 + } + ] + }, + { + "name": "Object_818_Material.066_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2849, + "POSITION": 2848, + "TEXCOORD_0": 2850, + "TEXCOORD_1": 2851, + "TEXCOORD_2": 2852 + }, + "indices": 2853, + "material": 79, + "mode": 4 + } + ] + }, + { + "name": "Object_820_Material.066_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2855, + "POSITION": 2854, + "TEXCOORD_0": 2856, + "TEXCOORD_1": 2857, + "TEXCOORD_2": 2858 + }, + "indices": 2859, + "material": 79, + "mode": 4 + } + ] + }, + { + "name": "Object_822_Material.066_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2861, + "POSITION": 2860, + "TEXCOORD_0": 2862, + "TEXCOORD_1": 2863, + "TEXCOORD_2": 2864 + }, + "indices": 2865, + "material": 79, + "mode": 4 + } + ] + }, + { + "name": "Object_824_Material.066_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2867, + "POSITION": 2866, + "TEXCOORD_0": 2868, + "TEXCOORD_1": 2869, + "TEXCOORD_2": 2870 + }, + "indices": 2871, + "material": 79, + "mode": 4 + } + ] + }, + { + "name": "Object_826_Material.060_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2873, + "POSITION": 2872, + "TEXCOORD_0": 2874, + "TEXCOORD_1": 2875, + "TEXCOORD_2": 2876 + }, + "indices": 2877, + "material": 78, + "mode": 4 + } + ] + }, + { + "name": "Object_828_Material.005_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2879, + "POSITION": 2878, + "TEXCOORD_0": 2880, + "TEXCOORD_1": 2881, + "TEXCOORD_2": 2882 + }, + "indices": 2883, + "material": 75, + "mode": 4 + } + ] + }, + { + "name": "Object_830_Material.069_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2885, + "POSITION": 2884, + "TEXCOORD_0": 2886, + "TEXCOORD_1": 2887, + "TEXCOORD_2": 2888 + }, + "indices": 2889, + "material": 82, + "mode": 4 + } + ] + }, + { + "name": "Object_832_Material.068_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2891, + "POSITION": 2890, + "TEXCOORD_0": 2892, + "TEXCOORD_1": 2893, + "TEXCOORD_2": 2894 + }, + "indices": 2895, + "material": 81, + "mode": 4 + } + ] + }, + { + "name": "Object_834_Material.068_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2897, + "POSITION": 2896, + "TEXCOORD_0": 2898, + "TEXCOORD_1": 2899, + "TEXCOORD_2": 2900 + }, + "indices": 2901, + "material": 81, + "mode": 4 + } + ] + }, + { + "name": "Object_836_Material.068_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2903, + "POSITION": 2902, + "TEXCOORD_0": 2904, + "TEXCOORD_1": 2905, + "TEXCOORD_2": 2906 + }, + "indices": 2907, + "material": 81, + "mode": 4 + } + ] + }, + { + "name": "Object_838_Material.070_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2909, + "POSITION": 2908, + "TEXCOORD_0": 2910, + "TEXCOORD_1": 2911, + "TEXCOORD_2": 2912 + }, + "indices": 2913, + "material": 83, + "mode": 4 + } + ] + }, + { + "name": "Object_840_Material.070_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2915, + "POSITION": 2914, + "TEXCOORD_0": 2916, + "TEXCOORD_1": 2917, + "TEXCOORD_2": 2918 + }, + "indices": 2919, + "material": 83, + "mode": 4 + } + ] + }, + { + "name": "Object_842_Material.066_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2921, + "POSITION": 2920, + "TEXCOORD_0": 2922, + "TEXCOORD_1": 2923, + "TEXCOORD_2": 2924 + }, + "indices": 2925, + "material": 79, + "mode": 4 + } + ] + }, + { + "name": "Object_844_Material.066_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2927, + "POSITION": 2926, + "TEXCOORD_0": 2928, + "TEXCOORD_1": 2929, + "TEXCOORD_2": 2930 + }, + "indices": 2931, + "material": 79, + "mode": 4 + } + ] + }, + { + "name": "Object_846_Material.066_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2933, + "POSITION": 2932, + "TEXCOORD_0": 2934, + "TEXCOORD_1": 2935, + "TEXCOORD_2": 2936 + }, + "indices": 2937, + "material": 79, + "mode": 4 + } + ] + }, + { + "name": "Object_848_Material.060_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2939, + "POSITION": 2938, + "TEXCOORD_0": 2940, + "TEXCOORD_1": 2941, + "TEXCOORD_2": 2942 + }, + "indices": 2943, + "material": 78, + "mode": 4 + } + ] + }, + { + "name": "Object_850_Material.070_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2945, + "POSITION": 2944, + "TEXCOORD_0": 2946, + "TEXCOORD_1": 2947, + "TEXCOORD_2": 2948 + }, + "indices": 2949, + "material": 83, + "mode": 4 + } + ] + }, + { + "name": "Object_852_Material.066_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2951, + "POSITION": 2950, + "TEXCOORD_0": 2952, + "TEXCOORD_1": 2953, + "TEXCOORD_2": 2954 + }, + "indices": 2955, + "material": 79, + "mode": 4 + } + ] + }, + { + "name": "Object_854_Material.068_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2957, + "POSITION": 2956, + "TEXCOORD_0": 2958, + "TEXCOORD_1": 2959, + "TEXCOORD_2": 2960 + }, + "indices": 2961, + "material": 81, + "mode": 4 + } + ] + }, + { + "name": "Object_856_Material.068_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2963, + "POSITION": 2962, + "TEXCOORD_0": 2964, + "TEXCOORD_1": 2965, + "TEXCOORD_2": 2966 + }, + "indices": 2967, + "material": 81, + "mode": 4 + } + ] + }, + { + "name": "Object_858_Material.069_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2969, + "POSITION": 2968, + "TEXCOORD_0": 2970, + "TEXCOORD_1": 2971, + "TEXCOORD_2": 2972 + }, + "indices": 2973, + "material": 82, + "mode": 4 + } + ] + }, + { + "name": "Object_860_Material.005_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2975, + "POSITION": 2974, + "TEXCOORD_0": 2976, + "TEXCOORD_1": 2977, + "TEXCOORD_2": 2978 + }, + "indices": 2979, + "material": 75, + "mode": 4 + } + ] + }, + { + "name": "Object_862_Material.066_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2981, + "POSITION": 2980, + "TEXCOORD_0": 2982, + "TEXCOORD_1": 2983, + "TEXCOORD_2": 2984 + }, + "indices": 2985, + "material": 79, + "mode": 4 + } + ] + }, + { + "name": "Object_864_Material.066_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2987, + "POSITION": 2986, + "TEXCOORD_0": 2988, + "TEXCOORD_1": 2989, + "TEXCOORD_2": 2990 + }, + "indices": 2991, + "material": 79, + "mode": 4 + } + ] + }, + { + "name": "Object_866_Material.070_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2993, + "POSITION": 2992, + "TEXCOORD_0": 2994, + "TEXCOORD_1": 2995, + "TEXCOORD_2": 2996 + }, + "indices": 2997, + "material": 83, + "mode": 4 + } + ] + }, + { + "name": "Object_868_Material.005_0", + "primitives": [ + { + "attributes": { + "NORMAL": 2999, + "POSITION": 2998, + "TEXCOORD_0": 3000, + "TEXCOORD_1": 3001, + "TEXCOORD_2": 3002 + }, + "indices": 3003, + "material": 75, + "mode": 4 + } + ] + }, + { + "name": "Object_870_Material.005_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3005, + "POSITION": 3004, + "TEXCOORD_0": 3006, + "TEXCOORD_1": 3007, + "TEXCOORD_2": 3008 + }, + "indices": 3009, + "material": 75, + "mode": 4 + } + ] + }, + { + "name": "Object_872_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3011, + "POSITION": 3010, + "TEXCOORD_0": 3012, + "TEXCOORD_1": 3013, + "TEXCOORD_2": 3014 + }, + "indices": 3015, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_874_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3017, + "POSITION": 3016, + "TEXCOORD_0": 3018, + "TEXCOORD_1": 3019, + "TEXCOORD_2": 3020 + }, + "indices": 3021, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_876_Material.069_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3023, + "POSITION": 3022, + "TEXCOORD_0": 3024, + "TEXCOORD_1": 3025, + "TEXCOORD_2": 3026 + }, + "indices": 3027, + "material": 82, + "mode": 4 + } + ] + }, + { + "name": "Object_878_Material.069_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3029, + "POSITION": 3028, + "TEXCOORD_0": 3030, + "TEXCOORD_1": 3031, + "TEXCOORD_2": 3032 + }, + "indices": 3033, + "material": 82, + "mode": 4 + } + ] + }, + { + "name": "Object_880_Material.068_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3035, + "POSITION": 3034, + "TEXCOORD_0": 3036, + "TEXCOORD_1": 3037, + "TEXCOORD_2": 3038 + }, + "indices": 3039, + "material": 81, + "mode": 4 + } + ] + }, + { + "name": "Object_882_Material.068_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3041, + "POSITION": 3040, + "TEXCOORD_0": 3042, + "TEXCOORD_1": 3043, + "TEXCOORD_2": 3044 + }, + "indices": 3045, + "material": 81, + "mode": 4 + } + ] + }, + { + "name": "Object_884_Material.070_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3047, + "POSITION": 3046, + "TEXCOORD_0": 3048, + "TEXCOORD_1": 3049, + "TEXCOORD_2": 3050 + }, + "indices": 3051, + "material": 83, + "mode": 4 + } + ] + }, + { + "name": "Object_886_Material.068_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3053, + "POSITION": 3052, + "TEXCOORD_0": 3054, + "TEXCOORD_1": 3055, + "TEXCOORD_2": 3056 + }, + "indices": 3057, + "material": 81, + "mode": 4 + } + ] + }, + { + "name": "Object_888_Material.068_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3059, + "POSITION": 3058, + "TEXCOORD_0": 3060, + "TEXCOORD_1": 3061, + "TEXCOORD_2": 3062 + }, + "indices": 3063, + "material": 81, + "mode": 4 + } + ] + }, + { + "name": "Object_890_Material.066_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3065, + "POSITION": 3064, + "TEXCOORD_0": 3066, + "TEXCOORD_1": 3067, + "TEXCOORD_2": 3068 + }, + "indices": 3069, + "material": 79, + "mode": 4 + } + ] + }, + { + "name": "Object_892_Material.068_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3071, + "POSITION": 3070, + "TEXCOORD_0": 3072, + "TEXCOORD_1": 3073, + "TEXCOORD_2": 3074 + }, + "indices": 3075, + "material": 81, + "mode": 4 + } + ] + }, + { + "name": "Object_894_Material.069_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3077, + "POSITION": 3076, + "TEXCOORD_0": 3078, + "TEXCOORD_1": 3079, + "TEXCOORD_2": 3080 + }, + "indices": 3081, + "material": 82, + "mode": 4 + } + ] + }, + { + "name": "Object_896_Material.005_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3083, + "POSITION": 3082, + "TEXCOORD_0": 3084, + "TEXCOORD_1": 3085, + "TEXCOORD_2": 3086 + }, + "indices": 3087, + "material": 75, + "mode": 4 + } + ] + }, + { + "name": "Object_898_Material.005_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3089, + "POSITION": 3088, + "TEXCOORD_0": 3090, + "TEXCOORD_1": 3091, + "TEXCOORD_2": 3092 + }, + "indices": 3093, + "material": 75, + "mode": 4 + } + ] + }, + { + "name": "Object_900_Material.066_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3095, + "POSITION": 3094, + "TEXCOORD_0": 3096, + "TEXCOORD_1": 3097, + "TEXCOORD_2": 3098 + }, + "indices": 3099, + "material": 79, + "mode": 4 + } + ] + }, + { + "name": "Object_902_Material.066_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3101, + "POSITION": 3100, + "TEXCOORD_0": 3102, + "TEXCOORD_1": 3103, + "TEXCOORD_2": 3104 + }, + "indices": 3105, + "material": 79, + "mode": 4 + } + ] + }, + { + "name": "Object_904_Material.066_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3107, + "POSITION": 3106, + "TEXCOORD_0": 3108, + "TEXCOORD_1": 3109, + "TEXCOORD_2": 3110 + }, + "indices": 3111, + "material": 79, + "mode": 4 + } + ] + }, + { + "name": "Object_906_Material.060_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3113, + "POSITION": 3112, + "TEXCOORD_0": 3114, + "TEXCOORD_1": 3115, + "TEXCOORD_2": 3116 + }, + "indices": 3117, + "material": 78, + "mode": 4 + } + ] + }, + { + "name": "Object_908_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3119, + "POSITION": 3118, + "TEXCOORD_0": 3120, + "TEXCOORD_1": 3121, + "TEXCOORD_2": 3122 + }, + "indices": 3123, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_910_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3125, + "POSITION": 3124, + "TEXCOORD_0": 3126, + "TEXCOORD_1": 3127, + "TEXCOORD_2": 3128 + }, + "indices": 3129, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_912_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3131, + "POSITION": 3130, + "TEXCOORD_0": 3132, + "TEXCOORD_1": 3133, + "TEXCOORD_2": 3134 + }, + "indices": 3135, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_914_Material.068_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3137, + "POSITION": 3136, + "TEXCOORD_0": 3138, + "TEXCOORD_1": 3139, + "TEXCOORD_2": 3140 + }, + "indices": 3141, + "material": 81, + "mode": 4 + } + ] + }, + { + "name": "Object_916_Material.068_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3143, + "POSITION": 3142, + "TEXCOORD_0": 3144, + "TEXCOORD_1": 3145, + "TEXCOORD_2": 3146 + }, + "indices": 3147, + "material": 81, + "mode": 4 + } + ] + }, + { + "name": "Object_918_Material.066_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3149, + "POSITION": 3148, + "TEXCOORD_0": 3150, + "TEXCOORD_1": 3151, + "TEXCOORD_2": 3152 + }, + "indices": 3153, + "material": 79, + "mode": 4 + } + ] + }, + { + "name": "Object_920_Material.066_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3155, + "POSITION": 3154, + "TEXCOORD_0": 3156, + "TEXCOORD_1": 3157, + "TEXCOORD_2": 3158 + }, + "indices": 3159, + "material": 79, + "mode": 4 + } + ] + }, + { + "name": "Object_922_Material.066_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3161, + "POSITION": 3160, + "TEXCOORD_0": 3162, + "TEXCOORD_1": 3163, + "TEXCOORD_2": 3164 + }, + "indices": 3165, + "material": 79, + "mode": 4 + } + ] + }, + { + "name": "Object_924_Material.066_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3167, + "POSITION": 3166, + "TEXCOORD_0": 3168, + "TEXCOORD_1": 3169, + "TEXCOORD_2": 3170 + }, + "indices": 3171, + "material": 79, + "mode": 4 + } + ] + }, + { + "name": "Object_926_Material.066_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3173, + "POSITION": 3172, + "TEXCOORD_0": 3174, + "TEXCOORD_1": 3175, + "TEXCOORD_2": 3176 + }, + "indices": 3177, + "material": 79, + "mode": 4 + } + ] + }, + { + "name": "Object_928_Material.060_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3179, + "POSITION": 3178, + "TEXCOORD_0": 3180, + "TEXCOORD_1": 3181, + "TEXCOORD_2": 3182 + }, + "indices": 3183, + "material": 78, + "mode": 4 + } + ] + }, + { + "name": "Object_930_Material.066_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3185, + "POSITION": 3184, + "TEXCOORD_0": 3186, + "TEXCOORD_1": 3187, + "TEXCOORD_2": 3188 + }, + "indices": 3189, + "material": 79, + "mode": 4 + } + ] + }, + { + "name": "Object_932_Material.060_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3191, + "POSITION": 3190, + "TEXCOORD_0": 3192, + "TEXCOORD_1": 3193, + "TEXCOORD_2": 3194 + }, + "indices": 3195, + "material": 78, + "mode": 4 + } + ] + }, + { + "name": "Object_934_Tasten_2_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3197, + "POSITION": 3196, + "TEXCOORD_0": 3198, + "TEXCOORD_1": 3199, + "TEXCOORD_2": 3200 + }, + "indices": 3201, + "material": 76, + "mode": 4 + } + ] + }, + { + "name": "Object_936_Material.070_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3203, + "POSITION": 3202, + "TEXCOORD_0": 3204, + "TEXCOORD_1": 3205, + "TEXCOORD_2": 3206 + }, + "indices": 3207, + "material": 83, + "mode": 4 + } + ] + }, + { + "name": "Object_938_Material.060_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3209, + "POSITION": 3208, + "TEXCOORD_0": 3210, + "TEXCOORD_1": 3211, + "TEXCOORD_2": 3212 + }, + "indices": 3213, + "material": 78, + "mode": 4 + } + ] + }, + { + "name": "Object_940_Material.060_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3215, + "POSITION": 3214, + "TEXCOORD_0": 3216, + "TEXCOORD_1": 3217, + "TEXCOORD_2": 3218 + }, + "indices": 3219, + "material": 78, + "mode": 4 + } + ] + }, + { + "name": "Object_942_Material.070_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3221, + "POSITION": 3220, + "TEXCOORD_0": 3222, + "TEXCOORD_1": 3223, + "TEXCOORD_2": 3224 + }, + "indices": 3225, + "material": 83, + "mode": 4 + } + ] + }, + { + "name": "Object_944_Material.060_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3227, + "POSITION": 3226, + "TEXCOORD_0": 3228, + "TEXCOORD_1": 3229, + "TEXCOORD_2": 3230 + }, + "indices": 3231, + "material": 78, + "mode": 4 + } + ] + }, + { + "name": "Object_946_Tasten_2_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3233, + "POSITION": 3232, + "TEXCOORD_0": 3234, + "TEXCOORD_1": 3235, + "TEXCOORD_2": 3236 + }, + "indices": 3237, + "material": 76, + "mode": 4 + } + ] + }, + { + "name": "Object_948_Material.067_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3239, + "POSITION": 3238, + "TEXCOORD_0": 3240, + "TEXCOORD_1": 3241, + "TEXCOORD_2": 3242 + }, + "indices": 3243, + "material": 80, + "mode": 4 + } + ] + }, + { + "name": "Object_950_Material.067_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3245, + "POSITION": 3244, + "TEXCOORD_0": 3246, + "TEXCOORD_1": 3247, + "TEXCOORD_2": 3248 + }, + "indices": 3249, + "material": 80, + "mode": 4 + } + ] + }, + { + "name": "Object_952_Material.067_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3251, + "POSITION": 3250, + "TEXCOORD_0": 3252, + "TEXCOORD_1": 3253, + "TEXCOORD_2": 3254 + }, + "indices": 3255, + "material": 80, + "mode": 4 + } + ] + }, + { + "name": "Object_954_Material.072_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3257, + "POSITION": 3256, + "TEXCOORD_0": 3258 + }, + "indices": 3259, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_956_Material.072_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3261, + "POSITION": 3260, + "TEXCOORD_0": 3262 + }, + "indices": 3263, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_958_Material.066_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3265, + "POSITION": 3264, + "TEXCOORD_0": 3266, + "TEXCOORD_1": 3267, + "TEXCOORD_2": 3268 + }, + "indices": 3269, + "material": 79, + "mode": 4 + } + ] + }, + { + "name": "Object_960_Material.067_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3271, + "POSITION": 3270, + "TEXCOORD_0": 3272, + "TEXCOORD_1": 3273, + "TEXCOORD_2": 3274 + }, + "indices": 3275, + "material": 80, + "mode": 4 + } + ] + }, + { + "name": "Object_962_Material.067_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3277, + "POSITION": 3276, + "TEXCOORD_0": 3278, + "TEXCOORD_1": 3279, + "TEXCOORD_2": 3280 + }, + "indices": 3281, + "material": 80, + "mode": 4 + } + ] + }, + { + "name": "Object_964_Tasten_2_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3283, + "POSITION": 3282, + "TEXCOORD_0": 3284, + "TEXCOORD_1": 3285, + "TEXCOORD_2": 3286 + }, + "indices": 3287, + "material": 76, + "mode": 4 + } + ] + }, + { + "name": "Object_966_Material.060_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3289, + "POSITION": 3288, + "TEXCOORD_0": 3290, + "TEXCOORD_1": 3291, + "TEXCOORD_2": 3292 + }, + "indices": 3293, + "material": 78, + "mode": 4 + } + ] + }, + { + "name": "Object_968_Material.060_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3295, + "POSITION": 3294, + "TEXCOORD_0": 3296, + "TEXCOORD_1": 3297, + "TEXCOORD_2": 3298 + }, + "indices": 3299, + "material": 78, + "mode": 4 + } + ] + }, + { + "name": "Object_970_Tasten_2_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3301, + "POSITION": 3300, + "TEXCOORD_0": 3302, + "TEXCOORD_1": 3303, + "TEXCOORD_2": 3304 + }, + "indices": 3305, + "material": 76, + "mode": 4 + } + ] + }, + { + "name": "Object_972_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3307, + "POSITION": 3306, + "TEXCOORD_0": 3308, + "TEXCOORD_1": 3309, + "TEXCOORD_2": 3310 + }, + "indices": 3311, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_974_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3313, + "POSITION": 3312, + "TEXCOORD_0": 3314, + "TEXCOORD_1": 3315, + "TEXCOORD_2": 3316 + }, + "indices": 3317, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_976_Material.070_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3319, + "POSITION": 3318, + "TEXCOORD_0": 3320, + "TEXCOORD_1": 3321, + "TEXCOORD_2": 3322 + }, + "indices": 3323, + "material": 83, + "mode": 4 + } + ] + }, + { + "name": "Object_978_Tasten_2_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3325, + "POSITION": 3324, + "TEXCOORD_0": 3326, + "TEXCOORD_1": 3327, + "TEXCOORD_2": 3328 + }, + "indices": 3329, + "material": 76, + "mode": 4 + } + ] + }, + { + "name": "Object_980_Tasten_2_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3331, + "POSITION": 3330, + "TEXCOORD_0": 3332, + "TEXCOORD_1": 3333, + "TEXCOORD_2": 3334 + }, + "indices": 3335, + "material": 76, + "mode": 4 + } + ] + }, + { + "name": "Object_982_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3337, + "POSITION": 3336, + "TEXCOORD_0": 3338, + "TEXCOORD_1": 3339, + "TEXCOORD_2": 3340 + }, + "indices": 3341, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_984_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3343, + "POSITION": 3342, + "TEXCOORD_0": 3344, + "TEXCOORD_1": 3345, + "TEXCOORD_2": 3346 + }, + "indices": 3347, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_986_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3349, + "POSITION": 3348, + "TEXCOORD_0": 3350, + "TEXCOORD_1": 3351, + "TEXCOORD_2": 3352 + }, + "indices": 3353, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_988_Material.067_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3355, + "POSITION": 3354, + "TEXCOORD_0": 3356, + "TEXCOORD_1": 3357, + "TEXCOORD_2": 3358 + }, + "indices": 3359, + "material": 80, + "mode": 4 + } + ] + }, + { + "name": "Object_990_Material.067_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3361, + "POSITION": 3360, + "TEXCOORD_0": 3362, + "TEXCOORD_1": 3363, + "TEXCOORD_2": 3364 + }, + "indices": 3365, + "material": 80, + "mode": 4 + } + ] + }, + { + "name": "Object_992_Tasten_2_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3367, + "POSITION": 3366, + "TEXCOORD_0": 3368, + "TEXCOORD_1": 3369, + "TEXCOORD_2": 3370 + }, + "indices": 3371, + "material": 76, + "mode": 4 + } + ] + }, + { + "name": "Object_994_Tasten_2_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3373, + "POSITION": 3372, + "TEXCOORD_0": 3374, + "TEXCOORD_1": 3375, + "TEXCOORD_2": 3376 + }, + "indices": 3377, + "material": 76, + "mode": 4 + } + ] + }, + { + "name": "Object_996_Tasten_2_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3379, + "POSITION": 3378, + "TEXCOORD_0": 3380, + "TEXCOORD_1": 3381, + "TEXCOORD_2": 3382 + }, + "indices": 3383, + "material": 76, + "mode": 4 + } + ] + }, + { + "name": "Object_998_Tasten_2_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3385, + "POSITION": 3384, + "TEXCOORD_0": 3386, + "TEXCOORD_1": 3387, + "TEXCOORD_2": 3388 + }, + "indices": 3389, + "material": 76, + "mode": 4 + } + ] + }, + { + "name": "Object_1000_Material.070_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3391, + "POSITION": 3390, + "TEXCOORD_0": 3392, + "TEXCOORD_1": 3393, + "TEXCOORD_2": 3394 + }, + "indices": 3395, + "material": 83, + "mode": 4 + } + ] + }, + { + "name": "Object_1002_Material.070_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3397, + "POSITION": 3396, + "TEXCOORD_0": 3398, + "TEXCOORD_1": 3399, + "TEXCOORD_2": 3400 + }, + "indices": 3401, + "material": 83, + "mode": 4 + } + ] + }, + { + "name": "Object_1004_Material.070_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3403, + "POSITION": 3402, + "TEXCOORD_0": 3404, + "TEXCOORD_1": 3405, + "TEXCOORD_2": 3406 + }, + "indices": 3407, + "material": 83, + "mode": 4 + } + ] + }, + { + "name": "Object_1006_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3409, + "POSITION": 3408, + "TEXCOORD_0": 3410, + "TEXCOORD_1": 3411, + "TEXCOORD_2": 3412 + }, + "indices": 3413, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_1008_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3415, + "POSITION": 3414, + "TEXCOORD_0": 3416, + "TEXCOORD_1": 3417, + "TEXCOORD_2": 3418 + }, + "indices": 3419, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_1010_Material.060_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3421, + "POSITION": 3420, + "TEXCOORD_0": 3422, + "TEXCOORD_1": 3423, + "TEXCOORD_2": 3424 + }, + "indices": 3425, + "material": 78, + "mode": 4 + } + ] + }, + { + "name": "Object_1012_Material.070_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3427, + "POSITION": 3426, + "TEXCOORD_0": 3428, + "TEXCOORD_1": 3429, + "TEXCOORD_2": 3430 + }, + "indices": 3431, + "material": 83, + "mode": 4 + } + ] + }, + { + "name": "Object_1014_Material.070_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3433, + "POSITION": 3432, + "TEXCOORD_0": 3434, + "TEXCOORD_1": 3435, + "TEXCOORD_2": 3436 + }, + "indices": 3437, + "material": 83, + "mode": 4 + } + ] + }, + { + "name": "Object_1016_Material.070_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3439, + "POSITION": 3438, + "TEXCOORD_0": 3440, + "TEXCOORD_1": 3441, + "TEXCOORD_2": 3442 + }, + "indices": 3443, + "material": 83, + "mode": 4 + } + ] + }, + { + "name": "Object_1018_Material.070_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3445, + "POSITION": 3444, + "TEXCOORD_0": 3446, + "TEXCOORD_1": 3447, + "TEXCOORD_2": 3448 + }, + "indices": 3449, + "material": 83, + "mode": 4 + } + ] + }, + { + "name": "Object_1020_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3451, + "POSITION": 3450, + "TEXCOORD_0": 3452, + "TEXCOORD_1": 3453, + "TEXCOORD_2": 3454 + }, + "indices": 3455, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_1022_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3457, + "POSITION": 3456, + "TEXCOORD_0": 3458, + "TEXCOORD_1": 3459, + "TEXCOORD_2": 3460 + }, + "indices": 3461, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_1024_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3463, + "POSITION": 3462, + "TEXCOORD_0": 3464, + "TEXCOORD_1": 3465, + "TEXCOORD_2": 3466 + }, + "indices": 3467, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_1026_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3469, + "POSITION": 3468, + "TEXCOORD_0": 3470, + "TEXCOORD_1": 3471, + "TEXCOORD_2": 3472 + }, + "indices": 3473, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_1028_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3475, + "POSITION": 3474, + "TEXCOORD_0": 3476, + "TEXCOORD_1": 3477, + "TEXCOORD_2": 3478 + }, + "indices": 3479, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_1030_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3481, + "POSITION": 3480, + "TEXCOORD_0": 3482, + "TEXCOORD_1": 3483, + "TEXCOORD_2": 3484 + }, + "indices": 3485, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_1032_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3487, + "POSITION": 3486, + "TEXCOORD_0": 3488, + "TEXCOORD_1": 3489, + "TEXCOORD_2": 3490 + }, + "indices": 3491, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_1034_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3493, + "POSITION": 3492, + "TEXCOORD_0": 3494, + "TEXCOORD_1": 3495, + "TEXCOORD_2": 3496 + }, + "indices": 3497, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_1036_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3499, + "POSITION": 3498, + "TEXCOORD_0": 3500, + "TEXCOORD_1": 3501, + "TEXCOORD_2": 3502 + }, + "indices": 3503, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_1038_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3505, + "POSITION": 3504, + "TEXCOORD_0": 3506, + "TEXCOORD_1": 3507, + "TEXCOORD_2": 3508 + }, + "indices": 3509, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_1040_Tasten_2_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3511, + "POSITION": 3510, + "TEXCOORD_0": 3512, + "TEXCOORD_1": 3513, + "TEXCOORD_2": 3514 + }, + "indices": 3515, + "material": 76, + "mode": 4 + } + ] + }, + { + "name": "Object_1042_Tasten_2_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3517, + "POSITION": 3516, + "TEXCOORD_0": 3518, + "TEXCOORD_1": 3519, + "TEXCOORD_2": 3520 + }, + "indices": 3521, + "material": 76, + "mode": 4 + } + ] + }, + { + "name": "Object_1044_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3523, + "POSITION": 3522, + "TEXCOORD_0": 3524, + "TEXCOORD_1": 3525, + "TEXCOORD_2": 3526 + }, + "indices": 3527, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_1046_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3529, + "POSITION": 3528, + "TEXCOORD_0": 3530, + "TEXCOORD_1": 3531, + "TEXCOORD_2": 3532 + }, + "indices": 3533, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_1048_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3535, + "POSITION": 3534, + "TEXCOORD_0": 3536, + "TEXCOORD_1": 3537, + "TEXCOORD_2": 3538 + }, + "indices": 3539, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_1050_Tasten_2_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3541, + "POSITION": 3540, + "TEXCOORD_0": 3542, + "TEXCOORD_1": 3543, + "TEXCOORD_2": 3544 + }, + "indices": 3545, + "material": 76, + "mode": 4 + } + ] + }, + { + "name": "Object_1052_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3547, + "POSITION": 3546, + "TEXCOORD_0": 3548, + "TEXCOORD_1": 3549, + "TEXCOORD_2": 3550 + }, + "indices": 3551, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_1054_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3553, + "POSITION": 3552, + "TEXCOORD_0": 3554, + "TEXCOORD_1": 3555, + "TEXCOORD_2": 3556 + }, + "indices": 3557, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_1056_Material.073_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3559, + "POSITION": 3558, + "TEXCOORD_0": 3560 + }, + "indices": 3561, + "material": 85, + "mode": 4 + } + ] + }, + { + "name": "Object_1058_Material.057_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3563, + "POSITION": 3562, + "TEXCOORD_0": 3564, + "TEXCOORD_1": 3565, + "TEXCOORD_2": 3566 + }, + "indices": 3567, + "material": 77, + "mode": 4 + } + ] + }, + { + "name": "Object_1060_Material.060_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3569, + "POSITION": 3568, + "TEXCOORD_0": 3570, + "TEXCOORD_1": 3571, + "TEXCOORD_2": 3572 + }, + "indices": 3573, + "material": 78, + "mode": 4 + } + ] + }, + { + "name": "Object_1062_Tasten_2_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3575, + "POSITION": 3574, + "TEXCOORD_0": 3576, + "TEXCOORD_1": 3577, + "TEXCOORD_2": 3578 + }, + "indices": 3579, + "material": 76, + "mode": 4 + } + ] + }, + { + "name": "Object_1064_Tasten_2_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3581, + "POSITION": 3580, + "TEXCOORD_0": 3582, + "TEXCOORD_1": 3583, + "TEXCOORD_2": 3584 + }, + "indices": 3585, + "material": 76, + "mode": 4 + } + ] + }, + { + "name": "Object_1066_Material.067_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3587, + "POSITION": 3586, + "TEXCOORD_0": 3588, + "TEXCOORD_1": 3589, + "TEXCOORD_2": 3590 + }, + "indices": 3591, + "material": 80, + "mode": 4 + } + ] + }, + { + "name": "Object_1068_Material.067_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3593, + "POSITION": 3592, + "TEXCOORD_0": 3594, + "TEXCOORD_1": 3595, + "TEXCOORD_2": 3596 + }, + "indices": 3597, + "material": 80, + "mode": 4 + } + ] + }, + { + "name": "Object_1070_Tasten_2_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3599, + "POSITION": 3598, + "TEXCOORD_0": 3600, + "TEXCOORD_1": 3601, + "TEXCOORD_2": 3602 + }, + "indices": 3603, + "material": 76, + "mode": 4 + } + ] + }, + { + "name": "Object_1072_Tasten_2_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3605, + "POSITION": 3604, + "TEXCOORD_0": 3606, + "TEXCOORD_1": 3607, + "TEXCOORD_2": 3608 + }, + "indices": 3609, + "material": 76, + "mode": 4 + } + ] + }, + { + "name": "Object_1074_Material.069_0", + "primitives": [ + { + "attributes": { + "NORMAL": 3611, + "POSITION": 3610, + "TEXCOORD_0": 3612, + "TEXCOORD_1": 3613, + "TEXCOORD_2": 3614 + }, + "indices": 3615, + "material": 82, + "mode": 4 + } + ] + } + ], + "nodes": [ + { + "children": [ + 1 + ], + "matrix": [ + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 2.220446049250313e-16, + -1.0, + 0.0, + 0.0, + 1.0, + 2.220446049250313e-16, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0 + ], + "name": "Sketchfab_model" + }, + { + "children": [ + 2 + ], + "matrix": [ + 0.009999999776482582, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.009999999776482582, + 0.0, + 0.0, + -0.009999999776482582, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0 + ], + "name": "dd12f1d0399348aab05d4e554860e7c0.fbx" + }, + { + "children": [ + 3, + 5, + 7, + 9, + 11, + 13, + 15, + 17, + 19, + 21, + 23, + 25, + 27, + 29, + 31, + 33, + 35, + 37, + 39, + 41, + 43, + 45, + 47, + 49, + 51, + 53, + 55, + 57, + 59, + 61, + 63, + 65, + 67, + 69, + 71, + 73, + 75, + 77, + 79, + 81, + 83, + 85, + 87, + 89, + 91, + 93, + 95, + 97, + 99, + 101, + 103, + 105, + 107, + 109, + 111, + 113, + 115, + 117, + 119, + 121, + 123, + 125, + 127, + 129, + 131, + 133, + 135, + 137, + 139, + 141, + 143, + 145, + 147, + 149, + 151, + 153, + 155, + 157, + 159, + 161, + 163, + 165, + 167, + 169, + 171, + 173, + 175, + 177, + 179, + 181, + 183, + 185, + 187, + 189, + 191, + 193, + 195, + 197, + 199, + 201, + 203, + 205, + 207, + 209, + 211, + 213, + 215, + 217, + 219, + 221, + 223, + 225, + 227, + 229, + 231, + 233, + 235, + 237, + 239, + 241, + 243, + 245, + 247, + 249, + 251, + 253, + 255, + 257, + 259, + 261, + 263, + 265, + 267, + 269, + 271, + 273, + 275, + 277, + 279, + 281, + 283, + 285, + 287, + 289, + 291, + 293, + 295, + 297, + 299, + 301, + 303, + 305, + 307, + 309, + 311, + 313, + 315, + 317, + 319, + 321, + 323, + 325, + 327, + 329, + 331, + 333, + 335, + 337, + 339, + 341, + 343, + 345, + 347, + 349, + 351, + 353, + 355, + 357, + 359, + 361, + 363, + 365, + 367, + 369, + 371, + 373, + 375, + 377, + 379, + 381, + 383, + 385, + 387, + 389, + 391, + 393, + 395, + 397, + 399, + 401, + 403, + 405, + 407, + 409, + 411, + 413, + 415, + 417, + 419, + 421, + 423, + 425, + 427, + 429, + 431, + 433, + 435, + 437, + 439, + 441, + 443, + 445, + 447, + 449, + 451, + 453, + 455, + 457, + 459, + 461, + 463, + 465, + 467, + 469, + 471, + 473, + 475, + 477, + 479, + 481, + 483, + 485, + 487, + 489, + 491, + 493, + 495, + 497, + 499, + 501, + 503, + 505, + 507, + 509, + 511, + 513, + 515, + 517, + 519, + 521, + 523, + 525, + 527, + 529, + 531, + 533, + 535, + 537, + 539, + 541, + 543, + 545, + 547, + 549, + 551, + 553, + 555, + 557, + 559, + 561, + 563, + 565, + 567, + 569, + 571, + 573, + 575, + 577, + 579, + 581, + 583, + 585, + 587, + 589, + 591, + 593, + 595, + 597, + 599, + 601, + 603, + 605, + 607, + 609, + 611, + 613, + 615, + 617, + 619, + 621, + 623, + 625, + 627, + 629, + 631, + 633, + 635, + 637, + 639, + 641, + 643, + 645, + 647, + 649, + 651, + 653, + 655, + 657, + 659, + 661, + 663, + 665, + 667, + 669, + 671, + 673, + 675, + 677, + 679, + 681, + 683, + 685, + 687, + 689, + 691, + 693, + 695, + 697, + 699, + 701, + 703, + 705, + 707, + 709, + 711, + 713, + 715, + 717, + 719, + 721, + 723, + 725, + 727, + 729, + 731, + 733, + 735, + 737, + 739, + 741, + 743, + 745, + 747, + 749, + 751, + 753, + 755, + 757, + 759, + 761, + 763, + 765, + 767, + 769, + 771, + 773, + 775, + 777, + 779, + 781, + 783, + 785, + 787, + 789, + 791, + 793, + 795, + 797, + 799, + 801, + 803, + 805, + 807, + 809, + 811, + 813, + 815, + 817, + 819, + 821, + 823, + 825, + 827, + 829, + 831, + 833, + 835, + 837, + 839, + 841, + 843, + 845, + 847, + 849, + 851, + 853, + 855, + 857, + 859, + 861, + 863, + 865, + 867, + 869, + 871, + 873, + 875, + 877, + 879, + 881, + 883, + 885, + 887, + 889, + 891, + 893, + 895, + 897, + 899, + 901, + 903, + 905, + 907, + 909, + 911, + 913, + 915, + 917, + 919, + 921, + 923, + 925, + 927, + 929, + 931, + 933, + 935, + 937, + 939, + 941, + 943, + 945, + 947, + 949, + 951, + 953, + 955, + 957, + 959, + 961, + 963, + 965, + 967, + 969, + 971, + 973, + 975, + 977, + 979, + 981, + 983, + 985, + 987, + 989, + 991, + 993, + 995, + 997, + 999, + 1001, + 1003, + 1005, + 1007, + 1009, + 1011, + 1013, + 1015, + 1017, + 1019, + 1021, + 1023, + 1025, + 1027, + 1029, + 1031, + 1033, + 1035, + 1037, + 1039, + 1041, + 1043, + 1045, + 1047, + 1049, + 1051, + 1053, + 1055, + 1057, + 1059, + 1061, + 1063, + 1065, + 1067, + 1069, + 1071, + 1073, + 1075, + 1077, + 1079, + 1082, + 1084, + 1086, + 1089, + 1091, + 1093, + 1095, + 1097, + 1100, + 1103, + 1106, + 1109, + 1112, + 1115, + 1118, + 1121, + 1124, + 1127, + 1130, + 1133, + 1136, + 1139, + 1142, + 1145, + 1148, + 1151, + 1154, + 1157, + 1160, + 1163, + 1166, + 1169, + 1172, + 1175, + 1178, + 1181, + 1184, + 1187, + 1190, + 1193, + 1196, + 1199, + 1202, + 1205, + 1208, + 1211, + 1214, + 1217, + 1220, + 1223, + 1226, + 1229, + 1232, + 1235, + 1238, + 1241, + 1244, + 1247, + 1250, + 1253, + 1256, + 1259, + 1262, + 1265, + 1268, + 1271, + 1274, + 1277, + 1280, + 1283, + 1286, + 1289, + 1292, + 1295, + 1298, + 1301, + 1304, + 1307, + 1310, + 1313, + 1316, + 1319, + 1322, + 1325, + 1328, + 1331, + 1334, + 1337, + 1340, + 1343, + 1346, + 1349, + 1352, + 1355, + 1358, + 1361, + 1364, + 1367, + 1370, + 1373, + 1376, + 1379, + 1382, + 1385, + 1388, + 1391, + 1394, + 1397, + 1400, + 1403, + 1406, + 1409, + 1412, + 1415, + 1418, + 1421, + 1424, + 1427, + 1430, + 1433, + 1436, + 1439, + 1442, + 1445, + 1448, + 1451, + 1454, + 1457, + 1460, + 1463, + 1466, + 1469, + 1472, + 1475, + 1478, + 1481, + 1484, + 1487, + 1490, + 1493, + 1496, + 1499, + 1502, + 1505, + 1508, + 1511 + ], + "name": "RootNode" + }, + { + "children": [ + 4 + ], + "matrix": [ + 368.9495239257798, + 3.2254592989162615e-05, + -0.0, + -0.0, + 1.0420680993438186e-11, + -0.0001191986920295653, + 731.6363525390527, + -0.0, + -2.27090261756142e-06, + 25.976097106933146, + 4.232043400145512e-06, + -0.0, + -61.023704528808594, + -0.5557101964950562, + 156.0901641845703, + 1.0 + ], + "name": "Cube" + }, + { + "mesh": 0, + "name": "Cube_Material_0" + }, + { + "children": [ + 6 + ], + "matrix": [ + 173.48944091796875, + 0.0, + 0.0, + 0.0, + -0.0, + -1.4658071919665945e-05, + -89.9706039428699, + 0.0, + 0.0, + 157.347427368162, + -2.5635149767378137e-05, + 0.0, + -85.93536376953125, + 199.69992065429688, + -353.72021484375, + 1.0 + ], + "name": "Cube.011" + }, + { + "mesh": 1, + "name": "Cube.011_Material.010_0" + }, + { + "children": [ + 8 + ], + "matrix": [ + 173.48944091796875, + 0.0, + 0.0, + 0.0, + -0.0, + -1.4658071919665945e-05, + -89.9706039428699, + 0.0, + 0.0, + 157.347427368162, + -2.5635149767378137e-05, + 0.0, + -85.93536376953125, + 199.69992065429688, + -353.72021484375, + 1.0 + ], + "name": "Cube.012" + }, + { + "mesh": 2, + "name": "Cube.012_Material.011_0" + }, + { + "children": [ + 10 + ], + "matrix": [ + 5.818292758309008, + 1.406328350961583, + -5.675480809603785e-08, + -0.0, + -3.2278113983411636e-06, + 1.6920225454756556e-05, + 88.36328124999832, + -0.0, + -2.8516653076690726, + 11.797972783089477, + -2.3633006167789887e-06, + -0.0, + 82.76553344726563, + 33.22783660888672, + -353.6085510253906, + 1.0 + ], + "name": "Cube.013" + }, + { + "mesh": 3, + "name": "Cube.013_Material.015_0" + }, + { + "children": [ + 12 + ], + "matrix": [ + 5.923714053341611, + -0.8080254769709778, + 2.709193938180356e-09, + -0.0, + 8.61968211647308e-07, + 6.615442993324928e-06, + 88.36328124999974, + -0.0, + 1.6423369164765584, + 12.040133077144725, + -9.174224293697555e-07, + -0.0, + -253.44522094726563, + 33.22783660888672, + -353.6085510253906, + 1.0 + ], + "name": "Cube.014" + }, + { + "mesh": 4, + "name": "Cube.014_Material.014_0" + }, + { + "children": [ + 14 + ], + "matrix": [ + 6.077499866485596, + 0.0, + 0.0, + 0.0, + 0.0, + 6.27478647232055, + 2.7427962790797434e-07, + 0.0, + 0.0, + -9.954128183311512e-08, + 2.277239084243772, + 0.0, + 74.20914459228516, + 51.217811584472656, + -262.8941345214844, + 1.0 + ], + "name": "Cylinder" + }, + { + "mesh": 5, + "name": "Cylinder_Material.009_0" + }, + { + "children": [ + 16 + ], + "matrix": [ + 1.5907350890385028e-05, + -50.67383193969468, + 3.020391071403486e-06, + 0.0, + -2.6378188692075515e-05, + -3.020399352765817e-06, + -50.67383193969031, + 0.0, + 9.999816894529403, + 3.1391069979872813e-06, + -5.205390165155855e-06, + 0.0, + 79.29447174072266, + 288.42816162109375, + -355.5619812011719, + 1.0 + ], + "name": "Cube.018" + }, + { + "mesh": 6, + "name": "Cube.018_Material.017_0" + }, + { + "children": [ + 18 + ], + "matrix": [ + 8.192776053514208e-06, + 7.181026821082307e-22, + -108.51660919189422, + 0.0, + 4.743412411003965e-06, + 108.51660919189442, + 3.5811767400027576e-13, + 0.0, + 108.51660919189412, + -4.743412411003979e-06, + 8.192776053514208e-06, + 0.0, + 89.58861541748047, + 288.6811218261719, + -355.4231872558594, + 1.0 + ], + "name": "aorus case fans" + }, + { + "mesh": 7, + "name": "aorus case fans_aorus case fans_0" + }, + { + "children": [ + 20 + ], + "matrix": [ + 8.192776053514208e-06, + -7.181026821082307e-22, + 108.51660919189422, + 0.0, + -4.743412411003965e-06, + 108.51660919189442, + 3.5811767400027576e-13, + 0.0, + -108.51660919189412, + -4.743412411003979e-06, + 8.192776053514208e-06, + 0.0, + 69.0184326171875, + 288.6811218261719, + -355.4231872558594, + 1.0 + ], + "name": "aorus case fans.001" + }, + { + "mesh": 8, + "name": "aorus case fans.001_aorus case fans_0" + }, + { + "children": [ + 22 + ], + "matrix": [ + 89.37416839599574, + 7.813338243899269e-06, + -0.0, + -0.0, + 9.954433728389332e-15, + -1.1386544517255265e-07, + 0.6989011168479825, + -0.0, + -9.304796666262747e-06, + 106.43446350097473, + 1.7340375151550582e-05, + -0.0, + -165.45028686523438, + 224.1227569580078, + -440.8395690917969, + 1.0 + ], + "name": "Cube.015" + }, + { + "mesh": 9, + "name": "Cube.015_Material.016_0" + }, + { + "children": [ + 24 + ], + "matrix": [ + 1.5907350890385028e-05, + -50.67383193969468, + 3.020391071403486e-06, + 0.0, + -2.6378188692075515e-05, + -3.020399352765817e-06, + -50.67383193969031, + 0.0, + 9.999816894529403, + 3.1391069979872813e-06, + -5.205390165155855e-06, + 0.0, + 79.29447174072266, + 177.86126708984375, + -355.5619812011719, + 1.0 + ], + "name": "Cube.016" + }, + { + "mesh": 10, + "name": "Cube.016_Material.017_0" + }, + { + "children": [ + 26 + ], + "matrix": [ + 8.192776053514208e-06, + 7.181026821082307e-22, + -108.51660919189422, + 0.0, + 4.743412411003965e-06, + 108.51660919189442, + 3.5811767400027576e-13, + 0.0, + 108.51660919189412, + -4.743412411003979e-06, + 8.192776053514208e-06, + 0.0, + 89.58861541748047, + 178.11424255371094, + -355.4231872558594, + 1.0 + ], + "name": "aorus case fans.002" + }, + { + "mesh": 11, + "name": "aorus case fans.002_aorus case fans_0" + }, + { + "children": [ + 28 + ], + "matrix": [ + 8.192776053514208e-06, + -7.181026821082307e-22, + 108.51660919189422, + 0.0, + -4.743412411003965e-06, + 108.51660919189442, + 3.5811767400027576e-13, + 0.0, + -108.51660919189412, + -4.743412411003979e-06, + 8.192776053514208e-06, + 0.0, + 69.0184326171875, + 178.11424255371094, + -355.4231872558594, + 1.0 + ], + "name": "aorus case fans.003" + }, + { + "mesh": 12, + "name": "aorus case fans.003_aorus case fans_0" + }, + { + "children": [ + 30 + ], + "matrix": [ + 1.5907350890385028e-05, + -50.67383193969468, + 3.020391071403486e-06, + 0.0, + -2.6378188692075515e-05, + -3.020399352765817e-06, + -50.67383193969031, + 0.0, + 9.999816894529403, + 3.1391069979872813e-06, + -5.205390165155855e-06, + 0.0, + -251.3770751953125, + 292.3486328125, + -334.898681640625, + 1.0 + ], + "name": "Cube.017" + }, + { + "mesh": 13, + "name": "Cube.017_Material.017_0" + }, + { + "children": [ + 32 + ], + "matrix": [ + 8.192776053514208e-06, + 7.181026821082307e-22, + -108.51660919189422, + 0.0, + 4.743412411003965e-06, + 108.51660919189442, + 3.5811767400027576e-13, + 0.0, + 108.51660919189412, + -4.743412411003979e-06, + 8.192776053514208e-06, + 0.0, + -241.0829315185547, + 292.6015930175781, + -334.7598876953125, + 1.0 + ], + "name": "aorus case fans.004" + }, + { + "mesh": 14, + "name": "aorus case fans.004_aorus case fans_0" + }, + { + "children": [ + 34 + ], + "matrix": [ + 8.192776053514208e-06, + -7.181026821082307e-22, + 108.51660919189422, + 0.0, + -4.743412411003965e-06, + 108.51660919189442, + 3.5811767400027576e-13, + 0.0, + -108.51660919189412, + -4.743412411003979e-06, + 8.192776053514208e-06, + 0.0, + -261.6531066894531, + 292.6015930175781, + -334.7598876953125, + 1.0 + ], + "name": "aorus case fans.005" + }, + { + "mesh": 15, + "name": "aorus case fans.005_aorus case fans_0" + }, + { + "children": [ + 36 + ], + "matrix": [ + -51.51337814330587, + -2.0060050072873966e-05, + 9.006885827984312e-06, + 0.0, + -9.006891487524572e-06, + 1.4533464258433949e-05, + -51.51337814330772, + 0.0, + 3.958587886920439e-06, + -10.165491104124802, + -2.867989689493467e-06, + 0.0, + -171.5443572998047, + 344.3587646484375, + -355.43011474609375, + 1.0 + ], + "name": "Cube.019" + }, + { + "mesh": 16, + "name": "Cube.019_Material.017_0" + }, + { + "children": [ + 38 + ], + "matrix": [ + 8.328511234327504e-06, + 0.0, + -110.31447601318328, + 0.0, + 110.3144760131744, + -4.427353005320786e-05, + 8.328511240451187e-06, + 0.0, + -4.427353004708418e-05, + -110.3144760131747, + -3.3312838571648504e-12, + 0.0, + -171.28721618652344, + 333.8940734863281, + -355.2890319824219, + 1.0 + ], + "name": "aorus case fans.006" + }, + { + "mesh": 17, + "name": "aorus case fans.006_aorus case fans_0" + }, + { + "children": [ + 40 + ], + "matrix": [ + 8.328511234327504e-06, + 0.0, + -110.31447601318328, + 0.0, + 110.3144760131744, + -4.427353005320786e-05, + 8.328511240451187e-06, + 0.0, + -4.427353004708418e-05, + -110.3144760131747, + -3.3312838571648504e-12, + 0.0, + -171.28721618652344, + 354.8050537109375, + -355.2890319824219, + 1.0 + ], + "name": "aorus case fans.007" + }, + { + "mesh": 18, + "name": "aorus case fans.007_aorus case fans_0" + }, + { + "children": [ + 42 + ], + "matrix": [ + 160.68109130859375, + 0.0, + 0.0, + 0.0, + -0.0, + -1.2045141034528429e-05, + -73.93254852294824, + 0.0, + 0.0, + 34.311977386474155, + -5.590130667081599e-06, + 0.0, + -96.10669708251953, + 78.82550048828125, + -363.39776611328125, + 1.0 + ], + "name": "Cube.020" + }, + { + "mesh": 19, + "name": "Cube.020_Material.020_0" + }, + { + "children": [ + 44 + ], + "matrix": [ + 7.187481880187988, + 0.0, + 0.0, + 0.0, + -0.0, + -9.374782946719236e-06, + -57.5420074462883, + 0.0, + 0.0, + 10.785477638244487, + -1.7571773443882203e-06, + 0.0, + -108.06404113769531, + 346.35284423828125, + -354.9810485839844, + 1.0 + ], + "name": "Cube.021" + }, + { + "mesh": 20, + "name": "Cube.021_Material.018_0" + }, + { + "children": [ + 46 + ], + "matrix": [ + -51.51337814330587, + -2.0060050072873966e-05, + 9.006885827984312e-06, + 0.0, + -9.006891487524572e-06, + 1.4533464258433949e-05, + -51.51337814330772, + 0.0, + 3.958587886920439e-06, + -10.165491104124802, + -2.867989689493467e-06, + 0.0, + -44.54793167114258, + 344.3587646484375, + -355.43011474609375, + 1.0 + ], + "name": "Cube.022" + }, + { + "mesh": 21, + "name": "Cube.022_Material.017_0" + }, + { + "children": [ + 48 + ], + "matrix": [ + 8.328511234327504e-06, + 0.0, + -110.31447601318328, + 0.0, + 110.3144760131744, + -4.427353005320786e-05, + 8.328511240451187e-06, + 0.0, + -4.427353004708418e-05, + -110.3144760131747, + -3.3312838571648504e-12, + 0.0, + -44.29078674316406, + 333.8940734863281, + -355.2890319824219, + 1.0 + ], + "name": "aorus case fans.008" + }, + { + "mesh": 22, + "name": "aorus case fans.008_aorus case fans_0" + }, + { + "children": [ + 50 + ], + "matrix": [ + 8.328511234327504e-06, + 0.0, + -110.31447601318328, + 0.0, + 110.3144760131744, + -4.427353005320786e-05, + 8.328511240451187e-06, + 0.0, + -4.427353004708418e-05, + -110.3144760131747, + -3.3312838571648504e-12, + 0.0, + -44.29078674316406, + 354.8050537109375, + -355.2890319824219, + 1.0 + ], + "name": "aorus case fans.009" + }, + { + "mesh": 23, + "name": "aorus case fans.009_aorus case fans_0" + }, + { + "children": [ + 52 + ], + "matrix": [ + 4.859640598297119, + 0.0, + 0.0, + 0.0, + 0.0, + 0.273708326040046, + -4.851926472739868, + 0.0, + 0.0, + 4.851926472739868, + 0.273708326040046, + 0.0, + -277.5442199707031, + 457.8604736328125, + -407.8544616699219, + 1.0 + ], + "name": "Sphere" + }, + { + "mesh": 24, + "name": "Sphere_Material.019_0" + }, + { + "children": [ + 54 + ], + "matrix": [ + 4.859640598297119, + 0.0, + 0.0, + 0.0, + -0.0, + -0.2386696861881748, + -4.85377573554838, + 0.0, + 0.0, + 4.85377573554838, + -0.2386696861881748, + 0.0, + -277.5442199707031, + 457.8604736328125, + -439.73150634765625, + 1.0 + ], + "name": "Sphere.001" + }, + { + "mesh": 25, + "name": "Sphere.001_Material.019_0" + }, + { + "children": [ + 56 + ], + "matrix": [ + -4.31338223228921e-06, + -26.475351333617763, + 1.5780537234252895e-06, + 0.0, + -5.026925894357257e-06, + 1.8391050733967206e-06, + 30.85505294799758, + 0.0, + -31.83249855041419, + 5.1861719866390205e-06, + -5.186172297641341e-06, + 0.0, + -259.6886291503906, + 284.7993469238281, + -422.490966796875, + 1.0 + ], + "name": "IOSHIELD" + }, + { + "mesh": 26, + "name": "IOSHIELD_IOSHIELD_0" + }, + { + "children": [ + 58 + ], + "matrix": [ + 11.99118232727046, + 1.0483024921933595e-06, + -0.0, + -0.0, + 8.44104093692306e-13, + -9.655425011885655e-06, + 59.26457595825116, + -0.0, + -1.02992814772384e-05, + 117.8100433349589, + 1.9193692351631105e-05, + -0.0, + 93.78107452392578, + 228.5900115966797, + -355.2820129394531, + 1.0 + ], + "name": "Cube.023" + }, + { + "mesh": 27, + "name": "Cube.023_Material.021_0" + }, + { + "children": [ + 60 + ], + "matrix": [ + 6.378213405609131, + 0.0, + 0.0, + 0.0, + -0.0, + -9.035298572058767e-06, + -55.45826721191333, + 0.0, + 0.0, + 55.45826721191333, + -9.035298572058767e-06, + 0.0, + -265.0957336425781, + 291.7020568847656, + -335.08990478515625, + 1.0 + ], + "name": "Cube.024" + }, + { + "mesh": 28, + "name": "Cube.024_Material.022_0" + }, + { + "children": [ + 62 + ], + "matrix": [ + 5.047477353022651, + 3.8418622186153017, + -5.696179363271701e-06, + 0.0, + -3.841862218615596, + 5.047477353025392, + 1.5881890804727747e-06, + 0.0, + 5.494484891896549e-06, + 2.1861929618896706e-06, + 6.343258857724295, + 0.0, + -235.59091186523438, + 287.7469482421875, + -423.9190673828125, + 1.0 + ], + "name": "MOBOAORUSORANGETRANS" + }, + { + "mesh": 29, + "name": "MOBOAORUSORANGETRANS_MOBOAORUSORANGETRANS_0" + }, + { + "children": [ + 64 + ], + "matrix": [ + 89.37416839599574, + 7.813338243899269e-06, + -0.0, + -0.0, + 9.954433728389332e-15, + -1.1386544517255265e-07, + 0.6989011168479825, + -0.0, + -9.304796666262747e-06, + 106.43446350097473, + 1.7340375151550582e-05, + -0.0, + -165.45028686523438, + 224.1227569580078, + -440.8395690917969, + 1.0 + ], + "name": "Cube.025" + }, + { + "mesh": 30, + "name": "Cube.025_Material.023_0" + }, + { + "children": [ + 66 + ], + "matrix": [ + 89.37416839599574, + 7.813338243899269e-06, + -0.0, + -0.0, + 9.954433728389332e-15, + -1.1386544517255265e-07, + 0.6989011168479825, + -0.0, + -9.304796666262747e-06, + 106.43446350097473, + 1.7340375151550582e-05, + -0.0, + -165.45028686523438, + 224.1227569580078, + -440.8395690917969, + 1.0 + ], + "name": "Cube.026" + }, + { + "mesh": 31, + "name": "Cube.026_Material.024_0" + }, + { + "children": [ + 68 + ], + "matrix": [ + -99.99999999999356, + 1.5099579909782904e-05, + 3.258413698858874e-05, + 0.0, + -4.356647300598039e-05, + -7.384968361423604e-05, + -133.7045135497772, + 0.0, + -1.5099561912420222e-05, + -99.99999999998361, + 5.523350575797892e-05, + 0.0, + -42.31238555908203, + 356.983642578125, + -354.16351318359375, + 1.0 + ], + "name": "metal-mesh-500x500" + }, + { + "mesh": 32, + "name": "metal-mesh-500x500_metal-mesh-500x500_0" + }, + { + "children": [ + 70 + ], + "matrix": [ + 4.3312576847309714e-05, + -1.1102230246251565e-14, + 99.9999999999906, + 0.0, + -133.70451354974057, + -0.000117416150635007, + 5.7910870164736605e-05, + 0.0, + 8.781764169185635e-05, + -99.99999999996143, + -3.803624082365786e-11, + 0.0, + -174.20526123046875, + 356.983642578125, + -354.16351318359375, + 1.0 + ], + "name": "metal-mesh-500x500.001" + }, + { + "mesh": 33, + "name": "metal-mesh-500x500.001_metal-mesh-500x500_0" + }, + { + "children": [ + 72 + ], + "matrix": [ + 4.394123061390213e-05, + 4.21162724731782e-21, + 79.55538940428474, + 0.0, + -8.073070559718233e-05, + 106.36914825436389, + 4.459039893431062e-11, + 0.0, + -79.55538940426183, + -6.0379939353355956e-05, + 4.394123061390213e-05, + 0.0, + -270.89990234375, + 291.5138854980469, + -335.32818603515625, + 1.0 + ], + "name": "metal-mesh-500x500.002" + }, + { + "mesh": 34, + "name": "metal-mesh-500x500.002_metal-mesh-500x500_0" + }, + { + "children": [ + 74 + ], + "matrix": [ + -1.5128912925720215, + -0.0, + -0.0, + -0.0, + -0.0, + 1.778504811331388e-06, + -10.916384696960305, + -0.0, + -0.0, + 44.28952407836856, + 7.215679352788776e-06, + -0.0, + -96.40647888183594, + 270.96295166015625, + -430.9271240234375, + 1.0 + ], + "name": "Cube.027" + }, + { + "mesh": 35, + "name": "Cube.027_Material.008_0" + }, + { + "children": [ + 76 + ], + "matrix": [ + -1.0511277914047241, + -0.0, + -0.0, + -0.0, + -0.0, + 1.5859904964163296e-06, + -9.734740257263056, + -0.0, + -0.0, + 44.41103744506777, + 7.235476393046602e-06, + -0.0, + -95.70954132080078, + 270.96295166015625, + -432.4090576171875, + 1.0 + ], + "name": "Cube.028" + }, + { + "mesh": 36, + "name": "Cube.028_Material.026_0" + }, + { + "children": [ + 78 + ], + "matrix": [ + -0.24975338578224182, + -0.0, + -0.0, + -0.0, + -0.0, + 1.5214386525612648e-06, + -9.338523864745971, + -0.0, + -0.0, + 46.66292190551696, + 7.602354939254896e-06, + -0.0, + -96.38716125488281, + 270.96295166015625, + -432.4090576171875, + 1.0 + ], + "name": "Cube.029" + }, + { + "mesh": 37, + "name": "Cube.029_Material.025_0" + }, + { + "children": [ + 80 + ], + "matrix": [ + 1.0511277914046444, + 1.2872600631773845e-16, + -4.0932427483117454e-07, + -0.0, + 3.790847819891611e-06, + -7.349524447239109e-07, + 9.734740257262418, + -0.0, + 1.30024427973346e-12, + 44.411037445068224, + 3.352940051032883e-06, + -0.0, + -96.99602508544922, + 270.96295166015625, + -451.7010192871094, + 1.0 + ], + "name": "Cube.030" + }, + { + "mesh": 38, + "name": "Cube.030_Material.026_0" + }, + { + "children": [ + 82 + ], + "matrix": [ + -1.5128912925720215, + -0.0, + -0.0, + -0.0, + -0.0, + 1.778504811331388e-06, + -10.916384696960305, + -0.0, + -0.0, + 44.28952407836856, + 7.215679352788776e-06, + -0.0, + -103.68679809570313, + 270.96295166015625, + -430.9271240234375, + 1.0 + ], + "name": "Cube.031" + }, + { + "mesh": 39, + "name": "Cube.031_Material.008_0" + }, + { + "children": [ + 84 + ], + "matrix": [ + -1.0511277914047241, + -0.0, + -0.0, + -0.0, + -0.0, + 1.5859904964163296e-06, + -9.734740257263056, + -0.0, + -0.0, + 44.41103744506777, + 7.235476393046602e-06, + -0.0, + -102.9898681640625, + 270.96295166015625, + -432.4090576171875, + 1.0 + ], + "name": "Cube.032" + }, + { + "mesh": 40, + "name": "Cube.032_Material.026_0" + }, + { + "children": [ + 86 + ], + "matrix": [ + -0.24975338578224182, + -0.0, + -0.0, + -0.0, + -0.0, + 1.5214386525612648e-06, + -9.338523864745971, + -0.0, + -0.0, + 46.66292190551696, + 7.602354939254896e-06, + -0.0, + -103.66747283935547, + 270.96295166015625, + -432.4090576171875, + 1.0 + ], + "name": "Cube.033" + }, + { + "mesh": 41, + "name": "Cube.033_Material.025_0" + }, + { + "children": [ + 88 + ], + "matrix": [ + 1.0511277914046444, + 1.2872600631773845e-16, + -4.0932427483117454e-07, + -0.0, + 3.790847819891611e-06, + -7.349524447239109e-07, + 9.734740257262418, + -0.0, + 1.30024427973346e-12, + 44.411037445068224, + 3.352940051032883e-06, + -0.0, + -104.2763442993164, + 270.96295166015625, + -451.7010192871094, + 1.0 + ], + "name": "Cube.034" + }, + { + "mesh": 42, + "name": "Cube.034_Material.026_0" + }, + { + "children": [ + 90 + ], + "matrix": [ + -1.5128912925720215, + -0.0, + -0.0, + -0.0, + -0.0, + 1.778504811331388e-06, + -10.916384696960305, + -0.0, + -0.0, + 44.28952407836856, + 7.215679352788776e-06, + -0.0, + -110.55084228515625, + 270.96295166015625, + -430.9271240234375, + 1.0 + ], + "name": "Cube.035" + }, + { + "mesh": 43, + "name": "Cube.035_Material.008_0" + }, + { + "children": [ + 92 + ], + "matrix": [ + -1.0511277914047241, + -0.0, + -0.0, + -0.0, + -0.0, + 1.5859904964163296e-06, + -9.734740257263056, + -0.0, + -0.0, + 44.41103744506777, + 7.235476393046602e-06, + -0.0, + -109.85391235351563, + 270.96295166015625, + -432.4090576171875, + 1.0 + ], + "name": "Cube.036" + }, + { + "mesh": 44, + "name": "Cube.036_Material.026_0" + }, + { + "children": [ + 94 + ], + "matrix": [ + -0.24975338578224182, + -0.0, + -0.0, + -0.0, + -0.0, + 1.5214386525612648e-06, + -9.338523864745971, + -0.0, + -0.0, + 46.66292190551696, + 7.602354939254896e-06, + -0.0, + -110.53152465820313, + 270.96295166015625, + -432.4090576171875, + 1.0 + ], + "name": "Cube.037" + }, + { + "mesh": 45, + "name": "Cube.037_Material.025_0" + }, + { + "children": [ + 96 + ], + "matrix": [ + 1.0511277914046444, + 1.2872600631773845e-16, + -4.0932427483117454e-07, + -0.0, + 3.790847819891611e-06, + -7.349524447239109e-07, + 9.734740257262418, + -0.0, + 1.30024427973346e-12, + 44.411037445068224, + 3.352940051032883e-06, + -0.0, + -111.14039611816406, + 270.96295166015625, + -451.7010192871094, + 1.0 + ], + "name": "Cube.038" + }, + { + "mesh": 46, + "name": "Cube.038_Material.026_0" + }, + { + "children": [ + 98 + ], + "matrix": [ + -1.5128912925720215, + -0.0, + -0.0, + -0.0, + -0.0, + 1.778504811331388e-06, + -10.916384696960305, + -0.0, + -0.0, + 44.28952407836856, + 7.215679352788776e-06, + -0.0, + -117.501953125, + 270.96295166015625, + -430.9271240234375, + 1.0 + ], + "name": "Cube.039" + }, + { + "mesh": 47, + "name": "Cube.039_Material.008_0" + }, + { + "children": [ + 100 + ], + "matrix": [ + -1.0511277914047241, + -0.0, + -0.0, + -0.0, + -0.0, + 1.5859904964163296e-06, + -9.734740257263056, + -0.0, + -0.0, + 44.41103744506777, + 7.235476393046602e-06, + -0.0, + -116.80501556396484, + 270.96295166015625, + -432.4090576171875, + 1.0 + ], + "name": "Cube.040" + }, + { + "mesh": 48, + "name": "Cube.040_Material.026_0" + }, + { + "children": [ + 102 + ], + "matrix": [ + -0.24975338578224182, + -0.0, + -0.0, + -0.0, + -0.0, + 1.5214386525612648e-06, + -9.338523864745971, + -0.0, + -0.0, + 46.66292190551696, + 7.602354939254896e-06, + -0.0, + -117.48262786865234, + 270.96295166015625, + -432.4090576171875, + 1.0 + ], + "name": "Cube.041" + }, + { + "mesh": 49, + "name": "Cube.041_Material.025_0" + }, + { + "children": [ + 104 + ], + "matrix": [ + 1.0511277914046444, + 1.2872600631773845e-16, + -4.0932427483117454e-07, + -0.0, + 3.790847819891611e-06, + -7.349524447239109e-07, + 9.734740257262418, + -0.0, + 1.30024427973346e-12, + 44.411037445068224, + 3.352940051032883e-06, + -0.0, + -118.09149932861328, + 270.96295166015625, + -451.7010192871094, + 1.0 + ], + "name": "Cube.042" + }, + { + "mesh": 50, + "name": "Cube.042_Material.026_0" + }, + { + "children": [ + 106 + ], + "matrix": [ + 6.0249644632509636e-05, + 5.774736879927352e-21, + 109.08169555662398, + 0.0, + -8.073070559718233e-05, + 106.36914825436389, + 4.459039893431062e-11, + 0.0, + -79.55538940426183, + -6.0379939353355956e-05, + 4.394123061390213e-05, + 0.0, + -257.977294921875, + 182.03939819335938, + -359.04949951171875, + 1.0 + ], + "name": "metal-mesh-500x500.003" + }, + { + "mesh": 51, + "name": "metal-mesh-500x500.003_metal-mesh-500x500_0" + }, + { + "children": [ + 108 + ], + "matrix": [ + 49.17704391479492, + 0.0, + 0.0, + 0.0, + -0.0, + -4.769934143237269e-06, + -29.27764701843223, + 0.0, + 0.0, + 59.6581153869621, + -9.719540690080266e-06, + 0.0, + -219.4855194091797, + 85.33855438232422, + -71.14894104003906, + 1.0 + ], + "name": "Cube.043" + }, + { + "mesh": 52, + "name": "Cube.043_Material.012_0" + }, + { + "children": [ + 110 + ], + "matrix": [ + 35.4759407043457, + 0.0, + 0.0, + 0.0, + -0.0, + -8.416165932549561e-07, + -5.165805816650322, + 0.0, + 0.0, + 20.56838035583469, + -3.351014501562231e-06, + 0.0, + -212.13954162597656, + 79.39873504638672, + -298.22796630859375, + 1.0 + ], + "name": "Cube.045" + }, + { + "mesh": 53, + "name": "Cube.045_Material.027_0" + }, + { + "children": [ + 112 + ], + "matrix": [ + 36.94224548339059, + -6.982627741505279e-20, + -2.407462165001775e-05, + 0.0, + 1.0523352046265108e-12, + 36.9422454833984, + 1.6147968365084768e-06, + 0.0, + 2.4074621650017728e-05, + -1.6147968365088196e-06, + 36.94224548339056, + 0.0, + -93.4769058227539, + 83.16719818115234, + -288.79583740234375, + 1.0 + ], + "name": "rgb-hdd-cover-aorus-v1" + }, + { + "mesh": 54, + "name": "rgb-hdd-cover-aorus-v1_rgb-hdd-cover-aorus-v1_0" + }, + { + "children": [ + 114 + ], + "matrix": [ + 2.975425775592976e-06, + 0.0, + -39.4107093811034, + 0.0, + 1.7226971004431286e-06, + 39.41070938110347, + 1.3006001261201745e-13, + 0.0, + 39.410709381103366, + -1.7226971004431334e-06, + 2.975425775592976e-06, + 0.0, + 87.7141342163086, + 83.614990234375, + -355.3115539550781, + 1.0 + ], + "name": "maxresdefault (1)" + }, + { + "mesh": 55, + "name": "maxresdefault (1)_maxresdefault (1)_0" + }, + { + "children": [ + 116 + ], + "matrix": [ + 0.3324879498564191, + -19.396883159825105, + -1.7294530692151426e-06, + 0.0, + 1.434783206860315e-06, + 1.754301187270033e-06, + -19.39973258972155, + 0.0, + 2.505953302079761, + 0.04295531756204158, + 1.8922200397806493e-07, + 0.0, + -169.22512817382813, + 114.40611267089844, + -71.64431762695313, + 1.0 + ], + "name": "Cylinder.001" + }, + { + "mesh": 56, + "name": "Cylinder.001_Material.028_0" + }, + { + "children": [ + 118 + ], + "matrix": [ + 0.35605771544925147, + -10.291908914824452, + -3.121668886555029e-07, + 0.0, + -4.6066687827333384e-07, + 2.964164655521261e-07, + -10.298066139221177, + 0.0, + 1.329648861892859, + 0.046000381467946876, + -5.8155571325399155e-08, + 0.0, + -166.36904907226563, + 70.64706420898438, + -71.64431762695313, + 1.0 + ], + "name": "Cylinder.002" + }, + { + "mesh": 57, + "name": "Cylinder.002_Material.029_0" + }, + { + "children": [ + 120 + ], + "matrix": [ + 49.17704391479492, + 0.0, + 0.0, + 0.0, + -0.0, + -4.769934143237269e-06, + -29.27764701843223, + 0.0, + 0.0, + 59.6581153869621, + -9.719540690080266e-06, + 0.0, + -219.4855194091797, + 85.33855438232422, + 671.4326782226563, + 1.0 + ], + "name": "Cube.044" + }, + { + "mesh": 58, + "name": "Cube.044_Material.012_0" + }, + { + "children": [ + 122 + ], + "matrix": [ + 0.3324879498564191, + -19.396883159825105, + -1.7294530692151426e-06, + 0.0, + 1.434783206860315e-06, + 1.754301187270033e-06, + -19.39973258972155, + 0.0, + 2.505953302079761, + 0.04295531756204158, + 1.8922200397806493e-07, + 0.0, + -169.22512817382813, + 114.40611267089844, + 670.9373168945313, + 1.0 + ], + "name": "Cylinder.003" + }, + { + "mesh": 59, + "name": "Cylinder.003_Material.031_0" + }, + { + "children": [ + 124 + ], + "matrix": [ + 0.35605771544925147, + -10.291908914824452, + -3.121668886555029e-07, + 0.0, + -4.6066687827333384e-07, + 2.964164655521261e-07, + -10.298066139221177, + 0.0, + 1.329648861892859, + 0.046000381467946876, + -5.8155571325399155e-08, + 0.0, + -166.36904907226563, + 70.64706420898438, + 670.9373168945313, + 1.0 + ], + "name": "Cylinder.004" + }, + { + "mesh": 60, + "name": "Cylinder.004_Material.030_0" + }, + { + "children": [ + 126 + ], + "matrix": [ + 45.188758850078464, + 2.944873417430985e-05, + -2.944873417431612e-05, + 0.0, + -2.944873288705847e-05, + 45.18875885008802, + 1.975282649418568e-06, + 0.0, + 2.944873546156744e-05, + -1.9752634581867985e-06, + 45.18875885008802, + 0.0, + 0.5859143733978271, + 70.42808532714844, + -289.065673828125, + 1.0 + ], + "name": "NVIDIA LOGO" + }, + { + "mesh": 61, + "name": "NVIDIA LOGO_NVIDIA LOGO_0" + }, + { + "children": [ + 128 + ], + "matrix": [ + 3.9949262378911254e-05, + -3.936628215299662e-22, + -59.48864364622682, + 0.0, + 2.6003316237638416e-06, + 59.48864364624018, + 1.7462380032026437e-12, + 0.0, + 59.48864364622677, + -2.600331623764428e-06, + 3.9949262378911254e-05, + 0.0, + -260.26617431640625, + 77.97001647949219, + -352.75244140625, + 1.0 + ], + "name": "psuback" + }, + { + "mesh": 62, + "name": "psuback_psuback_0" + }, + { + "children": [ + 130 + ], + "matrix": [ + 1.429560513713888e-06, + -8.151373392902884e-16, + -7.342104434966901, + 0.0, + -7.342104434965245, + 4.930548730974682e-06, + -1.4295605128987506e-06, + 0.0, + 4.930548730159545e-06, + 7.342104434965385, + 9.602317856839598e-13, + 0.0, + 70.47293090820313, + 357.14990234375, + -289.6947326660156, + 1.0 + ], + "name": "usb" + }, + { + "mesh": 63, + "name": "usb_usb_0" + }, + { + "children": [ + 132 + ], + "matrix": [ + 1.429560513713888e-06, + -8.151373392902884e-16, + -7.342104434966901, + 0.0, + -7.342104434965245, + 4.930548730974682e-06, + -1.4295605128987506e-06, + 0.0, + 4.930548730159545e-06, + 7.342104434965385, + 9.602317856839598e-13, + 0.0, + 70.47293090820313, + 357.14990234375, + -321.002685546875, + 1.0 + ], + "name": "usb.001" + }, + { + "mesh": 64, + "name": "usb.001_usb_0" + }, + { + "children": [ + 134 + ], + "matrix": [ + 1.429560513713888e-06, + -8.151373392902884e-16, + -7.342104434966901, + 0.0, + -7.342104434965245, + 4.930548730974682e-06, + -1.4295605128987506e-06, + 0.0, + 4.930548730159545e-06, + 7.342104434965385, + 9.602317856839598e-13, + 0.0, + 70.47293090820313, + 357.14990234375, + -352.5901794433594, + 1.0 + ], + "name": "usb.002" + }, + { + "mesh": 65, + "name": "usb.002_usb_0" + }, + { + "children": [ + 136 + ], + "matrix": [ + 3.297064781188965, + 0.0, + 0.0, + 0.0, + 0.0, + -5.371600341501861e-07, + -3.2970647811889213, + 0.0, + 0.0, + 3.2970647811889213, + -5.371600341501861e-07, + 0.0, + 69.92597961425781, + 356.74127197265625, + -407.0054931640625, + 1.0 + ], + "name": "Torus" + }, + { + "mesh": 66, + "name": "Torus_Material.013_0" + }, + { + "children": [ + 138 + ], + "matrix": [ + 3.297064781188965, + 0.0, + 0.0, + 0.0, + 0.0, + -5.371600341501861e-07, + -3.2970647811889213, + 0.0, + 0.0, + 3.2970647811889213, + -5.371600341501861e-07, + 0.0, + 69.92597961425781, + 356.74127197265625, + -423.72918701171875, + 1.0 + ], + "name": "Torus.001" + }, + { + "mesh": 67, + "name": "Torus.001_Material.032_0" + }, + { + "children": [ + 140 + ], + "matrix": [ + 1.429560513713888e-06, + -8.151373392902884e-16, + -7.342104434966901, + 0.0, + -7.342104434965245, + 4.930548730974682e-06, + -1.4295605128987506e-06, + 0.0, + 4.930548730159545e-06, + 7.342104434965385, + 9.602317856839598e-13, + 0.0, + 70.47293090820313, + 357.14990234375, + -384.8907165527344, + 1.0 + ], + "name": "usb.003" + }, + { + "mesh": 68, + "name": "usb.003_usb_0" + }, + { + "children": [ + 142 + ], + "matrix": [ + 9.278203010559082, + 0.0, + 0.0, + 0.0, + -0.0, + -6.915321074362105e-06, + -42.445938110351, + 0.0, + 0.0, + 42.445938110351, + -6.915321074362105e-06, + 0.0, + -188.1602020263672, + 268.51605224609375, + -368.1942443847656, + 1.0 + ], + "name": "Cube.046" + }, + { + "mesh": 69, + "name": "Cube.046_Material.034_0" + }, + { + "children": [ + 144 + ], + "matrix": [ + 9.278203010559082, + 0.0, + 0.0, + 0.0, + -0.0, + -6.915321074362105e-06, + -42.445938110351, + 0.0, + 0.0, + 42.445938110351, + -6.915321074362105e-06, + 0.0, + -134.6636962890625, + 268.51605224609375, + -368.1942443847656, + 1.0 + ], + "name": "Cube.047" + }, + { + "mesh": 70, + "name": "Cube.047_Material.033_0" + }, + { + "children": [ + 146 + ], + "matrix": [ + 17.436283111572266, + 0.0, + 0.0, + 0.0, + -0.0, + -6.419935784537599e-06, + -39.40528488159128, + 0.0, + 0.0, + 40.07472229003853, + -6.529000981932134e-06, + 0.0, + -161.35374450683594, + 268.2420654296875, + -368.1709899902344, + 1.0 + ], + "name": "Cube.048" + }, + { + "mesh": 71, + "name": "Cube.048_Material.035_0" + }, + { + "children": [ + 148 + ], + "matrix": [ + 17.436283111572266, + 0.0, + 0.0, + 0.0, + -0.0, + -6.419935784537599e-06, + -39.40528488159128, + 0.0, + 0.0, + 40.07472229003853, + -6.529000981932134e-06, + 0.0, + -161.35374450683594, + 268.2420654296875, + -368.1709899902344, + 1.0 + ], + "name": "Cube.049" + }, + { + "mesh": 72, + "name": "Cube.049_Material.040_0" + }, + { + "children": [ + 150 + ], + "matrix": [ + 17.436283111572266, + 0.0, + 0.0, + 0.0, + -0.0, + -6.419935784537599e-06, + -39.40528488159128, + 0.0, + 0.0, + 40.07472229003853, + -6.529000981932134e-06, + 0.0, + -161.35374450683594, + 268.2420654296875, + -368.1709899902344, + 1.0 + ], + "name": "Cube.050" + }, + { + "mesh": 73, + "name": "Cube.050_Material.038_0" + }, + { + "children": [ + 152 + ], + "matrix": [ + 17.436283111572266, + 0.0, + 0.0, + 0.0, + -0.0, + -6.419935784537599e-06, + -39.40528488159128, + 0.0, + 0.0, + 40.07472229003853, + -6.529000981932134e-06, + 0.0, + -161.35374450683594, + 268.2420654296875, + -368.1709899902344, + 1.0 + ], + "name": "Cube.051" + }, + { + "mesh": 74, + "name": "Cube.051_Material.042_0" + }, + { + "children": [ + 154 + ], + "matrix": [ + -1.4298013558846905e-06, + -32.71004104614249, + 1.9496701447249546e-06, + 0.0, + -5.329142204592387e-06, + -1.949669912306134e-06, + -32.71004104614208, + 0.0, + 34.212570190429204, + -1.4954793254145165e-06, + -5.57393518676224e-06, + 0.0, + -161.13897705078125, + 268.6579895019531, + -369.0243835449219, + 1.0 + ], + "name": "Cylinder.005" + }, + { + "mesh": 75, + "name": "Cylinder.005_Material.041_0" + }, + { + "children": [ + 156 + ], + "matrix": [ + -2.0549404621122713, + 8.002233604651245e-07, + -1.5005269276060293e-14, + 0.0, + -7.121351740368999e-07, + -1.8287336636055027, + -0.9372910275332579, + 0.0, + -3.0146661454496513e-06, + -7.741537577456234, + 15.104391229714416, + 0.0, + -173.93435668945313, + 242.500732421875, + -421.74005126953125, + 1.0 + ], + "name": "Cylinder.011" + }, + { + "mesh": 76, + "name": "Cylinder.011_Material.045_0" + }, + { + "children": [ + 158 + ], + "matrix": [ + 6.0249644632509636e-05, + 5.774736879927352e-21, + 109.08169555662398, + 0.0, + -8.073070559718233e-05, + 106.36914825436389, + 4.459039893431062e-11, + 0.0, + -79.55538940426183, + -6.0379939353355956e-05, + 4.394123061390213e-05, + 0.0, + -257.977294921875, + 220.7234649658203, + -359.04949951171875, + 1.0 + ], + "name": "metal-mesh-500x500.004" + }, + { + "mesh": 77, + "name": "metal-mesh-500x500.004_metal-mesh-500x500_0" + }, + { + "children": [ + 160 + ], + "matrix": [ + -3.968060011968472e-07, + 2.435577869415251, + 6.118531791658136e-15, + 0.0, + -2.4355778694152486, + -3.968060011968472e-07, + 1.0646251591132977e-07, + 0.0, + 1.0646251591132934e-07, + 1.1226413609614369e-14, + 2.435577869415281, + 0.0, + -143.80398559570313, + 250.19326782226563, + -325.7239074707031, + 1.0 + ], + "name": "Text" + }, + { + "mesh": 78, + "name": "Text_Material.046_0" + }, + { + "children": [ + 162 + ], + "matrix": [ + 5.749837398529053, + 0.0, + 0.0, + 0.0, + 0.0, + -7.540052123447581e-06, + -46.28050994872986, + 0.0, + 0.0, + 28.86747932434044, + -4.703109343851253e-06, + 0.0, + 83.51468658447266, + 83.27584838867188, + -355.5987243652344, + 1.0 + ], + "name": "Cube.052" + }, + { + "mesh": 79, + "name": "Cube.052_Material.047_0" + }, + { + "children": [ + 164 + ], + "matrix": [ + 35.19368362426758, + 0.0, + 0.0, + 0.0, + 0.0, + 35.19368362426754, + 1.53836477014097e-06, + 0.0, + 0.0, + -1.53836477014097e-06, + 35.19368362426754, + 0.0, + -115.8540267944336, + 150.748291015625, + -435.2226867675781, + 1.0 + ], + "name": "test-aorus-m2-souris-aorus-rgb2" + }, + { + "mesh": 80, + "name": "test-aorus-m2-souris-aorus-rgb2_test-aorus-m2-souris-aorus-rgb2_0" + }, + { + "children": [ + 166 + ], + "matrix": [ + 89.37416839599574, + 7.813338243899269e-06, + -0.0, + -0.0, + 9.954433728389332e-15, + -1.1386544517255265e-07, + 0.6989011168479825, + -0.0, + -9.304796666262747e-06, + 106.43446350097473, + 1.7340375151550582e-05, + -0.0, + -165.45028686523438, + 224.1227569580078, + -440.8395690917969, + 1.0 + ], + "name": "Cube.053" + }, + { + "mesh": 81, + "name": "Cube.053_Material.048_0" + }, + { + "children": [ + 168 + ], + "matrix": [ + 89.37416839599574, + 7.813338243899269e-06, + -0.0, + -0.0, + 9.954433728389332e-15, + -1.1386544517255265e-07, + 0.6989011168479825, + -0.0, + -9.304796666262747e-06, + 106.43446350097473, + 1.7340375151550582e-05, + -0.0, + -165.45028686523438, + 224.1227569580078, + -440.8395690917969, + 1.0 + ], + "name": "Cube.054" + }, + { + "mesh": 82, + "name": "Cube.054_Material.049_0" + }, + { + "children": [ + 170 + ], + "matrix": [ + 133.16307067871094, + 0.0, + 0.0, + 0.0, + -0.0, + -8.88463684347643e-06, + -54.5335121154778, + 0.0, + 0.0, + 13.174385070800607, + -2.1463797663044643e-06, + 0.0, + -122.28582000732422, + 185.07626342773438, + -370.55859375, + 1.0 + ], + "name": "Cube.055" + }, + { + "mesh": 83, + "name": "Cube.055_Material.054_0" + }, + { + "children": [ + 172 + ], + "matrix": [ + 128.05894470214844, + 0.0, + 0.0, + 0.0, + -0.0, + -8.544089715665935e-06, + -52.4432487487786, + 0.0, + 0.0, + 12.669409751891923, + -2.0641088442717533e-06, + 0.0, + -127.22206115722656, + 200.08087158203125, + -370.55859375, + 1.0 + ], + "name": "Cube.056" + }, + { + "mesh": 84, + "name": "Cube.056_Material.061_0" + }, + { + "children": [ + 174 + ], + "matrix": [ + 36.35369110107422, + 0.0, + 0.0, + 0.0, + -0.0, + -6.227078405447795e-06, + -38.2215347290034, + 0.0, + 0.0, + 10.574655532836774, + -1.722830063744379e-06, + 0.0, + -209.45143127441406, + 184.61602783203125, + -370.0960693359375, + 1.0 + ], + "name": "Cylinder.006" + }, + { + "mesh": 85, + "name": "Cylinder.006_Material.050_0" + }, + { + "children": [ + 176 + ], + "matrix": [ + 36.35369110107422, + 0.0, + 0.0, + 0.0, + -0.0, + -6.227078405447795e-06, + -38.2215347290034, + 0.0, + 0.0, + 10.574655532836774, + -1.722830063744379e-06, + 0.0, + -124.4391098022461, + 184.61602783203125, + -370.0960693359375, + 1.0 + ], + "name": "Cylinder.007" + }, + { + "mesh": 86, + "name": "Cylinder.007_Material.051_0" + }, + { + "children": [ + 178 + ], + "matrix": [ + 36.35369110107422, + 0.0, + 0.0, + 0.0, + -0.0, + -6.227078405447795e-06, + -38.2215347290034, + 0.0, + 0.0, + 10.574655532836774, + -1.722830063744379e-06, + 0.0, + -37.77696990966797, + 184.61602783203125, + -370.0960693359375, + 1.0 + ], + "name": "Cylinder.008" + }, + { + "mesh": 87, + "name": "Cylinder.008_Material.052_0" + }, + { + "children": [ + 180 + ], + "matrix": [ + 124.42671966552734, + 0.0, + 0.0, + 0.0, + 0.0, + -2.510793222399158e-05, + -154.1113891601542, + 0.0, + 0.0, + 119.91057586669764, + -1.953591248646838e-05, + 0.0, + 117.18205261230469, + 25.60487937927246, + -29.16535758972168, + 1.0 + ], + "name": "Plane" + }, + { + "mesh": 88, + "name": "Plane_Material.053_0" + }, + { + "children": [ + 182 + ], + "matrix": [ + 10.376615524291992, + 0.0, + 0.0, + 0.0, + 0.0, + 10.376615524291982, + 4.5357627028451994e-07, + 0.0, + 0.0, + -4.768809429906814e-07, + 10.909764289855946, + 0.0, + -229.27110290527344, + 204.82577514648438, + -315.95660400390625, + 1.0 + ], + "name": "geforcertx" + }, + { + "mesh": 89, + "name": "geforcertx_Material.056_0" + }, + { + "children": [ + 184 + ], + "matrix": [ + 128.05894470214844, + 0.0, + 0.0, + 0.0, + -0.0, + -8.544089715665935e-06, + -52.4432487487786, + 0.0, + 0.0, + 12.669409751891923, + -2.0641088442717533e-06, + 0.0, + -127.22206115722656, + 200.08087158203125, + -370.55859375, + 1.0 + ], + "name": "Cube.057" + }, + { + "mesh": 90, + "name": "Cube.057_Material.059_0" + }, + { + "children": [ + 186 + ], + "matrix": [ + 128.05894470214844, + 0.0, + 0.0, + 0.0, + -0.0, + -8.544089715665935e-06, + -52.4432487487786, + 0.0, + 0.0, + 12.669409751891923, + -2.0641088442717533e-06, + 0.0, + -127.22206115722656, + 200.08087158203125, + -370.55859375, + 1.0 + ], + "name": "Cube.059" + }, + { + "mesh": 91, + "name": "Cube.059_Material.058_0" + }, + { + "children": [ + 188 + ], + "matrix": [ + 133.25665283203125, + 0.0, + 0.0, + 0.0, + 0.0, + 53.22020721435542, + 2.3263291422473426e-06, + 0.0, + 0.0, + -3.603054922676587e-08, + 0.8242828845977775, + 0.0, + -123.74424743652344, + 264.2767333984375, + -316.7951965332031, + 1.0 + ], + "name": "Cube.060" + }, + { + "mesh": 92, + "name": "Cube.060_Material.062_0" + }, + { + "children": [ + 190 + ], + "matrix": [ + 133.259033203125, + 0.0, + 0.0, + 0.0, + -0.0, + -8.879825244127019e-06, + -54.50397872924733, + 0.0, + 0.0, + 0.8094638586044205, + -1.3187840178696728e-07, + 0.0, + -122.59111022949219, + 213.7086181640625, + -370.4294128417969, + 1.0 + ], + "name": "Cube.058" + }, + { + "mesh": 93, + "name": "Cube.058_Material.063_0" + }, + { + "children": [ + 192 + ], + "matrix": [ + 8.645501136779785, + 0.0, + 0.0, + 0.0, + 0.0, + 8.645501136779776, + 3.7790685712321535e-07, + 0.0, + 0.0, + -3.9732364508991816e-07, + 9.089705467224112, + 0.0, + -182.4276123046875, + 181.69923400878906, + -315.8466491699219, + 1.0 + ], + "name": "aorus logotranspa" + }, + { + "mesh": 94, + "name": "aorus logotranspa_aorus logotranspa_0" + }, + { + "children": [ + 194 + ], + "matrix": [ + 133.16307067871094, + 0.0, + 0.0, + 0.0, + -0.0, + -8.88463684347643e-06, + -54.5335121154778, + 0.0, + 0.0, + 13.174385070800607, + -2.1463797663044643e-06, + 0.0, + -122.28582000732422, + 185.07626342773438, + -370.55859375, + 1.0 + ], + "name": "Cube.061" + }, + { + "mesh": 95, + "name": "Cube.061_Material.064_0" + }, + { + "children": [ + 196 + ], + "matrix": [ + 89.37416839599574, + 7.813338243899269e-06, + -0.0, + -0.0, + 9.954433728389332e-15, + -1.1386544517255265e-07, + 0.6989011168479825, + -0.0, + -9.304796666262747e-06, + 106.43446350097473, + 1.7340375151550582e-05, + -0.0, + -165.45028686523438, + 224.1227569580078, + -440.8395690917969, + 1.0 + ], + "name": "Cube.062" + }, + { + "mesh": 96, + "name": "Cube.062_Material.065_0" + }, + { + "children": [ + 198 + ], + "matrix": [ + 42.88701248168928, + 3.7493018486623626e-06, + -0.0, + -0.0, + 6.108388057568896e-13, + -6.987181234409874e-06, + -42.88701248168888, + -0.0, + 2.0021780506329795e-06, + -22.902246475219332, + 3.7312495655126147e-06, + -0.0, + 111.41255187988281, + 32.44666290283203, + -27.405920028686523, + 1.0 + ], + "name": "Cube.064" + }, + { + "mesh": 97, + "name": "Cube.064_Material.074_0" + }, + { + "children": [ + 200 + ], + "matrix": [ + 42.88701248168928, + 3.7493018486623626e-06, + -0.0, + -0.0, + 6.108388057568896e-13, + -6.987181234409874e-06, + -42.88701248168888, + -0.0, + 2.0021780506329795e-06, + -22.902246475219332, + 3.7312495655126147e-06, + -0.0, + 111.41255187988281, + 32.44666290283203, + -27.405920028686523, + 1.0 + ], + "name": "Cube.067" + }, + { + "mesh": 98, + "name": "Cube.067_Material.075_0" + }, + { + "children": [ + 202 + ], + "matrix": [ + 42.88701248168928, + 3.7493018486623626e-06, + -0.0, + -0.0, + 6.108388057568896e-13, + -6.987181234409874e-06, + -42.88701248168888, + -0.0, + 2.0021780506329795e-06, + -22.902246475219332, + 3.7312495655126147e-06, + -0.0, + 111.41255187988281, + 32.49509048461914, + -27.405920028686523, + 1.0 + ], + "name": "Cube.063" + }, + { + "mesh": 99, + "name": "Cube.063_Material.074_0" + }, + { + "children": [ + 204 + ], + "matrix": [ + 42.884470234622356, + -0.46766088601761346, + -3.719856030069342e-17, + -0.0, + -2.0442103718283084e-08, + -1.8745394760286306e-06, + -42.8870124816894, + -0.0, + -0.2497372754420861, + -22.90089052854521, + 1.0010892740327254e-06, + -0.0, + 111.41255187988281, + 32.49509048461914, + -27.405920028686523, + 1.0 + ], + "name": "Cube.065" + }, + { + "mesh": 100, + "name": "Cube.065_Material.074_0" + }, + { + "children": [ + 206 + ], + "matrix": [ + 42.884470234622356, + -0.46766088601761346, + -3.719856030069342e-17, + -0.0, + -2.0442103718283084e-08, + -1.8745394760286306e-06, + -42.8870124816894, + -0.0, + -0.2497372754420861, + -22.90089052854521, + 1.0010892740327254e-06, + -0.0, + 111.46056365966797, + 32.2869758605957, + -27.29169464111328, + 1.0 + ], + "name": "Cube.066" + }, + { + "mesh": 101, + "name": "Cube.066_Material.076_0" + }, + { + "children": [ + 208 + ], + "matrix": [ + 42.88701248168928, + 3.7493018486623626e-06, + -0.0, + -0.0, + 6.108388057568896e-13, + -6.987181234409874e-06, + -42.88701248168888, + -0.0, + 2.0021780506329795e-06, + -22.902246475219332, + 3.7312495655126147e-06, + -0.0, + 111.41255187988281, + 32.44666290283203, + -27.405920028686523, + 1.0 + ], + "name": "Cube.072" + }, + { + "mesh": 102, + "name": "Cube.072_Material.078_0" + }, + { + "children": [ + 210 + ], + "matrix": [ + 42.88701248168928, + 3.7493018486623626e-06, + -0.0, + -0.0, + 6.108388057568896e-13, + -6.987181234409874e-06, + -42.88701248168888, + -0.0, + 2.0021780506329795e-06, + -22.902246475219332, + 3.7312495655126147e-06, + -0.0, + 111.41255187988281, + 32.44666290283203, + -27.405920028686523, + 1.0 + ], + "name": "Cube.073" + }, + { + "mesh": 103, + "name": "Cube.073_Material.079_0" + }, + { + "children": [ + 212 + ], + "matrix": [ + 41.71484987665632, + -9.958286327203423, + 4.487898275240324e-07, + -0.0, + 1.233188596401287e-09, + -1.9276220859159814e-06, + -42.8870124816894, + -0.0, + -5.317861735353635, + -22.27630303710988, + 1.0010894509490895e-06, + -0.0, + 65.92594146728516, + 34.461090087890625, + -27.346220016479492, + 1.0 + ], + "name": "Cube.076" + }, + { + "mesh": 104, + "name": "Cube.076_Material.080_0" + }, + { + "children": [ + 214 + ], + "matrix": [ + 11.57416572006797, + -4.8555776280112956e-17, + 0.012957930996537427, + 0.0, + -5.664091960637692e-10, + 11.574172019958484, + 5.059229335576209e-07, + 0.0, + -0.0028000396165429463, + -1.0932341449967793e-07, + 2.5010260166753175, + 0.0, + 77.22225189208984, + 34.52458572387695, + -28.481891632080078, + 1.0 + ], + "name": "Cylinder.009" + }, + { + "mesh": 105, + "name": "Cylinder.009_Material.081_0" + }, + { + "children": [ + 216 + ], + "matrix": [ + 11.891384301783699, + 6.7736132902303554e-18, + 0.013313075081399185, + 0.0, + -5.819329082338515e-10, + 11.891388893127429, + 5.197888336695541e-07, + 0.0, + -0.00044017496837693224, + -1.7185979231744104e-08, + 0.39316909707125836, + 0.0, + 77.22154235839844, + 34.52458572387695, + -27.857837677001953, + 1.0 + ], + "name": "Cylinder.010" + }, + { + "mesh": 106, + "name": "Cylinder.010_Material.077_0" + }, + { + "children": [ + 218 + ], + "matrix": [ + 10.438132420182672, + -1.4812840019410946e-17, + 0.011686077675467478, + 0.0, + -5.108146537024985e-10, + 10.438137054443349, + 4.562652500015659e-07, + 0.0, + -0.003210481579043269, + -1.2534850500299857e-07, + 2.8676372676318223, + 0.0, + 77.22250366210938, + 34.52458572387695, + -28.709497451782227, + 1.0 + ], + "name": "Cylinder.012" + }, + { + "mesh": 107, + "name": "Cylinder.012_Material.082_0" + }, + { + "children": [ + 220 + ], + "matrix": [ + 33.058687379813115, + -94.37755659437144, + 1.7584426359462668e-06, + 0.0, + 5.1546715112982255e-05, + 1.991904718945392e-05, + 99.99999999998474, + 0.0, + -94.37755659435737, + -33.05868737980716, + 5.523350576908115e-05, + 0.0, + -57.66334533691406, + 118.32025146484375, + -315.5950927734375, + 1.0 + ], + "name": "BezierCurve.001" + }, + { + "mesh": 108, + "name": "BezierCurve.001_Material.085_0" + }, + { + "children": [ + 222 + ], + "matrix": [ + 5.641849517822266, + 0.0, + 0.0, + 0.0, + -0.0, + -8.798168201874389e-07, + -5.400277137756277, + 0.0, + 0.0, + 4.233972549438421, + -6.898016842808811e-07, + 0.0, + -92.94392395019531, + 206.718994140625, + -314.86199951171875, + 1.0 + ], + "name": "Cube.074" + }, + { + "mesh": 109, + "name": "Cube.074_Material.084_0" + }, + { + "children": [ + 224 + ], + "matrix": [ + 1.1633355617523193, + 0.0, + 0.0, + 0.0, + -0.0, + -8.54275909900266e-06, + -52.435081481932905, + 0.0, + 0.0, + 17.74275398254371, + -2.890661533118182e-06, + 0.0, + -258.0068054199219, + 195.51239013671875, + -371.51080322265625, + 1.0 + ], + "name": "Cube.075" + }, + { + "mesh": 110, + "name": "Cube.075_Material.086_0" + }, + { + "children": [ + 226 + ], + "matrix": [ + 33.058687379813115, + -94.37755659437144, + 1.7584426359462668e-06, + 0.0, + 5.1546715112982255e-05, + 1.991904718945392e-05, + 99.99999999998474, + 0.0, + -94.37755659435737, + -33.05868737980716, + 5.523350576908115e-05, + 0.0, + -31.437889099121094, + 183.7853240966797, + -440.1556396484375, + 1.0 + ], + "name": "BezierCurve.002" + }, + { + "mesh": 111, + "name": "BezierCurve.002_Material.087_0" + }, + { + "children": [ + 228 + ], + "matrix": [ + 2.8489303588867188, + 0.0, + 0.0, + 0.0, + -0.0, + -7.937529259473599e-07, + -4.872020721435483, + 0.0, + 0.0, + 17.376914978027113, + -2.831058793954306e-06, + 0.0, + -81.67821502685547, + 266.505615234375, + -437.4105529785156, + 1.0 + ], + "name": "Cube.077" + }, + { + "mesh": 112, + "name": "Cube.077_Material.083_0" + }, + { + "children": [ + 230 + ], + "matrix": [ + 2.8489303588867188, + 0.0, + 0.0, + 0.0, + 0.0, + -7.937529259473599e-07, + -4.872020721435483, + 0.0, + 0.0, + 12.045918464660485, + -1.962529220161119e-06, + 0.0, + 70.35210418701172, + 334.3746337890625, + -437.4105529785156, + 1.0 + ], + "name": "Cube.078" + }, + { + "mesh": 113, + "name": "Cube.078_Material.083_0" + }, + { + "children": [ + 232 + ], + "matrix": [ + 1.9470718881642313e-05, + -99.9999999999981, + -1.1724465943260495e-13, + 0.0, + -99.99999999999696, + -1.9470718881642313e-05, + 1.5099579909783707e-05, + 0.0, + -1.5099579909783441e-05, + -2.822752095978731e-12, + -99.99999999999885, + 0.0, + 73.03350830078125, + 238.19570922851563, + -437.38818359375, + 1.0 + ], + "name": "BezierCurve" + }, + { + "mesh": 114, + "name": "BezierCurve_Material.088_0" + }, + { + "children": [ + 234 + ], + "matrix": [ + 16.037994384765625, + 0.0, + 0.0, + 0.0, + -0.0, + -1.4926804590976403e-06, + -9.162007331848024, + 0.0, + 0.0, + 4.326242446899357, + -7.048343586626317e-07, + 0.0, + -269.8395690917969, + 182.60963439941406, + -338.4084167480469, + 1.0 + ], + "name": "Cube.079" + }, + { + "mesh": 115, + "name": "Cube.079_Material.089_0" + }, + { + "children": [ + 236 + ], + "matrix": [ + -7.010430248210637e-07, + -16.037994384765582, + 9.559388442568605e-07, + 0.0, + -1.4926804855445062e-06, + -5.46098062244378e-07, + -9.162007331848006, + 0.0, + 4.326242446899353, + -1.8910611217039133e-07, + -7.048343596232505e-07, + 0.0, + -158.493408203125, + 199.9745635986328, + 375.1634216308594, + 1.0 + ], + "name": "Cube.080" + }, + { + "mesh": 116, + "name": "Cube.080_Material.089_0" + }, + { + "children": [ + 238 + ], + "matrix": [ + -2.7412010661365116e-06, + -62.71136808447573, + -77.8927744593386, + 0.0, + -7.775940452647845e-06, + -77.89277445933827, + 62.71136808447573, + 0.0, + -99.99999999999967, + 7.775940441545615e-06, + -2.741201088340972e-06, + 0.0, + -158.89813232421875, + 127.66092681884766, + 299.3943786621094, + 1.0 + ], + "name": "BezierCurve.003" + }, + { + "mesh": 117, + "name": "BezierCurve.003_Material.091_0" + }, + { + "children": [ + 240 + ], + "matrix": [ + 2.5523126423434963, + 0.6067526587750516, + 0.016214959010181364, + 0.0, + 1.743683994404631e-08, + 0.035639979744987754, + -1.333626373008357, + 0.0, + -0.5175059248578667, + 2.1753415563330663, + 0.05813406329659222, + 0.0, + 93.21507263183594, + 47.658329010009766, + -27.746746063232422, + 1.0 + ], + "name": "Cube.081" + }, + { + "mesh": 118, + "name": "Cube.081_Material.090_0" + }, + { + "children": [ + 242 + ], + "matrix": [ + 5.7255734085485175, + -1.6698431661134718, + -1.6553721059890442e-16, + 0.0, + -7.299116568146293e-08, + -2.502727714122187e-07, + -5.964106559753413, + 0.0, + 0.5825821270962197, + 1.9975628866759578, + -9.095393293657187e-08, + 0.0, + 129.11863708496094, + 44.50042724609375, + -27.606985092163086, + 1.0 + ], + "name": "Cube.068" + }, + { + "mesh": 119, + "name": "Cube.068_Material.092_0" + }, + { + "children": [ + 244 + ], + "matrix": [ + 9.370122975942221e-07, + -6.889546823191377e-16, + -12.411104202270472, + 0.0, + -11.9147273633147, + 3.4748885441711406, + -8.995368887299218e-07, + 0.0, + 3.474888544171131, + 11.914727363314737, + 2.623467860143643e-07, + 0.0, + 129.54119873046875, + 46.55219650268555, + -27.47589683532715, + 1.0 + ], + "name": "Color-PewDiePie-Logo" + }, + { + "mesh": 120, + "name": "Color-PewDiePie-Logo_Color-PewDiePie-Logo_0" + }, + { + "children": [ + 246 + ], + "matrix": [ + 42.88701248168928, + 3.7493018486623626e-06, + -0.0, + -0.0, + 6.383788317086393e-13, + -7.302202399914888e-06, + -44.82059860229432, + -0.0, + 2.0021780506329795e-06, + -22.902246475219332, + 3.7312495655126147e-06, + -0.0, + 111.41255187988281, + 32.44666290283203, + -27.405920028686523, + 1.0 + ], + "name": "Cube.069" + }, + { + "mesh": 121, + "name": "Cube.069_Material.093_0" + }, + { + "children": [ + 248 + ], + "matrix": [ + -4.308277515384857e-07, + -9.856189727783176, + 5.874746175309317e-07, + 0.0, + -1.6057771551159082e-06, + -5.874745474984916e-07, + -9.856189727783054, + 0.0, + 4.878874301910331, + -2.132624239918746e-07, + -7.948695170179174e-07, + 0.0, + 83.02698516845703, + 308.22509765625, + -282.1931457519531, + 1.0 + ], + "name": "Cylinder.013" + }, + { + "mesh": 122, + "name": "Cylinder.013_Material.094_0" + }, + { + "children": [ + 250 + ], + "matrix": [ + -2.8602785321697175e-07, + -6.543554306030256, + 3.900261834846624e-07, + 0.0, + -1.0660803320642882e-06, + -3.900261369899126e-07, + -6.543554306030175, + 0.0, + 3.2390997409820095, + -1.4158558297818848e-07, + -5.277163311379263e-07, + 0.0, + 84.51951599121094, + 280.4237365722656, + -282.1931457519531, + 1.0 + ], + "name": "Cylinder.014" + }, + { + "mesh": 123, + "name": "Cylinder.014_Material.095_0" + }, + { + "children": [ + 252 + ], + "matrix": [ + -2.9155674524798657e-07, + -6.670040607452375, + 3.9756535365114155e-07, + 0.0, + -1.0866875665908526e-06, + -3.9756530625765254e-07, + -6.670040607452292, + 0.0, + 3.301711082458449, + -1.443224123421711e-07, + -5.379170134428044e-07, + 0.0, + 84.51951599121094, + 254.3072967529297, + -282.1931457519531, + 1.0 + ], + "name": "Cylinder.015" + }, + { + "mesh": 124, + "name": "Cylinder.015_Material.096_0" + }, + { + "children": [ + 254 + ], + "matrix": [ + -4.513386839192593e-07, + -10.325425148010227, + 6.15443224735478e-07, + 0.0, + -1.365879116666266e-06, + -4.997077044250475e-07, + -8.383706092834347, + 0.0, + 9.717717170715193, + -4.247750180164967e-07, + -1.5832170857483743e-06, + 0.0, + 87.58583068847656, + 202.482177734375, + -275.4857177734375, + 1.0 + ], + "name": "Text.001" + }, + { + "mesh": 125, + "name": "Text.001_Material.097_0" + }, + { + "children": [ + 256 + ], + "matrix": [ + 5.407493699198653, + 0.6997207145646935, + 8.854953246389825e-10, + 0.0, + -4.7125457471539275e-08, + 3.7044853659003687e-07, + -4.946271419525132, + 0.0, + -0.24498889458239878, + 1.8932923897388496, + 1.441313158950315e-07, + 0.0, + 98.95756530761719, + 38.351585388183594, + -8.161566734313965, + 1.0 + ], + "name": "Cube.088" + }, + { + "mesh": 126, + "name": "Cube.088_Material.098_0" + }, + { + "children": [ + 258 + ], + "matrix": [ + 100.0, + 0.0, + 0.0, + 0.0, + -0.0, + -1.629206793918314e-05, + -99.99999999999868, + 0.0, + 0.0, + 99.99999999999868, + -1.629206793918314e-05, + 0.0, + -33.393333435058594, + 29.826143264770508, + -26.833724975585938, + 1.0 + ], + "name": "BezierCurve.004" + }, + { + "mesh": 127, + "name": "BezierCurve.004_Material.099_0" + }, + { + "children": [ + 260 + ], + "matrix": [ + 7.667816638946533, + 0.0, + 0.0, + 0.0, + -0.0, + -3.785680151489097e-07, + -2.3236339092254332, + 0.0, + 0.0, + 5.236331939697196, + -8.531067571366249e-07, + 0.0, + -266.8487243652344, + 260.3353271484375, + -432.7508544921875, + 1.0 + ], + "name": "Cube.070" + }, + { + "mesh": 128, + "name": "Cube.070_Material.100_0" + }, + { + "children": [ + 262 + ], + "matrix": [ + 7.667816638946533, + 0.0, + 0.0, + 0.0, + -0.0, + -3.785680151489097e-07, + -2.3236339092254332, + 0.0, + 0.0, + 5.236331939697196, + -8.531067571366249e-07, + 0.0, + -266.8487243652344, + 260.3353271484375, + -426.84283447265625, + 1.0 + ], + "name": "Cube.071" + }, + { + "mesh": 129, + "name": "Cube.071_Material.101_0" + }, + { + "children": [ + 264 + ], + "matrix": [ + 7.667816638946533, + 0.0, + 0.0, + 0.0, + -0.0, + -3.785680151489097e-07, + -2.3236339092254332, + 0.0, + 0.0, + 5.236331939697196, + -8.531067571366249e-07, + 0.0, + -266.8487243652344, + 274.0422668457031, + -426.6409912109375, + 1.0 + ], + "name": "Cube.082" + }, + { + "mesh": 130, + "name": "Cube.082_Material.101_0" + }, + { + "children": [ + 266 + ], + "matrix": [ + -1.3421571378873554e-07, + -3.070497512817375, + 1.830158917180035e-07, + 0.0, + -5.002475497223729e-07, + -1.8301586990080647e-07, + -3.0704975128173366, + 0.0, + 5.453830718994063, + -2.383945736660216e-07, + -8.885418072375595e-07, + 0.0, + -263.6327209472656, + 248.73675537109375, + -421.7603759765625, + 1.0 + ], + "name": "Cylinder.016" + }, + { + "mesh": 131, + "name": "Cylinder.016_Material.102_0" + }, + { + "children": [ + 268 + ], + "matrix": [ + -2.492668001343525e-07, + -5.702559471130356, + 3.398989910681431e-07, + 0.0, + -9.290648797697762e-07, + -3.3989895054902105e-07, + -5.702559471130285, + 0.0, + 5.70255947113029, + -2.492668555315897e-07, + -9.290648645751055e-07, + 0.0, + 87.65415954589844, + 308.1877136230469, + -282.2664794921875, + 1.0 + ], + "name": "BezierCircle" + }, + { + "mesh": 132, + "name": "BezierCircle_Material.104_0" + }, + { + "children": [ + 270 + ], + "matrix": [ + 4.371139006309477e-06, + -1.1102230246251565e-14, + -99.99999999999991, + 0.0, + -99.99999999999982, + -4.371139006309477e-06, + -4.371139011860592e-06, + 0.0, + -4.371139011860592e-06, + 99.99999999999991, + -1.9984014443252818e-13, + 0.0, + 83.41278076171875, + 25.966310501098633, + 360.69610595703125, + 1.0 + ], + "name": "BezierCurve.005" + }, + { + "mesh": 133, + "name": "BezierCurve.005_Material.103_0" + }, + { + "children": [ + 272 + ], + "matrix": [ + 4.371139006309477e-06, + -1.1102230246251565e-14, + -99.99999999999991, + 0.0, + -99.99999999999982, + -4.371139006309477e-06, + -4.371139011860592e-06, + 0.0, + -4.371139011860592e-06, + 99.99999999999991, + -1.9984014443252818e-13, + 0.0, + -275.7300109863281, + 25.966310501098633, + 569.7454833984375, + 1.0 + ], + "name": "BezierCurve.006" + }, + { + "mesh": 134, + "name": "BezierCurve.006_Material.106_0" + }, + { + "children": [ + 274 + ], + "matrix": [ + 4.371139006309477e-06, + -1.1102230246251565e-14, + -99.99999999999991, + 0.0, + -99.99999999999982, + -4.371139006309477e-06, + -4.371139011860592e-06, + 0.0, + -4.371139011860592e-06, + 99.99999999999991, + -1.9984014443252818e-13, + 0.0, + -271.3393249511719, + 25.966310501098633, + 569.7454833984375, + 1.0 + ], + "name": "BezierCurve.007" + }, + { + "mesh": 135, + "name": "BezierCurve.007_Material.105_0" + }, + { + "children": [ + 276 + ], + "matrix": [ + 7.549789959870878e-06, + -5.551115123125783e-15, + 99.99999999999972, + 0.0, + -99.99999999999783, + 1.9470718870540082e-05, + 7.549789959870878e-06, + 0.0, + -1.9470718859437852e-05, + -99.9999999999981, + 1.4654943925052066e-12, + 0.0, + -280.4308166503906, + 25.966310501098633, + 28.49835777282715, + 1.0 + ], + "name": "BezierCurve.008" + }, + { + "mesh": 136, + "name": "BezierCurve.008_Material.107_0" + }, + { + "children": [ + 278 + ], + "matrix": [ + 6.334633910196007e-05, + -1.8060084135650134e-14, + -325.34155273436886, + 0.0, + -4.040951802842859, + -0.28257090082021064, + -7.868023652885208e-07, + 0.0, + -12.841519045206317, + 183.64226247764356, + -2.500336085755288e-06, + 0.0, + -138.594482421875, + 295.6539306640625, + 300.4053649902344, + 1.0 + ], + "name": "Cube.001" + }, + { + "mesh": 137, + "name": "Cube.001_Material.055_0" + }, + { + "children": [ + 280 + ], + "matrix": [ + -0.0003348324239343237, + -0.0, + 325.34149169904646, + -0.0, + -14.637002366502495, + -1.797195833593119, + -1.5063996158797503e-05, + -0.0, + -18.628101067132107, + 151.71388354391146, + -1.917152405110944e-05, + -0.0, + -146.7056427001953, + 263.6781005859375, + 300.4053649902344, + 1.0 + ], + "name": "Cube.002" + }, + { + "mesh": 138, + "name": "Cube.002_Material.044_0" + }, + { + "children": [ + 282 + ], + "matrix": [ + 20.630760881841685, + 1.241870179563576, + 77.99714428917103, + 0.0, + -9.732887016367066, + 80.0893671632955, + 1.299230489371966, + 0.0, + -77.39746540566715, + -9.74037300251111, + 20.62722802324378, + 0.0, + -142.04046630859375, + 164.81265258789063, + 596.0805053710938, + 1.0 + ], + "name": "gallerymodel" + }, + { + "mesh": 139, + "name": "gallerymodel_gallerymodel_0" + }, + { + "children": [ + 284 + ], + "matrix": [ + 2.456260391974803e-05, + 0.0, + -325.34155273437403, + 0.0, + -4.040951802842923, + -0.28257090082021064, + -3.050833735344155e-07, + 0.0, + -2.164817028954849, + 30.958323205212828, + -1.6343913899949494e-07, + 0.0, + -157.1312255859375, + 447.6515808105469, + 300.4053649902344, + 1.0 + ], + "name": "Cube.003" + }, + { + "mesh": 140, + "name": "Cube.003_Material.001_0" + }, + { + "children": [ + 286 + ], + "matrix": [ + 0.05845130427506947, + -0.5849656424989765, + 113.03217790116327, + 0.0, + -14.570781476617183, + 112.08909791991762, + 0.5876198583163538, + 0.0, + -112.09060025155343, + -14.570885324946614, + -0.017443046314945407, + 0.0, + -153.70526123046875, + 194.9165802001953, + 83.02733612060547, + 1.0 + ], + "name": "bg2" + }, + { + "mesh": 141, + "name": "bg2_bg2_0" + }, + { + "children": [ + 288 + ], + "matrix": [ + 2.503670298960799e-05, + 0.0, + -331.6211853027334, + 0.0, + -24.279822155464633, + 347.2173758818951, + -1.8330755763545233e-06, + 0.0, + 330.8133715686026, + 23.132741579924406, + 2.4975714758873077e-05, + 0.0, + -136.17652893066406, + 300.1324768066406, + 300.4053649902344, + 1.0 + ], + "name": "MY SCREEN" + }, + { + "mesh": 142, + "name": "MY SCREEN_MY SCREEN_0" + }, + { + "children": [ + 290 + ], + "matrix": [ + 1.3084044553854376e-05, + 0.0, + 23.68860054015752, + 0.0, + -1.6524329237289994, + 23.630902058077464, + 9.126966346706822e-07, + 0.0, + -23.63090205807386, + -1.6524329237292517, + 1.3052175658752568e-05, + 0.0, + -161.5426483154297, + 449.4466247558594, + 82.0821533203125, + 1.0 + ], + "name": "gigabyte-logo" + }, + { + "mesh": 143, + "name": "gigabyte-logo_gigabyte-logo_0" + }, + { + "children": [ + 292 + ], + "matrix": [ + 1.3468677102576413e-06, + 2.475770102216933e-16, + -17.83980369567866, + 0.0, + -1.244442716625535, + 17.796346766271707, + -9.395281132671412e-08, + 0.0, + 17.796346766271657, + 1.2444427166255383, + 1.3435868038732548e-06, + 0.0, + -122.05940246582031, + 122.82362365722656, + 301.5984191894531, + 1.0 + ], + "name": "gigabyte-logo.001" + }, + { + "mesh": 144, + "name": "gigabyte-logo.001_gigabyte-logo_0" + }, + { + "children": [ + 294 + ], + "matrix": [ + 3.263271507471313e-05, + -9.303609145832736e-15, + -167.59892272948903, + 0.0, + -17.749936105546798, + -1.2411965496141266, + -3.45604015908809e-06, + 0.0, + -13.497737246650031, + 193.02661917001782, + -2.628106487638673e-06, + 0.0, + -148.74098205566406, + 180.96983337402344, + 299.2461242675781, + 1.0 + ], + "name": "Cube.004" + }, + { + "mesh": 145, + "name": "Cube.004_Material.002_0" + }, + { + "children": [ + 296 + ], + "matrix": [ + 1.2321210903846983e-06, + -1.8118771660433595e-15, + -16.319938659667923, + 0.0, + -28.811819076537976, + -1.2594046620818712e-06, + -2.1752318222972577e-06, + 0.0, + -5.654458256202452e-07, + 12.935892105102528, + -4.59575208292852e-14, + 0.0, + -186.532470703125, + 291.5636901855469, + 297.42510986328125, + 1.0 + ], + "name": "Cube.005" + }, + { + "mesh": 146, + "name": "Cube.005_Material.003_0" + }, + { + "children": [ + 298 + ], + "matrix": [ + 7.902722140869888e-06, + -2.2530714290379438e-15, + -40.58772659301681, + 0.0, + -16.599632618402982, + -1.1607594871502322, + -3.2320678009303742e-06, + 0.0, + -37.0831219107957, + 530.3133051050492, + -7.220350455395473e-06, + 0.0, + -202.9559326171875, + -64.82244110107422, + 300.4053649902344, + 1.0 + ], + "name": "Cube.006" + }, + { + "mesh": 147, + "name": "Cube.006_Material.043_0" + }, + { + "children": [ + 300 + ], + "matrix": [ + -1.4635237193836142e-05, + -2.1521628270205866e-14, + 193.84959411621037, + -0.0, + -54.1158218383787, + 2.3654777969623226e-06, + -4.085630880851511e-06, + -0.0, + 4.0742653430180844e-07, + 9.320832252502433, + 3.311424824127031e-14, + -0.0, + -213.017822265625, + 35.33295822143555, + 296.0550842285156, + 1.0 + ], + "name": "Cube.007" + }, + { + "mesh": 148, + "name": "Cube.007_Material.037_0" + }, + { + "children": [ + 302 + ], + "matrix": [ + 15.5085538619484, + -7.411996800054065e-07, + -46.55501148822307, + 0.0, + -103.2037368782689, + -3.872504558578446e-05, + -34.37955788145044, + 0.0, + -1.8806867225495609e-06, + 5.648133754729867, + -7.164239729872463e-07, + 0.0, + -80.19874572753906, + 31.648094177246094, + 453.1488952636719, + 1.0 + ], + "name": "Cube.008" + }, + { + "mesh": 149, + "name": "Cube.008_Material.036_0" + }, + { + "children": [ + 304 + ], + "matrix": [ + -14.043312843110638, + 2.471096400712604e-06, + -47.01775943138991, + 0.0, + -104.22956966772539, + -1.2349445119449712e-05, + 31.13139528655253, + 0.0, + -5.329970937266094e-07, + 5.648133754730181, + 4.560431674778387e-07, + 0.0, + -80.19878387451172, + 31.648094177246094, + 163.7945098876953, + 1.0 + ], + "name": "Cube.009" + }, + { + "mesh": 150, + "name": "Cube.009_Material.039_0" + }, + { + "children": [ + 306 + ], + "matrix": [ + -43.41123714621792, + 2.8588614981631037e-08, + -0.26224884728651354, + 0.0, + -0.5813564706275188, + -4.2062405007921465e-06, + 96.23456451393615, + 0.0, + 1.9712416492440446e-09, + 4.996860027313228, + 2.184157117731004e-07, + 0.0, + -181.1455535888672, + 31.636882781982422, + 295.79583740234375, + 1.0 + ], + "name": "Cube.010" + }, + { + "mesh": 151, + "name": "Cube.010_Material.006_0" + }, + { + "children": [ + 308 + ], + "matrix": [ + 6.901629040871109e-06, + 0.0, + -91.41484832763645, + 0.0, + -7.991742824146171e-06, + -91.4148788452145, + -6.033597975835252e-13, + 0.0, + -91.41487884521423, + 7.991742824146193e-06, + -6.901631355033248e-06, + 0.0, + 147.7085418701172, + 33.2446403503418, + 403.08636474609375, + 1.0 + ], + "name": "Object_8" + }, + { + "mesh": 152, + "name": "Object_8_Tastatur_Seite_0" + }, + { + "children": [ + 310 + ], + "matrix": [ + 6.901629040871109e-06, + 0.0, + -91.41484832763645, + 0.0, + -7.991742824146171e-06, + -91.4148788452145, + -6.033597975835252e-13, + 0.0, + -91.41487884521423, + 7.991742824146193e-06, + -6.901631355033248e-06, + 0.0, + 147.7085418701172, + 33.2446403503418, + 403.08636474609375, + 1.0 + ], + "name": "Object_10" + }, + { + "mesh": 153, + "name": "Object_10_Tastatur_Unterseite_0" + }, + { + "children": [ + 312 + ], + "matrix": [ + 6.901629040871109e-06, + 0.0, + -91.41484832763645, + 0.0, + -7.991742824146171e-06, + -91.4148788452145, + -6.033597975835252e-13, + 0.0, + -91.41487884521423, + 7.991742824146193e-06, + -6.901631355033248e-06, + 0.0, + 147.7085418701172, + 33.2446403503418, + 403.08636474609375, + 1.0 + ], + "name": "Object_12" + }, + { + "mesh": 154, + "name": "Object_12_Tastatur_Unterseite_0" + }, + { + "children": [ + 314 + ], + "matrix": [ + 6.901629040871109e-06, + 0.0, + -91.41484832763645, + 0.0, + -7.991742824146171e-06, + -91.4148788452145, + -6.033597975835252e-13, + 0.0, + -91.41487884521423, + 7.991742824146193e-06, + -6.901631355033248e-06, + 0.0, + 147.7085418701172, + 33.2446403503418, + 403.08636474609375, + 1.0 + ], + "name": "Object_14" + }, + { + "mesh": 155, + "name": "Object_14_Material.004_0" + }, + { + "children": [ + 316 + ], + "matrix": [ + 6.901629040871109e-06, + 0.0, + -91.41484832763645, + 0.0, + -7.991742824146171e-06, + -91.4148788452145, + -6.033597975835252e-13, + 0.0, + -91.41487884521423, + 7.991742824146193e-06, + -6.901631355033248e-06, + 0.0, + 147.7085418701172, + 33.2446403503418, + 403.08636474609375, + 1.0 + ], + "name": "Object_16" + }, + { + "mesh": 156, + "name": "Object_16_Material.004_0" + }, + { + "children": [ + 318 + ], + "matrix": [ + 6.901629040871109e-06, + 0.0, + -91.41484832763645, + 0.0, + -7.991742824146171e-06, + -91.4148788452145, + -6.033597975835252e-13, + 0.0, + -91.41487884521423, + 7.991742824146193e-06, + -6.901631355033248e-06, + 0.0, + 147.7085418701172, + 33.2446403503418, + 403.08636474609375, + 1.0 + ], + "name": "Object_18" + }, + { + "mesh": 157, + "name": "Object_18_Material.004_0" + }, + { + "children": [ + 320 + ], + "matrix": [ + 6.901629040871109e-06, + 0.0, + -91.41484832763645, + 0.0, + -7.991742824146171e-06, + -91.4148788452145, + -6.033597975835252e-13, + 0.0, + -91.41487884521423, + 7.991742824146193e-06, + -6.901631355033248e-06, + 0.0, + 147.7085418701172, + 33.2446403503418, + 403.08636474609375, + 1.0 + ], + "name": "Object_20" + }, + { + "mesh": 158, + "name": "Object_20_Material.004_0" + }, + { + "children": [ + 322 + ], + "matrix": [ + 6.901629040871109e-06, + 0.0, + -91.41484832763645, + 0.0, + -7.991742824146171e-06, + -91.4148788452145, + -6.033597975835252e-13, + 0.0, + -91.41487884521423, + 7.991742824146193e-06, + -6.901631355033248e-06, + 0.0, + 147.7085418701172, + 33.2446403503418, + 403.08636474609375, + 1.0 + ], + "name": "Object_22" + }, + { + "mesh": 159, + "name": "Object_22_Material.004_0" + }, + { + "children": [ + 324 + ], + "matrix": [ + 6.901629040871109e-06, + 0.0, + -91.41484832763645, + 0.0, + -7.991742824146171e-06, + -91.4148788452145, + -6.033597975835252e-13, + 0.0, + -91.41487884521423, + 7.991742824146193e-06, + -6.901631355033248e-06, + 0.0, + 147.7085418701172, + 33.2446403503418, + 403.08636474609375, + 1.0 + ], + "name": "Object_24" + }, + { + "mesh": 160, + "name": "Object_24_Tastatur_Seite_0" + }, + { + "children": [ + 326 + ], + "matrix": [ + 6.901629040871109e-06, + 0.0, + -91.41484832763645, + 0.0, + -7.991742824146171e-06, + -91.4148788452145, + -6.033597975835252e-13, + 0.0, + -91.41487884521423, + 7.991742824146193e-06, + -6.901631355033248e-06, + 0.0, + 147.7085418701172, + 33.2446403503418, + 403.08636474609375, + 1.0 + ], + "name": "Object_26" + }, + { + "mesh": 161, + "name": "Object_26_Material.004_0" + }, + { + "children": [ + 328 + ], + "matrix": [ + 6.901629040871109e-06, + 0.0, + -91.41484832763645, + 0.0, + -7.991742824146171e-06, + -91.4148788452145, + -6.033597975835252e-13, + 0.0, + -91.41487884521423, + 7.991742824146193e-06, + -6.901631355033248e-06, + 0.0, + 147.7085418701172, + 33.2446403503418, + 403.08636474609375, + 1.0 + ], + "name": "Object_28" + }, + { + "mesh": 162, + "name": "Object_28_Material.004_0" + }, + { + "children": [ + 330 + ], + "matrix": [ + 6.901629040871109e-06, + 0.0, + -91.41484832763645, + 0.0, + -7.991742824146171e-06, + -91.4148788452145, + -6.033597975835252e-13, + 0.0, + -91.41487884521423, + 7.991742824146193e-06, + -6.901631355033248e-06, + 0.0, + 147.7085418701172, + 33.2446403503418, + 403.08636474609375, + 1.0 + ], + "name": "Object_30" + }, + { + "mesh": 163, + "name": "Object_30_Material.007_0" + }, + { + "children": [ + 332 + ], + "matrix": [ + 6.901629040871109e-06, + 0.0, + -91.41484832763645, + 0.0, + -7.991742824146171e-06, + -91.4148788452145, + -6.033597975835252e-13, + 0.0, + -91.41487884521423, + 7.991742824146193e-06, + -6.901631355033248e-06, + 0.0, + 147.7085418701172, + 33.2446403503418, + 403.08636474609375, + 1.0 + ], + "name": "Object_32" + }, + { + "mesh": 164, + "name": "Object_32_Material.004_0" + }, + { + "children": [ + 334 + ], + "matrix": [ + 6.901629040871109e-06, + 0.0, + -91.41484832763645, + 0.0, + -7.991742824146171e-06, + -91.4148788452145, + -6.033597975835252e-13, + 0.0, + -91.41487884521423, + 7.991742824146193e-06, + -6.901631355033248e-06, + 0.0, + 147.7085418701172, + 33.2446403503418, + 403.08636474609375, + 1.0 + ], + "name": "Object_34" + }, + { + "mesh": 165, + "name": "Object_34_Material.004_0" + }, + { + "children": [ + 336 + ], + "matrix": [ + 6.901629040871109e-06, + 0.0, + -91.41484832763645, + 0.0, + -7.991742824146171e-06, + -91.4148788452145, + -6.033597975835252e-13, + 0.0, + -91.41487884521423, + 7.991742824146193e-06, + -6.901631355033248e-06, + 0.0, + 147.7085418701172, + 33.2446403503418, + 403.08636474609375, + 1.0 + ], + "name": "Object_36" + }, + { + "mesh": 166, + "name": "Object_36_Tastatur_Seite_0" + }, + { + "children": [ + 338 + ], + "matrix": [ + 6.901629040871109e-06, + 0.0, + -91.41484832763645, + 0.0, + -7.991742824146171e-06, + -91.4148788452145, + -6.033597975835252e-13, + 0.0, + -91.41487884521423, + 7.991742824146193e-06, + -6.901631355033248e-06, + 0.0, + 147.7085418701172, + 33.2446403503418, + 403.08636474609375, + 1.0 + ], + "name": "Object_38" + }, + { + "mesh": 167, + "name": "Object_38_Tastatur_Seite_0" + }, + { + "children": [ + 340 + ], + "matrix": [ + 6.901629040871109e-06, + 0.0, + -91.41484832763645, + 0.0, + -7.991742824146171e-06, + -91.4148788452145, + -6.033597975835252e-13, + 0.0, + -91.41487884521423, + 7.991742824146193e-06, + -6.901631355033248e-06, + 0.0, + 147.7085418701172, + 33.2446403503418, + 403.08636474609375, + 1.0 + ], + "name": "Object_40" + }, + { + "mesh": 168, + "name": "Object_40_Tastatur_Seite_0" + }, + { + "children": [ + 342 + ], + "matrix": [ + 6.901629040871109e-06, + 0.0, + -91.41484832763645, + 0.0, + -7.991742824146171e-06, + -91.4148788452145, + -6.033597975835252e-13, + 0.0, + -91.41487884521423, + 7.991742824146193e-06, + -6.901631355033248e-06, + 0.0, + 147.7085418701172, + 33.2446403503418, + 403.08636474609375, + 1.0 + ], + "name": "Object_42" + }, + { + "mesh": 169, + "name": "Object_42_Tastatur_Seite_0" + }, + { + "children": [ + 344 + ], + "matrix": [ + 6.901629040871109e-06, + 0.0, + -91.41484832763645, + 0.0, + -7.991742824146171e-06, + -91.4148788452145, + -6.033597975835252e-13, + 0.0, + -91.41487884521423, + 7.991742824146193e-06, + -6.901631355033248e-06, + 0.0, + 147.7085418701172, + 33.2446403503418, + 403.08636474609375, + 1.0 + ], + "name": "Object_44" + }, + { + "mesh": 170, + "name": "Object_44_Tastatur_Seite_0" + }, + { + "children": [ + 346 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_47" + }, + { + "mesh": 171, + "name": "Object_47_Material.005_0" + }, + { + "children": [ + 348 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_49" + }, + { + "mesh": 172, + "name": "Object_49_Tasten_2_0" + }, + { + "children": [ + 350 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_51" + }, + { + "mesh": 173, + "name": "Object_51_Tasten_2_0" + }, + { + "children": [ + 352 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_53" + }, + { + "mesh": 174, + "name": "Object_53_Tasten_2_0" + }, + { + "children": [ + 354 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_55" + }, + { + "mesh": 175, + "name": "Object_55_Material.057_0" + }, + { + "children": [ + 356 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_57" + }, + { + "mesh": 176, + "name": "Object_57_Tasten_2_0" + }, + { + "children": [ + 358 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_59" + }, + { + "mesh": 177, + "name": "Object_59_Material.060_0" + }, + { + "children": [ + 360 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_61" + }, + { + "mesh": 178, + "name": "Object_61_Tasten_2_0" + }, + { + "children": [ + 362 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_63" + }, + { + "mesh": 179, + "name": "Object_63_Material.060_0" + }, + { + "children": [ + 364 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_65" + }, + { + "mesh": 180, + "name": "Object_65_Material.066_0" + }, + { + "children": [ + 366 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_67" + }, + { + "mesh": 181, + "name": "Object_67_Material.067_0" + }, + { + "children": [ + 368 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_69" + }, + { + "mesh": 182, + "name": "Object_69_Material.066_0" + }, + { + "children": [ + 370 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_71" + }, + { + "mesh": 183, + "name": "Object_71_Tasten_2_0" + }, + { + "children": [ + 372 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_73" + }, + { + "mesh": 184, + "name": "Object_73_Material.057_0" + }, + { + "children": [ + 374 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_75" + }, + { + "mesh": 185, + "name": "Object_75_Material.066_0" + }, + { + "children": [ + 376 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_77" + }, + { + "mesh": 186, + "name": "Object_77_Material.057_0" + }, + { + "children": [ + 378 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_79" + }, + { + "mesh": 187, + "name": "Object_79_Material.057_0" + }, + { + "children": [ + 380 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_81" + }, + { + "mesh": 188, + "name": "Object_81_Material.068_0" + }, + { + "children": [ + 382 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_83" + }, + { + "mesh": 189, + "name": "Object_83_Tasten_2_0" + }, + { + "children": [ + 384 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_85" + }, + { + "mesh": 190, + "name": "Object_85_Material.068_0" + }, + { + "children": [ + 386 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_87" + }, + { + "mesh": 191, + "name": "Object_87_Tasten_2_0" + }, + { + "children": [ + 388 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_89" + }, + { + "mesh": 192, + "name": "Object_89_Material.068_0" + }, + { + "children": [ + 390 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_91" + }, + { + "mesh": 193, + "name": "Object_91_Material.067_0" + }, + { + "children": [ + 392 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_93" + }, + { + "mesh": 194, + "name": "Object_93_Material.069_0" + }, + { + "children": [ + 394 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_95" + }, + { + "mesh": 195, + "name": "Object_95_Tasten_2_0" + }, + { + "children": [ + 396 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_97" + }, + { + "mesh": 196, + "name": "Object_97_Material.005_0" + }, + { + "children": [ + 398 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_99" + }, + { + "mesh": 197, + "name": "Object_99_Tasten_2_0" + }, + { + "children": [ + 400 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_101" + }, + { + "mesh": 198, + "name": "Object_101_Material.067_0" + }, + { + "children": [ + 402 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_103" + }, + { + "mesh": 199, + "name": "Object_103_Material.070_0" + }, + { + "children": [ + 404 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_105" + }, + { + "mesh": 200, + "name": "Object_105_Tasten_2_0" + }, + { + "children": [ + 406 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_107" + }, + { + "mesh": 201, + "name": "Object_107_Material.070_0" + }, + { + "children": [ + 408 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_109" + }, + { + "mesh": 202, + "name": "Object_109_Material.069_0" + }, + { + "children": [ + 410 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_111" + }, + { + "mesh": 203, + "name": "Object_111_Material.067_0" + }, + { + "children": [ + 412 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_113" + }, + { + "mesh": 204, + "name": "Object_113_Material.068_0" + }, + { + "children": [ + 414 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_115" + }, + { + "mesh": 205, + "name": "Object_115_Material.057_0" + }, + { + "children": [ + 416 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_117" + }, + { + "mesh": 206, + "name": "Object_117_Material.068_0" + }, + { + "children": [ + 418 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_119" + }, + { + "mesh": 207, + "name": "Object_119_Material.057_0" + }, + { + "children": [ + 420 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_121" + }, + { + "mesh": 208, + "name": "Object_121_Material.066_0" + }, + { + "children": [ + 422 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_123" + }, + { + "mesh": 209, + "name": "Object_123_Material.057_0" + }, + { + "children": [ + 424 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_125" + }, + { + "mesh": 210, + "name": "Object_125_Material.066_0" + }, + { + "children": [ + 426 + ], + "matrix": [ + 1.163684070888042e-05, + -1.0695238326634163e-15, + -154.13462829589798, + 0.0, + -8.241749843825179, + -91.04261539761862, + -6.222348026394793e-07, + 0.0, + -91.04261539761835, + 8.241749843825202, + -6.873526246143897e-06, + 0.0, + 147.70851135253906, + 32.60113525390625, + 400.7702941894531, + 1.0 + ], + "name": "Object_127" + }, + { + "mesh": 211, + "name": "Object_127_Material.057_0" + }, + { + "children": [ + 428 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 385.7916259765625, + 1.0 + ], + "name": "Object_129" + }, + { + "mesh": 212, + "name": "Object_129_Material.066_0" + }, + { + "children": [ + 430 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_131" + }, + { + "mesh": 213, + "name": "Object_131_Material.060_0" + }, + { + "children": [ + 432 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_133" + }, + { + "mesh": 214, + "name": "Object_133_Material.060_0" + }, + { + "children": [ + 434 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_135" + }, + { + "mesh": 215, + "name": "Object_135_Material.060_0" + }, + { + "children": [ + 436 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_137" + }, + { + "mesh": 216, + "name": "Object_137_Material.005_0" + }, + { + "children": [ + 438 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_139" + }, + { + "mesh": 217, + "name": "Object_139_Material.005_0" + }, + { + "children": [ + 440 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_141" + }, + { + "mesh": 218, + "name": "Object_141_Material.069_0" + }, + { + "children": [ + 442 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_143" + }, + { + "mesh": 219, + "name": "Object_143_Material.068_0" + }, + { + "children": [ + 444 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_145" + }, + { + "mesh": 220, + "name": "Object_145_Material.066_0" + }, + { + "children": [ + 446 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_147" + }, + { + "mesh": 221, + "name": "Object_147_Material.066_0" + }, + { + "children": [ + 448 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_149" + }, + { + "mesh": 222, + "name": "Object_149_Material.005_0" + }, + { + "children": [ + 450 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_151" + }, + { + "mesh": 223, + "name": "Object_151_Material.068_0" + }, + { + "children": [ + 452 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_153" + }, + { + "mesh": 224, + "name": "Object_153_Material.066_0" + }, + { + "children": [ + 454 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_155" + }, + { + "mesh": 225, + "name": "Object_155_Material.068_0" + }, + { + "children": [ + 456 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_157" + }, + { + "mesh": 226, + "name": "Object_157_Material.066_0" + }, + { + "children": [ + 458 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_159" + }, + { + "mesh": 227, + "name": "Object_159_Material.066_0" + }, + { + "children": [ + 460 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_161" + }, + { + "mesh": 228, + "name": "Object_161_Material.066_0" + }, + { + "children": [ + 462 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_163" + }, + { + "mesh": 229, + "name": "Object_163_Material.066_0" + }, + { + "children": [ + 464 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_165" + }, + { + "mesh": 230, + "name": "Object_165_Material.066_0" + }, + { + "children": [ + 466 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_167" + }, + { + "mesh": 231, + "name": "Object_167_Material.060_0" + }, + { + "children": [ + 468 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_169" + }, + { + "mesh": 232, + "name": "Object_169_Material.060_0" + }, + { + "children": [ + 470 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_171" + }, + { + "mesh": 233, + "name": "Object_171_Material.005_0" + }, + { + "children": [ + 472 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_173" + }, + { + "mesh": 234, + "name": "Object_173_Material.057_0" + }, + { + "children": [ + 474 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_175" + }, + { + "mesh": 235, + "name": "Object_175_Material.069_0" + }, + { + "children": [ + 476 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_177" + }, + { + "mesh": 236, + "name": "Object_177_Material.068_0" + }, + { + "children": [ + 478 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_179" + }, + { + "mesh": 237, + "name": "Object_179_Material.060_0" + }, + { + "children": [ + 480 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_181" + }, + { + "mesh": 238, + "name": "Object_181_Material.057_0" + }, + { + "children": [ + 482 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_183" + }, + { + "mesh": 239, + "name": "Object_183_Material.070_0" + }, + { + "children": [ + 484 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_185" + }, + { + "mesh": 240, + "name": "Object_185_Material.057_0" + }, + { + "children": [ + 486 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_187" + }, + { + "mesh": 241, + "name": "Object_187_Material.057_0" + }, + { + "children": [ + 488 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_189" + }, + { + "mesh": 242, + "name": "Object_189_Material.069_0" + }, + { + "children": [ + 490 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_191" + }, + { + "mesh": 243, + "name": "Object_191_Material.057_0" + }, + { + "children": [ + 492 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_193" + }, + { + "mesh": 244, + "name": "Object_193_Material.057_0" + }, + { + "children": [ + 494 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_195" + }, + { + "mesh": 245, + "name": "Object_195_Material.057_0" + }, + { + "children": [ + 496 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_197" + }, + { + "mesh": 246, + "name": "Object_197_Material.057_0" + }, + { + "children": [ + 498 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_199" + }, + { + "mesh": 247, + "name": "Object_199_Material.057_0" + }, + { + "children": [ + 500 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_201" + }, + { + "mesh": 248, + "name": "Object_201_Material.057_0" + }, + { + "children": [ + 502 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_203" + }, + { + "mesh": 249, + "name": "Object_203_Material.060_0" + }, + { + "children": [ + 504 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.70852661132813, + 32.577659606933594, + 403.08642578125, + 1.0 + ], + "name": "Object_205" + }, + { + "mesh": 250, + "name": "Object_205_Material.066_0" + }, + { + "children": [ + 506 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_207" + }, + { + "mesh": 251, + "name": "Object_207_Material.057_0" + }, + { + "children": [ + 508 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_209" + }, + { + "mesh": 252, + "name": "Object_209_Material.070_0" + }, + { + "children": [ + 510 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_211" + }, + { + "mesh": 253, + "name": "Object_211_Material.067_0" + }, + { + "children": [ + 512 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_213" + }, + { + "mesh": 254, + "name": "Object_213_Tasten_2_0" + }, + { + "children": [ + 514 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_215" + }, + { + "mesh": 255, + "name": "Object_215_Material.057_0" + }, + { + "children": [ + 516 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_217" + }, + { + "mesh": 256, + "name": "Object_217_Material.060_0" + }, + { + "children": [ + 518 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_219" + }, + { + "mesh": 257, + "name": "Object_219_Material.060_0" + }, + { + "children": [ + 520 + ], + "matrix": [ + 1.163684070888042e-05, + -1.0695238326634163e-15, + -154.13462829589798, + 0.0, + -8.241749843825179, + -91.04261539761862, + -6.222348026394793e-07, + 0.0, + -91.04261539761835, + 8.241749843825202, + -6.873526246143897e-06, + 0.0, + 147.70851135253906, + 32.60113525390625, + 400.7702941894531, + 1.0 + ], + "name": "Object_221" + }, + { + "mesh": 258, + "name": "Object_221_Material.057_0" + }, + { + "children": [ + 522 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_223" + }, + { + "mesh": 259, + "name": "Object_223_Material.005_0" + }, + { + "children": [ + 524 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_225" + }, + { + "mesh": 260, + "name": "Object_225_Material.005_0" + }, + { + "children": [ + 526 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.70852661132813, + 32.43153381347656, + 403.08642578125, + 1.0 + ], + "name": "Object_227" + }, + { + "mesh": 261, + "name": "Object_227_Material.069_0" + }, + { + "children": [ + 528 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_229" + }, + { + "mesh": 262, + "name": "Object_229_Material.057_0" + }, + { + "children": [ + 530 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_231" + }, + { + "mesh": 263, + "name": "Object_231_Material.068_0" + }, + { + "children": [ + 532 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_233" + }, + { + "mesh": 264, + "name": "Object_233_Material.057_0" + }, + { + "children": [ + 534 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_235" + }, + { + "mesh": 265, + "name": "Object_235_Material.057_0" + }, + { + "children": [ + 536 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_237" + }, + { + "mesh": 266, + "name": "Object_237_Material.066_0" + }, + { + "children": [ + 538 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_239" + }, + { + "mesh": 267, + "name": "Object_239_Material.066_0" + }, + { + "children": [ + 540 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_241" + }, + { + "mesh": 268, + "name": "Object_241_Material.070_0" + }, + { + "children": [ + 542 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_243" + }, + { + "mesh": 269, + "name": "Object_243_Material.066_0" + }, + { + "children": [ + 544 + ], + "matrix": [ + 1.0787882171371424e-05, + -9.914973810238367e-16, + -142.88983154296832, + 0.0, + -8.241749843825179, + -91.04261539761862, + -6.222348026394793e-07, + 0.0, + -91.04261539761835, + 8.241749843825202, + -6.873526246143897e-06, + 0.0, + 147.70852661132813, + 32.60113525390625, + 289.94110107421875, + 1.0 + ], + "name": "Object_245" + }, + { + "mesh": 270, + "name": "Object_245_Material.070_0" + }, + { + "children": [ + 546 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_247" + }, + { + "mesh": 271, + "name": "Object_247_Material.066_0" + }, + { + "children": [ + 548 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_249" + }, + { + "mesh": 272, + "name": "Object_249_Material.060_0" + }, + { + "children": [ + 550 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_251" + }, + { + "mesh": 273, + "name": "Object_251_Material.070_0" + }, + { + "children": [ + 552 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_253" + }, + { + "mesh": 274, + "name": "Object_253_Material.057_0" + }, + { + "children": [ + 554 + ], + "matrix": [ + 5.988074627563417e-06, + -5.503545752807981e-16, + -79.31445312499977, + 0.0, + -8.241749843825179, + -91.04261539761862, + -6.222348026394793e-07, + 0.0, + -91.04261539761835, + 8.241749843825202, + -6.873526246143897e-06, + 0.0, + 129.14137268066406, + 32.60114669799805, + 395.1336975097656, + 1.0 + ], + "name": "Object_255" + }, + { + "mesh": 275, + "name": "Object_255_Material.057_0" + }, + { + "children": [ + 556 + ], + "matrix": [ + 5.988074627563417e-06, + -5.503545752807981e-16, + -79.31445312499977, + 0.0, + -8.241749843825179, + -91.04261539761862, + -6.222348026394793e-07, + 0.0, + -91.04261539761835, + 8.241749843825202, + -6.873526246143897e-06, + 0.0, + 129.14137268066406, + 32.60114669799805, + 395.1336975097656, + 1.0 + ], + "name": "Object_257" + }, + { + "mesh": 276, + "name": "Object_257_Material.057_0" + }, + { + "children": [ + 558 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 385.7485656738281, + 1.0 + ], + "name": "Object_259" + }, + { + "mesh": 277, + "name": "Object_259_Material.060_0" + }, + { + "children": [ + 560 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 385.7177734375, + 1.0 + ], + "name": "Object_261" + }, + { + "mesh": 278, + "name": "Object_261_Material.060_0" + }, + { + "children": [ + 562 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 385.5260009765625, + 1.0 + ], + "name": "Object_263" + }, + { + "mesh": 279, + "name": "Object_263_Material.060_0" + }, + { + "children": [ + 564 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 125.98516082763672, + 34.79241180419922, + 402.7314147949219, + 1.0 + ], + "name": "Object_265" + }, + { + "mesh": 280, + "name": "Object_265_Material.060_0" + }, + { + "children": [ + 566 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_267" + }, + { + "mesh": 281, + "name": "Object_267_Tasten_2_0" + }, + { + "children": [ + 568 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_269" + }, + { + "mesh": 282, + "name": "Object_269_Material.070_0" + }, + { + "children": [ + 570 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_271" + }, + { + "mesh": 283, + "name": "Object_271_Material.070_0" + }, + { + "children": [ + 572 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_273" + }, + { + "mesh": 284, + "name": "Object_273_Material.067_0" + }, + { + "children": [ + 574 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_275" + }, + { + "mesh": 285, + "name": "Object_275_Material.005_0" + }, + { + "children": [ + 576 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_277" + }, + { + "mesh": 286, + "name": "Object_277_Tasten_2_0" + }, + { + "children": [ + 578 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_279" + }, + { + "mesh": 287, + "name": "Object_279_Tasten_2_0" + }, + { + "children": [ + 580 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_281" + }, + { + "mesh": 288, + "name": "Object_281_Material.069_0" + }, + { + "children": [ + 582 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_283" + }, + { + "mesh": 289, + "name": "Object_283_Material.068_0" + }, + { + "children": [ + 584 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_285" + }, + { + "mesh": 290, + "name": "Object_285_Material.068_0" + }, + { + "children": [ + 586 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_287" + }, + { + "mesh": 291, + "name": "Object_287_Tasten_2_0" + }, + { + "children": [ + 588 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_289" + }, + { + "mesh": 292, + "name": "Object_289_Material.068_0" + }, + { + "children": [ + 590 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_291" + }, + { + "mesh": 293, + "name": "Object_291_Material.066_0" + }, + { + "children": [ + 592 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_293" + }, + { + "mesh": 294, + "name": "Object_293_Material.066_0" + }, + { + "children": [ + 594 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_295" + }, + { + "mesh": 295, + "name": "Object_295_Tasten_2_0" + }, + { + "children": [ + 596 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_297" + }, + { + "mesh": 296, + "name": "Object_297_Material.067_0" + }, + { + "children": [ + 598 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_299" + }, + { + "mesh": 297, + "name": "Object_299_Material.066_0" + }, + { + "children": [ + 600 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_301" + }, + { + "mesh": 298, + "name": "Object_301_Material.060_0" + }, + { + "children": [ + 602 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_303" + }, + { + "mesh": 299, + "name": "Object_303_Tasten_2_0" + }, + { + "children": [ + 604 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_305" + }, + { + "mesh": 300, + "name": "Object_305_Material.060_0" + }, + { + "children": [ + 606 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_307" + }, + { + "mesh": 301, + "name": "Object_307_Tasten_2_0" + }, + { + "children": [ + 608 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_309" + }, + { + "mesh": 302, + "name": "Object_309_Material.057_0" + }, + { + "children": [ + 610 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_311" + }, + { + "mesh": 303, + "name": "Object_311_Tasten_2_0" + }, + { + "children": [ + 612 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_313" + }, + { + "mesh": 304, + "name": "Object_313_Tasten_2_0" + }, + { + "children": [ + 614 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_315" + }, + { + "mesh": 305, + "name": "Object_315_Material.005_0" + }, + { + "children": [ + 616 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_317" + }, + { + "mesh": 306, + "name": "Object_317_Tasten_2_0" + }, + { + "children": [ + 618 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_319" + }, + { + "mesh": 307, + "name": "Object_319_Tasten_2_0" + }, + { + "children": [ + 620 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_321" + }, + { + "mesh": 308, + "name": "Object_321_Material.068_0" + }, + { + "children": [ + 622 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_323" + }, + { + "mesh": 309, + "name": "Object_323_Material.057_0" + }, + { + "children": [ + 624 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_325" + }, + { + "mesh": 310, + "name": "Object_325_Material.066_0" + }, + { + "children": [ + 626 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_327" + }, + { + "mesh": 311, + "name": "Object_327_Material.057_0" + }, + { + "children": [ + 628 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_329" + }, + { + "mesh": 312, + "name": "Object_329_Material.066_0" + }, + { + "children": [ + 630 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_331" + }, + { + "mesh": 313, + "name": "Object_331_Material.060_0" + }, + { + "children": [ + 632 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_333" + }, + { + "mesh": 314, + "name": "Object_333_Material.060_0" + }, + { + "children": [ + 634 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_335" + }, + { + "mesh": 315, + "name": "Object_335_Material.005_0" + }, + { + "children": [ + 636 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_337" + }, + { + "mesh": 316, + "name": "Object_337_Material.068_0" + }, + { + "children": [ + 638 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_339" + }, + { + "mesh": 317, + "name": "Object_339_Material.066_0" + }, + { + "children": [ + 640 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_341" + }, + { + "mesh": 318, + "name": "Object_341_Material.068_0" + }, + { + "children": [ + 642 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_343" + }, + { + "mesh": 319, + "name": "Object_343_Material.066_0" + }, + { + "children": [ + 644 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_345" + }, + { + "mesh": 320, + "name": "Object_345_Material.066_0" + }, + { + "children": [ + 646 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_347" + }, + { + "mesh": 321, + "name": "Object_347_Material.066_0" + }, + { + "children": [ + 648 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_349" + }, + { + "mesh": 322, + "name": "Object_349_Material.066_0" + }, + { + "children": [ + 650 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_351" + }, + { + "mesh": 323, + "name": "Object_351_Material.060_0" + }, + { + "children": [ + 652 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_353" + }, + { + "mesh": 324, + "name": "Object_353_Material.060_0" + }, + { + "children": [ + 654 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_355" + }, + { + "mesh": 325, + "name": "Object_355_Material.057_0" + }, + { + "children": [ + 656 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_357" + }, + { + "mesh": 326, + "name": "Object_357_Material.069_0" + }, + { + "children": [ + 658 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_359" + }, + { + "mesh": 327, + "name": "Object_359_Material.066_0" + }, + { + "children": [ + 660 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_361" + }, + { + "mesh": 328, + "name": "Object_361_Material.057_0" + }, + { + "children": [ + 662 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_363" + }, + { + "mesh": 329, + "name": "Object_363_Material.057_0" + }, + { + "children": [ + 664 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_365" + }, + { + "mesh": 330, + "name": "Object_365_Material.057_0" + }, + { + "children": [ + 666 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_367" + }, + { + "mesh": 331, + "name": "Object_367_Material.069_0" + }, + { + "children": [ + 668 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_369" + }, + { + "mesh": 332, + "name": "Object_369_Material.060_0" + }, + { + "children": [ + 670 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_371" + }, + { + "mesh": 333, + "name": "Object_371_Material.070_0" + }, + { + "children": [ + 672 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_373" + }, + { + "mesh": 334, + "name": "Object_373_Material.070_0" + }, + { + "children": [ + 674 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_375" + }, + { + "mesh": 335, + "name": "Object_375_Material.067_0" + }, + { + "children": [ + 676 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_377" + }, + { + "mesh": 336, + "name": "Object_377_Tasten_2_0" + }, + { + "children": [ + 678 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_379" + }, + { + "mesh": 337, + "name": "Object_379_Material.066_0" + }, + { + "children": [ + 680 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_381" + }, + { + "mesh": 338, + "name": "Object_381_Material.005_0" + }, + { + "children": [ + 682 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_383" + }, + { + "mesh": 339, + "name": "Object_383_Material.005_0" + }, + { + "children": [ + 684 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_385" + }, + { + "mesh": 340, + "name": "Object_385_Material.069_0" + }, + { + "children": [ + 686 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_387" + }, + { + "mesh": 341, + "name": "Object_387_Material.005_0" + }, + { + "children": [ + 688 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_389" + }, + { + "mesh": 342, + "name": "Object_389_Material.068_0" + }, + { + "children": [ + 690 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_391" + }, + { + "mesh": 343, + "name": "Object_391_Material.057_0" + }, + { + "children": [ + 692 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_393" + }, + { + "mesh": 344, + "name": "Object_393_Material.068_0" + }, + { + "children": [ + 694 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_395" + }, + { + "mesh": 345, + "name": "Object_395_Material.057_0" + }, + { + "children": [ + 696 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_397" + }, + { + "mesh": 346, + "name": "Object_397_Material.066_0" + }, + { + "children": [ + 698 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_399" + }, + { + "mesh": 347, + "name": "Object_399_Material.066_0" + }, + { + "children": [ + 700 + ], + "matrix": [ + 1.0787882171371424e-05, + -9.914973810238367e-16, + -142.88983154296832, + 0.0, + -8.241749843825179, + -91.04261539761862, + -6.222348026394793e-07, + 0.0, + -91.04261539761835, + 8.241749843825202, + -6.873526246143897e-06, + 0.0, + 147.70852661132813, + 32.60113525390625, + 289.94110107421875, + 1.0 + ], + "name": "Object_401" + }, + { + "mesh": 348, + "name": "Object_401_Material.070_0" + }, + { + "children": [ + 702 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_403" + }, + { + "mesh": 349, + "name": "Object_403_Material.066_0" + }, + { + "children": [ + 704 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_405" + }, + { + "mesh": 350, + "name": "Object_405_Material.060_0" + }, + { + "children": [ + 706 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_407" + }, + { + "mesh": 351, + "name": "Object_407_Material.070_0" + }, + { + "children": [ + 708 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_409" + }, + { + "mesh": 352, + "name": "Object_409_Material.067_0" + }, + { + "children": [ + 710 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_411" + }, + { + "mesh": 353, + "name": "Object_411_Tasten_2_0" + }, + { + "children": [ + 712 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_413" + }, + { + "mesh": 354, + "name": "Object_413_Material.066_0" + }, + { + "children": [ + 714 + ], + "matrix": [ + 6.9016290510201955e-06, + -6.343179337872423e-16, + -91.41484832763645, + 0.0, + -8.241749155977137, + -91.04260779929471, + -6.222347507083967e-07, + 0.0, + -91.04260779929446, + 8.24174915597716, + -6.873525672486402e-06, + 0.0, + 147.7085418701172, + 32.60114288330078, + 403.08642578125, + 1.0 + ], + "name": "Object_415" + }, + { + "mesh": 355, + "name": "Object_415_Material.057_0" + }, + { + "children": [ + 716 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_418" + }, + { + "mesh": 356, + "name": "Object_418_Tasten_0" + }, + { + "children": [ + 718 + ], + "matrix": [ + 5.101281315713345e-06, + -4.688507886949436e-16, + -67.56851959228496, + 0.0, + -8.241749843825179, + -91.04261539761862, + -6.222348026394793e-07, + 0.0, + -91.04261539761835, + 8.241749843825202, + -6.873526246143897e-06, + 0.0, + 164.91656494140625, + 31.113588333129883, + 386.96435546875, + 1.0 + ], + "name": "Object_420" + }, + { + "mesh": 357, + "name": "Object_420_Tasten_0" + }, + { + "children": [ + 720 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_422" + }, + { + "mesh": 358, + "name": "Object_422_Tasten_0" + }, + { + "children": [ + 722 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_424" + }, + { + "mesh": 359, + "name": "Object_424_Tasten_0" + }, + { + "children": [ + 724 + ], + "matrix": [ + 5.493684114748638e-06, + -5.049159163418148e-16, + -72.76605224609354, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 130.24081420898438, + 34.604984283447266, + 390.5765686035156, + 1.0 + ], + "name": "Object_426" + }, + { + "mesh": 360, + "name": "Object_426_Tasten_0" + }, + { + "children": [ + 726 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_428" + }, + { + "mesh": 361, + "name": "Object_428_Tasten_0" + }, + { + "children": [ + 728 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_430" + }, + { + "mesh": 362, + "name": "Object_430_Tasten_0" + }, + { + "children": [ + 730 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_432" + }, + { + "mesh": 363, + "name": "Object_432_Tasten_0" + }, + { + "children": [ + 732 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_434" + }, + { + "mesh": 364, + "name": "Object_434_Tasten_0" + }, + { + "children": [ + 734 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_436" + }, + { + "mesh": 365, + "name": "Object_436_Tasten_0" + }, + { + "children": [ + 736 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 402.92755126953125, + 1.0 + ], + "name": "Object_438" + }, + { + "mesh": 366, + "name": "Object_438_Tasten_0" + }, + { + "children": [ + 738 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_440" + }, + { + "mesh": 367, + "name": "Object_440_Tasten_0" + }, + { + "children": [ + 740 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_442" + }, + { + "mesh": 368, + "name": "Object_442_Tasten_0" + }, + { + "children": [ + 742 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_444" + }, + { + "mesh": 369, + "name": "Object_444_Tasten_0" + }, + { + "children": [ + 744 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_446" + }, + { + "mesh": 370, + "name": "Object_446_Tasten_0" + }, + { + "children": [ + 746 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_448" + }, + { + "mesh": 371, + "name": "Object_448_Tasten_0" + }, + { + "children": [ + 748 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_450" + }, + { + "mesh": 372, + "name": "Object_450_Tasten_0" + }, + { + "children": [ + 750 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_452" + }, + { + "mesh": 373, + "name": "Object_452_Tasten_0" + }, + { + "children": [ + 752 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_454" + }, + { + "mesh": 374, + "name": "Object_454_Tasten_0" + }, + { + "children": [ + 754 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_456" + }, + { + "mesh": 375, + "name": "Object_456_Tasten_0" + }, + { + "children": [ + 756 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_458" + }, + { + "mesh": 376, + "name": "Object_458_Tasten_0" + }, + { + "children": [ + 758 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_460" + }, + { + "mesh": 377, + "name": "Object_460_Tasten_0" + }, + { + "children": [ + 760 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_462" + }, + { + "mesh": 378, + "name": "Object_462_Tasten_0" + }, + { + "children": [ + 762 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_464" + }, + { + "mesh": 379, + "name": "Object_464_Tasten_0" + }, + { + "children": [ + 764 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_466" + }, + { + "mesh": 380, + "name": "Object_466_Tasten_0" + }, + { + "children": [ + 766 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_468" + }, + { + "mesh": 381, + "name": "Object_468_Tasten_0" + }, + { + "children": [ + 768 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_470" + }, + { + "mesh": 382, + "name": "Object_470_Tasten_0" + }, + { + "children": [ + 770 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_472" + }, + { + "mesh": 383, + "name": "Object_472_Tasten_0" + }, + { + "children": [ + 772 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_474" + }, + { + "mesh": 384, + "name": "Object_474_Tasten_0" + }, + { + "children": [ + 774 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_476" + }, + { + "mesh": 385, + "name": "Object_476_Tasten_0" + }, + { + "children": [ + 776 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_478" + }, + { + "mesh": 386, + "name": "Object_478_Tasten_0" + }, + { + "children": [ + 778 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_480" + }, + { + "mesh": 387, + "name": "Object_480_Tasten_0" + }, + { + "children": [ + 780 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_482" + }, + { + "mesh": 388, + "name": "Object_482_Tasten_0" + }, + { + "children": [ + 782 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_484" + }, + { + "mesh": 389, + "name": "Object_484_Tasten_0" + }, + { + "children": [ + 784 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_486" + }, + { + "mesh": 390, + "name": "Object_486_Tasten_0" + }, + { + "children": [ + 786 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_488" + }, + { + "mesh": 391, + "name": "Object_488_Tasten_0" + }, + { + "children": [ + 788 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_490" + }, + { + "mesh": 392, + "name": "Object_490_Tasten_0" + }, + { + "children": [ + 790 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_492" + }, + { + "mesh": 393, + "name": "Object_492_Tasten_0" + }, + { + "children": [ + 792 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_494" + }, + { + "mesh": 394, + "name": "Object_494_Tasten_0" + }, + { + "children": [ + 794 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_496" + }, + { + "mesh": 395, + "name": "Object_496_Tasten_0" + }, + { + "children": [ + 796 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_498" + }, + { + "mesh": 396, + "name": "Object_498_Tasten_0" + }, + { + "children": [ + 798 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_500" + }, + { + "mesh": 397, + "name": "Object_500_Tasten_0" + }, + { + "children": [ + 800 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_502" + }, + { + "mesh": 398, + "name": "Object_502_Tasten_0" + }, + { + "children": [ + 802 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_504" + }, + { + "mesh": 399, + "name": "Object_504_Tasten_0" + }, + { + "children": [ + 804 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_506" + }, + { + "mesh": 400, + "name": "Object_506_Tasten_0" + }, + { + "children": [ + 806 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_508" + }, + { + "mesh": 401, + "name": "Object_508_Tasten_0" + }, + { + "children": [ + 808 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_510" + }, + { + "mesh": 402, + "name": "Object_510_Tasten_0" + }, + { + "children": [ + 810 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_512" + }, + { + "mesh": 403, + "name": "Object_512_Tasten_0" + }, + { + "children": [ + 812 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 385.8563232421875, + 1.0 + ], + "name": "Object_514" + }, + { + "mesh": 404, + "name": "Object_514_Tasten_0" + }, + { + "children": [ + 814 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 385.8563232421875, + 1.0 + ], + "name": "Object_516" + }, + { + "mesh": 405, + "name": "Object_516_Tasten_0" + }, + { + "children": [ + 816 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 385.8563232421875, + 1.0 + ], + "name": "Object_518" + }, + { + "mesh": 406, + "name": "Object_518_Tasten_0" + }, + { + "children": [ + 818 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 385.8563232421875, + 1.0 + ], + "name": "Object_520" + }, + { + "mesh": 407, + "name": "Object_520_Tasten_0" + }, + { + "children": [ + 820 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 385.8563232421875, + 1.0 + ], + "name": "Object_522" + }, + { + "mesh": 408, + "name": "Object_522_Tasten_0" + }, + { + "children": [ + 822 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 385.8563232421875, + 1.0 + ], + "name": "Object_524" + }, + { + "mesh": 409, + "name": "Object_524_Tasten_0" + }, + { + "children": [ + 824 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_526" + }, + { + "mesh": 410, + "name": "Object_526_Tasten_0" + }, + { + "children": [ + 826 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 385.8563232421875, + 1.0 + ], + "name": "Object_528" + }, + { + "mesh": 411, + "name": "Object_528_Tasten_0" + }, + { + "children": [ + 828 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_530" + }, + { + "mesh": 412, + "name": "Object_530_Tasten_0" + }, + { + "children": [ + 830 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_532" + }, + { + "mesh": 413, + "name": "Object_532_Tasten_0" + }, + { + "children": [ + 832 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_534" + }, + { + "mesh": 414, + "name": "Object_534_Tasten_0" + }, + { + "children": [ + 834 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_536" + }, + { + "mesh": 415, + "name": "Object_536_Tasten_0" + }, + { + "children": [ + 836 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_538" + }, + { + "mesh": 416, + "name": "Object_538_Tasten_0" + }, + { + "children": [ + 838 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_540" + }, + { + "mesh": 417, + "name": "Object_540_Tasten_0" + }, + { + "children": [ + 840 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_542" + }, + { + "mesh": 418, + "name": "Object_542_Tasten_0" + }, + { + "children": [ + 842 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_544" + }, + { + "mesh": 419, + "name": "Object_544_Tasten_0" + }, + { + "children": [ + 844 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_546" + }, + { + "mesh": 420, + "name": "Object_546_Tasten_0" + }, + { + "children": [ + 846 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_548" + }, + { + "mesh": 421, + "name": "Object_548_Tasten_0" + }, + { + "children": [ + 848 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_550" + }, + { + "mesh": 422, + "name": "Object_550_Tasten_0" + }, + { + "children": [ + 850 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_552" + }, + { + "mesh": 423, + "name": "Object_552_Tasten_0" + }, + { + "children": [ + 852 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_554" + }, + { + "mesh": 424, + "name": "Object_554_Tasten_0" + }, + { + "children": [ + 854 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_556" + }, + { + "mesh": 425, + "name": "Object_556_Tasten_0" + }, + { + "children": [ + 856 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_558" + }, + { + "mesh": 426, + "name": "Object_558_Tasten_0" + }, + { + "children": [ + 858 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_560" + }, + { + "mesh": 427, + "name": "Object_560_Tasten_0" + }, + { + "children": [ + 860 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_562" + }, + { + "mesh": 428, + "name": "Object_562_Tasten_0" + }, + { + "children": [ + 862 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_564" + }, + { + "mesh": 429, + "name": "Object_564_Tasten_0" + }, + { + "children": [ + 864 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_566" + }, + { + "mesh": 430, + "name": "Object_566_Tasten_0" + }, + { + "children": [ + 866 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_568" + }, + { + "mesh": 431, + "name": "Object_568_Tasten_0" + }, + { + "children": [ + 868 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_570" + }, + { + "mesh": 432, + "name": "Object_570_Tasten_0" + }, + { + "children": [ + 870 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_572" + }, + { + "mesh": 433, + "name": "Object_572_Tasten_0" + }, + { + "children": [ + 872 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_574" + }, + { + "mesh": 434, + "name": "Object_574_Tasten_0" + }, + { + "children": [ + 874 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_576" + }, + { + "mesh": 435, + "name": "Object_576_Tasten_0" + }, + { + "children": [ + 876 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_578" + }, + { + "mesh": 436, + "name": "Object_578_Tasten_0" + }, + { + "children": [ + 878 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_580" + }, + { + "mesh": 437, + "name": "Object_580_Tasten_0" + }, + { + "children": [ + 880 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_582" + }, + { + "mesh": 438, + "name": "Object_582_Tasten_0" + }, + { + "children": [ + 882 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_584" + }, + { + "mesh": 439, + "name": "Object_584_Tasten_0" + }, + { + "children": [ + 884 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_586" + }, + { + "mesh": 440, + "name": "Object_586_Tasten_0" + }, + { + "children": [ + 886 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_588" + }, + { + "mesh": 441, + "name": "Object_588_Tasten_0" + }, + { + "children": [ + 888 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_590" + }, + { + "mesh": 442, + "name": "Object_590_Tasten_0" + }, + { + "children": [ + 890 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_592" + }, + { + "mesh": 443, + "name": "Object_592_Tasten_0" + }, + { + "children": [ + 892 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_594" + }, + { + "mesh": 444, + "name": "Object_594_Tasten_0" + }, + { + "children": [ + 894 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_596" + }, + { + "mesh": 445, + "name": "Object_596_Tasten_0" + }, + { + "children": [ + 896 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_598" + }, + { + "mesh": 446, + "name": "Object_598_Tasten_0" + }, + { + "children": [ + 898 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_600" + }, + { + "mesh": 447, + "name": "Object_600_Tasten_0" + }, + { + "children": [ + 900 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_602" + }, + { + "mesh": 448, + "name": "Object_602_Tasten_0" + }, + { + "children": [ + 902 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.58149337768555, + 403.08642578125, + 1.0 + ], + "name": "Object_604" + }, + { + "mesh": 449, + "name": "Object_604_Material.071_0" + }, + { + "children": [ + 904 + ], + "matrix": [ + 1.1920804557588766e-05, + -1.0956225059550974e-15, + -157.89584350585892, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.70852661132813, + 34.29640579223633, + 259.2745666503906, + 1.0 + ], + "name": "Object_606" + }, + { + "mesh": 450, + "name": "Object_606_Tasten_0" + }, + { + "children": [ + 906 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_608" + }, + { + "mesh": 451, + "name": "Object_608_Tasten_0" + }, + { + "children": [ + 908 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_610" + }, + { + "mesh": 452, + "name": "Object_610_Tasten_0" + }, + { + "children": [ + 910 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_612" + }, + { + "mesh": 453, + "name": "Object_612_Tasten_0" + }, + { + "children": [ + 912 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_614" + }, + { + "mesh": 454, + "name": "Object_614_Tasten_0" + }, + { + "children": [ + 914 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_616" + }, + { + "mesh": 455, + "name": "Object_616_Tasten_0" + }, + { + "children": [ + 916 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_618" + }, + { + "mesh": 456, + "name": "Object_618_Tasten_0" + }, + { + "children": [ + 918 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_620" + }, + { + "mesh": 457, + "name": "Object_620_Tasten_0" + }, + { + "children": [ + 920 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_622" + }, + { + "mesh": 458, + "name": "Object_622_Tasten_0" + }, + { + "children": [ + 922 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_624" + }, + { + "mesh": 459, + "name": "Object_624_Tasten_0" + }, + { + "children": [ + 924 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_626" + }, + { + "mesh": 460, + "name": "Object_626_Tasten_0" + }, + { + "children": [ + 926 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_628" + }, + { + "mesh": 461, + "name": "Object_628_Tasten_0" + }, + { + "children": [ + 928 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_630" + }, + { + "mesh": 462, + "name": "Object_630_Tasten_0" + }, + { + "children": [ + 930 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_632" + }, + { + "mesh": 463, + "name": "Object_632_Tasten_0" + }, + { + "children": [ + 932 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_634" + }, + { + "mesh": 464, + "name": "Object_634_Tasten_0" + }, + { + "children": [ + 934 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_636" + }, + { + "mesh": 465, + "name": "Object_636_Tasten_0" + }, + { + "children": [ + 936 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_638" + }, + { + "mesh": 466, + "name": "Object_638_Tasten_0" + }, + { + "children": [ + 938 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_640" + }, + { + "mesh": 467, + "name": "Object_640_Tasten_0" + }, + { + "children": [ + 940 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_642" + }, + { + "mesh": 468, + "name": "Object_642_Tasten_0" + }, + { + "children": [ + 942 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_644" + }, + { + "mesh": 469, + "name": "Object_644_Tasten_0" + }, + { + "children": [ + 944 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_646" + }, + { + "mesh": 470, + "name": "Object_646_Tasten_0" + }, + { + "children": [ + 946 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_648" + }, + { + "mesh": 471, + "name": "Object_648_Tasten_0" + }, + { + "children": [ + 948 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_650" + }, + { + "mesh": 472, + "name": "Object_650_Tasten_0" + }, + { + "children": [ + 950 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_652" + }, + { + "mesh": 473, + "name": "Object_652_Tasten_0" + }, + { + "children": [ + 952 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_654" + }, + { + "mesh": 474, + "name": "Object_654_Tasten_0" + }, + { + "children": [ + 954 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_656" + }, + { + "mesh": 475, + "name": "Object_656_Tasten_0" + }, + { + "children": [ + 956 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_658" + }, + { + "mesh": 476, + "name": "Object_658_Tasten_0" + }, + { + "children": [ + 958 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_660" + }, + { + "mesh": 477, + "name": "Object_660_Tasten_0" + }, + { + "children": [ + 960 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_662" + }, + { + "mesh": 478, + "name": "Object_662_Tasten_0" + }, + { + "children": [ + 962 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_664" + }, + { + "mesh": 479, + "name": "Object_664_Tasten_0" + }, + { + "children": [ + 964 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_666" + }, + { + "mesh": 480, + "name": "Object_666_Tasten_0" + }, + { + "children": [ + 966 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_668" + }, + { + "mesh": 481, + "name": "Object_668_Tasten_0" + }, + { + "children": [ + 968 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_670" + }, + { + "mesh": 482, + "name": "Object_670_Tasten_0" + }, + { + "children": [ + 970 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_672" + }, + { + "mesh": 483, + "name": "Object_672_Tasten_0" + }, + { + "children": [ + 972 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_674" + }, + { + "mesh": 484, + "name": "Object_674_Tasten_0" + }, + { + "children": [ + 974 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_676" + }, + { + "mesh": 485, + "name": "Object_676_Tasten_0" + }, + { + "children": [ + 976 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_678" + }, + { + "mesh": 486, + "name": "Object_678_Tasten_0" + }, + { + "children": [ + 978 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_680" + }, + { + "mesh": 487, + "name": "Object_680_Tasten_0" + }, + { + "children": [ + 980 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_682" + }, + { + "mesh": 488, + "name": "Object_682_Tasten_0" + }, + { + "children": [ + 982 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_684" + }, + { + "mesh": 489, + "name": "Object_684_Tasten_0" + }, + { + "children": [ + 984 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_686" + }, + { + "mesh": 490, + "name": "Object_686_Tasten_0" + }, + { + "children": [ + 986 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_688" + }, + { + "mesh": 491, + "name": "Object_688_Tasten_0" + }, + { + "children": [ + 988 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_690" + }, + { + "mesh": 492, + "name": "Object_690_Tasten_0" + }, + { + "children": [ + 990 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_692" + }, + { + "mesh": 493, + "name": "Object_692_Tasten_0" + }, + { + "children": [ + 992 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_694" + }, + { + "mesh": 494, + "name": "Object_694_Tasten_0" + }, + { + "children": [ + 994 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_696" + }, + { + "mesh": 495, + "name": "Object_696_Tasten_0" + }, + { + "children": [ + 996 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_698" + }, + { + "mesh": 496, + "name": "Object_698_Tasten_0" + }, + { + "children": [ + 998 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_700" + }, + { + "mesh": 497, + "name": "Object_700_Tasten_0" + }, + { + "children": [ + 1000 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_702" + }, + { + "mesh": 498, + "name": "Object_702_Tasten_0" + }, + { + "children": [ + 1002 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_704" + }, + { + "mesh": 499, + "name": "Object_704_Tasten_0" + }, + { + "children": [ + 1004 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_706" + }, + { + "mesh": 500, + "name": "Object_706_Tasten_0" + }, + { + "children": [ + 1006 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_708" + }, + { + "mesh": 501, + "name": "Object_708_Tasten_0" + }, + { + "children": [ + 1008 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_710" + }, + { + "mesh": 502, + "name": "Object_710_Tasten_0" + }, + { + "children": [ + 1010 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_712" + }, + { + "mesh": 503, + "name": "Object_712_Tasten_0" + }, + { + "children": [ + 1012 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_714" + }, + { + "mesh": 504, + "name": "Object_714_Tasten_0" + }, + { + "children": [ + 1014 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_716" + }, + { + "mesh": 505, + "name": "Object_716_Tasten_0" + }, + { + "children": [ + 1016 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_718" + }, + { + "mesh": 506, + "name": "Object_718_Tasten_0" + }, + { + "children": [ + 1018 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_720" + }, + { + "mesh": 507, + "name": "Object_720_Tasten_0" + }, + { + "children": [ + 1020 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_722" + }, + { + "mesh": 508, + "name": "Object_722_Tasten_0" + }, + { + "children": [ + 1022 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_724" + }, + { + "mesh": 509, + "name": "Object_724_Tasten_0" + }, + { + "children": [ + 1024 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_726" + }, + { + "mesh": 510, + "name": "Object_726_Tasten_0" + }, + { + "children": [ + 1026 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_728" + }, + { + "mesh": 511, + "name": "Object_728_Tasten_0" + }, + { + "children": [ + 1028 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_730" + }, + { + "mesh": 512, + "name": "Object_730_Tasten_0" + }, + { + "children": [ + 1030 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_732" + }, + { + "mesh": 513, + "name": "Object_732_Tasten_0" + }, + { + "children": [ + 1032 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_734" + }, + { + "mesh": 514, + "name": "Object_734_Tasten_0" + }, + { + "children": [ + 1034 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_736" + }, + { + "mesh": 515, + "name": "Object_736_Tasten_0" + }, + { + "children": [ + 1036 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_738" + }, + { + "mesh": 516, + "name": "Object_738_Tasten_0" + }, + { + "children": [ + 1038 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_740" + }, + { + "mesh": 517, + "name": "Object_740_Tasten_0" + }, + { + "children": [ + 1040 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_742" + }, + { + "mesh": 518, + "name": "Object_742_Tasten_0" + }, + { + "children": [ + 1042 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_744" + }, + { + "mesh": 519, + "name": "Object_744_Tasten_0" + }, + { + "children": [ + 1044 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_746" + }, + { + "mesh": 520, + "name": "Object_746_Tasten_0" + }, + { + "children": [ + 1046 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_748" + }, + { + "mesh": 521, + "name": "Object_748_Tasten_0" + }, + { + "children": [ + 1048 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_750" + }, + { + "mesh": 522, + "name": "Object_750_Tasten_0" + }, + { + "children": [ + 1050 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_752" + }, + { + "mesh": 523, + "name": "Object_752_Tasten_0" + }, + { + "children": [ + 1052 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_754" + }, + { + "mesh": 524, + "name": "Object_754_Tasten_0" + }, + { + "children": [ + 1054 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_756" + }, + { + "mesh": 525, + "name": "Object_756_Tasten_0" + }, + { + "children": [ + 1056 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_758" + }, + { + "mesh": 526, + "name": "Object_758_Tasten_0" + }, + { + "children": [ + 1058 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_760" + }, + { + "mesh": 527, + "name": "Object_760_Tasten_0" + }, + { + "children": [ + 1060 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_762" + }, + { + "mesh": 528, + "name": "Object_762_Tasten_0" + }, + { + "children": [ + 1062 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_764" + }, + { + "mesh": 529, + "name": "Object_764_Tasten_0" + }, + { + "children": [ + 1064 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_766" + }, + { + "mesh": 530, + "name": "Object_766_Tasten_0" + }, + { + "children": [ + 1066 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_768" + }, + { + "mesh": 531, + "name": "Object_768_Tasten_0" + }, + { + "children": [ + 1068 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_770" + }, + { + "mesh": 532, + "name": "Object_770_Tasten_0" + }, + { + "children": [ + 1070 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_772" + }, + { + "mesh": 533, + "name": "Object_772_Tasten_0" + }, + { + "children": [ + 1072 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_774" + }, + { + "mesh": 534, + "name": "Object_774_Tasten_0" + }, + { + "children": [ + 1074 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_776" + }, + { + "mesh": 535, + "name": "Object_776_Tasten_0" + }, + { + "children": [ + 1076 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_778" + }, + { + "mesh": 536, + "name": "Object_778_Tasten_0" + }, + { + "children": [ + 1078 + ], + "matrix": [ + 6.901630203026722e-06, + -6.343180396663607e-16, + -91.41486358642551, + 0.0, + -8.241747780281052, + -91.04259260264693, + -6.222346468462319e-07, + 0.0, + -91.04259260264666, + 8.241747780281075, + -6.873524525171412e-06, + 0.0, + 147.7085418701172, + 34.604976654052734, + 403.08642578125, + 1.0 + ], + "name": "Object_780" + }, + { + "mesh": 537, + "name": "Object_780_Tasten_0" + }, + { + "children": [ + 1080 + ], + "matrix": [ + 1.6528442436719658e-06, + -1.2152826386554755e-15, + -21.892585754394467, + 0.0, + -21.826613774441455, + 1.698330258951081, + -1.6478634966565832e-06, + 0.0, + 1.6983302589510763, + 21.82661377444152, + 1.2822036499790652e-07, + 0.0, + 101.60081481933594, + 40.62207794189453, + 244.0074462890625, + 1.0 + ], + "name": "OnTheFly-bg_422" + }, + { + "children": [ + 1081 + ], + "matrix": [ + 0.9999999403953552, + 0.0, + -1.6543612251060553e-24, + 0.0, + 2.832914583947088e-41, + 0.9999999403953552, + 1.7123916905817303e-17, + 0.0, + 1.6543612251060553e-24, + -1.7123916905817303e-17, + 0.9999999403953552, + 0.0, + 0.0, + 0.0, + 5.960464477539063e-08, + 1.0 + ], + "name": "Object_782" + }, + { + "mesh": 538, + "name": "Object_782_OnTheFly-bg_0" + }, + { + "children": [ + 1083 + ], + "matrix": [ + 3.7615780725122493e-06, + -5.531532144901737e-15, + -49.82361221313462, + 0.0, + -49.82361602783185, + -2.1778595145464263e-06, + -3.761578357748114e-06, + 0.0, + -2.1778595145464263e-06, + 49.82361602783199, + -1.7700904218938274e-13, + 0.0, + 174.1614990234375, + 46.92334747314453, + 307.7135009765625, + 1.0 + ], + "name": "Object_784" + }, + { + "mesh": 539, + "name": "Object_784_Material.057_0" + }, + { + "children": [ + 1085 + ], + "matrix": [ + -49.82362747192281, + 7.5231584440760185e-06, + 6.6942449050284924e-06, + 0.0, + 6.694245618168013e-06, + 8.117297620322261e-06, + 49.823623657225454, + 0.0, + 7.523155625435521e-06, + 49.8236160278308, + -8.117297395138266e-06, + 0.0, + 191.37669372558594, + 45.22822189331055, + 324.98468017578125, + 1.0 + ], + "name": "Object_786" + }, + { + "mesh": 540, + "name": "Object_786_Material.057_0" + }, + { + "children": [ + 1087 + ], + "matrix": [ + -19.608207702636317, + 2.960756990935969e-06, + 2.634536085998234e-06, + 0.0, + 2.6345360558283084e-06, + 3.194581507226016e-06, + 19.608203887939016, + 0.0, + 2.960755985712368e-06, + 19.60820388793897, + -3.1945819077844376e-06, + 0.0, + 159.01754760742188, + 47.31952667236328, + 359.93609619140625, + 1.0 + ], + "name": "Plane.003_425" + }, + { + "children": [ + 1088 + ], + "matrix": [ + 1.0000001192092896, + 2.646977960169688e-23, + 7.105428220931454e-15, + 0.0, + -2.64697764462542e-23, + 1.0, + 7.940933880509067e-23, + 0.0, + -7.105427373898505e-15, + -7.940933880509086e-23, + 1.0, + 0.0, + 0.0, + -1.9073486328125e-06, + 1.359417183266487e-07, + 1.0 + ], + "name": "Object_788" + }, + { + "mesh": 541, + "name": "Object_788_Material.057_0" + }, + { + "children": [ + 1090 + ], + "matrix": [ + 49.823627471922926, + -6.694247737173751e-06, + 6.69424632110115e-06, + 0.0, + 6.6942447179312785e-06, + -8.117299512106689e-06, + -49.823623657225454, + 0.0, + 6.694247290189055e-06, + 49.82361602783092, + -8.117297373012135e-06, + 0.0, + 191.37667846679688, + 45.22822189331055, + 290.0993957519531, + 1.0 + ], + "name": "Object_790" + }, + { + "mesh": 542, + "name": "Object_790_Material.057_0" + }, + { + "children": [ + 1092 + ], + "matrix": [ + 1.7501631718524149, + -4.781488347428238e-06, + 52.5830493887526, + 0.0, + 52.58305701389918, + -5.1880041519597925e-05, + -1.750163425650919, + 0.0, + 5.201037164937784e-05, + 52.61215972897812, + 3.0530331164864143e-06, + 0.0, + 190.94097900390625, + 45.22822189331055, + 307.68377685546875, + 1.0 + ], + "name": "Object_792" + }, + { + "mesh": 543, + "name": "Object_792_Material.057_0" + }, + { + "children": [ + 1094 + ], + "matrix": [ + -29.265617370603, + 3.932092392490663e-06, + 1.1396452177999062e-05, + 0.0, + 1.1396451732114643e-05, + 2.2094909643471865e-06, + 29.265615463254537, + 0.0, + 3.932091532082746e-06, + 29.265617370605128, + -2.209492651687608e-06, + 0.0, + 139.38133239746094, + 50.4600830078125, + 591.2596435546875, + 1.0 + ], + "name": "Object_794" + }, + { + "mesh": 544, + "name": "Object_794_Material.070_0" + }, + { + "children": [ + 1096 + ], + "matrix": [ + 29.26562499999947, + -3.93209757287844e-06, + 3.9320963252098415e-06, + 0.0, + 3.932094659513079e-06, + -4.767974791200494e-06, + -29.265617370604815, + 0.0, + 3.932097188420904e-06, + 29.265617370604815, + -4.767974264840426e-06, + 0.0, + 141.1079864501953, + 50.460086822509766, + 586.2903442382813, + 1.0 + ], + "name": "Object_796" + }, + { + "mesh": 545, + "name": "Object_796_Material.070_0" + }, + { + "children": [ + 1098 + ], + "matrix": [ + -19.347892628774552, + 3.184448231077528, + 1.5760962390631025e-06, + 0.0, + 1.3147532875035835e-06, + -1.716689221585147e-06, + 19.6082019805907, + 0.0, + 3.184448231077647, + 19.34789262877454, + 1.480378210619612e-06, + 0.0, + 122.70124816894531, + 53.532936096191406, + 358.45635986328125, + 1.0 + ], + "name": "Plane.008_430" + }, + { + "children": [ + 1099 + ], + "matrix": [ + 1.0, + -2.386979516178976e-15, + -3.7748733939847164e-17, + 0.0, + 2.3869798007291083e-15, + 1.0000001192092896, + -1.323488980084845e-23, + 0.0, + 3.7748733939847164e-17, + 1.3234888133021371e-23, + 1.0, + 0.0, + 9.5367431640625e-07, + -1.9073486328125e-06, + -4.440892098500626e-16, + 1.0 + ], + "name": "Object_798" + }, + { + "mesh": 546, + "name": "Object_798_Material.057_0" + }, + { + "children": [ + 1101 + ], + "matrix": [ + -8.836556479086942, + -0.7894828525981737, + 1.8677270647086953e-07, + 0.0, + 1.5152232385541847e-07, + 4.0287876328387476e-07, + 8.871753692626942, + 0.0, + -0.7894828525981813, + 8.836556479086934, + -3.877966862021181e-07, + 0.0, + 190.9855194091797, + 44.57741928100586, + 567.4793090820313, + 1.0 + ], + "name": "Plane.087_431" + }, + { + "children": [ + 1102 + ], + "matrix": [ + 1.0, + 7.610061635487855e-23, + 7.450580606501036e-09, + 0.0, + -1.2904018469822285e-22, + 1.0000001192092896, + 7.105427357600999e-15, + 0.0, + -7.450580606501036e-09, + -7.1054265105681524e-15, + 1.0, + 0.0, + -1.9073486328125e-06, + 3.814697265625e-06, + 2.384185791015625e-07, + 1.0 + ], + "name": "Object_800" + }, + { + "mesh": 547, + "name": "Object_800_Material.005_0" + }, + { + "children": [ + 1104 + ], + "matrix": [ + -8.836556479086942, + -0.7894828525981737, + 1.8677270647086953e-07, + 0.0, + 1.5152232385541847e-07, + 4.0287876328387476e-07, + 8.871753692626942, + 0.0, + -0.7894828525981813, + 8.836556479086934, + -3.877966862021181e-07, + 0.0, + 190.86802673339844, + 44.62821960449219, + 565.2545776367188, + 1.0 + ], + "name": "Plane.088_432" + }, + { + "children": [ + 1105 + ], + "matrix": [ + 1.0, + 7.610061635487855e-23, + 7.450580606501036e-09, + 0.0, + -1.2904018469822285e-22, + 1.0000001192092896, + 7.105427357600999e-15, + 0.0, + -7.450580606501036e-09, + -7.1054265105681524e-15, + 1.0, + 0.0, + -1.9073486328125e-06, + 3.814697265625e-06, + -1.1920928955078125e-07, + 1.0 + ], + "name": "Object_802" + }, + { + "mesh": 548, + "name": "Object_802_Material.005_0" + }, + { + "children": [ + 1107 + ], + "matrix": [ + -8.836556479086942, + -0.7894828525981737, + 1.8677270647086953e-07, + 0.0, + 1.5152232385541847e-07, + 4.0287876328387476e-07, + 8.871753692626942, + 0.0, + -0.7894828525981813, + 8.836556479086934, + -3.877966862021181e-07, + 0.0, + 192.4904327392578, + 44.41950225830078, + 565.4120483398438, + 1.0 + ], + "name": "Plane.089_433" + }, + { + "children": [ + 1108 + ], + "matrix": [ + 1.0, + 7.610061635487855e-23, + 7.450580606501036e-09, + 0.0, + -1.2904018469822285e-22, + 1.0000001192092896, + 7.105427357600999e-15, + 0.0, + -7.450580606501036e-09, + -7.1054265105681524e-15, + 1.0, + 0.0, + 1.9073486328125e-06, + -7.105427357601002e-15, + -3.5762786865234375e-07, + 1.0 + ], + "name": "Object_804" + }, + { + "mesh": 549, + "name": "Object_804_Material.005_0" + }, + { + "children": [ + 1110 + ], + "matrix": [ + -8.836556479086942, + -0.7894828525981737, + 1.8677270647086953e-07, + 0.0, + 1.5152232385541847e-07, + 4.0287876328387476e-07, + 8.871753692626942, + 0.0, + -0.7894828525981813, + 8.836556479086934, + -3.877966862021181e-07, + 0.0, + 192.4027862548828, + 44.401283264160156, + 567.4718627929688, + 1.0 + ], + "name": "Plane.090_434" + }, + { + "children": [ + 1111 + ], + "matrix": [ + 1.0, + 7.610061635487855e-23, + 7.450580606501036e-09, + 0.0, + -1.2904018469822285e-22, + 1.0000001192092896, + 7.105427357600999e-15, + 0.0, + -7.450580606501036e-09, + -7.1054265105681524e-15, + 1.0, + 0.0, + 3.552713678800501e-15, + 3.814697265625e-06, + 1.1920928955078125e-07, + 1.0 + ], + "name": "Object_806" + }, + { + "mesh": 550, + "name": "Object_806_Material.005_0" + }, + { + "children": [ + 1113 + ], + "matrix": [ + 4.842681547575969e-07, + -7.121332624647188e-16, + -6.414326190948468, + 0.0, + -6.414327144622779, + -2.803791558109042e-07, + -4.842682264019381e-07, + 0.0, + -2.803791558109042e-07, + 6.414327144622797, + -2.278826778700279e-14, + 0.0, + 140.8444061279297, + 50.581729888916016, + 568.8697509765625, + 1.0 + ], + "name": "Text_435" + }, + { + "children": [ + 1114 + ], + "matrix": [ + 1.0000001192092896, + 0.0, + 3.944304526105059e-31, + 0.0, + 5.605193190019655e-45, + 1.0000001192092896, + -1.4210854717512893e-14, + 0.0, + -3.944304526105059e-31, + 1.4210854717512893e-14, + 1.0000001192092896, + 0.0, + 0.0, + -1.9073486328125e-06, + 8.919960237108171e-08, + 1.0 + ], + "name": "Object_808" + }, + { + "mesh": 551, + "name": "Object_808_Material.005_0" + }, + { + "children": [ + 1116 + ], + "matrix": [ + 4.31286114682336e-07, + -6.342213190916961e-16, + -5.712557792663557, + 0.0, + -5.712557792663553, + -2.4970384193308914e-07, + -4.3128611436522534e-07, + 0.0, + -2.4970384193308914e-07, + 5.712557792663569, + -2.0295082210934276e-14, + 0.0, + 141.03799438476563, + 50.581729888916016, + 552.0098876953125, + 1.0 + ], + "name": "Text.001_436" + }, + { + "children": [ + 1117 + ], + "matrix": [ + 1.0, + 0.0, + 3.944304526105058e-31, + 0.0, + 5.605193858210763e-45, + 1.0, + -1.421085471751292e-14, + 0.0, + -3.944304526105058e-31, + 1.421085471751292e-14, + 1.0, + 0.0, + -7.62939453125e-06, + -3.552713678800501e-15, + -4.974961029802216e-07, + 1.0 + ], + "name": "Object_810" + }, + { + "mesh": 552, + "name": "Object_810_Material.005_0" + }, + { + "children": [ + 1119 + ], + "matrix": [ + 4.31286114682336e-07, + -6.342213190916961e-16, + -5.712557792663557, + 0.0, + -5.712557792663553, + -2.4970384193308914e-07, + -4.3128611436522534e-07, + 0.0, + -2.4970384193308914e-07, + 5.712557792663569, + -2.0295082210934276e-14, + 0.0, + 141.03799438476563, + 50.581729888916016, + 532.0255737304688, + 1.0 + ], + "name": "Text.002_437" + }, + { + "children": [ + 1120 + ], + "matrix": [ + 1.0, + 0.0, + 3.944304526105058e-31, + 0.0, + 5.605193858210763e-45, + 1.0, + -1.421085471751292e-14, + 0.0, + -3.944304526105058e-31, + 1.421085471751292e-14, + 1.0, + 0.0, + 0.0, + 3.552713678800501e-15, + -4.974961029802216e-07, + 1.0 + ], + "name": "Object_812" + }, + { + "mesh": 553, + "name": "Object_812_Material.068_0" + }, + { + "children": [ + 1122 + ], + "matrix": [ + 4.31286114682336e-07, + -6.342213190916961e-16, + -5.712557792663557, + 0.0, + -5.712557792663553, + -2.4970384193308914e-07, + -4.3128611436522534e-07, + 0.0, + -2.4970384193308914e-07, + 5.712557792663569, + -2.0295082210934276e-14, + 0.0, + 141.03799438476563, + 50.581729888916016, + 514.7837524414063, + 1.0 + ], + "name": "Text.003_438" + }, + { + "children": [ + 1123 + ], + "matrix": [ + 1.0, + 0.0, + 3.944304526105058e-31, + 0.0, + 5.605193858210763e-45, + 1.0, + -1.421085471751292e-14, + 0.0, + -3.944304526105058e-31, + 1.421085471751292e-14, + 1.0, + 0.0, + -7.62939453125e-06, + 0.0, + -4.974961029802216e-07, + 1.0 + ], + "name": "Object_814" + }, + { + "mesh": 554, + "name": "Object_814_Material.068_0" + }, + { + "children": [ + 1125 + ], + "matrix": [ + 4.31286114682336e-07, + -6.342213190916961e-16, + -5.712557792663557, + 0.0, + -5.712557792663553, + -2.4970384193308914e-07, + -4.3128611436522534e-07, + 0.0, + -2.4970384193308914e-07, + 5.712557792663569, + -2.0295082210934276e-14, + 0.0, + 141.03799438476563, + 50.581729888916016, + 498.1382751464844, + 1.0 + ], + "name": "Text.004_439" + }, + { + "children": [ + 1126 + ], + "matrix": [ + 1.0, + 0.0, + 3.944304526105058e-31, + 0.0, + 5.605193858210763e-45, + 1.0, + -1.421085471751292e-14, + 0.0, + -3.944304526105058e-31, + 1.421085471751292e-14, + 1.0, + 0.0, + -7.62939453125e-06, + -3.552713678800501e-15, + -4.974961029802216e-07, + 1.0 + ], + "name": "Object_816" + }, + { + "mesh": 555, + "name": "Object_816_Material.068_0" + }, + { + "children": [ + 1128 + ], + "matrix": [ + 4.31286114682336e-07, + -6.342213190916961e-16, + -5.712557792663557, + 0.0, + -5.712557792663553, + -2.4970384193308914e-07, + -4.3128611436522534e-07, + 0.0, + -2.4970384193308914e-07, + 5.712557792663569, + -2.0295082210934276e-14, + 0.0, + 141.03799438476563, + 50.581729888916016, + 480.7523193359375, + 1.0 + ], + "name": "Text.005_440" + }, + { + "children": [ + 1129 + ], + "matrix": [ + 1.0, + 0.0, + 3.944304526105058e-31, + 0.0, + 5.605193858210763e-45, + 1.0, + -1.421085471751292e-14, + 0.0, + -3.944304526105058e-31, + 1.421085471751292e-14, + 1.0, + 0.0, + -7.62939453125e-06, + 0.0, + -4.974961029802216e-07, + 1.0 + ], + "name": "Object_818" + }, + { + "mesh": 556, + "name": "Object_818_Material.066_0" + }, + { + "children": [ + 1131 + ], + "matrix": [ + 4.31286114682336e-07, + -6.342213190916961e-16, + -5.712557792663557, + 0.0, + -5.712557792663553, + -2.4970384193308914e-07, + -4.3128611436522534e-07, + 0.0, + -2.4970384193308914e-07, + 5.712557792663569, + -2.0295082210934276e-14, + 0.0, + 141.03799438476563, + 50.581729888916016, + 463.6155090332031, + 1.0 + ], + "name": "Text.006_441" + }, + { + "children": [ + 1132 + ], + "matrix": [ + 1.0, + 0.0, + 3.944304526105058e-31, + 0.0, + 5.605193858210763e-45, + 1.0, + -1.421085471751292e-14, + 0.0, + -3.944304526105058e-31, + 1.421085471751292e-14, + 1.0, + 0.0, + 0.0, + 3.552713678800501e-15, + -4.974961029802216e-07, + 1.0 + ], + "name": "Object_820" + }, + { + "mesh": 557, + "name": "Object_820_Material.066_0" + }, + { + "children": [ + 1134 + ], + "matrix": [ + 4.31286114682336e-07, + -6.342213190916961e-16, + -5.712557792663557, + 0.0, + -5.712557792663553, + -2.4970384193308914e-07, + -4.3128611436522534e-07, + 0.0, + -2.4970384193308914e-07, + 5.712557792663569, + -2.0295082210934276e-14, + 0.0, + 141.03799438476563, + 50.581729888916016, + 443.74566650390625, + 1.0 + ], + "name": "Text.007_442" + }, + { + "children": [ + 1135 + ], + "matrix": [ + 1.0, + 0.0, + 3.944304526105058e-31, + 0.0, + 5.605193858210763e-45, + 1.0, + -1.421085471751292e-14, + 0.0, + -3.944304526105058e-31, + 1.421085471751292e-14, + 1.0, + 0.0, + -7.62939453125e-06, + 0.0, + -4.974961029802216e-07, + 1.0 + ], + "name": "Object_822" + }, + { + "mesh": 558, + "name": "Object_822_Material.066_0" + }, + { + "children": [ + 1137 + ], + "matrix": [ + 4.6494601732248603e-07, + -6.837193834303957e-16, + -6.158396720886213, + 0.0, + -6.158396720886207, + -2.691920812299418e-07, + -4.6494601698062634e-07, + 0.0, + -2.691920812299418e-07, + 6.158396720886225, + -2.187902026977266e-14, + 0.0, + 141.64889526367188, + 50.88457489013672, + 427.9776916503906, + 1.0 + ], + "name": "Text.008_443" + }, + { + "children": [ + 1138 + ], + "matrix": [ + 1.0, + 0.0, + -3.944304526105059e-31, + 0.0, + 5.605193856387772e-45, + 1.0, + 1.4210854712891086e-14, + 0.0, + 3.944304526105059e-31, + -1.4210854712891086e-14, + 1.0, + 0.0, + 7.62939453125e-06, + -3.552713678800501e-15, + 2.293561465194216e-07, + 1.0 + ], + "name": "Object_824" + }, + { + "mesh": 559, + "name": "Object_824_Material.066_0" + }, + { + "children": [ + 1140 + ], + "matrix": [ + 4.6494601732248603e-07, + -6.837193834303957e-16, + -6.158396720886213, + 0.0, + -6.158396720886207, + -2.691920812299418e-07, + -4.6494601698062634e-07, + 0.0, + -2.691920812299418e-07, + 6.158396720886225, + -2.187902026977266e-14, + 0.0, + 142.0945587158203, + 50.955116271972656, + 409.2159423828125, + 1.0 + ], + "name": "Text.009_444" + }, + { + "children": [ + 1141 + ], + "matrix": [ + 1.0, + 0.0, + -3.944304526105059e-31, + 0.0, + 5.605193856387772e-45, + 1.0, + 1.4210854712891086e-14, + 0.0, + 3.944304526105059e-31, + -1.4210854712891086e-14, + 1.0, + 0.0, + 0.0, + -3.552713678800501e-15, + 2.3907932700240053e-07, + 1.0 + ], + "name": "Object_826" + }, + { + "mesh": 560, + "name": "Object_826_Material.060_0" + }, + { + "children": [ + 1143 + ], + "matrix": [ + 4.842681547575969e-07, + -7.121332624647188e-16, + -6.414326190948468, + 0.0, + -6.414327144622779, + -2.803791558109042e-07, + -4.842682264019381e-07, + 0.0, + -2.803791558109042e-07, + 6.414327144622797, + -2.278826778700279e-14, + 0.0, + 158.0303955078125, + 48.549007415771484, + 561.971435546875, + 1.0 + ], + "name": "Text.010_445" + }, + { + "children": [ + 1144 + ], + "matrix": [ + 1.0000001192092896, + 0.0, + 3.944304526105059e-31, + 0.0, + 5.605193190019655e-45, + 1.0000001192092896, + -1.4210854717512893e-14, + 0.0, + -3.944304526105059e-31, + 1.4210854717512893e-14, + 1.0000001192092896, + 0.0, + 0.0, + 3.552713678800501e-15, + -5.04485797137022e-07, + 1.0 + ], + "name": "Object_828" + }, + { + "mesh": 561, + "name": "Object_828_Material.005_0" + }, + { + "children": [ + 1146 + ], + "matrix": [ + 4.842681547575969e-07, + -7.121332624647188e-16, + -6.414326190948468, + 0.0, + -6.414327144622779, + -2.803791558109042e-07, + -4.842682264019381e-07, + 0.0, + -2.803791558109042e-07, + 6.414327144622797, + -2.278826778700279e-14, + 0.0, + 158.0303955078125, + 48.436920166015625, + 543.8751831054688, + 1.0 + ], + "name": "Text.011_446" + }, + { + "children": [ + 1147 + ], + "matrix": [ + 1.0000001192092896, + 0.0, + 3.944304526105059e-31, + 0.0, + 5.605193190019655e-45, + 1.0000001192092896, + -1.4210854717512893e-14, + 0.0, + -3.944304526105059e-31, + 1.4210854717512893e-14, + 1.0000001192092896, + 0.0, + 7.62939453125e-06, + 0.0, + -2.764863893389702e-08, + 1.0 + ], + "name": "Object_830" + }, + { + "mesh": 562, + "name": "Object_830_Material.069_0" + }, + { + "children": [ + 1149 + ], + "matrix": [ + 4.842681547575969e-07, + -7.121332624647188e-16, + -6.414326190948468, + 0.0, + -6.414327144622779, + -2.803791558109042e-07, + -4.842682264019381e-07, + 0.0, + -2.803791558109042e-07, + 6.414327144622797, + -2.278826778700279e-14, + 0.0, + 158.0303955078125, + 48.436920166015625, + 528.2266845703125, + 1.0 + ], + "name": "Text.012_447" + }, + { + "children": [ + 1150 + ], + "matrix": [ + 1.0000001192092896, + 0.0, + 3.944304526105059e-31, + 0.0, + 5.605193190019655e-45, + 1.0000001192092896, + -1.4210854717512893e-14, + 0.0, + -3.944304526105059e-31, + 1.4210854717512893e-14, + 1.0000001192092896, + 0.0, + -7.62939453125e-06, + 0.0, + -2.764863893389702e-08, + 1.0 + ], + "name": "Object_832" + }, + { + "mesh": 563, + "name": "Object_832_Material.068_0" + }, + { + "children": [ + 1152 + ], + "matrix": [ + 4.842681547575969e-07, + -7.121332624647188e-16, + -6.414326190948468, + 0.0, + -6.414327144622779, + -2.803791558109042e-07, + -4.842682264019381e-07, + 0.0, + -2.803791558109042e-07, + 6.414327144622797, + -2.278826778700279e-14, + 0.0, + 158.0303955078125, + 48.436920166015625, + 509.5635986328125, + 1.0 + ], + "name": "Text.013_448" + }, + { + "children": [ + 1153 + ], + "matrix": [ + 1.0000001192092896, + 0.0, + 3.944304526105059e-31, + 0.0, + 5.605193190019655e-45, + 1.0000001192092896, + -1.4210854717512893e-14, + 0.0, + -3.944304526105059e-31, + 1.4210854717512893e-14, + 1.0000001192092896, + 0.0, + 0.0, + 0.0, + -2.764863893389702e-08, + 1.0 + ], + "name": "Object_834" + }, + { + "mesh": 564, + "name": "Object_834_Material.068_0" + }, + { + "children": [ + 1155 + ], + "matrix": [ + 4.842681547575969e-07, + -7.121332624647188e-16, + -6.414326190948468, + 0.0, + -6.414327144622779, + -2.803791558109042e-07, + -4.842682264019381e-07, + 0.0, + -2.803791558109042e-07, + 6.414327144622797, + -2.278826778700279e-14, + 0.0, + 158.0303955078125, + 48.353309631347656, + 494.3053283691406, + 1.0 + ], + "name": "Text.014_449" + }, + { + "children": [ + 1156 + ], + "matrix": [ + 1.0000001192092896, + 0.0, + 3.944304526105059e-31, + 0.0, + 5.605193190019655e-45, + 1.0000001192092896, + -1.4210854717512893e-14, + 0.0, + -3.944304526105059e-31, + 1.4210854717512893e-14, + 1.0000001192092896, + 0.0, + -7.62939453125e-06, + 0.0, + -2.764863893389702e-08, + 1.0 + ], + "name": "Object_836" + }, + { + "mesh": 565, + "name": "Object_836_Material.068_0" + }, + { + "children": [ + 1158 + ], + "matrix": [ + -3.600448196977819e-08, + -0.0455318578319736, + -2.691374943705688, + 0.0, + -2.6917600631704137, + 2.288943129873346e-06, + -2.71400544092022e-09, + 0.0, + 2.288661551013548e-06, + 2.691374943704715, + -0.0455318578319878, + 0.0, + 156.65711975097656, + 48.63592529296875, + 594.0031127929688, + 1.0 + ], + "name": "Text.015_450" + }, + { + "children": [ + 1159 + ], + "matrix": [ + 1.0, + -2.481541837659083e-24, + 0.0, + 0.0, + 2.481541837659083e-24, + 1.0, + -1.421085480899653e-14, + 0.0, + 3.5264828655475955e-38, + 1.4210853961963577e-14, + 0.9999999403953552, + 0.0, + -3.0517578125e-05, + 7.62939453125e-06, + -1.6689300537109375e-06, + 1.0 + ], + "name": "Object_838" + }, + { + "mesh": 566, + "name": "Object_838_Material.070_0" + }, + { + "children": [ + 1161 + ], + "matrix": [ + 2.357899231005711e-07, + 1.7336866547098086e-16, + -3.1231322288513095, + 0.0, + -3.100836761831281, + -0.37251548235073273, + -2.3410666212379141e-07, + 0.0, + -0.37251548235073173, + 3.1008367618312898, + -2.812413612785569e-08, + 0.0, + 192.64385986328125, + 45.649803161621094, + 594.7985229492188, + 1.0 + ], + "name": "Text.017_452" + }, + { + "children": [ + 1162 + ], + "matrix": [ + 0.9999999403953552, + 0.0, + 0.0, + 0.0, + 0.0, + 0.9999999403953552, + -4.998607632614752e-18, + 0.0, + 0.0, + 4.998607632614752e-18, + 0.9999999403953552, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0 + ], + "name": "Object_840" + }, + { + "mesh": 567, + "name": "Object_840_Material.070_0" + }, + { + "children": [ + 1164 + ], + "matrix": [ + 4.842681547575969e-07, + -7.121332624647188e-16, + -6.414326190948468, + 0.0, + -6.414327144622779, + -2.803791558109042e-07, + -4.842682264019381e-07, + 0.0, + -2.803791558109042e-07, + 6.414327144622797, + -2.278826778700279e-14, + 0.0, + 158.0303955078125, + 48.436920166015625, + 475.9764099121094, + 1.0 + ], + "name": "Text.020_455" + }, + { + "children": [ + 1165 + ], + "matrix": [ + 1.0000001192092896, + 0.0, + 3.944304526105059e-31, + 0.0, + 5.605193190019655e-45, + 1.0000001192092896, + -1.4210854717512893e-14, + 0.0, + -3.944304526105059e-31, + 1.4210854717512893e-14, + 1.0000001192092896, + 0.0, + -7.62939453125e-06, + 0.0, + -2.764863893389702e-08, + 1.0 + ], + "name": "Object_842" + }, + { + "mesh": 568, + "name": "Object_842_Material.066_0" + }, + { + "children": [ + 1167 + ], + "matrix": [ + 4.842681547575969e-07, + -7.121332624647188e-16, + -6.414326190948468, + 0.0, + -5.271877765655498, + -2.3044110537952484e-07, + -3.9801569795547743e-07, + 0.0, + -2.803791558109042e-07, + 6.414327144622797, + -2.278826778700279e-14, + 0.0, + 157.21144104003906, + 48.436920166015625, + 455.6252136230469, + 1.0 + ], + "name": "Text.021_456" + }, + { + "children": [ + 1168 + ], + "matrix": [ + 1.0, + 0.0, + 3.944304526105059e-31, + 0.0, + 1.4012984618586685e-45, + 1.0, + -3.5527136725480714e-15, + 0.0, + -3.944304291006189e-31, + 3.552713460789835e-15, + 0.9999999403953552, + 0.0, + -7.62939453125e-06, + -1.9073486328125e-06, + 4.320340849517379e-07, + 1.0 + ], + "name": "Object_844" + }, + { + "mesh": 569, + "name": "Object_844_Material.066_0" + }, + { + "children": [ + 1170 + ], + "matrix": [ + 4.842681547575969e-07, + -7.121332624647188e-16, + -6.414326190948468, + 0.0, + -6.414327144622779, + -2.803791558109042e-07, + -4.842682264019381e-07, + 0.0, + -2.803791558109042e-07, + 6.414327144622797, + -2.278826778700279e-14, + 0.0, + 158.0303955078125, + 48.436920166015625, + 441.2599182128906, + 1.0 + ], + "name": "Text.022_457" + }, + { + "children": [ + 1171 + ], + "matrix": [ + 1.0000001192092896, + 0.0, + 3.944304526105059e-31, + 0.0, + 5.605193190019655e-45, + 1.0000001192092896, + -1.4210854717512893e-14, + 0.0, + -3.944304526105059e-31, + 1.4210854717512893e-14, + 1.0000001192092896, + 0.0, + -7.62939453125e-06, + 0.0, + -2.764863893389702e-08, + 1.0 + ], + "name": "Object_846" + }, + { + "mesh": 570, + "name": "Object_846_Material.066_0" + }, + { + "children": [ + 1173 + ], + "matrix": [ + 5.220631848179368e-07, + -7.67712176331757e-16, + -6.914936542510967, + 0.0, + -6.914937496185277, + -3.0226153015767566e-07, + -5.220632564344886e-07, + 0.0, + -3.0226153015767566e-07, + 6.9149374961852965, + -2.4566793030748012e-14, + 0.0, + 159.02734375, + 48.63896560668945, + 422.0705871582031, + 1.0 + ], + "name": "Text.023_458" + }, + { + "children": [ + 1174 + ], + "matrix": [ + 1.0, + 0.0, + 7.88860905221012e-31, + 0.0, + -1.1210387717995793e-44, + 1.0, + 1.4210854719508534e-14, + 0.0, + -7.88860905221012e-31, + -1.4210854719508534e-14, + 1.0, + 0.0, + 0.0, + -3.552713678800501e-15, + 2.2891504158906173e-07, + 1.0 + ], + "name": "Object_848" + }, + { + "mesh": 571, + "name": "Object_848_Material.060_0" + }, + { + "children": [ + 1176 + ], + "matrix": [ + 3.7601824221371295e-07, + 0.0, + -4.9805126190185405, + 0.0, + -4.913298130596462, + 0.8154798759504946, + -3.7094368904344326e-07, + 0.0, + 0.8154798759504924, + 4.913298130596476, + 6.156701780844749e-08, + 0.0, + 122.0291519165039, + 53.886627197265625, + 594.9238891601563, + 1.0 + ], + "name": "Text.025_460" + }, + { + "children": [ + 1177 + ], + "matrix": [ + 0.9999999403953552, + -2.7369109000017966e-48, + -1.6543612251060546e-24, + 0.0, + 2.4651904795593217e-32, + 0.9999999999999999, + 1.4901161216858703e-08, + 0.0, + 1.6543613237136736e-24, + -1.4901161216858703e-08, + 0.9999999999999999, + 0.0, + 1.52587890625e-05, + 0.0, + 9.5367431640625e-07, + 1.0 + ], + "name": "Object_850" + }, + { + "mesh": 572, + "name": "Object_850_Material.070_0" + }, + { + "children": [ + 1179 + ], + "matrix": [ + 4.842681540454637e-07, + -3.560666312323594e-16, + -6.4143261909484695, + 0.0, + -6.382602722323292, + -0.637152236815345, + -4.818730989115432e-07, + 0.0, + -0.6371522368153426, + 6.38260272232331, + -4.81036561665192e-08, + 0.0, + 175.48690795898438, + 47.26929473876953, + 483.9068908691406, + 1.0 + ], + "name": "Text.026_461" + }, + { + "children": [ + 1180 + ], + "matrix": [ + 1.0000001192092896, + 1.323488980084844e-23, + 3.30872245021211e-24, + 0.0, + -1.3234887458917908e-23, + 0.9999999403953552, + 7.450581035413111e-09, + 0.0, + -3.3087217599588943e-24, + -7.450581035413111e-09, + 0.9999999403953552, + 0.0, + -7.62939453125e-06, + 1.9073486328125e-06, + -7.152557373046875e-07, + 1.0 + ], + "name": "Object_852" + }, + { + "mesh": 573, + "name": "Object_852_Material.066_0" + }, + { + "children": [ + 1182 + ], + "matrix": [ + 4.842681540454637e-07, + -3.560666312323594e-16, + -6.4143261909484695, + 0.0, + -6.382602722323292, + -0.637152236815345, + -4.818730989115432e-07, + 0.0, + -0.6371522368153426, + 6.38260272232331, + -4.81036561665192e-08, + 0.0, + 175.4868927001953, + 47.26929473876953, + 501.88751220703125, + 1.0 + ], + "name": "Text.027_462" + }, + { + "children": [ + 1183 + ], + "matrix": [ + 1.0000001192092896, + 1.323488980084844e-23, + 3.30872245021211e-24, + 0.0, + -1.3234887458917908e-23, + 0.9999999403953552, + 7.450581035413111e-09, + 0.0, + -3.3087217599588943e-24, + -7.450581035413111e-09, + 0.9999999403953552, + 0.0, + -7.62939453125e-06, + 1.9073486328125e-06, + -4.76837158203125e-07, + 1.0 + ], + "name": "Object_854" + }, + { + "mesh": 574, + "name": "Object_854_Material.068_0" + }, + { + "children": [ + 1185 + ], + "matrix": [ + 4.842681540454637e-07, + -3.560666312323594e-16, + -6.4143261909484695, + 0.0, + -6.382602722323292, + -0.637152236815345, + -4.818730989115432e-07, + 0.0, + -0.6371522368153426, + 6.38260272232331, + -4.81036561665192e-08, + 0.0, + 175.48690795898438, + 47.26929473876953, + 519.0947265625, + 1.0 + ], + "name": "Text.028_463" + }, + { + "children": [ + 1186 + ], + "matrix": [ + 1.0000001192092896, + 1.323488980084844e-23, + 3.30872245021211e-24, + 0.0, + -1.3234887458917908e-23, + 0.9999999403953552, + 7.450581035413111e-09, + 0.0, + -3.3087217599588943e-24, + -7.450581035413111e-09, + 0.9999999403953552, + 0.0, + 1.4210854715202004e-14, + 1.9073486328125e-06, + -7.152557373046875e-07, + 1.0 + ], + "name": "Object_856" + }, + { + "mesh": 575, + "name": "Object_856_Material.068_0" + }, + { + "children": [ + 1188 + ], + "matrix": [ + 4.842681540454637e-07, + -3.560666312323594e-16, + -6.4143261909484695, + 0.0, + -6.382602722323292, + -0.637152236815345, + -4.818730989115432e-07, + 0.0, + -0.6371522368153426, + 6.38260272232331, + -4.81036561665192e-08, + 0.0, + 175.48690795898438, + 47.26929473876953, + 537.0140991210938, + 1.0 + ], + "name": "Text.029_464" + }, + { + "children": [ + 1189 + ], + "matrix": [ + 1.0000001192092896, + 1.323488980084844e-23, + 3.30872245021211e-24, + 0.0, + -1.3234887458917908e-23, + 0.9999999403953552, + 7.450581035413111e-09, + 0.0, + -3.3087217599588943e-24, + -7.450581035413111e-09, + 0.9999999403953552, + 0.0, + 1.4210854715202004e-14, + 1.9073486328125e-06, + -7.152557373046875e-07, + 1.0 + ], + "name": "Object_858" + }, + { + "mesh": 576, + "name": "Object_858_Material.069_0" + }, + { + "children": [ + 1191 + ], + "matrix": [ + 4.842681540454637e-07, + -3.560666312323594e-16, + -6.4143261909484695, + 0.0, + -6.382602722323292, + -0.637152236815345, + -4.818730989115432e-07, + 0.0, + -0.6371522368153426, + 6.38260272232331, + -4.81036561665192e-08, + 0.0, + 175.48690795898438, + 47.166259765625, + 554.659423828125, + 1.0 + ], + "name": "Text.030_465" + }, + { + "children": [ + 1192 + ], + "matrix": [ + 1.0000001192092896, + 1.323488980084844e-23, + 3.30872245021211e-24, + 0.0, + -1.3234887458917908e-23, + 0.9999999403953552, + 7.450581035413111e-09, + 0.0, + -3.3087217599588943e-24, + -7.450581035413111e-09, + 0.9999999403953552, + 0.0, + 0.0, + 1.9073486328125e-06, + -2.384185791015625e-07, + 1.0 + ], + "name": "Object_860" + }, + { + "mesh": 577, + "name": "Object_860_Material.005_0" + }, + { + "children": [ + 1194 + ], + "matrix": [ + 4.842681540454637e-07, + -3.560666312323594e-16, + -6.4143261909484695, + 0.0, + -6.382602722323292, + -0.637152236815345, + -4.818730989115432e-07, + 0.0, + -0.6371522368153426, + 6.38260272232331, + -4.81036561665192e-08, + 0.0, + 175.48690795898438, + 47.26929473876953, + 467.98291015625, + 1.0 + ], + "name": "Text.031_466" + }, + { + "children": [ + 1195 + ], + "matrix": [ + 1.0000001192092896, + 1.323488980084844e-23, + 3.30872245021211e-24, + 0.0, + -1.3234887458917908e-23, + 0.9999999403953552, + 7.450581035413111e-09, + 0.0, + -3.3087217599588943e-24, + -7.450581035413111e-09, + 0.9999999403953552, + 0.0, + 1.4210854715202004e-14, + 1.9073486328125e-06, + -7.152557373046875e-07, + 1.0 + ], + "name": "Object_862" + }, + { + "mesh": 578, + "name": "Object_862_Material.066_0" + }, + { + "children": [ + 1197 + ], + "matrix": [ + 4.842681540454637e-07, + -3.560666312323594e-16, + -6.4143261909484695, + 0.0, + -6.382602722323292, + -0.637152236815345, + -4.818730989115432e-07, + 0.0, + -0.6371522368153426, + 6.38260272232331, + -4.81036561665192e-08, + 0.0, + 175.48690795898438, + 47.26929473876953, + 450.2833251953125, + 1.0 + ], + "name": "Text.032_467" + }, + { + "children": [ + 1198 + ], + "matrix": [ + 1.0000001192092896, + 1.323488980084844e-23, + 3.30872245021211e-24, + 0.0, + -1.3234887458917908e-23, + 0.9999999403953552, + 7.450581035413111e-09, + 0.0, + -3.3087217599588943e-24, + -7.450581035413111e-09, + 0.9999999403953552, + 0.0, + -7.62939453125e-06, + 1.9073486328125e-06, + -7.152557373046875e-07, + 1.0 + ], + "name": "Object_864" + }, + { + "mesh": 579, + "name": "Object_864_Material.066_0" + }, + { + "children": [ + 1200 + ], + "matrix": [ + 3.2662077836783566e-07, + 0.0, + -4.3262233734130735, + 0.0, + -4.267838842926551, + 0.708350398794942, + -3.2221286853722583e-07, + 0.0, + 0.70835039879494, + 4.2678388429265635, + 5.34789672968908e-08, + 0.0, + 122.44432830810547, + 53.93135452270508, + 578.0614624023438, + 1.0 + ], + "name": "Text.038_473" + }, + { + "children": [ + 1201 + ], + "matrix": [ + 1.0, + 2.646977960169688e-23, + 0.0, + 0.0, + -2.646977960169688e-23, + 1.0, + 2.3011044218919198e-17, + 0.0, + 6.090972688796923e-40, + -2.3011044218919198e-17, + 1.0, + 0.0, + 0.0, + 1.9073486328125e-06, + 9.5367431640625e-07, + 1.0 + ], + "name": "Object_866" + }, + { + "mesh": 580, + "name": "Object_866_Material.070_0" + }, + { + "children": [ + 1203 + ], + "matrix": [ + 2.393125433984296e-07, + -3.519174668100138e-16, + -3.169790744781485, + 0.0, + -3.127013254809236, + 0.5190033650160282, + -2.3608293272723356e-07, + 0.0, + 0.5190033650160264, + 3.127013254809245, + 3.918366360741295e-08, + 0.0, + 122.05757141113281, + 53.85054397583008, + 561.2257690429688, + 1.0 + ], + "name": "Text.039_474" + }, + { + "children": [ + 1204 + ], + "matrix": [ + 0.9999999403953552, + 0.0, + 0.0, + 0.0, + 0.0, + 0.9999999403953551, + -1.490116211452677e-08, + 0.0, + 0.0, + 1.490116211452677e-08, + 0.9999999403953551, + 0.0, + 0.0, + 0.0, + 9.5367431640625e-07, + 1.0 + ], + "name": "Object_868" + }, + { + "mesh": 581, + "name": "Object_868_Material.005_0" + }, + { + "children": [ + 1206 + ], + "matrix": [ + 3.2662077836783566e-07, + 0.0, + -4.3262233734130735, + 0.0, + -4.267838842926551, + 0.708350398794942, + -3.2221286853722583e-07, + 0.0, + 0.70835039879494, + 4.2678388429265635, + 5.34789672968908e-08, + 0.0, + 127.0079345703125, + 53.028892517089844, + 560.6402587890625, + 1.0 + ], + "name": "Text.040_475" + }, + { + "children": [ + 1207 + ], + "matrix": [ + 1.0, + 2.646977960169688e-23, + 0.0, + 0.0, + -2.646977960169688e-23, + 1.0, + 2.3011044218919198e-17, + 0.0, + 6.090972688796923e-40, + -2.3011044218919198e-17, + 1.0, + 0.0, + -2.842170943040401e-14, + 1.9073486328125e-06, + -3.552713678800501e-15, + 1.0 + ], + "name": "Object_870" + }, + { + "mesh": 582, + "name": "Object_870_Material.005_0" + }, + { + "children": [ + 1209 + ], + "matrix": [ + 2.357899231005711e-07, + 1.7336866547098086e-16, + -3.1231322288513095, + 0.0, + -3.100836761831281, + -0.37251548235073273, + -2.3410666212379141e-07, + 0.0, + -0.37251548235073173, + 3.1008367618312898, + -2.812413612785569e-08, + 0.0, + 192.64385986328125, + 45.649803161621094, + 359.94561767578125, + 1.0 + ], + "name": "Text.053_488" + }, + { + "children": [ + 1210 + ], + "matrix": [ + 0.9999999403953552, + 0.0, + 0.0, + 0.0, + 0.0, + 0.9999999403953552, + -4.998607632614752e-18, + 0.0, + 0.0, + 4.998607632614752e-18, + 0.9999999403953552, + 0.0, + 7.62939453125e-06, + 0.0, + 8.881784197001252e-16, + 1.0 + ], + "name": "Object_872" + }, + { + "mesh": 583, + "name": "Object_872_Material.057_0" + }, + { + "children": [ + 1212 + ], + "matrix": [ + 3.0244728897573745e-07, + -4.447593187904592e-16, + -4.006035804748524, + 0.0, + -4.00603580474852, + -1.7510939366808697e-07, + -3.024472887533578e-07, + 0.0, + -1.7510939366808697e-07, + 4.006035804748532, + -1.4232298201294694e-14, + 0.0, + 156.28501892089844, + 46.93686294555664, + 363.3792724609375, + 1.0 + ], + "name": "Text.055_490" + }, + { + "children": [ + 1213 + ], + "matrix": [ + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + -8.928363924673895e-24, + 0.0, + 0.0, + 8.928363924673895e-24, + 1.0, + 0.0, + 0.0, + 3.814697265625e-06, + -4.803873707714956e-07, + 1.0 + ], + "name": "Object_874" + }, + { + "mesh": 584, + "name": "Object_874_Material.057_0" + }, + { + "children": [ + 1215 + ], + "matrix": [ + 2.885214381036644e-07, + -4.2428086792248797e-16, + -3.821582317352284, + 0.0, + -3.7700076232550033, + 0.6257238083644743, + -2.8462765699289154e-07, + 0.0, + 0.6257238083644722, + 3.770007623255014, + 4.724083285538177e-08, + 0.0, + 122.48380279541016, + 53.904693603515625, + 543.3729248046875, + 1.0 + ], + "name": "Text.057_492" + }, + { + "children": [ + 1216 + ], + "matrix": [ + 1.0, + -1.3234889800848446e-23, + -1.6543612251060557e-24, + 0.0, + 1.3234889800848446e-23, + 1.0, + -4.745174449189912e-18, + 0.0, + 1.6543612251060557e-24, + 4.745174449189912e-18, + 1.0, + 0.0, + 0.0, + -1.9073486328125e-06, + 9.5367431640625e-07, + 1.0 + ], + "name": "Object_876" + }, + { + "mesh": 585, + "name": "Object_876_Material.069_0" + }, + { + "children": [ + 1218 + ], + "matrix": [ + 3.2662077836783566e-07, + 0.0, + -4.3262233734130735, + 0.0, + -4.267838842926551, + 0.708350398794942, + -3.2221286853722583e-07, + 0.0, + 0.70835039879494, + 4.2678388429265635, + 5.34789672968908e-08, + 0.0, + 127.43417358398438, + 53.08305740356445, + 543.2583618164063, + 1.0 + ], + "name": "Text.058_493" + }, + { + "children": [ + 1219 + ], + "matrix": [ + 1.0, + 2.646977960169688e-23, + 0.0, + 0.0, + -2.646977960169688e-23, + 1.0, + 2.3011044218919198e-17, + 0.0, + 6.090972688796923e-40, + -2.3011044218919198e-17, + 1.0, + 0.0, + -7.62939453125e-06, + 1.9073486328125e-06, + -1.430511474609375e-06, + 1.0 + ], + "name": "Object_878" + }, + { + "mesh": 586, + "name": "Object_878_Material.069_0" + }, + { + "children": [ + 1221 + ], + "matrix": [ + 2.885214381036644e-07, + -4.2428086792248797e-16, + -3.821582317352284, + 0.0, + -3.7700076232550033, + 0.6257238083644743, + -2.8462765699289154e-07, + 0.0, + 0.6257238083644722, + 3.770007623255014, + 4.724083285538177e-08, + 0.0, + 122.48380279541016, + 53.74461364746094, + 525.7683715820313, + 1.0 + ], + "name": "Text.059_494" + }, + { + "children": [ + 1222 + ], + "matrix": [ + 1.0, + -1.3234889800848446e-23, + -1.6543612251060557e-24, + 0.0, + 1.3234889800848446e-23, + 1.0, + -4.745174449189912e-18, + 0.0, + 1.6543612251060557e-24, + 4.745174449189912e-18, + 1.0, + 0.0, + 1.52587890625e-05, + -3.814697265625e-06, + 9.5367431640625e-07, + 1.0 + ], + "name": "Object_880" + }, + { + "mesh": 587, + "name": "Object_880_Material.068_0" + }, + { + "children": [ + 1224 + ], + "matrix": [ + 3.2662077836783566e-07, + 0.0, + -4.3262233734130735, + 0.0, + -4.267838842926551, + 0.708350398794942, + -3.2221286853722583e-07, + 0.0, + 0.70835039879494, + 4.2678388429265635, + 5.34789672968908e-08, + 0.0, + 127.43415832519531, + 52.922969818115234, + 525.6514892578125, + 1.0 + ], + "name": "Text.060_495" + }, + { + "children": [ + 1225 + ], + "matrix": [ + 1.0, + 2.646977960169688e-23, + 0.0, + 0.0, + -2.646977960169688e-23, + 1.0, + 2.3011044218919198e-17, + 0.0, + 6.090972688796923e-40, + -2.3011044218919198e-17, + 1.0, + 0.0, + -7.62939453125e-06, + 0.0, + 9.5367431640625e-07, + 1.0 + ], + "name": "Object_882" + }, + { + "mesh": 588, + "name": "Object_882_Material.068_0" + }, + { + "children": [ + 1227 + ], + "matrix": [ + 8.145601795549348e-07, + -2.3223165842342196e-16, + -4.183513641357343, + 0.0, + -4.142218421806675, + 0.586359039478496, + -8.065197036253791e-07, + 0.0, + 0.586359039478485, + 4.142218421806753, + 1.1416831966928421e-07, + 0.0, + 101.7389144897461, + 56.42401123046875, + 595.2723999023438, + 1.0 + ], + "name": "Text.061_496" + }, + { + "children": [ + 1228 + ], + "matrix": [ + 1.0, + -2.6469779601696886e-23, + 3.308722450212111e-24, + 0.0, + 2.6469779601696886e-23, + 1.0, + -1.5315096574728595e-17, + 0.0, + -3.3087224502121103e-24, + 1.5315096574728595e-17, + 1.0, + 0.0, + 1.52587890625e-05, + 0.0, + -4.76837158203125e-07, + 1.0 + ], + "name": "Object_884" + }, + { + "mesh": 589, + "name": "Object_884_Material.070_0" + }, + { + "children": [ + 1230 + ], + "matrix": [ + 2.885214381036644e-07, + -4.2428086792248797e-16, + -3.821582317352284, + 0.0, + -3.7700076232550033, + 0.6257238083644743, + -2.8462765699289154e-07, + 0.0, + 0.6257238083644722, + 3.770007623255014, + 4.724083285538177e-08, + 0.0, + 122.48380279541016, + 53.85218811035156, + 509.2848815917969, + 1.0 + ], + "name": "Text.062_497" + }, + { + "children": [ + 1231 + ], + "matrix": [ + 1.0, + -1.3234889800848446e-23, + -1.6543612251060557e-24, + 0.0, + 1.3234889800848446e-23, + 1.0, + -4.745174449189912e-18, + 0.0, + 1.6543612251060557e-24, + 4.745174449189912e-18, + 1.0, + 0.0, + 0.0, + -3.814697265625e-06, + 9.5367431640625e-07, + 1.0 + ], + "name": "Object_886" + }, + { + "mesh": 590, + "name": "Object_886_Material.068_0" + }, + { + "children": [ + 1233 + ], + "matrix": [ + 3.2662077836783566e-07, + 0.0, + -4.3262233734130735, + 0.0, + -4.267838842926551, + 0.708350398794942, + -3.2221286853722583e-07, + 0.0, + 0.70835039879494, + 4.2678388429265635, + 5.34789672968908e-08, + 0.0, + 127.43415832519531, + 53.030540466308594, + 508.7716979980469, + 1.0 + ], + "name": "Text.063_498" + }, + { + "children": [ + 1234 + ], + "matrix": [ + 1.0, + 2.646977960169688e-23, + 0.0, + 0.0, + -2.646977960169688e-23, + 1.0, + 2.3011044218919198e-17, + 0.0, + 6.090972688796923e-40, + -2.3011044218919198e-17, + 1.0, + 0.0, + -1.52587890625e-05, + -3.552713678800501e-15, + -9.5367431640625e-07, + 1.0 + ], + "name": "Object_888" + }, + { + "mesh": 591, + "name": "Object_888_Material.068_0" + }, + { + "children": [ + 1236 + ], + "matrix": [ + 8.823703761137327e-07, + 0.0, + -4.531781196594153, + 0.0, + -4.4802919702145525, + 0.6811967390401342, + -8.723450538434489e-07, + 0.0, + 0.6811967390401213, + 4.480291970214638, + 1.326339019198607e-07, + 0.0, + 101.3667221069336, + 56.13206100463867, + 484.3406066894531, + 1.0 + ], + "name": "Text.070_505" + }, + { + "children": [ + 1237 + ], + "matrix": [ + 0.9999998807907104, + -2.6469779601696886e-23, + -6.617444900424222e-24, + 0.0, + 2.6469781278026515e-23, + 0.9999999403953551, + 1.490116211031887e-08, + 0.0, + 6.617444900424195e-24, + -1.490116211031887e-08, + 0.9999999403953551, + 0.0, + 1.52587890625e-05, + -1.9073486328125e-06, + 1.7763568394002505e-15, + 1.0 + ], + "name": "Object_890" + }, + { + "mesh": 592, + "name": "Object_890_Material.066_0" + }, + { + "children": [ + 1239 + ], + "matrix": [ + 8.665498238294713e-07, + 2.4705394090698417e-16, + -4.4505281448363405, + 0.0, + -4.425870470800358, + 0.4678459494187305, + -8.617487967878619e-07, + 0.0, + 0.4678459494187214, + 4.425870470800442, + 9.109296989690887e-08, + 0.0, + 101.205078125, + 56.94178771972656, + 513.08984375, + 1.0 + ], + "name": "Text.071_506" + }, + { + "children": [ + 1240 + ], + "matrix": [ + 1.0000001192092896, + -2.6469779601696886e-23, + -6.617444900424222e-24, + 0.0, + 2.646977639694984e-23, + 1.0, + -7.450580577164669e-09, + 0.0, + 6.617444308778613e-24, + 7.450580577164669e-09, + 1.0, + 0.0, + -7.62939453125e-06, + 1.9073486328125e-06, + -7.152557373046875e-07, + 1.0 + ], + "name": "Object_892" + }, + { + "mesh": 593, + "name": "Object_892_Material.068_0" + }, + { + "children": [ + 1242 + ], + "matrix": [ + 8.665498238294713e-07, + 2.4705394090698417e-16, + -4.4505281448363405, + 0.0, + -4.425870470800358, + 0.4678459494187305, + -8.617487967878619e-07, + 0.0, + 0.4678459494187214, + 4.425870470800442, + 9.109296989690887e-08, + 0.0, + 101.205078125, + 56.94178771972656, + 530.455322265625, + 1.0 + ], + "name": "Text.072_507" + }, + { + "children": [ + 1243 + ], + "matrix": [ + 1.0000001192092896, + -2.6469779601696886e-23, + -6.617444900424222e-24, + 0.0, + 2.646977639694984e-23, + 1.0, + -7.450580577164669e-09, + 0.0, + 6.617444308778613e-24, + 7.450580577164669e-09, + 1.0, + 0.0, + -7.62939453125e-06, + 1.9073486328125e-06, + -7.152557373046875e-07, + 1.0 + ], + "name": "Object_894" + }, + { + "mesh": 594, + "name": "Object_894_Material.069_0" + }, + { + "children": [ + 1245 + ], + "matrix": [ + 8.665498238294713e-07, + 2.4705394090698417e-16, + -4.4505281448363405, + 0.0, + -4.425870470800358, + 0.4678459494187305, + -8.617487967878619e-07, + 0.0, + 0.4678459494187214, + 4.425870470800442, + 9.109296989690887e-08, + 0.0, + 101.205078125, + 56.94178771972656, + 548.2025146484375, + 1.0 + ], + "name": "Text.073_508" + }, + { + "children": [ + 1246 + ], + "matrix": [ + 1.0000001192092896, + -2.6469779601696886e-23, + -6.617444900424222e-24, + 0.0, + 2.646977639694984e-23, + 1.0, + -7.450580577164669e-09, + 0.0, + 6.617444308778613e-24, + 7.450580577164669e-09, + 1.0, + 0.0, + -1.52587890625e-05, + 1.9073486328125e-06, + -7.152557373046875e-07, + 1.0 + ], + "name": "Object_896" + }, + { + "mesh": 595, + "name": "Object_896_Material.005_0" + }, + { + "children": [ + 1248 + ], + "matrix": [ + 8.665498238294713e-07, + 2.4705394090698417e-16, + -4.4505281448363405, + 0.0, + -4.425870470800358, + 0.4678459494187305, + -8.617487967878619e-07, + 0.0, + 0.4678459494187214, + 4.425870470800442, + 9.109296989690887e-08, + 0.0, + 101.205078125, + 56.94178771972656, + 565.1781005859375, + 1.0 + ], + "name": "Text.074_509" + }, + { + "children": [ + 1249 + ], + "matrix": [ + 1.0000001192092896, + -2.6469779601696886e-23, + -6.617444900424222e-24, + 0.0, + 2.646977639694984e-23, + 1.0, + -7.450580577164669e-09, + 0.0, + 6.617444308778613e-24, + 7.450580577164669e-09, + 1.0, + 0.0, + 0.0, + 1.9073486328125e-06, + -7.152557373046875e-07, + 1.0 + ], + "name": "Object_898" + }, + { + "mesh": 596, + "name": "Object_898_Material.005_0" + }, + { + "children": [ + 1251 + ], + "matrix": [ + 8.823703761137327e-07, + 0.0, + -4.531781196594153, + 0.0, + -4.4802919702145525, + 0.6811967390401342, + -8.723450538434489e-07, + 0.0, + 0.6811967390401213, + 4.480291970214638, + 1.326339019198607e-07, + 0.0, + 101.3667221069336, + 56.1539306640625, + 466.89434814453125, + 1.0 + ], + "name": "Text.079_514" + }, + { + "children": [ + 1252 + ], + "matrix": [ + 0.9999998807907104, + -2.6469779601696886e-23, + -6.617444900424222e-24, + 0.0, + 2.6469781278026515e-23, + 0.9999999403953551, + 1.490116211031887e-08, + 0.0, + 6.617444900424195e-24, + -1.490116211031887e-08, + 0.9999999403953551, + 0.0, + 7.62939453125e-06, + 0.0, + 0.0, + 1.0 + ], + "name": "Object_900" + }, + { + "mesh": 597, + "name": "Object_900_Material.066_0" + }, + { + "children": [ + 1254 + ], + "matrix": [ + 8.823703761137327e-07, + 0.0, + -4.531781196594153, + 0.0, + -4.4802919702145525, + 0.6811967390401342, + -8.723450538434489e-07, + 0.0, + 0.6811967390401213, + 4.480291970214638, + 1.326339019198607e-07, + 0.0, + 101.3667221069336, + 56.1539306640625, + 449.3674621582031, + 1.0 + ], + "name": "Text.080_515" + }, + { + "children": [ + 1255 + ], + "matrix": [ + 0.9999998807907104, + -2.6469779601696886e-23, + -6.617444900424222e-24, + 0.0, + 2.6469781278026515e-23, + 0.9999999403953551, + 1.490116211031887e-08, + 0.0, + 6.617444900424195e-24, + -1.490116211031887e-08, + 0.9999999403953551, + 0.0, + 7.62939453125e-06, + 0.0, + 0.0, + 1.0 + ], + "name": "Object_902" + }, + { + "mesh": 598, + "name": "Object_902_Material.066_0" + }, + { + "children": [ + 1257 + ], + "matrix": [ + 8.823703761137327e-07, + 0.0, + -4.531781196594153, + 0.0, + -4.4802919702145525, + 0.6811967390401342, + -8.723450538434489e-07, + 0.0, + 0.6811967390401213, + 4.480291970214638, + 1.326339019198607e-07, + 0.0, + 101.3667221069336, + 56.1539306640625, + 431.94879150390625, + 1.0 + ], + "name": "Text.081_516" + }, + { + "children": [ + 1258 + ], + "matrix": [ + 0.9999998807907104, + -2.6469779601696886e-23, + -6.617444900424222e-24, + 0.0, + 2.6469781278026515e-23, + 0.9999999403953551, + 1.490116211031887e-08, + 0.0, + 6.617444900424195e-24, + -1.490116211031887e-08, + 0.9999999403953551, + 0.0, + 7.62939453125e-06, + 0.0, + 1.7763568394002505e-15, + 1.0 + ], + "name": "Object_904" + }, + { + "mesh": 599, + "name": "Object_904_Material.066_0" + }, + { + "children": [ + 1260 + ], + "matrix": [ + 3.398407732615808e-07, + 4.997477448141427e-16, + -4.501327514648425, + 0.0, + -4.443437319766316, + 0.7195990307391308, + -3.354701852418712e-07, + 0.0, + 0.7195990307391288, + 4.443437319766328, + 5.4328216032417034e-08, + 0.0, + 101.4731674194336, + 56.12112808227539, + 402.9732360839844, + 1.0 + ], + "name": "Text.082_517" + }, + { + "children": [ + 1261 + ], + "matrix": [ + 1.0, + -2.646977960169689e-23, + 1.6543612251060557e-24, + 0.0, + 2.646977802397508e-23, + 0.9999999403953552, + 1.6440701004531535e-17, + 0.0, + -1.6543611264984433e-24, + -1.6440701004531535e-17, + 0.9999999403953552, + 0.0, + -7.62939453125e-06, + 0.0, + 7.152557373046875e-07, + 1.0 + ], + "name": "Object_906" + }, + { + "mesh": 600, + "name": "Object_906_Material.060_0" + }, + { + "children": [ + 1263 + ], + "matrix": [ + 3.162844713456172e-07, + 4.651073795241124e-16, + -4.1893148422241095, + 0.0, + -4.1088517953991195, + 0.817128977559141, + -3.102096805668766e-07, + 0.0, + 0.8171289775591392, + 4.108851795399131, + 6.169152147613408e-08, + 0.0, + 101.35198974609375, + 56.183998107910156, + 386.4811096191406, + 1.0 + ], + "name": "Text.083_518" + }, + { + "children": [ + 1264 + ], + "matrix": [ + 1.0000001192092896, + -1.3234889800848438e-23, + 4.963083675318165e-24, + 0.0, + 1.3234888297082517e-23, + 0.9999999999999999, + -1.4901161229558092e-08, + 0.0, + -4.963082886457353e-24, + 1.4901161229558092e-08, + 0.9999999999999999, + 0.0, + 0.0, + 1.9073486328125e-06, + 4.76837158203125e-07, + 1.0 + ], + "name": "Object_908" + }, + { + "mesh": 601, + "name": "Object_908_Material.057_0" + }, + { + "children": [ + 1266 + ], + "matrix": [ + 3.162844713456172e-07, + 4.651073795241124e-16, + -4.1893148422241095, + 0.0, + -4.1088517953991195, + 0.817128977559141, + -3.102096805668766e-07, + 0.0, + 0.8171289775591392, + 4.108851795399131, + 6.169152147613408e-08, + 0.0, + 101.35198974609375, + 56.183998107910156, + 368.47247314453125, + 1.0 + ], + "name": "Text.084_519" + }, + { + "children": [ + 1267 + ], + "matrix": [ + 1.0000001192092896, + -1.3234889800848438e-23, + 4.963083675318165e-24, + 0.0, + 1.3234888297082517e-23, + 0.9999999999999999, + -1.4901161229558092e-08, + 0.0, + -4.963082886457353e-24, + 1.4901161229558092e-08, + 0.9999999999999999, + 0.0, + 7.62939453125e-06, + 1.9073486328125e-06, + 4.76837158203125e-07, + 1.0 + ], + "name": "Object_910" + }, + { + "mesh": 602, + "name": "Object_910_Material.057_0" + }, + { + "children": [ + 1269 + ], + "matrix": [ + 3.162844713456172e-07, + 4.651073795241124e-16, + -4.1893148422241095, + 0.0, + -4.1088517953991195, + 0.817128977559141, + -3.102096805668766e-07, + 0.0, + 0.8171289775591392, + 4.108851795399131, + 6.169152147613408e-08, + 0.0, + 101.35196685791016, + 56.183998107910156, + 351.3489990234375, + 1.0 + ], + "name": "Text.085_520" + }, + { + "children": [ + 1270 + ], + "matrix": [ + 1.0000001192092896, + -1.3234889800848438e-23, + 4.963083675318165e-24, + 0.0, + 1.3234888297082517e-23, + 0.9999999999999999, + -1.4901161229558092e-08, + 0.0, + -4.963082886457353e-24, + 1.4901161229558092e-08, + 0.9999999999999999, + 0.0, + 7.62939453125e-06, + 0.0, + -9.5367431640625e-07, + 1.0 + ], + "name": "Object_912" + }, + { + "mesh": 603, + "name": "Object_912_Material.057_0" + }, + { + "children": [ + 1272 + ], + "matrix": [ + 2.885214381036644e-07, + -4.2428086792248797e-16, + -3.821582317352284, + 0.0, + -3.7700076232550033, + 0.6257238083644743, + -2.8462765699289154e-07, + 0.0, + 0.6257238083644722, + 3.770007623255014, + 4.724083285538177e-08, + 0.0, + 122.48380279541016, + 53.851776123046875, + 491.6510009765625, + 1.0 + ], + "name": "Text.086_521" + }, + { + "children": [ + 1273 + ], + "matrix": [ + 1.0, + -1.3234889800848446e-23, + -1.6543612251060557e-24, + 0.0, + 1.3234889800848446e-23, + 1.0, + -4.745174449189912e-18, + 0.0, + 1.6543612251060557e-24, + 4.745174449189912e-18, + 1.0, + 0.0, + -1.52587890625e-05, + -3.814697265625e-06, + -9.5367431640625e-07, + 1.0 + ], + "name": "Object_914" + }, + { + "mesh": 604, + "name": "Object_914_Material.068_0" + }, + { + "children": [ + 1275 + ], + "matrix": [ + 3.2662077836783566e-07, + 0.0, + -4.3262233734130735, + 0.0, + -4.267838842926551, + 0.708350398794942, + -3.2221286853722583e-07, + 0.0, + 0.70835039879494, + 4.2678388429265635, + 5.34789672968908e-08, + 0.0, + 127.43415832519531, + 53.03013229370117, + 491.8240051269531, + 1.0 + ], + "name": "Text.087_522" + }, + { + "children": [ + 1276 + ], + "matrix": [ + 1.0, + 2.646977960169688e-23, + 0.0, + 0.0, + -2.646977960169688e-23, + 1.0, + 2.3011044218919198e-17, + 0.0, + 6.090972688796923e-40, + -2.3011044218919198e-17, + 1.0, + 0.0, + 0.0, + -1.9073486328125e-06, + 0.0, + 1.0 + ], + "name": "Object_916" + }, + { + "mesh": 605, + "name": "Object_916_Material.068_0" + }, + { + "children": [ + 1278 + ], + "matrix": [ + 2.885214381036644e-07, + -4.2428086792248797e-16, + -3.821582317352284, + 0.0, + -3.7700076232550033, + 0.6257238083644743, + -2.8462765699289154e-07, + 0.0, + 0.6257238083644722, + 3.770007623255014, + 4.724083285538177e-08, + 0.0, + 122.48380279541016, + 53.820777893066406, + 473.6639404296875, + 1.0 + ], + "name": "Text.088_523" + }, + { + "children": [ + 1279 + ], + "matrix": [ + 1.0, + -1.3234889800848446e-23, + -1.6543612251060557e-24, + 0.0, + 1.3234889800848446e-23, + 1.0, + -4.745174449189912e-18, + 0.0, + 1.6543612251060557e-24, + 4.745174449189912e-18, + 1.0, + 0.0, + -7.62939453125e-06, + -3.814697265625e-06, + 1.9073486328125e-06, + 1.0 + ], + "name": "Object_918" + }, + { + "mesh": 606, + "name": "Object_918_Material.066_0" + }, + { + "children": [ + 1281 + ], + "matrix": [ + 3.2662077836783566e-07, + 0.0, + -4.3262233734130735, + 0.0, + -4.267838842926551, + 0.708350398794942, + -3.2221286853722583e-07, + 0.0, + 0.70835039879494, + 4.2678388429265635, + 5.34789672968908e-08, + 0.0, + 127.43415832519531, + 52.99912643432617, + 473.40484619140625, + 1.0 + ], + "name": "Text.089_524" + }, + { + "children": [ + 1282 + ], + "matrix": [ + 1.0, + 2.646977960169688e-23, + 0.0, + 0.0, + -2.646977960169688e-23, + 1.0, + 2.3011044218919198e-17, + 0.0, + 6.090972688796923e-40, + -2.3011044218919198e-17, + 1.0, + 0.0, + -7.62939453125e-06, + 1.9073486328125e-06, + -3.552713678800501e-15, + 1.0 + ], + "name": "Object_920" + }, + { + "mesh": 607, + "name": "Object_920_Material.066_0" + }, + { + "children": [ + 1284 + ], + "matrix": [ + 2.885214381036644e-07, + -4.2428086792248797e-16, + -3.821582317352284, + 0.0, + -3.7700076232550033, + 0.6257238083644743, + -2.8462765699289154e-07, + 0.0, + 0.6257238083644722, + 3.770007623255014, + 4.724083285538177e-08, + 0.0, + 122.48380279541016, + 53.85144805908203, + 456.4730224609375, + 1.0 + ], + "name": "Text.090_525" + }, + { + "children": [ + 1285 + ], + "matrix": [ + 1.0, + -1.3234889800848446e-23, + -1.6543612251060557e-24, + 0.0, + 1.3234889800848446e-23, + 1.0, + -4.745174449189912e-18, + 0.0, + 1.6543612251060557e-24, + 4.745174449189912e-18, + 1.0, + 0.0, + -1.4210854715202004e-14, + -3.814697265625e-06, + 9.5367431640625e-07, + 1.0 + ], + "name": "Object_922" + }, + { + "mesh": 608, + "name": "Object_922_Material.066_0" + }, + { + "children": [ + 1287 + ], + "matrix": [ + 3.2662077836783566e-07, + 0.0, + -4.3262233734130735, + 0.0, + -4.267838842926551, + 0.708350398794942, + -3.2221286853722583e-07, + 0.0, + 0.70835039879494, + 4.2678388429265635, + 5.34789672968908e-08, + 0.0, + 127.43415832519531, + 53.02980041503906, + 456.7462463378906, + 1.0 + ], + "name": "Text.091_526" + }, + { + "children": [ + 1288 + ], + "matrix": [ + 1.0, + 2.646977960169688e-23, + 0.0, + 0.0, + -2.646977960169688e-23, + 1.0, + 2.3011044218919198e-17, + 0.0, + 6.090972688796923e-40, + -2.3011044218919198e-17, + 1.0, + 0.0, + -1.52587890625e-05, + 1.9073486328125e-06, + 0.0, + 1.0 + ], + "name": "Object_924" + }, + { + "mesh": 609, + "name": "Object_924_Material.066_0" + }, + { + "children": [ + 1290 + ], + "matrix": [ + 2.885214385279453e-07, + 0.0, + -3.821582317352284, + 0.0, + -3.0992381951394314, + 0.5143930434782151, + -2.3398597414030725e-07, + 0.0, + 0.625723358944536, + 3.770007697847078, + 4.724079933719739e-08, + 0.0, + 121.67271423339844, + 54.09598922729492, + 439.12200927734375, + 1.0 + ], + "name": "Text.092_527" + }, + { + "children": [ + 1291 + ], + "matrix": [ + 1.0, + -2.646977960169688e-23, + 1.6543612251060552e-24, + 0.0, + 2.646977961402283e-23, + 1.0, + -7.450580576636736e-09, + 0.0, + -1.6543610278908292e-24, + 7.450580576636736e-09, + 1.0, + 0.0, + -7.62939453125e-06, + 0.0, + 4.76837158203125e-07, + 1.0 + ], + "name": "Object_926" + }, + { + "mesh": 610, + "name": "Object_926_Material.066_0" + }, + { + "children": [ + 1293 + ], + "matrix": [ + 3.933066342619108e-06, + 2.1214043396124399e-16, + 3.821582317350271, + 0.0, + 3.0992380888476334, + -0.5143936838802088, + -3.189649732075219e-06, + 0.0, + 0.6257241379486884, + 3.7700075685524843, + -6.43977897992249e-07, + 0.0, + 120.31279754638672, + 54.21159362792969, + 419.6874084472656, + 1.0 + ], + "name": "Text.093_528" + }, + { + "children": [ + 1294 + ], + "matrix": [ + 0.9999998807907104, + 5.329070729958988e-15, + 0.0, + 0.0, + -5.329070729958988e-15, + 0.9999998807907104, + 8.560706834667372e-18, + 0.0, + 4.5620617658787176e-32, + -8.560706834667372e-18, + 0.9999998807907104, + 0.0, + 0.0, + 7.105427357601002e-15, + -4.76837158203125e-07, + 1.0 + ], + "name": "Object_928" + }, + { + "mesh": 611, + "name": "Object_928_Material.060_0" + }, + { + "children": [ + 1296 + ], + "matrix": [ + 3.2662077836783566e-07, + 0.0, + -4.3262233734130735, + 0.0, + -4.267838842926551, + 0.708350398794942, + -3.2221286853722583e-07, + 0.0, + 0.70835039879494, + 4.2678388429265635, + 5.34789672968908e-08, + 0.0, + 127.43415832519531, + 53.034366607666016, + 439.3608093261719, + 1.0 + ], + "name": "Text.094_529" + }, + { + "children": [ + 1297 + ], + "matrix": [ + 1.0, + 2.646977960169688e-23, + 0.0, + 0.0, + -2.646977960169688e-23, + 1.0, + 2.3011044218919198e-17, + 0.0, + 6.090972688796923e-40, + -2.3011044218919198e-17, + 1.0, + 0.0, + -7.62939453125e-06, + -3.552713678800501e-15, + 0.0, + 1.0 + ], + "name": "Object_930" + }, + { + "mesh": 612, + "name": "Object_930_Material.066_0" + }, + { + "children": [ + 1299 + ], + "matrix": [ + 3.2662077836783566e-07, + 0.0, + -4.3262233734130735, + 0.0, + -4.267838842926551, + 0.708350398794942, + -3.2221286853722583e-07, + 0.0, + 0.70835039879494, + 4.2678388429265635, + 5.34789672968908e-08, + 0.0, + 127.43415832519531, + 53.02962112426758, + 421.5911865234375, + 1.0 + ], + "name": "Text.095_530" + }, + { + "children": [ + 1300 + ], + "matrix": [ + 1.0, + 2.646977960169688e-23, + 0.0, + 0.0, + -2.646977960169688e-23, + 1.0, + 2.3011044218919198e-17, + 0.0, + 6.090972688796923e-40, + -2.3011044218919198e-17, + 1.0, + 0.0, + -7.62939453125e-06, + -3.552713678800501e-15, + 3.552713678800501e-15, + 1.0 + ], + "name": "Object_932" + }, + { + "mesh": 613, + "name": "Object_932_Material.060_0" + }, + { + "children": [ + 1302 + ], + "matrix": [ + 3.0244728897573745e-07, + -4.447593187904592e-16, + -4.006035804748524, + 0.0, + -4.00603580474852, + -1.7510939366808697e-07, + -3.024472887533578e-07, + 0.0, + -1.7510939366808697e-07, + 4.006035804748532, + -1.4232298201294694e-14, + 0.0, + 186.13475036621094, + 46.57475280761719, + 219.39630126953125, + 1.0 + ], + "name": "Text.099_534" + }, + { + "children": [ + 1303 + ], + "matrix": [ + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + -8.928363924673895e-24, + 0.0, + 0.0, + 8.928363924673895e-24, + 1.0, + 0.0, + 0.0, + 0.0, + -4.3292857299093157e-07, + 1.0 + ], + "name": "Object_934" + }, + { + "mesh": 614, + "name": "Object_934_Tasten_2_0" + }, + { + "children": [ + 1305 + ], + "matrix": [ + 6.19664665780642, + -8.307058213697738e-07, + 0.004258204202882495, + 0.0, + 0.005772099241344445, + -0.5803747583710223, + -8.399818301076765, + 0.0, + 0.00029493796720996246, + 6.194382587461019, + -0.42799278105614436, + 0.0, + 173.51959228515625, + 46.999393463134766, + 585.5242309570313, + 1.0 + ], + "name": "Text.135_570" + }, + { + "children": [ + 1306 + ], + "matrix": [ + 1.0, + 1.712407960655776e-11, + -1.5845103075212866e-12, + 0.0, + -1.712407960360638e-11, + 1.0, + 1.8626451631087436e-09, + 0.0, + 1.5845103394173706e-12, + -1.8626451631087163e-09, + 1.0, + 0.0, + -3.814697265625e-06, + -7.62939453125e-06, + 9.5367431640625e-07, + 1.0 + ], + "name": "Object_936" + }, + { + "mesh": 615, + "name": "Object_936_Material.070_0" + }, + { + "children": [ + 1308 + ], + "matrix": [ + 0.0045760704521531316, + 4.311014761071697e-05, + -6.67205510555501, + 0.0, + -4.915889646356215, + -0.3867318551682514, + -0.0033740922501315235, + 0.0, + -0.2150780528920463, + 2.7339366989281304, + -0.00012984783464657835, + 0.0, + 175.03382873535156, + 47.035972595214844, + 400.0088806152344, + 1.0 + ], + "name": "Text.136_571" + }, + { + "children": [ + 1309 + ], + "matrix": [ + 1.0, + -6.129141671192692e-11, + 2.6147974437800225e-12, + 0.0, + 6.12914167216678e-11, + 1.0, + -3.7252902577409904e-09, + 0.0, + -2.6147972154517053e-12, + 3.725290257741151e-09, + 1.0, + 0.0, + 7.105427357601002e-15, + -3.814697265625e-06, + 4.76837158203125e-07, + 1.0 + ], + "name": "Object_938" + }, + { + "mesh": 616, + "name": "Object_938_Material.060_0" + }, + { + "children": [ + 1311 + ], + "matrix": [ + 0.0029079663859526636, + 2.7395308148377997e-05, + -4.239906744234837, + 0.0, + -4.915888695619604, + -0.3867317803740312, + -0.0033740915975796447, + 0.0, + -0.21507799679639117, + 2.7339359858755055, + -0.00012984780078027143, + 0.0, + 175.03382873535156, + 47.035972595214844, + 434.8533020019531, + 1.0 + ], + "name": "Text.137_572" + }, + { + "children": [ + 1312 + ], + "matrix": [ + 1.0, + -5.520917056855977e-11, + -5.002220846198577e-12, + 0.0, + 5.520917059651186e-11, + 1.0, + 5.587935473857977e-09, + 0.0, + 5.0022202395377164e-12, + -5.587935140791344e-09, + 0.9999999403953552, + 0.0, + -7.62939453125e-06, + 7.105427357601002e-15, + 1.9073486328125e-06, + 1.0 + ], + "name": "Object_940" + }, + { + "mesh": 617, + "name": "Object_940_Material.060_0" + }, + { + "children": [ + 1314 + ], + "matrix": [ + 1.4052661569628083e-07, + 1.0332465232632578e-16, + -1.8613314628601023, + 0.0, + -6.951212888900443, + -0.4802834312372188, + -5.2480197297412e-07, + 0.0, + -0.480283431237218, + 6.951212888900463, + -3.626038987693794e-08, + 0.0, + 176.05154418945313, + 46.7877197265625, + 584.429931640625, + 1.0 + ], + "name": "Text.138_573" + }, + { + "children": [ + 1315 + ], + "matrix": [ + 1.0000001192092896, + -3.30872245021211e-24, + 0.0, + 0.0, + 3.30872245021211e-24, + 1.0000001192092896, + -1.0498817913508397e-17, + 0.0, + 3.4737670390061293e-41, + 1.0498817913508397e-17, + 1.0000001192092896, + 0.0, + 0.0, + -3.552713678800501e-15, + -4.76837158203125e-07, + 1.0 + ], + "name": "Object_942" + }, + { + "mesh": 618, + "name": "Object_942_Material.070_0" + }, + { + "children": [ + 1317 + ], + "matrix": [ + 0.0029079663859526636, + 2.7395308148377997e-05, + -4.239906744234837, + 0.0, + -4.915888695619604, + -0.3867317803740312, + -0.0033740915975796447, + 0.0, + -0.21507799679639117, + 2.7339359858755055, + -0.00012984780078027143, + 0.0, + 175.03382873535156, + 47.035972595214844, + 417.32489013671875, + 1.0 + ], + "name": "Text.139_574" + }, + { + "children": [ + 1318 + ], + "matrix": [ + 1.0, + -5.520917056855977e-11, + -5.002220846198577e-12, + 0.0, + 5.520917059651186e-11, + 1.0, + 5.587935473857977e-09, + 0.0, + 5.0022202395377164e-12, + -5.587935140791344e-09, + 0.9999999403953552, + 0.0, + -7.62939453125e-06, + -7.62939453125e-06, + 1.430511474609375e-06, + 1.0 + ], + "name": "Object_944" + }, + { + "mesh": 619, + "name": "Object_944_Material.060_0" + }, + { + "children": [ + 1320 + ], + "matrix": [ + 4.1141605414394387e-07, + -6.050016999662974e-16, + -5.449370861053451, + 0.0, + -5.449370861053446, + -2.381995753059707e-07, + -4.1141605384144305e-07, + 0.0, + -2.381995753059707e-07, + 5.449370861053462, + -1.9360054398921515e-14, + 0.0, + 126.21009063720703, + 53.66515350341797, + 253.1333465576172, + 1.0 + ], + "name": "Text.140_575" + }, + { + "children": [ + 1321 + ], + "matrix": [ + 1.0000001192092896, + 0.0, + -7.888609052210116e-31, + 0.0, + 3.397249496053103e-54, + 1.0, + 4.3065258761745956e-24, + 0.0, + 7.888608111814748e-31, + -4.3065258761745956e-24, + 1.0, + 0.0, + 0.0, + 0.0, + 2.507938461349113e-07, + 1.0 + ], + "name": "Object_946" + }, + { + "mesh": 620, + "name": "Object_946_Tasten_2_0" + }, + { + "children": [ + 1323 + ], + "matrix": [ + 1.1802378794246261e-07, + -1.4988396232430614e-16, + -2.7000694274902313, + 0.0, + -2.638222492979218, + 0.5745940117156083, + -1.1532037212289184e-07, + 0.0, + 0.5745940117156075, + 2.6382224929792204, + 2.511630299463848e-08, + 0.0, + 122.21870422363281, + 53.89300537109375, + 271.1722412109375, + 1.0 + ], + "name": "Text.141_576" + }, + { + "children": [ + 1324 + ], + "matrix": [ + 1.0, + -6.617444900424222e-24, + 0.0, + 0.0, + 6.617444900424222e-24, + 0.9999999999999999, + 1.4901161157376322e-08, + 0.0, + -9.860761291127943e-32, + -1.4901161157376322e-08, + 0.9999999999999999, + 0.0, + 1.4210854715202004e-14, + 3.814697265625e-06, + 9.5367431640625e-07, + 1.0 + ], + "name": "Object_948" + }, + { + "mesh": 621, + "name": "Object_948_Material.067_0" + }, + { + "children": [ + 1326 + ], + "matrix": [ + 3.336317091048417e-07, + 2.453085501098279e-16, + -4.4190859794616575, + 0.0, + -4.408575442186019, + -0.3046037826898105, + -3.3283818623348923e-07, + 0.0, + -0.30460378268981, + 4.408575442186032, + -2.2996945553317036e-08, + 0.0, + 192.32383728027344, + 45.45188522338867, + 259.966552734375, + 1.0 + ], + "name": "Text.142_577" + }, + { + "children": [ + 1327 + ], + "matrix": [ + 1.0, + 1.3234889800848443e-23, + -8.271806125530276e-25, + 0.0, + -1.3234889800848443e-23, + 1.0, + 1.7256710977206928e-17, + 0.0, + 8.271806125530279e-25, + -1.7256710977206928e-17, + 1.0, + 0.0, + 0.0, + 0.0, + -2.384185791015625e-07, + 1.0 + ], + "name": "Object_950" + }, + { + "mesh": 622, + "name": "Object_950_Material.067_0" + }, + { + "children": [ + 1329 + ], + "matrix": [ + 2.863035731212886e-07, + 2.1050971024932225e-16, + -3.7922058105468643, + 0.0, + -3.7831874603082847, + -0.261393555842871, + -2.8562270714957147e-07, + 0.0, + -0.26139355584287055, + 3.783187460308296, + -1.9734664220594812e-08, + 0.0, + 197.02304077148438, + 45.61362838745117, + 260.9899597167969, + 1.0 + ], + "name": "Text.143_578" + }, + { + "children": [ + 1330 + ], + "matrix": [ + 0.9999999403953552, + -1.3234889800848446e-23, + -1.6543612251060557e-24, + 0.0, + 1.3234890577383446e-23, + 1.0, + -7.450580593544905e-09, + 0.0, + 1.6543614223212938e-24, + 7.450580593544905e-09, + 1.0, + 0.0, + 7.62939453125e-06, + -7.62939453125e-06, + 1.430511474609375e-06, + 1.0 + ], + "name": "Object_952" + }, + { + "mesh": 623, + "name": "Object_952_Material.067_0" + }, + { + "children": [ + 1332 + ], + "matrix": [ + -4.9913348081130176, + 0.4497198752791727, + 1.1795177535450579e-06, + 0.0, + 8.822017340655435e-07, + -3.732643140204508e-07, + 3.8755064010618936, + 0.0, + 0.44971978969976667, + 4.991333858286386, + 3.783617103771167e-07, + 0.0, + 184.7771759033203, + 33.31953430175781, + 601.2343139648438, + 1.0 + ], + "name": "Text.144_579" + }, + { + "children": [ + 1333 + ], + "matrix": [ + 0.9999999403953552, + 2.2232216491635227e-14, + -3.72529052878667e-09, + 0.0, + -2.2232217815951492e-14, + 1.0, + 2.2204467109948026e-16, + 0.0, + 3.725290306742038e-09, + -2.2204456180822726e-16, + 0.9999998807907104, + 0.0, + 0.0, + 1.52587890625e-05, + -2.384185791015625e-07, + 1.0 + ], + "name": "Object_954" + }, + { + "mesh": 624, + "name": "Object_954_Material.072_0" + }, + { + "children": [ + 1335 + ], + "matrix": [ + 3.116938384154852, + -0.27849421579960376, + -2.588022485494753e-07, + 0.0, + -2.3674963196739202e-07, + 2.583541807552884e-07, + -3.1293551921844283, + 0.0, + 0.2784942157996234, + 3.116938384154852, + 2.3625974480309594e-07, + 0.0, + 164.61962890625, + 35.13227462768555, + 204.9669189453125, + 1.0 + ], + "name": "Text.145_580" + }, + { + "children": [ + 1336 + ], + "matrix": [ + 1.0, + -2.9420908034984284e-15, + -1.2659698550452062e-17, + 0.0, + 2.942091154222983e-15, + 1.0000001192092896, + 1.1102228922762588e-16, + 0.0, + 1.2659698550451735e-17, + -1.1102227599273928e-16, + 1.0, + 0.0, + 0.0, + 1.4210854715202004e-14, + -1.430511474609375e-06, + 1.0 + ], + "name": "Object_956" + }, + { + "mesh": 625, + "name": "Object_956_Material.072_0" + }, + { + "children": [ + 1338 + ], + "matrix": [ + 3.737722952914348e-07, + 5.496452381270318e-16, + -4.950764179229723, + 0.0, + -15.526883608722393, + -1.094699960218966, + -1.172247098263456e-06, + 0.0, + -0.8149954297372689, + 11.559641581278774, + -6.153044366643193e-08, + 0.0, + 189.41836547851563, + 46.756996154785156, + 488.8923645019531, + 1.0 + ], + "name": "Text.146_581" + }, + { + "children": [ + 1339 + ], + "matrix": [ + 0.9999999403953552, + -3.30872245021211e-24, + 0.0, + 0.0, + 3.30872245021211e-24, + 0.9999999403953552, + 2.3636535719649666e-17, + 0.0, + -7.820673638084502e-41, + -2.3636534310802264e-17, + 0.9999998807907104, + 0.0, + -7.62939453125e-06, + -1.7763568394002505e-15, + 0.0, + 1.0 + ], + "name": "Object_958" + }, + { + "mesh": 626, + "name": "Object_958_Material.066_0" + }, + { + "children": [ + 1341 + ], + "matrix": [ + 3.0798199677564975e-07, + 9.057965991238963e-16, + -4.07934522628783, + 0.0, + -4.06722087695394, + 0.3142860220791302, + -3.070666339464301e-07, + 0.0, + 0.3142860220791293, + 4.067220876953953, + 2.372793526700563e-08, + 0.0, + 140.39271545410156, + 50.322853088378906, + 267.7450256347656, + 1.0 + ], + "name": "Text.147_582" + }, + { + "children": [ + 1342 + ], + "matrix": [ + 1.0, + 1.3234889800848437e-23, + -8.271806125530274e-25, + 0.0, + -1.3234889800848437e-23, + 1.0, + 2.0130924137960832e-17, + 0.0, + 8.271806125530276e-25, + -2.0130924137960832e-17, + 1.0, + 0.0, + 0.0, + 0.0, + 2.384185791015625e-07, + 1.0 + ], + "name": "Object_960" + }, + { + "mesh": 627, + "name": "Object_960_Material.067_0" + }, + { + "children": [ + 1344 + ], + "matrix": [ + 1.8803655326226477e-07, + 5.530286582952799e-16, + -2.490619659423821, + 0.0, + -2.4832178715337956, + 0.19188548898889793, + -1.8747773387182493e-07, + 0.0, + 0.19188548898889737, + 2.4832178715338027, + 1.4486951825875146e-08, + 0.0, + 145.1863250732422, + 50.322853088378906, + 270.03369140625, + 1.0 + ], + "name": "Text.148_583" + }, + { + "children": [ + 1345 + ], + "matrix": [ + 1.0, + 0.0, + -8.271806125530275e-25, + 0.0, + 5.172473139947945e-42, + 1.0, + 6.2531363301462256e-18, + 0.0, + 8.271806125530275e-25, + -6.2531363301462256e-18, + 1.0, + 0.0, + -1.4210854715202004e-14, + 3.814697265625e-06, + 1.9073486328125e-06, + 1.0 + ], + "name": "Object_962" + }, + { + "mesh": 628, + "name": "Object_962_Material.067_0" + }, + { + "children": [ + 1347 + ], + "matrix": [ + 1.8803655326226477e-07, + 5.530286582952799e-16, + -2.490619659423821, + 0.0, + -2.4832178715337956, + 0.19188548898889793, + -1.8747773387182493e-07, + 0.0, + 0.19188548898889737, + 2.4832178715338027, + 1.4486951825875146e-08, + 0.0, + 145.1863250732422, + 50.322853088378906, + 234.87057495117188, + 1.0 + ], + "name": "Text.149_584" + }, + { + "children": [ + 1348 + ], + "matrix": [ + 1.0, + 0.0, + -8.271806125530275e-25, + 0.0, + 5.172473139947945e-42, + 1.0, + 6.2531363301462256e-18, + 0.0, + 8.271806125530275e-25, + -6.2531363301462256e-18, + 1.0, + 0.0, + -1.4210854715202004e-14, + 3.814697265625e-06, + 1.9073486328125e-06, + 1.0 + ], + "name": "Object_964" + }, + { + "mesh": 629, + "name": "Object_964_Tasten_2_0" + }, + { + "children": [ + 1350 + ], + "matrix": [ + 0.0045760704521531316, + 4.311014761071697e-05, + -6.67205510555501, + 0.0, + -4.915889646356215, + -0.3867318551682514, + -0.0033740922501315235, + 0.0, + -0.2150780528920463, + 2.7339366989281304, + -0.00012984783464657835, + 0.0, + 157.08648681640625, + 48.545753479003906, + 408.6183166503906, + 1.0 + ], + "name": "Text.150_585" + }, + { + "children": [ + 1351 + ], + "matrix": [ + 1.0, + -6.129141671192692e-11, + 2.6147974437800225e-12, + 0.0, + 6.12914167216678e-11, + 1.0, + -3.7252902577409904e-09, + 0.0, + -2.6147972154517053e-12, + 3.725290257741151e-09, + 1.0, + 0.0, + -3.814697265625e-06, + -3.814697265625e-06, + 4.76837158203125e-07, + 1.0 + ], + "name": "Object_966" + }, + { + "mesh": 630, + "name": "Object_966_Material.060_0" + }, + { + "children": [ + 1353 + ], + "matrix": [ + 0.0045739538869665145, + -0.00011809348149958339, + -6.672055106100498, + 0.0, + -4.926482587631318, + -0.21284233724208235, + -0.0033735286250231255, + 0.0, + -0.11837064735157894, + 2.7398278837330072, + -0.00012964186930516434, + 0.0, + 158.9547882080078, + 48.54574966430664, + 391.2696533203125, + 1.0 + ], + "name": "Text.151_586" + }, + { + "children": [ + 1354 + ], + "matrix": [ + 1.0, + -9.606534209609385e-12, + -2.273736740879793e-12, + 0.0, + 9.60653534420959e-12, + 1.0000001192092896, + -4.656612990341791e-09, + 0.0, + 2.2737370566642463e-12, + 4.6566129903417695e-09, + 1.0000001192092896, + 0.0, + -3.814697265625e-06, + -7.105427357601002e-15, + 1.6689300537109375e-06, + 1.0 + ], + "name": "Object_968" + }, + { + "mesh": 631, + "name": "Object_968_Material.060_0" + }, + { + "children": [ + 1356 + ], + "matrix": [ + 3.0798199677564975e-07, + 9.057965991238963e-16, + -4.07934522628783, + 0.0, + -4.06722087695394, + 0.3142860220791302, + -3.070666339464301e-07, + 0.0, + 0.3142860220791293, + 4.067220876953953, + 2.372793526700563e-08, + 0.0, + 140.39271545410156, + 50.369232177734375, + 250.49256896972656, + 1.0 + ], + "name": "Text.152_587" + }, + { + "children": [ + 1357 + ], + "matrix": [ + 1.0, + 1.3234889800848437e-23, + -8.271806125530274e-25, + 0.0, + -1.3234889800848437e-23, + 1.0, + 2.0130924137960832e-17, + 0.0, + 8.271806125530276e-25, + -2.0130924137960832e-17, + 1.0, + 0.0, + 3.814697265625e-06, + 0.0, + -7.152557373046875e-07, + 1.0 + ], + "name": "Object_970" + }, + { + "mesh": 632, + "name": "Object_970_Tasten_2_0" + }, + { + "children": [ + 1359 + ], + "matrix": [ + 2.8303731104312283e-07, + -4.162162672316798e-16, + -3.748942852020253, + 0.0, + -1.6588191986083922, + -7.250929303452197e-08, + -1.2523736521686447e-07, + 0.0, + -2.381995753059707e-07, + 5.449370861053462, + -1.9360054398921515e-14, + 0.0, + 158.8053741455078, + 47.35289001464844, + 358.0809631347656, + 1.0 + ], + "name": "Text.153_588" + }, + { + "children": [ + 1360 + ], + "matrix": [ + 1.0000001192092896, + -2.6469779601696874e-23, + 7.8886090522101146e-31, + 0.0, + 2.646977644625363e-23, + 1.0, + -1.421085471711371e-14, + 0.0, + -7.888604350233272e-31, + 1.421085471711371e-14, + 1.0, + 0.0, + 0.0, + 1.52587890625e-05, + 1.0078338164021261e-07, + 1.0 + ], + "name": "Object_972" + }, + { + "mesh": 633, + "name": "Object_972_Material.057_0" + }, + { + "children": [ + 1362 + ], + "matrix": [ + 4.1141605414394387e-07, + -6.050016999662974e-16, + -5.449370861053451, + 0.0, + -5.449370861053446, + -2.381995753059707e-07, + -4.1141605384144305e-07, + 0.0, + -2.381995753059707e-07, + 5.449370861053462, + -1.9360054398921515e-14, + 0.0, + 158.52870178222656, + 47.35289764404297, + 360.2051696777344, + 1.0 + ], + "name": "Text.154_589" + }, + { + "children": [ + 1363 + ], + "matrix": [ + 1.0000001192092896, + 0.0, + -7.888609052210116e-31, + 0.0, + 3.397249496053103e-54, + 1.0, + 4.3065258761745956e-24, + 0.0, + 7.888608111814748e-31, + -4.3065258761745956e-24, + 1.0, + 0.0, + -1.4210854715202004e-14, + 3.814697265625e-06, + 1.0476360330358148e-06, + 1.0 + ], + "name": "Object_974" + }, + { + "mesh": 634, + "name": "Object_974_Material.057_0" + }, + { + "children": [ + 1365 + ], + "matrix": [ + 4.203829849300988e-07, + -6.181878853726787e-16, + -5.568141460418685, + 0.0, + -5.568142414092996, + -2.4339124498928204e-07, + -4.2038305662141257e-07, + 0.0, + -2.4339124498928204e-07, + 5.568142414093012, + -1.9782015720057507e-14, + 0.0, + 138.80638122558594, + 50.5096321105957, + 591.8989868164063, + 1.0 + ], + "name": "Text.155_590" + }, + { + "children": [ + 1366 + ], + "matrix": [ + 1.0, + -1.3234889800848446e-23, + -3.94430452610506e-31, + 0.0, + 1.3234889800848446e-23, + 1.0, + 1.4210854712891086e-14, + 0.0, + 3.9443026453140986e-31, + -1.4210854712891086e-14, + 1.0, + 0.0, + -7.62939453125e-06, + 3.552713678800501e-15, + -4.653102223528549e-07, + 1.0 + ], + "name": "Object_976" + }, + { + "mesh": 635, + "name": "Object_976_Material.070_0" + }, + { + "children": [ + 1368 + ], + "matrix": [ + 3.0798199677564975e-07, + 9.057965991238963e-16, + -4.07934522628783, + 0.0, + -4.06722087695394, + 0.3142860220791302, + -3.070666339464301e-07, + 0.0, + 0.3142860220791293, + 4.067220876953953, + 2.372793526700563e-08, + 0.0, + 140.39271545410156, + 50.369232177734375, + 233.01014709472656, + 1.0 + ], + "name": "Text.156_591" + }, + { + "children": [ + 1369 + ], + "matrix": [ + 1.0, + 1.3234889800848437e-23, + -8.271806125530274e-25, + 0.0, + -1.3234889800848437e-23, + 1.0, + 2.0130924137960832e-17, + 0.0, + 8.271806125530276e-25, + -2.0130924137960832e-17, + 1.0, + 0.0, + 0.0, + 0.0, + -7.152557373046875e-07, + 1.0 + ], + "name": "Object_978" + }, + { + "mesh": 636, + "name": "Object_978_Tasten_2_0" + }, + { + "children": [ + 1371 + ], + "matrix": [ + 2.4906198978423815, + -3.449281305792387e-07, + 9.657284663817921e-08, + 0.0, + 2.257866507642119e-07, + 0.3526371241027093, + -4.563542200657426, + 0.0, + 3.388424789964278e-07, + 2.500781116524088, + 0.19324205237204814, + 0.0, + 143.9503631591797, + 50.12162780761719, + 251.2159423828125, + 1.0 + ], + "name": "Text.157_592" + }, + { + "children": [ + 1372 + ], + "matrix": [ + 1.0, + -3.330669080492915e-15, + -8.404155023538762e-22, + 0.0, + 3.330669080492915e-15, + 1.0, + -5.551115123125784e-17, + 0.0, + 8.40415452446098e-22, + 5.551114792253539e-17, + 0.9999999403953552, + 0.0, + -7.62939453125e-06, + -3.814697265625e-06, + -1.9073486328125e-06, + 1.0 + ], + "name": "Object_980" + }, + { + "mesh": 637, + "name": "Object_980_Tasten_2_0" + }, + { + "children": [ + 1374 + ], + "matrix": [ + 4.910211378322619e-07, + -4.199713760450949e-16, + -2.5218439102172376, + 0.0, + -2.4883648257243483, + 0.40955732394575506, + -4.845025195012012e-07, + 0.0, + 0.40955732394574734, + 2.4883648257243953, + 7.974375443141777e-08, + 0.0, + 100.21073913574219, + 56.325225830078125, + 328.5050048828125, + 1.0 + ], + "name": "Text.158_593" + }, + { + "children": [ + 1375 + ], + "matrix": [ + 1.0, + 5.293955920339378e-23, + 0.0, + 0.0, + -5.293955920339378e-23, + 1.0, + 3.3306640580794464e-18, + 0.0, + 1.7632388708931264e-40, + -3.3306640580794464e-18, + 1.0, + 0.0, + 0.0, + 3.814697265625e-06, + 4.76837158203125e-07, + 1.0 + ], + "name": "Object_982" + }, + { + "mesh": 638, + "name": "Object_982_Material.057_0" + }, + { + "children": [ + 1377 + ], + "matrix": [ + 4.910211378322619e-07, + -4.199713760450949e-16, + -2.5218439102172376, + 0.0, + -2.4883648257243483, + 0.40955732394575506, + -4.845025195012012e-07, + 0.0, + 0.40955732394574734, + 2.4883648257243953, + 7.974375443141777e-08, + 0.0, + 100.21073913574219, + 56.325225830078125, + 310.76239013671875, + 1.0 + ], + "name": "Text.159_594" + }, + { + "children": [ + 1378 + ], + "matrix": [ + 1.0, + 5.293955920339378e-23, + 0.0, + 0.0, + -5.293955920339378e-23, + 1.0, + 3.3306640580794464e-18, + 0.0, + 1.7632388708931264e-40, + -3.3306640580794464e-18, + 1.0, + 0.0, + 0.0, + 3.814697265625e-06, + 4.76837158203125e-07, + 1.0 + ], + "name": "Object_984" + }, + { + "mesh": 639, + "name": "Object_984_Material.057_0" + }, + { + "children": [ + 1380 + ], + "matrix": [ + 4.910211378322619e-07, + -4.199713760450949e-16, + -2.5218439102172376, + 0.0, + -2.4883648257243483, + 0.40955732394575506, + -4.845025195012012e-07, + 0.0, + 0.40955732394574734, + 2.4883648257243953, + 7.974375443141777e-08, + 0.0, + 100.21073913574219, + 56.325225830078125, + 293.44415283203125, + 1.0 + ], + "name": "Text.160_595" + }, + { + "children": [ + 1381 + ], + "matrix": [ + 1.0, + 5.293955920339378e-23, + 0.0, + 0.0, + -5.293955920339378e-23, + 1.0, + 3.3306640580794464e-18, + 0.0, + 1.7632388708931264e-40, + -3.3306640580794464e-18, + 1.0, + 0.0, + -7.62939453125e-06, + 3.814697265625e-06, + 4.76837158203125e-07, + 1.0 + ], + "name": "Object_986" + }, + { + "mesh": 640, + "name": "Object_986_Material.057_0" + }, + { + "children": [ + 1383 + ], + "matrix": [ + 0.0035091065229641695, + -9.076408818647172e-05, + -5.1187617663529315, + 0.0, + -4.440037281068479, + -0.19200970452066346, + -0.0030404103394201286, + 0.0, + -0.10678472574464767, + 2.469294561101138, + -0.00011698966943576918, + 0.0, + 158.1964569091797, + 48.545753479003906, + 268.3175048828125, + 1.0 + ], + "name": "Text.161_596" + }, + { + "children": [ + 1384 + ], + "matrix": [ + 0.9999998807907104, + -3.382184940101118e-12, + -1.3552527156068805e-20, + 0.0, + 3.38218534328903e-12, + 1.0, + -9.313225805204558e-10, + 0.0, + 1.6702434353366536e-20, + 9.313225805204558e-10, + 1.0, + 0.0, + 3.814697265625e-06, + 7.62939453125e-06, + 1.430511474609375e-06, + 1.0 + ], + "name": "Object_988" + }, + { + "mesh": 641, + "name": "Object_988_Material.067_0" + }, + { + "children": [ + 1386 + ], + "matrix": [ + 0.002202543409166039, + -5.6969443052190783e-05, + -3.2128676966033733, + 0.0, + -4.440035851893091, + -0.19200964271587972, + -0.0030404093607617633, + 0.0, + -0.10678472574464767, + 2.469294561101138, + -0.00011698966943576918, + 0.0, + 162.31190490722656, + 48.54574966430664, + 268.0117492675781, + 1.0 + ], + "name": "Text.162_597" + }, + { + "children": [ + 1387 + ], + "matrix": [ + 1.0, + -4.2717829273897204e-11, + -3.1832314426527213e-12, + 0.0, + 4.271782927093259e-11, + 1.0, + -9.313225252141081e-10, + 0.0, + 3.1832314824367976e-12, + 9.31322525213972e-10, + 1.0, + 0.0, + 0.0, + 3.814697265625e-06, + 3.552713678800501e-15, + 1.0 + ], + "name": "Object_990" + }, + { + "mesh": 642, + "name": "Object_990_Material.067_0" + }, + { + "children": [ + 1389 + ], + "matrix": [ + 0.0035091065229641695, + -9.076408818647172e-05, + -5.1187617663529315, + 0.0, + -4.440037281068479, + -0.19200970452066346, + -0.0030404103394201286, + 0.0, + -0.10678472574464767, + 2.469294561101138, + -0.00011698966943576918, + 0.0, + 158.1964569091797, + 48.545753479003906, + 250.90188598632813, + 1.0 + ], + "name": "Text.163_598" + }, + { + "children": [ + 1390 + ], + "matrix": [ + 0.9999998807907104, + -3.382184940101118e-12, + -1.3552527156068805e-20, + 0.0, + 3.38218534328903e-12, + 1.0, + -9.313225805204558e-10, + 0.0, + 1.6702434353366536e-20, + 9.313225805204558e-10, + 1.0, + 0.0, + 3.814697265625e-06, + 7.105427357601002e-15, + 9.5367431640625e-07, + 1.0 + ], + "name": "Object_992" + }, + { + "mesh": 643, + "name": "Object_992_Tasten_2_0" + }, + { + "children": [ + 1392 + ], + "matrix": [ + 0.0035091065229641695, + -9.076408818647172e-05, + -5.1187617663529315, + 0.0, + -4.440037281068479, + -0.19200970452066346, + -0.0030404103394201286, + 0.0, + -0.10678472574464767, + 2.469294561101138, + -0.00011698966943576918, + 0.0, + 158.1964569091797, + 48.545753479003906, + 233.2236328125, + 1.0 + ], + "name": "Text.164_599" + }, + { + "children": [ + 1393 + ], + "matrix": [ + 0.9999998807907104, + -3.382184940101118e-12, + -1.3552527156068805e-20, + 0.0, + 3.38218534328903e-12, + 1.0, + -9.313225805204558e-10, + 0.0, + 1.6702434353366536e-20, + 9.313225805204558e-10, + 1.0, + 0.0, + 3.814697265625e-06, + 7.105427357601002e-15, + 1.6689300537109375e-06, + 1.0 + ], + "name": "Object_994" + }, + { + "mesh": 644, + "name": "Object_994_Tasten_2_0" + }, + { + "children": [ + 1395 + ], + "matrix": [ + 0.002202543409166039, + -5.6969443052190783e-05, + -3.2128676966033733, + 0.0, + -4.440035851893091, + -0.19200964271587972, + -0.0030404093607617633, + 0.0, + -0.10678472574464767, + 2.469294561101138, + -0.00011698966943576918, + 0.0, + 162.31190490722656, + 48.54574966430664, + 232.6932373046875, + 1.0 + ], + "name": "Text.165_600" + }, + { + "children": [ + 1396 + ], + "matrix": [ + 1.0, + -4.2717829273897204e-11, + -3.1832314426527213e-12, + 0.0, + 4.271782927093259e-11, + 1.0, + -9.313225252141081e-10, + 0.0, + 3.1832314824367976e-12, + 9.31322525213972e-10, + 1.0, + 0.0, + 0.0, + 3.814697265625e-06, + 2.384185791015625e-06, + 1.0 + ], + "name": "Object_996" + }, + { + "mesh": 645, + "name": "Object_996_Tasten_2_0" + }, + { + "children": [ + 1398 + ], + "matrix": [ + 2.4548580400103485e-07, + 1.8049773150643648e-16, + -3.25155806541442, + 0.0, + -3.2438256141840545, + -0.22412717337476581, + -2.449020206280953e-07, + 0.0, + -0.22412717337476545, + 3.243825614184064, + -1.6921130649145925e-08, + 0.0, + 191.76898193359375, + 45.45188522338867, + 235.8826141357422, + 1.0 + ], + "name": "Text.166_601" + }, + { + "children": [ + 1399 + ], + "matrix": [ + 1.0, + 2.6469779601696886e-23, + -8.271806125530277e-25, + 0.0, + -2.6469779601696886e-23, + 1.0, + 3.3789231693926192e-18, + 0.0, + 8.271806125530277e-25, + -3.3789231693926192e-18, + 1.0, + 0.0, + 0.0, + -3.814697265625e-06, + 9.5367431640625e-07, + 1.0 + ], + "name": "Object_998" + }, + { + "mesh": 646, + "name": "Object_998_Tasten_2_0" + }, + { + "children": [ + 1401 + ], + "matrix": [ + 1.8561732128390764e-07, + -2.729567642993923e-16, + -2.458575963973992, + 0.0, + -2.4585759639739897, + -1.074677729610167e-07, + -1.8561732114742927e-07, + 0.0, + -1.074677729610167e-07, + 2.458575963973997, + -8.734616457580554e-15, + 0.0, + 139.97386169433594, + 50.53956985473633, + 592.7052001953125, + 1.0 + ], + "name": "Text.167_602" + }, + { + "children": [ + 1402 + ], + "matrix": [ + 1.0, + -1.323488980084844e-23, + 1.1832913578315174e-30, + 0.0, + 1.323488980084844e-23, + 1.0, + -8.928363924673751e-24, + 0.0, + -1.1832913578315174e-30, + 8.928363924673751e-24, + 1.0, + 0.0, + 0.0, + 0.0, + 2.0044353732373565e-08, + 1.0 + ], + "name": "Object_1000" + }, + { + "mesh": 647, + "name": "Object_1000_Material.070_0" + }, + { + "children": [ + 1404 + ], + "matrix": [ + 1.7479313583050609e-06, + 3.0909394268633934e-16, + 5.568141460418428, + 0.0, + 5.56814241409267, + -9.071655462908827e-07, + -1.7479316589155199e-06, + 0.0, + 9.071655453636007e-07, + 5.568142414092945, + -2.8683922794083385e-13, + 0.0, + 141.682861328125, + 50.5096321105957, + 585.6509399414063, + 1.0 + ], + "name": "Text.168_603" + }, + { + "children": [ + 1405 + ], + "matrix": [ + 1.0, + 1.4210854662262445e-14, + -1.694066109078767e-21, + 0.0, + -1.4210854662262445e-14, + 1.0, + -1.4210854727574457e-14, + 0.0, + 1.694065907130376e-21, + 1.4210854727574457e-14, + 1.0, + 0.0, + 0.0, + 1.9073486328125e-06, + -3.959005425713258e-07, + 1.0 + ], + "name": "Object_1002" + }, + { + "mesh": 648, + "name": "Object_1002_Material.070_0" + }, + { + "children": [ + 1407 + ], + "matrix": [ + 7.717875084089725e-07, + 1.3647838214969615e-16, + 2.4585759639738782, + 0.0, + 2.458575963973846, + -4.005528669329843e-07, + -7.71787508954886e-07, + 0.0, + 4.0055286652354915e-07, + 2.4585759639739666, + -1.2665193863491803e-13, + 0.0, + 140.515380859375, + 50.53956985473633, + 584.8447875976563, + 1.0 + ], + "name": "Text.169_604" + }, + { + "children": [ + 1408 + ], + "matrix": [ + 1.0, + 1.421085476814156e-14, + 0.0, + 0.0, + -1.421085476814156e-14, + 1.0, + 1.4097326887617034e-23, + 0.0, + 2.0033506501894275e-37, + -1.4097326887617034e-23, + 1.0, + 0.0, + 0.0, + -3.814697265625e-06, + 4.963840183336288e-08, + 1.0 + ], + "name": "Object_1004" + }, + { + "mesh": 649, + "name": "Object_1004_Material.070_0" + }, + { + "children": [ + 1410 + ], + "matrix": [ + 2.0372185952330335e-07, + 1.4979006078116912e-16, + -2.6983778476715012, + 0.0, + -2.691959913944137, + -0.1859968562157866, + -2.0323731938363872e-07, + 0.0, + -0.18599685621578632, + 2.691959913944145, + -1.4042371823853477e-08, + 0.0, + 192.32383728027344, + 45.45188522338867, + 402.25897216796875, + 1.0 + ], + "name": "Text.170_605" + }, + { + "children": [ + 1411 + ], + "matrix": [ + 1.0, + -1.3234889800848443e-23, + -8.271806125530277e-25, + 0.0, + 1.3234889011987538e-23, + 0.9999999403953552, + -2.4376675808693188e-17, + 0.0, + 8.271805632492215e-25, + 2.4376675808693188e-17, + 0.9999999403953552, + 0.0, + 0.0, + 0.0, + 9.5367431640625e-07, + 1.0 + ], + "name": "Object_1006" + }, + { + "mesh": 650, + "name": "Object_1006_Material.057_0" + }, + { + "children": [ + 1413 + ], + "matrix": [ + 2.0372185952330335e-07, + 1.4979006078116912e-16, + -2.6983778476715012, + 0.0, + -2.691959913944137, + -0.1859968562157866, + -2.0323731938363872e-07, + 0.0, + -0.18599685621578632, + 2.691959913944145, + -1.4042371823853477e-08, + 0.0, + 192.32383728027344, + 45.45188522338867, + 377.9745788574219, + 1.0 + ], + "name": "Text.171_606" + }, + { + "children": [ + 1414 + ], + "matrix": [ + 1.0, + -1.3234889800848443e-23, + -8.271806125530277e-25, + 0.0, + 1.3234889011987538e-23, + 0.9999999403953552, + -2.4376675808693188e-17, + 0.0, + 8.271805632492215e-25, + 2.4376675808693188e-17, + 0.9999999403953552, + 0.0, + 0.0, + 0.0, + 9.5367431640625e-07, + 1.0 + ], + "name": "Object_1008" + }, + { + "mesh": 651, + "name": "Object_1008_Material.057_0" + }, + { + "children": [ + 1416 + ], + "matrix": [ + 2.0372185952330335e-07, + 1.4979006078116912e-16, + -2.6983778476715012, + 0.0, + -2.691959913944137, + -0.1859968562157866, + -2.0323731938363872e-07, + 0.0, + -0.18599685621578632, + 2.691959913944145, + -1.4042371823853477e-08, + 0.0, + 192.11471557617188, + 45.45188522338867, + 422.37396240234375, + 1.0 + ], + "name": "Text.172_607" + }, + { + "children": [ + 1417 + ], + "matrix": [ + 1.0, + -1.3234889800848443e-23, + -8.271806125530277e-25, + 0.0, + 1.3234889011987538e-23, + 0.9999999403953552, + -2.4376675808693188e-17, + 0.0, + 8.271805632492215e-25, + 2.4376675808693188e-17, + 0.9999999403953552, + 0.0, + -1.52587890625e-05, + 0.0, + 4.76837158203125e-07, + 1.0 + ], + "name": "Object_1010" + }, + { + "mesh": 652, + "name": "Object_1010_Material.060_0" + }, + { + "children": [ + 1419 + ], + "matrix": [ + 1.4052661569628083e-07, + 1.0332465232632578e-16, + -1.8613314628601023, + 0.0, + -6.951212888900443, + -0.4802834312372188, + -5.2480197297412e-07, + 0.0, + -0.480283431237218, + 6.951212888900463, + -3.626038987693794e-08, + 0.0, + 176.05154418945313, + 46.7877197265625, + 581.6424560546875, + 1.0 + ], + "name": "Text.173_608" + }, + { + "children": [ + 1420 + ], + "matrix": [ + 1.0000001192092896, + -3.30872245021211e-24, + 0.0, + 0.0, + 3.30872245021211e-24, + 1.0000001192092896, + -1.0498817913508397e-17, + 0.0, + 3.4737670390061293e-41, + 1.0498817913508397e-17, + 1.0000001192092896, + 0.0, + -3.0517578125e-05, + -3.552713678800501e-15, + -4.76837158203125e-07, + 1.0 + ], + "name": "Object_1012" + }, + { + "mesh": 653, + "name": "Object_1012_Material.070_0" + }, + { + "children": [ + 1422 + ], + "matrix": [ + -2.6926684379567902, + 4.065816224948149e-07, + 2.2530374066368987e-06, + 0.0, + 7.804493764329403e-06, + -0.6525987925786393, + 9.445137771205538, + 0.0, + 1.45440170346166e-06, + 6.965240822853522, + 0.4812537266380329, + 0.0, + 178.05625915527344, + 46.7877197265625, + 584.429931640625, + 1.0 + ], + "name": "Text.174_609" + }, + { + "children": [ + 1423 + ], + "matrix": [ + 0.9999999403953552, + 7.704947325030465e-14, + 1.6543612251060556e-23, + 0.0, + -7.704947784281141e-14, + 1.0, + 0.0, + 0.0, + -1.6543613237136747e-23, + -1.2746767615548094e-36, + 1.0, + 0.0, + 0.0, + 7.105427357601002e-15, + -4.76837158203125e-07, + 1.0 + ], + "name": "Object_1014" + }, + { + "mesh": 654, + "name": "Object_1014_Material.070_0" + }, + { + "children": [ + 1425 + ], + "matrix": [ + -2.6926684379567902, + 4.065816224948149e-07, + 2.2530374066368987e-06, + 0.0, + 7.804493764329403e-06, + -0.6525987925786393, + 9.445137771205538, + 0.0, + 1.45440170346166e-06, + 6.965240822853522, + 0.4812537266380329, + 0.0, + 178.05625915527344, + 46.7877197265625, + 582.62646484375, + 1.0 + ], + "name": "Text.175_610" + }, + { + "children": [ + 1426 + ], + "matrix": [ + 0.9999999403953552, + 7.704947325030465e-14, + 1.6543612251060556e-23, + 0.0, + -7.704947784281141e-14, + 1.0, + 0.0, + 0.0, + -1.6543613237136747e-23, + -1.2746767615548094e-36, + 1.0, + 0.0, + 0.0, + 0.0, + 9.5367431640625e-07, + 1.0 + ], + "name": "Object_1016" + }, + { + "mesh": 655, + "name": "Object_1016_Material.070_0" + }, + { + "children": [ + 1428 + ], + "matrix": [ + 2.69706417144107e-07, + 1.9830636099444173e-16, + -3.5723698139190576, + 0.0, + -6.951212888900443, + -0.4802834312372188, + -5.2480197297412e-07, + 0.0, + -0.480283431237218, + 6.951212888900463, + -3.626038987693794e-08, + 0.0, + 177.22296142578125, + 46.7877197265625, + 583.3386840820313, + 1.0 + ], + "name": "Text.176_611" + }, + { + "children": [ + 1429 + ], + "matrix": [ + 1.0000001192092896, + 0.0, + 4.1359030627651384e-25, + 0.0, + -1.3974897019201473e-42, + 1.0, + 3.3789231693926184e-18, + 0.0, + -4.1359025697271314e-25, + -3.3789231693926184e-18, + 1.0, + 0.0, + -1.52587890625e-05, + 3.552713678800501e-15, + -1.1920928955078125e-07, + 1.0 + ], + "name": "Object_1018" + }, + { + "mesh": 656, + "name": "Object_1018_Material.070_0" + }, + { + "children": [ + 1431 + ], + "matrix": [ + 6.1966476128201, + -0.0003250047170173948, + 0.00424382838201243, + 0.0, + 0.0076352979472772775, + 0.08078336584965824, + -11.142532535866753, + 0.0, + 0.000294246251755958, + 6.196846219416731, + 0.04492733948082389, + 0.0, + 173.51959228515625, + 47.035972595214844, + 367.4150085449219, + 1.0 + ], + "name": "Text.177_612" + }, + { + "children": [ + 1432 + ], + "matrix": [ + 1.0, + -3.38147289032434e-11, + 7.623296525288705e-21, + 0.0, + 3.38147289032434e-11, + 1.0, + 1.7347234759768075e-18, + 0.0, + -7.623296583947908e-21, + -1.7347234759765498e-18, + 1.0, + 0.0, + -3.552713678800501e-15, + -3.814697265625e-06, + 3.5762786865234375e-07, + 1.0 + ], + "name": "Object_1020" + }, + { + "mesh": 657, + "name": "Object_1020_Material.057_0" + }, + { + "children": [ + 1434 + ], + "matrix": [ + 1.6521332347849555e-07, + 1.214759860508342e-16, + -2.1883168220519957, + 0.0, + -6.1819064262017545, + -0.42712937690407066, + -4.6672095087067e-07, + 0.0, + -0.42712937690406994, + 6.181906426201772, + -3.224737046318279e-08, + 0.0, + 176.2571563720703, + 47.093109130859375, + 365.5276794433594, + 1.0 + ], + "name": "Text.178_613" + }, + { + "children": [ + 1435 + ], + "matrix": [ + 0.9999998807907104, + 3.308722450212111e-24, + 0.0, + 0.0, + -3.30872284464261e-24, + 1.0, + 1.7256710977206928e-17, + 0.0, + 5.709767383367946e-41, + -1.7256710977206928e-17, + 1.0, + 0.0, + 1.52587890625e-05, + -1.9073486328125e-06, + 4.76837158203125e-07, + 1.0 + ], + "name": "Object_1022" + }, + { + "mesh": 658, + "name": "Object_1022_Material.057_0" + }, + { + "children": [ + 1437 + ], + "matrix": [ + 1.6521332347849555e-07, + 1.214759860508342e-16, + -2.1883168220519957, + 0.0, + -6.1819064262017545, + -0.42712937690407066, + -4.6672095087067e-07, + 0.0, + -0.42712937690406994, + 6.181906426201772, + -3.224737046318279e-08, + 0.0, + 176.2571563720703, + 47.093109130859375, + 362.2505187988281, + 1.0 + ], + "name": "Text.179_614" + }, + { + "children": [ + 1438 + ], + "matrix": [ + 0.9999998807907104, + 3.308722450212111e-24, + 0.0, + 0.0, + -3.30872284464261e-24, + 1.0, + 1.7256710977206928e-17, + 0.0, + 5.709767383367946e-41, + -1.7256710977206928e-17, + 1.0, + 0.0, + 0.0, + -1.9073486328125e-06, + 4.76837158203125e-07, + 1.0 + ], + "name": "Object_1024" + }, + { + "mesh": 659, + "name": "Object_1024_Material.057_0" + }, + { + "children": [ + 1440 + ], + "matrix": [ + -2.394665479659169, + 3.6158442767314593e-07, + 2.003261594709e-06, + 0.0, + 9.168493375576648e-06, + -0.7668199183419725, + 11.098273329354576, + 0.0, + 1.2975900711774417e-06, + 6.214625215695976, + 0.42939097452298797, + 0.0, + 178.04000854492188, + 47.093109130859375, + 365.5276794433594, + 1.0 + ], + "name": "Text.180_615" + }, + { + "children": [ + 1441 + ], + "matrix": [ + 1.0, + -1.3244960683778123e-13, + -1.2434500420209317e-14, + 0.0, + 1.3244960693042545e-13, + 1.0, + 7.450580583046039e-09, + 0.0, + 1.2434498692228925e-14, + -7.45058013895683e-09, + 0.9999999403953552, + 0.0, + 0.0, + 0.0, + -4.76837158203125e-07, + 1.0 + ], + "name": "Object_1026" + }, + { + "mesh": 660, + "name": "Object_1026_Material.057_0" + }, + { + "children": [ + 1443 + ], + "matrix": [ + -2.394665479659169, + 3.6158442767314593e-07, + 2.003261594709e-06, + 0.0, + 9.168493375576648e-06, + -0.7668199183419725, + 11.098273329354576, + 0.0, + 1.2975900711774417e-06, + 6.214625215695976, + 0.42939097452298797, + 0.0, + 178.04000854492188, + 47.093109130859375, + 363.40740966796875, + 1.0 + ], + "name": "Text.181_616" + }, + { + "children": [ + 1444 + ], + "matrix": [ + 1.0, + -1.3244960683778123e-13, + -1.2434500420209317e-14, + 0.0, + 1.3244960693042545e-13, + 1.0, + 7.450580583046039e-09, + 0.0, + 1.2434498692228925e-14, + -7.45058013895683e-09, + 0.9999999403953552, + 0.0, + 1.4210854715202004e-14, + -7.105427357601002e-15, + -9.5367431640625e-07, + 1.0 + ], + "name": "Object_1028" + }, + { + "mesh": 661, + "name": "Object_1028_Material.057_0" + }, + { + "children": [ + 1446 + ], + "matrix": [ + 3.170864834217022e-07, + 2.331433835120228e-16, + -4.199937820434559, + 0.0, + -6.1819064262017545, + -0.42712937690407066, + -4.6672095087067e-07, + 0.0, + -0.42712937690406994, + 6.181906426201772, + -3.224737046318279e-08, + 0.0, + 177.29891967773438, + 47.093109130859375, + 364.2447204589844, + 1.0 + ], + "name": "Text.182_617" + }, + { + "children": [ + 1447 + ], + "matrix": [ + 0.9999999403953552, + 6.617444900424222e-24, + -8.271806125530277e-25, + 0.0, + -6.617445294854698e-24, + 1.0, + 1.725671097720702e-17, + 0.0, + 8.271806618568372e-25, + -1.725671097720702e-17, + 1.0, + 0.0, + -1.4210854715202004e-14, + 0.0, + 8.344650268554688e-07, + 1.0 + ], + "name": "Object_1030" + }, + { + "mesh": 662, + "name": "Object_1030_Material.057_0" + }, + { + "children": [ + 1449 + ], + "matrix": [ + 4.1141605353894217e-07, + 1.5125042499157434e-15, + -5.449370861053453, + 0.0, + -5.377026991255982, + 0.8849991619222521, + -4.0595424429955696e-07, + 0.0, + 0.8849991619222507, + 5.377026991255998, + 6.681557825200333e-08, + 0.0, + 122.22430419921875, + 53.64524841308594, + 358.7254333496094, + 1.0 + ], + "name": "Text.183_618" + }, + { + "children": [ + 1450 + ], + "matrix": [ + 1.0, + 0.0, + 1.654361225106055e-24, + 0.0, + -5.010614540829341e-41, + 1.0, + 3.0287306452725456e-17, + 0.0, + -1.654361225106055e-24, + -3.0287306452725456e-17, + 1.0, + 0.0, + 7.62939453125e-06, + -3.552713678800501e-15, + -7.152557373046875e-07, + 1.0 + ], + "name": "Object_1032" + }, + { + "mesh": 663, + "name": "Object_1032_Material.057_0" + }, + { + "children": [ + 1452 + ], + "matrix": [ + 4.910211378322619e-07, + -4.199713760450949e-16, + -2.5218439102172376, + 0.0, + -2.4883648257243483, + 0.40955732394575506, + -4.845025195012012e-07, + 0.0, + 0.40955732394574734, + 2.4883648257243953, + 7.974375443141777e-08, + 0.0, + 122.22430419921875, + 53.782283782958984, + 328.5050048828125, + 1.0 + ], + "name": "Text.184_619" + }, + { + "children": [ + 1453 + ], + "matrix": [ + 1.0, + 5.293955920339378e-23, + 0.0, + 0.0, + -5.293955920339378e-23, + 1.0, + 3.3306640580794464e-18, + 0.0, + 1.7632388708931264e-40, + -3.3306640580794464e-18, + 1.0, + 0.0, + 0.0, + -3.814697265625e-06, + 0.0, + 1.0 + ], + "name": "Object_1034" + }, + { + "mesh": 664, + "name": "Object_1034_Material.057_0" + }, + { + "children": [ + 1455 + ], + "matrix": [ + 4.910211378322619e-07, + -4.199713760450949e-16, + -2.5218439102172376, + 0.0, + -2.4883648257243483, + 0.40955732394575506, + -4.845025195012012e-07, + 0.0, + 0.40955732394574734, + 2.4883648257243953, + 7.974375443141777e-08, + 0.0, + 122.22430419921875, + 53.782283782958984, + 311.1342468261719, + 1.0 + ], + "name": "Text.185_620" + }, + { + "children": [ + 1456 + ], + "matrix": [ + 1.0, + 5.293955920339378e-23, + 0.0, + 0.0, + -5.293955920339378e-23, + 1.0, + 3.3306640580794464e-18, + 0.0, + 1.7632388708931264e-40, + -3.3306640580794464e-18, + 1.0, + 0.0, + -7.62939453125e-06, + -3.814697265625e-06, + 0.0, + 1.0 + ], + "name": "Object_1036" + }, + { + "mesh": 665, + "name": "Object_1036_Material.057_0" + }, + { + "children": [ + 1458 + ], + "matrix": [ + 4.910211378322619e-07, + -4.199713760450949e-16, + -2.5218439102172376, + 0.0, + -2.4883648257243483, + 0.40955732394575506, + -4.845025195012012e-07, + 0.0, + 0.40955732394574734, + 2.4883648257243953, + 7.974375443141777e-08, + 0.0, + 122.22430419921875, + 53.782283782958984, + 292.7678527832031, + 1.0 + ], + "name": "Text.186_621" + }, + { + "children": [ + 1459 + ], + "matrix": [ + 1.0, + 5.293955920339378e-23, + 0.0, + 0.0, + -5.293955920339378e-23, + 1.0, + 3.3306640580794464e-18, + 0.0, + 1.7632388708931264e-40, + -3.3306640580794464e-18, + 1.0, + 0.0, + 7.62939453125e-06, + -3.814697265625e-06, + 0.0, + 1.0 + ], + "name": "Object_1038" + }, + { + "mesh": 666, + "name": "Object_1038_Material.057_0" + }, + { + "children": [ + 1461 + ], + "matrix": [ + 4.1141605414394387e-07, + -6.050016999662974e-16, + -5.449370861053451, + 0.0, + -5.449370861053446, + -2.381995753059707e-07, + -4.1141605384144305e-07, + 0.0, + -2.381995753059707e-07, + 5.449370861053462, + -1.9360054398921515e-14, + 0.0, + 152.1118927001953, + 49.61494064331055, + 217.77520751953125, + 1.0 + ], + "name": "Text.187_622" + }, + { + "children": [ + 1462 + ], + "matrix": [ + 1.0000001192092896, + 0.0, + -7.888609052210116e-31, + 0.0, + 3.397249496053103e-54, + 1.0, + 4.3065258761745956e-24, + 0.0, + 7.888608111814748e-31, + -4.3065258761745956e-24, + 1.0, + 0.0, + 0.0, + 3.814697265625e-06, + -1.0179239779972704e-06, + 1.0 + ], + "name": "Object_1040" + }, + { + "mesh": 667, + "name": "Object_1040_Tasten_2_0" + }, + { + "children": [ + 1464 + ], + "matrix": [ + 4.1141605414394387e-07, + -6.050016999662974e-16, + -5.449370861053451, + 0.0, + -5.449370861053446, + -2.381995753059707e-07, + -4.1141605384144305e-07, + 0.0, + -2.381995753059707e-07, + 5.449370861053462, + -1.9360054398921515e-14, + 0.0, + 123.40980529785156, + 53.50948715209961, + 217.77520751953125, + 1.0 + ], + "name": "Text.188_623" + }, + { + "children": [ + 1465 + ], + "matrix": [ + 1.0000001192092896, + 0.0, + -7.888609052210116e-31, + 0.0, + 3.397249496053103e-54, + 1.0, + 4.3065258761745956e-24, + 0.0, + 7.888608111814748e-31, + -4.3065258761745956e-24, + 1.0, + 0.0, + 0.0, + -3.552713678800501e-15, + 1.8175069271819666e-07, + 1.0 + ], + "name": "Object_1042" + }, + { + "mesh": 668, + "name": "Object_1042_Tasten_2_0" + }, + { + "children": [ + 1467 + ], + "matrix": [ + 4.910211378322619e-07, + -4.199713760450949e-16, + -2.5218439102172376, + 0.0, + -2.4883648257243483, + 0.40955732394575506, + -4.845025195012012e-07, + 0.0, + 0.40955732394574734, + 2.4883648257243953, + 7.974375443141777e-08, + 0.0, + 140.39271545410156, + 50.55778503417969, + 328.60052490234375, + 1.0 + ], + "name": "Text.189_624" + }, + { + "children": [ + 1468 + ], + "matrix": [ + 1.0, + 5.293955920339378e-23, + 0.0, + 0.0, + -5.293955920339378e-23, + 1.0, + 3.3306640580794464e-18, + 0.0, + 1.7632388708931264e-40, + -3.3306640580794464e-18, + 1.0, + 0.0, + 0.0, + -7.62939453125e-06, + 0.0, + 1.0 + ], + "name": "Object_1044" + }, + { + "mesh": 669, + "name": "Object_1044_Material.057_0" + }, + { + "children": [ + 1470 + ], + "matrix": [ + 4.910211378322619e-07, + -4.199713760450949e-16, + -2.5218439102172376, + 0.0, + -2.4883648257243483, + 0.40955732394575506, + -4.845025195012012e-07, + 0.0, + 0.40955732394574734, + 2.4883648257243953, + 7.974375443141777e-08, + 0.0, + 140.39271545410156, + 50.55778503417969, + 310.0890197753906, + 1.0 + ], + "name": "Text.190_625" + }, + { + "children": [ + 1471 + ], + "matrix": [ + 1.0, + 5.293955920339378e-23, + 0.0, + 0.0, + -5.293955920339378e-23, + 1.0, + 3.3306640580794464e-18, + 0.0, + 1.7632388708931264e-40, + -3.3306640580794464e-18, + 1.0, + 0.0, + -1.4210854715202004e-14, + -7.62939453125e-06, + 0.0, + 1.0 + ], + "name": "Object_1046" + }, + { + "mesh": 670, + "name": "Object_1046_Material.057_0" + }, + { + "children": [ + 1473 + ], + "matrix": [ + 4.910211378322619e-07, + -4.199713760450949e-16, + -2.5218439102172376, + 0.0, + -2.4883648257243483, + 0.40955732394575506, + -4.845025195012012e-07, + 0.0, + 0.40955732394574734, + 2.4883648257243953, + 7.974375443141777e-08, + 0.0, + 140.39271545410156, + 50.55778503417969, + 293.0292053222656, + 1.0 + ], + "name": "Text.191_626" + }, + { + "children": [ + 1474 + ], + "matrix": [ + 1.0, + 5.293955920339378e-23, + 0.0, + 0.0, + -5.293955920339378e-23, + 1.0, + 3.3306640580794464e-18, + 0.0, + 1.7632388708931264e-40, + -3.3306640580794464e-18, + 1.0, + 0.0, + 7.62939453125e-06, + -7.62939453125e-06, + 0.0, + 1.0 + ], + "name": "Object_1048" + }, + { + "mesh": 671, + "name": "Object_1048_Material.057_0" + }, + { + "children": [ + 1476 + ], + "matrix": [ + 4.1141605414394387e-07, + -6.050016999662974e-16, + -5.449370861053451, + 0.0, + -5.449370861053446, + -2.381995753059707e-07, + -4.1141605384144305e-07, + 0.0, + -2.381995753059707e-07, + 5.449370861053462, + -1.9360054398921515e-14, + 0.0, + 126.58975982666016, + 53.66515350341797, + 235.64443969726563, + 1.0 + ], + "name": "Text.192_627" + }, + { + "children": [ + 1477 + ], + "matrix": [ + 1.0000001192092896, + 0.0, + -7.888609052210116e-31, + 0.0, + 3.397249496053103e-54, + 1.0, + 4.3065258761745956e-24, + 0.0, + 7.888608111814748e-31, + -4.3065258761745956e-24, + 1.0, + 0.0, + 0.0, + 0.0, + 2.6015482035290916e-07, + 1.0 + ], + "name": "Object_1050" + }, + { + "mesh": 672, + "name": "Object_1050_Tasten_2_0" + }, + { + "children": [ + 1479 + ], + "matrix": [ + 2.2571393404784143e-07, + -4.978803548028022e-16, + -2.989671707153312, + 0.0, + -2.949982439005258, + 0.48553411547175734, + -2.2271747781646052e-07, + 0.0, + 0.48553411547175584, + 2.949982439005266, + 3.665680544278151e-08, + 0.0, + 138.83164978027344, + 50.65608596801758, + 360.8417053222656, + 1.0 + ], + "name": "Text.193_628" + }, + { + "children": [ + 1480 + ], + "matrix": [ + 1.0, + -1.3234889800848446e-23, + -4.9630836753181675e-24, + 0.0, + 1.323488901198754e-23, + 0.9999999403953552, + -2.5223146693456648e-17, + 0.0, + 4.963083379495328e-24, + 2.5223146693456648e-17, + 0.9999999403953552, + 0.0, + -7.62939453125e-06, + -7.105427357601002e-15, + 1.430511474609375e-06, + 1.0 + ], + "name": "Object_1052" + }, + { + "mesh": 673, + "name": "Object_1052_Material.057_0" + }, + { + "children": [ + 1482 + ], + "matrix": [ + 1.3068270615197722e-07, + 0.0, + -2.989671707153317, + 0.0, + -2.9868779248066955, + 0.12922859601817704, + -1.305605858053503e-07, + 0.0, + 0.1292285960181767, + 2.986877924806698, + 5.648761548165372e-09, + 0.0, + 138.83164978027344, + 50.51897048950195, + 377.70513916015625, + 1.0 + ], + "name": "Text.194_629" + }, + { + "children": [ + 1483 + ], + "matrix": [ + 1.0, + -6.61744490042422e-24, + 8.271806125530275e-25, + 0.0, + 6.61744490042422e-24, + 1.0, + 7.545220917071648e-19, + 0.0, + -8.271806125530275e-25, + -7.545220917071648e-19, + 1.0, + 0.0, + -7.62939453125e-06, + 3.814697265625e-06, + -1.1920928955078125e-06, + 1.0 + ], + "name": "Object_1054" + }, + { + "mesh": 674, + "name": "Object_1054_Material.057_0" + }, + { + "children": [ + 1485 + ], + "matrix": [ + 1.3068270615197722e-07, + 0.0, + -2.989671707153317, + 0.0, + -2.9868779248066955, + 0.12922859601817704, + -1.305605858053503e-07, + 0.0, + 0.1292285960181767, + 2.986877924806698, + 5.648761548165372e-09, + 0.0, + 138.83164978027344, + 50.625091552734375, + 395.77130126953125, + 1.0 + ], + "name": "Text.195_630" + }, + { + "children": [ + 1486 + ], + "matrix": [ + 1.0, + -6.61744490042422e-24, + 8.271806125530275e-25, + 0.0, + 6.61744490042422e-24, + 1.0, + 7.545220917071648e-19, + 0.0, + -8.271806125530275e-25, + -7.545220917071648e-19, + 1.0, + 0.0, + 2.842170943040401e-14, + 7.62939453125e-06, + 7.152557373046875e-07, + 1.0 + ], + "name": "Object_1056" + }, + { + "mesh": 675, + "name": "Object_1056_Material.073_0" + }, + { + "children": [ + 1488 + ], + "matrix": [ + 9.118287290939222e-07, + -7.798889631628072e-16, + -4.683076858520419, + 0.0, + -4.620907911814933, + 0.7605503256588542, + -8.997239884250717e-07, + 0.0, + 0.7605503256588398, + 4.62090791181502, + 1.480846144265444e-07, + 0.0, + 122.22430419921875, + 53.899147033691406, + 387.24560546875, + 1.0 + ], + "name": "Text.196_631" + }, + { + "children": [ + 1489 + ], + "matrix": [ + 0.9999999403953552, + 5.293955920339376e-23, + -6.61744490042422e-24, + 0.0, + -5.293955604794995e-23, + 0.9999998807907104, + 5.884253950250755e-17, + 0.0, + 6.617444505993747e-24, + -5.884253950250755e-17, + 0.9999998807907104, + 0.0, + 1.4210854715202004e-14, + -1.9073486328125e-06, + -1.9073486328125e-06, + 1.0 + ], + "name": "Object_1058" + }, + { + "mesh": 676, + "name": "Object_1058_Material.057_0" + }, + { + "children": [ + 1491 + ], + "matrix": [ + 9.118287290939222e-07, + -7.798889631628072e-16, + -4.683076858520419, + 0.0, + -4.620907911814933, + 0.7605503256588542, + -8.997239884250717e-07, + 0.0, + 0.7605503256588398, + 4.62090791181502, + 1.480846144265444e-07, + 0.0, + 118.87957000732422, + 54.41367721557617, + 404.7262268066406, + 1.0 + ], + "name": "Text.197_632" + }, + { + "children": [ + 1492 + ], + "matrix": [ + 0.9999999403953552, + 5.293955920339376e-23, + -6.61744490042422e-24, + 0.0, + -5.293955604794995e-23, + 0.9999998807907104, + 5.884253950250755e-17, + 0.0, + 6.617444505993747e-24, + -5.884253950250755e-17, + 0.9999998807907104, + 0.0, + -1.4210854715202004e-14, + 0.0, + -9.5367431640625e-07, + 1.0 + ], + "name": "Object_1060" + }, + { + "mesh": 677, + "name": "Object_1060_Material.060_0" + }, + { + "children": [ + 1494 + ], + "matrix": [ + 2.4886859179072696, + 0.09814404097504796, + 3.435742404885225e-07, + 0.0, + -0.013895263279525128, + 0.35236488758051654, + -4.56354207454423, + 0.0, + -0.09854444422531951, + 2.4988384603056013, + 0.19324292835248466, + 0.0, + 178.586181640625, + 47.22291564941406, + 251.2159423828125, + 1.0 + ], + "name": "Text.198_633" + }, + { + "children": [ + 1495 + ], + "matrix": [ + 1.0000001192092896, + 5.238689553222413e-10, + 3.72529075904907e-09, + 0.0, + -5.238689622611369e-10, + 1.0000001192092896, + 1.8626455933201665e-09, + 0.0, + -3.7252900919394708e-09, + -1.8626452622047833e-09, + 0.9999999403953552, + 0.0, + 7.62939453125e-06, + 3.814697265625e-06, + -9.5367431640625e-07, + 1.0 + ], + "name": "Object_1062" + }, + { + "mesh": 678, + "name": "Object_1062_Tasten_2_0" + }, + { + "children": [ + 1497 + ], + "matrix": [ + 0.0032393533677320826, + 3.0663352277703794e-05, + -4.723081431455183, + 0.0, + -4.025640805509574, + -0.31686633530155456, + -0.0027630667550552213, + 0.0, + -0.2149741875977424, + 2.7311491430564945, + -0.00012971005881727186, + 0.0, + 175.03382873535156, + 47.035972595214844, + 250.74853515625, + 1.0 + ], + "name": "Text.199_634" + }, + { + "children": [ + 1498 + ], + "matrix": [ + 0.9999998807907104, + -6.394887332346332e-12, + 4.5474738612303464e-12, + 0.0, + 6.394888103146732e-12, + 1.0, + -1.862645386530381e-09, + 0.0, + -4.547474120369535e-12, + 1.8626452755080933e-09, + 0.9999999403953552, + 0.0, + 7.62939453125e-06, + -3.814697265625e-06, + 1.7763568394002505e-15, + 1.0 + ], + "name": "Object_1064" + }, + { + "mesh": 679, + "name": "Object_1064_Tasten_2_0" + }, + { + "children": [ + 1500 + ], + "matrix": [ + 0.0032393533677320826, + 3.0663352277703794e-05, + -4.723081431455183, + 0.0, + -4.025640805509574, + -0.31686633530155456, + -0.0027630667550552213, + 0.0, + -0.2149741875977424, + 2.7311491430564945, + -0.00012971005881727186, + 0.0, + 175.03382873535156, + 47.035972595214844, + 267.89801025390625, + 1.0 + ], + "name": "Text.200_635" + }, + { + "children": [ + 1501 + ], + "matrix": [ + 0.9999998807907104, + -6.394887332346332e-12, + 4.5474738612303464e-12, + 0.0, + 6.394888103146732e-12, + 1.0, + -1.862645386530381e-09, + 0.0, + -4.547474120369535e-12, + 1.8626452755080933e-09, + 0.9999999403953552, + 0.0, + 7.62939453125e-06, + 0.0, + 4.76837158203125e-07, + 1.0 + ], + "name": "Object_1066" + }, + { + "mesh": 680, + "name": "Object_1066_Material.067_0" + }, + { + "children": [ + 1503 + ], + "matrix": [ + 0.0020782449708080537, + 1.9672431632202274e-05, + -3.0301480318310454, + 0.0, + -2.582696697966174, + -0.2032892842202737, + -0.001772677625578152, + 0.0, + -0.1379191834044024, + 1.752200409617647, + -8.321699266002022e-05, + 0.0, + 180.14515686035156, + 47.43604278564453, + 269.1224060058594, + 1.0 + ], + "name": "Text.201_636" + }, + { + "children": [ + 1504 + ], + "matrix": [ + 1.0, + 2.2978952074481634e-11, + 6.025402399245649e-12, + 0.0, + -2.2978950682382985e-11, + 0.9999999403953552, + -3.7252905438254154e-09, + 0.0, + -6.025402125706953e-12, + 3.7252905438252765e-09, + 0.9999999403953552, + 0.0, + -7.62939453125e-06, + 1.4210854715202004e-14, + -9.5367431640625e-07, + 1.0 + ], + "name": "Object_1068" + }, + { + "mesh": 681, + "name": "Object_1068_Material.067_0" + }, + { + "children": [ + 1506 + ], + "matrix": [ + 0.0032393533677320826, + 3.0663352277703794e-05, + -4.723081431455183, + 0.0, + -4.025640805509574, + -0.31686633530155456, + -0.0027630667550552213, + 0.0, + -0.2149741875977424, + 2.7311491430564945, + -0.00012971005881727186, + 0.0, + 175.03382873535156, + 47.035972595214844, + 233.44607543945313, + 1.0 + ], + "name": "Text.202_637" + }, + { + "children": [ + 1507 + ], + "matrix": [ + 0.9999998807907104, + -6.394887332346332e-12, + 4.5474738612303464e-12, + 0.0, + 6.394888103146732e-12, + 1.0, + -1.862645386530381e-09, + 0.0, + -4.547474120369535e-12, + 1.8626452755080933e-09, + 0.9999999403953552, + 0.0, + 7.62939453125e-06, + 3.814697265625e-06, + 4.76837158203125e-07, + 1.0 + ], + "name": "Object_1070" + }, + { + "mesh": 682, + "name": "Object_1070_Tasten_2_0" + }, + { + "children": [ + 1509 + ], + "matrix": [ + 0.0020782449708080537, + 1.9672431632202274e-05, + -3.0301480318310454, + 0.0, + -2.582696697966174, + -0.2032892842202737, + -0.001772677625578152, + 0.0, + -0.1379191834044024, + 1.752200409617647, + -8.321699266002022e-05, + 0.0, + 180.14515686035156, + 47.58256912231445, + 235.554931640625, + 1.0 + ], + "name": "Text.203_638" + }, + { + "children": [ + 1510 + ], + "matrix": [ + 1.0, + 2.2978952074481634e-11, + 6.025402399245649e-12, + 0.0, + -2.2978950682382985e-11, + 0.9999999403953552, + -3.7252905438254154e-09, + 0.0, + -6.025402125706953e-12, + 3.7252905438252765e-09, + 0.9999999403953552, + 0.0, + 0.0, + 7.62939453125e-06, + 0.0, + 1.0 + ], + "name": "Object_1072" + }, + { + "mesh": 683, + "name": "Object_1072_Tasten_2_0" + }, + { + "children": [ + 1512 + ], + "matrix": [ + 2.0372185952330335e-07, + 1.4979006078116912e-16, + -2.6983778476715012, + 0.0, + -2.691959913944137, + -0.1859968562157866, + -2.0323731938363872e-07, + 0.0, + -0.18599685621578632, + 2.691959913944145, + -1.4042371823853477e-08, + 0.0, + 192.11471557617188, + 45.45188522338867, + 545.4623413085938, + 1.0 + ], + "name": "Text.204_639" + }, + { + "children": [ + 1513 + ], + "matrix": [ + 1.0, + -1.3234889800848443e-23, + -8.271806125530277e-25, + 0.0, + 1.3234889011987538e-23, + 0.9999999403953552, + -2.4376675808693188e-17, + 0.0, + 8.271805632492215e-25, + 2.4376675808693188e-17, + 0.9999999403953552, + 0.0, + -1.52587890625e-05, + 0.0, + 4.76837158203125e-07, + 1.0 + ], + "name": "Object_1074" + }, + { + "mesh": 684, + "name": "Object_1074_Material.069_0" + } + ], + "samplers": [ + { + "magFilter": 9729, + "minFilter": 9987, + "wrapS": 10497, + "wrapT": 10497 + }, + { + "magFilter": 9729, + "minFilter": 9987, + "wrapS": 33071, + "wrapT": 33071 + } + ], + "scene": 0, + "scenes": [ + { + "name": "Sketchfab_Scene", + "nodes": [ + 0 + ] + } + ], + "textures": [ + { + "sampler": 0, + "source": 0 + }, + { + "sampler": 0, + "source": 1 + }, + { + "sampler": 0, + "source": 2 + }, + { + "sampler": 1, + "source": 3 + }, + { + "sampler": 0, + "source": 3 + }, + { + "sampler": 0, + "source": 4 + }, + { + "sampler": 0, + "source": 5 + }, + { + "sampler": 1, + "source": 6 + }, + { + "sampler": 1, + "source": 7 + }, + { + "sampler": 0, + "source": 8 + }, + { + "sampler": 0, + "source": 9 + }, + { + "sampler": 0, + "source": 10 + }, + { + "sampler": 1, + "source": 11 + }, + { + "sampler": 0, + "source": 12 + }, + { + "sampler": 0, + "source": 13 + }, + { + "sampler": 0, + "source": 14 + }, + { + "sampler": 1, + "source": 15 + }, + { + "sampler": 0, + "source": 16 + }, + { + "sampler": 1, + "source": 17 + }, + { + "sampler": 0, + "source": 17 + }, + { + "sampler": 0, + "source": 18 + }, + { + "sampler": 1, + "source": 19 + }, + { + "sampler": 1, + "source": 20 + }, + { + "sampler": 1, + "source": 21 + }, + { + "sampler": 0, + "source": 22 + }, + { + "sampler": 0, + "source": 23 + }, + { + "sampler": 0, + "source": 24 + }, + { + "sampler": 1, + "source": 25 + }, + { + "sampler": 0, + "source": 26 + }, + { + "sampler": 0, + "source": 27 + }, + { + "sampler": 0, + "source": 28 + }, + { + "sampler": 0, + "source": 29 + }, + { + "sampler": 0, + "source": 30 + }, + { + "sampler": 0, + "source": 31 + }, + { + "sampler": 1, + "source": 32 + }, + { + "sampler": 0, + "source": 33 + }, + { + "sampler": 0, + "source": 34 + }, + { + "sampler": 0, + "source": 35 + }, + { + "sampler": 1, + "source": 36 + }, + { + "sampler": 0, + "source": 37 + }, + { + "sampler": 1, + "source": 38 + }, + { + "sampler": 1, + "source": 39 + }, + { + "sampler": 1, + "source": 40 + }, + { + "sampler": 0, + "source": 40 + }, + { + "sampler": 1, + "source": 41 + }, + { + "sampler": 0, + "source": 42 + }, + { + "sampler": 0, + "source": 43 + }, + { + "sampler": 0, + "source": 44 + }, + { + "sampler": 0, + "source": 45 + }, + { + "sampler": 0, + "source": 46 + }, + { + "sampler": 0, + "source": 47 + }, + { + "sampler": 0, + "source": 48 + }, + { + "sampler": 0, + "source": 49 + }, + { + "sampler": 1, + "source": 50 + } + ] +} diff --git a/app/public/desktop_pc/textures/Material.002_baseColor.png b/app/public/desktop_pc/textures/Material.002_baseColor.png new file mode 100644 index 0000000..2382787 Binary files /dev/null and b/app/public/desktop_pc/textures/Material.002_baseColor.png differ diff --git a/app/public/desktop_pc/textures/Material.023_baseColor.jpeg b/app/public/desktop_pc/textures/Material.023_baseColor.jpeg new file mode 100644 index 0000000..cbf5b0f Binary files /dev/null and b/app/public/desktop_pc/textures/Material.023_baseColor.jpeg differ diff --git a/app/public/desktop_pc/textures/Material.024_baseColor.jpeg b/app/public/desktop_pc/textures/Material.024_baseColor.jpeg new file mode 100644 index 0000000..aad1975 Binary files /dev/null and b/app/public/desktop_pc/textures/Material.024_baseColor.jpeg differ diff --git a/app/public/desktop_pc/textures/Material.074_0_baseColor.png b/app/public/desktop_pc/textures/Material.074_0_baseColor.png new file mode 100644 index 0000000..f8e37e2 Binary files /dev/null and b/app/public/desktop_pc/textures/Material.074_0_baseColor.png differ diff --git a/app/public/desktop_pc/textures/Material.074_10_baseColor.jpeg b/app/public/desktop_pc/textures/Material.074_10_baseColor.jpeg new file mode 100644 index 0000000..98c2b6c Binary files /dev/null and b/app/public/desktop_pc/textures/Material.074_10_baseColor.jpeg differ diff --git a/app/public/desktop_pc/textures/Material.074_11_baseColor.png b/app/public/desktop_pc/textures/Material.074_11_baseColor.png new file mode 100644 index 0000000..756b35a Binary files /dev/null and b/app/public/desktop_pc/textures/Material.074_11_baseColor.png differ diff --git a/app/public/desktop_pc/textures/Material.074_12_baseColor.jpeg b/app/public/desktop_pc/textures/Material.074_12_baseColor.jpeg new file mode 100644 index 0000000..f893026 Binary files /dev/null and b/app/public/desktop_pc/textures/Material.074_12_baseColor.jpeg differ diff --git a/app/public/desktop_pc/textures/Material.074_13_baseColor.png b/app/public/desktop_pc/textures/Material.074_13_baseColor.png new file mode 100644 index 0000000..af1bf0f Binary files /dev/null and b/app/public/desktop_pc/textures/Material.074_13_baseColor.png differ diff --git a/app/public/desktop_pc/textures/Material.074_14_baseColor.png b/app/public/desktop_pc/textures/Material.074_14_baseColor.png new file mode 100644 index 0000000..76bdcfa Binary files /dev/null and b/app/public/desktop_pc/textures/Material.074_14_baseColor.png differ diff --git a/app/public/desktop_pc/textures/Material.074_15_baseColor.png b/app/public/desktop_pc/textures/Material.074_15_baseColor.png new file mode 100644 index 0000000..e0b0853 Binary files /dev/null and b/app/public/desktop_pc/textures/Material.074_15_baseColor.png differ diff --git a/app/public/desktop_pc/textures/Material.074_16_baseColor.png b/app/public/desktop_pc/textures/Material.074_16_baseColor.png new file mode 100644 index 0000000..aa1d5db Binary files /dev/null and b/app/public/desktop_pc/textures/Material.074_16_baseColor.png differ diff --git a/app/public/desktop_pc/textures/Material.074_17_baseColor.png b/app/public/desktop_pc/textures/Material.074_17_baseColor.png new file mode 100644 index 0000000..17ff47b Binary files /dev/null and b/app/public/desktop_pc/textures/Material.074_17_baseColor.png differ diff --git a/app/public/desktop_pc/textures/Material.074_18_baseColor.png b/app/public/desktop_pc/textures/Material.074_18_baseColor.png new file mode 100644 index 0000000..f8639fd Binary files /dev/null and b/app/public/desktop_pc/textures/Material.074_18_baseColor.png differ diff --git a/app/public/desktop_pc/textures/Material.074_18_emissive.png b/app/public/desktop_pc/textures/Material.074_18_emissive.png new file mode 100644 index 0000000..f34e627 Binary files /dev/null and b/app/public/desktop_pc/textures/Material.074_18_emissive.png differ diff --git a/app/public/desktop_pc/textures/Material.074_19_baseColor.png b/app/public/desktop_pc/textures/Material.074_19_baseColor.png new file mode 100644 index 0000000..4061886 Binary files /dev/null and b/app/public/desktop_pc/textures/Material.074_19_baseColor.png differ diff --git a/app/public/desktop_pc/textures/Material.074_1_baseColor.jpeg b/app/public/desktop_pc/textures/Material.074_1_baseColor.jpeg new file mode 100644 index 0000000..babda6d Binary files /dev/null and b/app/public/desktop_pc/textures/Material.074_1_baseColor.jpeg differ diff --git a/app/public/desktop_pc/textures/Material.074_20_baseColor.png b/app/public/desktop_pc/textures/Material.074_20_baseColor.png new file mode 100644 index 0000000..5c93dbc Binary files /dev/null and b/app/public/desktop_pc/textures/Material.074_20_baseColor.png differ diff --git a/app/public/desktop_pc/textures/Material.074_21_baseColor.png b/app/public/desktop_pc/textures/Material.074_21_baseColor.png new file mode 100644 index 0000000..7ec8eec Binary files /dev/null and b/app/public/desktop_pc/textures/Material.074_21_baseColor.png differ diff --git a/app/public/desktop_pc/textures/Material.074_22_baseColor.png b/app/public/desktop_pc/textures/Material.074_22_baseColor.png new file mode 100644 index 0000000..207a4e0 Binary files /dev/null and b/app/public/desktop_pc/textures/Material.074_22_baseColor.png differ diff --git a/app/public/desktop_pc/textures/Material.074_23_baseColor.png b/app/public/desktop_pc/textures/Material.074_23_baseColor.png new file mode 100644 index 0000000..0ab62a5 Binary files /dev/null and b/app/public/desktop_pc/textures/Material.074_23_baseColor.png differ diff --git a/app/public/desktop_pc/textures/Material.074_24_baseColor.png b/app/public/desktop_pc/textures/Material.074_24_baseColor.png new file mode 100644 index 0000000..5ab4901 Binary files /dev/null and b/app/public/desktop_pc/textures/Material.074_24_baseColor.png differ diff --git a/app/public/desktop_pc/textures/Material.074_24_emissive.png b/app/public/desktop_pc/textures/Material.074_24_emissive.png new file mode 100644 index 0000000..42bd4c0 Binary files /dev/null and b/app/public/desktop_pc/textures/Material.074_24_emissive.png differ diff --git a/app/public/desktop_pc/textures/Material.074_25_baseColor.jpeg b/app/public/desktop_pc/textures/Material.074_25_baseColor.jpeg new file mode 100644 index 0000000..697b30b Binary files /dev/null and b/app/public/desktop_pc/textures/Material.074_25_baseColor.jpeg differ diff --git a/app/public/desktop_pc/textures/Material.074_26_baseColor.png b/app/public/desktop_pc/textures/Material.074_26_baseColor.png new file mode 100644 index 0000000..7b06ef0 Binary files /dev/null and b/app/public/desktop_pc/textures/Material.074_26_baseColor.png differ diff --git a/app/public/desktop_pc/textures/Material.074_27_baseColor.png b/app/public/desktop_pc/textures/Material.074_27_baseColor.png new file mode 100644 index 0000000..62811cd Binary files /dev/null and b/app/public/desktop_pc/textures/Material.074_27_baseColor.png differ diff --git a/app/public/desktop_pc/textures/Material.074_27_emissive.png b/app/public/desktop_pc/textures/Material.074_27_emissive.png new file mode 100644 index 0000000..debe50d Binary files /dev/null and b/app/public/desktop_pc/textures/Material.074_27_emissive.png differ diff --git a/app/public/desktop_pc/textures/Material.074_28_baseColor.png b/app/public/desktop_pc/textures/Material.074_28_baseColor.png new file mode 100644 index 0000000..d4f64b7 Binary files /dev/null and b/app/public/desktop_pc/textures/Material.074_28_baseColor.png differ diff --git a/app/public/desktop_pc/textures/Material.074_29_baseColor.png b/app/public/desktop_pc/textures/Material.074_29_baseColor.png new file mode 100644 index 0000000..a2f7bd5 Binary files /dev/null and b/app/public/desktop_pc/textures/Material.074_29_baseColor.png differ diff --git a/app/public/desktop_pc/textures/Material.074_2_baseColor.jpeg b/app/public/desktop_pc/textures/Material.074_2_baseColor.jpeg new file mode 100644 index 0000000..bba8a65 Binary files /dev/null and b/app/public/desktop_pc/textures/Material.074_2_baseColor.jpeg differ diff --git a/app/public/desktop_pc/textures/Material.074_30_baseColor.png b/app/public/desktop_pc/textures/Material.074_30_baseColor.png new file mode 100644 index 0000000..d86c32e Binary files /dev/null and b/app/public/desktop_pc/textures/Material.074_30_baseColor.png differ diff --git a/app/public/desktop_pc/textures/Material.074_31_baseColor.png b/app/public/desktop_pc/textures/Material.074_31_baseColor.png new file mode 100644 index 0000000..17753eb Binary files /dev/null and b/app/public/desktop_pc/textures/Material.074_31_baseColor.png differ diff --git a/app/public/desktop_pc/textures/Material.074_32_baseColor.jpeg b/app/public/desktop_pc/textures/Material.074_32_baseColor.jpeg new file mode 100644 index 0000000..c138063 Binary files /dev/null and b/app/public/desktop_pc/textures/Material.074_32_baseColor.jpeg differ diff --git a/app/public/desktop_pc/textures/Material.074_33_baseColor.png b/app/public/desktop_pc/textures/Material.074_33_baseColor.png new file mode 100644 index 0000000..bb0742e Binary files /dev/null and b/app/public/desktop_pc/textures/Material.074_33_baseColor.png differ diff --git a/app/public/desktop_pc/textures/Material.074_34_baseColor.jpeg b/app/public/desktop_pc/textures/Material.074_34_baseColor.jpeg new file mode 100644 index 0000000..6604143 Binary files /dev/null and b/app/public/desktop_pc/textures/Material.074_34_baseColor.jpeg differ diff --git a/app/public/desktop_pc/textures/Material.074_35_baseColor.png b/app/public/desktop_pc/textures/Material.074_35_baseColor.png new file mode 100644 index 0000000..4d856bb Binary files /dev/null and b/app/public/desktop_pc/textures/Material.074_35_baseColor.png differ diff --git a/app/public/desktop_pc/textures/Material.074_36_baseColor.jpeg b/app/public/desktop_pc/textures/Material.074_36_baseColor.jpeg new file mode 100644 index 0000000..7952cca Binary files /dev/null and b/app/public/desktop_pc/textures/Material.074_36_baseColor.jpeg differ diff --git a/app/public/desktop_pc/textures/Material.074_39_baseColor.jpeg b/app/public/desktop_pc/textures/Material.074_39_baseColor.jpeg new file mode 100644 index 0000000..98aaad5 Binary files /dev/null and b/app/public/desktop_pc/textures/Material.074_39_baseColor.jpeg differ diff --git a/app/public/desktop_pc/textures/Material.074_3_baseColor.png b/app/public/desktop_pc/textures/Material.074_3_baseColor.png new file mode 100644 index 0000000..c366d75 Binary files /dev/null and b/app/public/desktop_pc/textures/Material.074_3_baseColor.png differ diff --git a/app/public/desktop_pc/textures/Material.074_40_baseColor.png b/app/public/desktop_pc/textures/Material.074_40_baseColor.png new file mode 100644 index 0000000..e536cfe Binary files /dev/null and b/app/public/desktop_pc/textures/Material.074_40_baseColor.png differ diff --git a/app/public/desktop_pc/textures/Material.074_4_baseColor.png b/app/public/desktop_pc/textures/Material.074_4_baseColor.png new file mode 100644 index 0000000..c15b9e3 Binary files /dev/null and b/app/public/desktop_pc/textures/Material.074_4_baseColor.png differ diff --git a/app/public/desktop_pc/textures/Material.074_4_emissive.png b/app/public/desktop_pc/textures/Material.074_4_emissive.png new file mode 100644 index 0000000..fe36fea Binary files /dev/null and b/app/public/desktop_pc/textures/Material.074_4_emissive.png differ diff --git a/app/public/desktop_pc/textures/Material.074_5_baseColor.png b/app/public/desktop_pc/textures/Material.074_5_baseColor.png new file mode 100644 index 0000000..932012e Binary files /dev/null and b/app/public/desktop_pc/textures/Material.074_5_baseColor.png differ diff --git a/app/public/desktop_pc/textures/Material.074_6_baseColor.png b/app/public/desktop_pc/textures/Material.074_6_baseColor.png new file mode 100644 index 0000000..d05a7cc Binary files /dev/null and b/app/public/desktop_pc/textures/Material.074_6_baseColor.png differ diff --git a/app/public/desktop_pc/textures/Material.074_7_baseColor.png b/app/public/desktop_pc/textures/Material.074_7_baseColor.png new file mode 100644 index 0000000..c857a06 Binary files /dev/null and b/app/public/desktop_pc/textures/Material.074_7_baseColor.png differ diff --git a/app/public/desktop_pc/textures/Material.074_8_baseColor.png b/app/public/desktop_pc/textures/Material.074_8_baseColor.png new file mode 100644 index 0000000..a1ee546 Binary files /dev/null and b/app/public/desktop_pc/textures/Material.074_8_baseColor.png differ diff --git a/app/public/desktop_pc/textures/Material.074_9_baseColor.png b/app/public/desktop_pc/textures/Material.074_9_baseColor.png new file mode 100644 index 0000000..a0b8aa1 Binary files /dev/null and b/app/public/desktop_pc/textures/Material.074_9_baseColor.png differ diff --git a/app/public/desktop_pc/textures/Material.074_9_emissive.png b/app/public/desktop_pc/textures/Material.074_9_emissive.png new file mode 100644 index 0000000..c92cd41 Binary files /dev/null and b/app/public/desktop_pc/textures/Material.074_9_emissive.png differ diff --git a/app/public/desktop_pc/textures/Material.074_baseColor.png b/app/public/desktop_pc/textures/Material.074_baseColor.png new file mode 100644 index 0000000..f62313d Binary files /dev/null and b/app/public/desktop_pc/textures/Material.074_baseColor.png differ diff --git a/app/public/desktop_pc/textures/Material_baseColor.jpeg b/app/public/desktop_pc/textures/Material_baseColor.jpeg new file mode 100644 index 0000000..b89e0c3 Binary files /dev/null and b/app/public/desktop_pc/textures/Material_baseColor.jpeg differ diff --git a/app/public/desktop_pc/textures/Material_metallicRoughness.png b/app/public/desktop_pc/textures/Material_metallicRoughness.png new file mode 100644 index 0000000..415231e Binary files /dev/null and b/app/public/desktop_pc/textures/Material_metallicRoughness.png differ diff --git a/app/public/desktop_pc/textures/Tasten_2_baseColor.jpeg b/app/public/desktop_pc/textures/Tasten_2_baseColor.jpeg new file mode 100644 index 0000000..0703271 Binary files /dev/null and b/app/public/desktop_pc/textures/Tasten_2_baseColor.jpeg differ diff --git a/app/public/logo.svg b/app/public/logo.svg new file mode 100644 index 0000000..b60f55d --- /dev/null +++ b/app/public/logo.svg @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + diff --git a/app/public/planet/license.txt b/app/public/planet/license.txt new file mode 100644 index 0000000..08f651a --- /dev/null +++ b/app/public/planet/license.txt @@ -0,0 +1,11 @@ +Model Information: +* title: Stylized planet +* source: https://sketchfab.com/3d-models/stylized-planet-789725db86f547fc9163b00f302c3e70 +* author: cmzw (https://sketchfab.com/cmzw) + +Model License: +* license type: CC-BY-4.0 (http://creativecommons.org/licenses/by/4.0/) +* requirements: Author must be credited. Commercial use is allowed. + +If you use this 3D model in your project be sure to copy paste this credit wherever you share it: +This work is based on "Stylized planet" (https://sketchfab.com/3d-models/stylized-planet-789725db86f547fc9163b00f302c3e70) by cmzw (https://sketchfab.com/cmzw) licensed under CC-BY-4.0 (http://creativecommons.org/licenses/by/4.0/) \ No newline at end of file diff --git a/app/public/planet/scene.bin b/app/public/planet/scene.bin new file mode 100644 index 0000000..ea53ab9 Binary files /dev/null and b/app/public/planet/scene.bin differ diff --git a/app/public/planet/scene.gltf b/app/public/planet/scene.gltf new file mode 100644 index 0000000..5b02147 --- /dev/null +++ b/app/public/planet/scene.gltf @@ -0,0 +1,536 @@ +{ + "accessors": [ + { + "bufferView": 2, + "componentType": 5126, + "count": 26495, + "max": [ + 0.8758764863014221, + 0.8545469045639038, + 0.8728971481323242 + ], + "min": [ + -0.8763356804847717, + -0.8634992837905884, + -0.8758782148361206 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 317940, + "componentType": 5126, + "count": 26495, + "max": [ + 1.0, + 0.9999911785125732, + 0.9991646409034729 + ], + "min": [ + -1.0, + -0.9999968409538269, + -0.9999611377716064 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "componentType": 5126, + "count": 26495, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "componentType": 5125, + "count": 103014, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 635880, + "componentType": 5126, + "count": 6596, + "max": [ + 0.6551179885864258, + 0.6613333821296692, + 0.6618664860725403 + ], + "min": [ + -0.6606217622756958, + -0.6490849852561951, + -0.6526646018028259 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 715032, + "componentType": 5126, + "count": 6596, + "max": [ + 0.999987006187439, + 0.9998384118080139, + 0.9999796748161316 + ], + "min": [ + -0.9995425939559937, + -0.999676525592804, + -0.9994800686836243 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 211960, + "componentType": 5126, + "count": 6596, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 412056, + "componentType": 5125, + "count": 39042, + "type": "SCALAR" + }, + { + "bufferView": 3, + "componentType": 5126, + "count": 451, + "max": [ + 15.0 + ], + "min": [ + 0.0 + ], + "type": "SCALAR" + }, + { + "bufferView": 5, + "componentType": 5126, + "count": 451, + "max": [ + 0.20017318427562714, + 0.979751706123352, + 0.2001722753047943, + 0.9797602891921997 + ], + "min": [ + -0.018710684031248093, + -0.9797568917274475, + -0.1991616040468216, + 0.0026621678844094276 + ], + "type": "VEC4" + }, + { + "bufferView": 3, + "byteOffset": 1804, + "componentType": 5126, + "count": 125, + "max": [ + 15.0 + ], + "min": [ + 0.0 + ], + "type": "SCALAR" + }, + { + "bufferView": 4, + "componentType": 5126, + "count": 125, + "max": [ + 1.0000001192092896, + 1.0, + 1.0000001192092896 + ], + "min": [ + 0.9999998807907104, + 1.0, + 0.9999998807907104 + ], + "type": "VEC3" + }, + { + "bufferView": 3, + "byteOffset": 2304, + "componentType": 5126, + "count": 451, + "max": [ + 15.0 + ], + "min": [ + 0.0 + ], + "type": "SCALAR" + }, + { + "bufferView": 5, + "byteOffset": 7216, + "componentType": 5126, + "count": 451, + "max": [ + 0.20017318427562714, + 0.979751706123352, + 0.2001722753047943, + 0.9797602891921997 + ], + "min": [ + -0.018710684031248093, + -0.9797568917274475, + -0.1991616040468216, + 0.0026621678844094276 + ], + "type": "VEC4" + }, + { + "bufferView": 3, + "byteOffset": 4108, + "componentType": 5126, + "count": 125, + "max": [ + 15.0 + ], + "min": [ + 0.0 + ], + "type": "SCALAR" + }, + { + "bufferView": 4, + "byteOffset": 1500, + "componentType": 5126, + "count": 125, + "max": [ + 1.0000001192092896, + 1.0, + 1.0000001192092896 + ], + "min": [ + 0.9999998807907104, + 1.0, + 0.9999998807907104 + ], + "type": "VEC3" + } + ], + "animations": [ + { + "channels": [ + { + "sampler": 0, + "target": { + "node": 3, + "path": "rotation" + } + }, + { + "sampler": 1, + "target": { + "node": 3, + "path": "scale" + } + }, + { + "sampler": 2, + "target": { + "node": 5, + "path": "rotation" + } + }, + { + "sampler": 3, + "target": { + "node": 5, + "path": "scale" + } + } + ], + "name": "Animation", + "samplers": [ + { + "input": 8, + "interpolation": "LINEAR", + "output": 9 + }, + { + "input": 10, + "interpolation": "LINEAR", + "output": 11 + }, + { + "input": 12, + "interpolation": "LINEAR", + "output": 13 + }, + { + "input": 14, + "interpolation": "LINEAR", + "output": 15 + } + ] + } + ], + "asset": { + "extras": { + "author": "cmzw (https://sketchfab.com/cmzw)", + "license": "CC-BY-4.0 (http://creativecommons.org/licenses/by/4.0/)", + "source": "https://sketchfab.com/3d-models/stylized-planet-789725db86f547fc9163b00f302c3e70", + "title": "Stylized planet" + }, + "generator": "Sketchfab-14.10.0", + "version": "2.0" + }, + "bufferViews": [ + { + "buffer": 0, + "byteLength": 568224, + "name": "floatBufferViews", + "target": 34963 + }, + { + "buffer": 0, + "byteLength": 264728, + "byteOffset": 568224, + "byteStride": 8, + "name": "floatBufferViews", + "target": 34962 + }, + { + "buffer": 0, + "byteLength": 794184, + "byteOffset": 832952, + "byteStride": 12, + "name": "floatBufferViews", + "target": 34962 + }, + { + "buffer": 0, + "byteLength": 4608, + "byteOffset": 1627136, + "name": "floatBufferViews" + }, + { + "buffer": 0, + "byteLength": 3000, + "byteOffset": 1631744, + "byteStride": 12, + "name": "floatBufferViews" + }, + { + "buffer": 0, + "byteLength": 14432, + "byteOffset": 1634744, + "byteStride": 16, + "name": "floatBufferViews" + } + ], + "buffers": [ + { + "byteLength": 1649176, + "uri": "scene.bin" + } + ], + "extensionsUsed": [ + "KHR_materials_unlit" + ], + "images": [ + { + "uri": "textures/Clouds_baseColor.png" + }, + { + "uri": "textures/Planet_baseColor.png" + } + ], + "materials": [ + { + "doubleSided": true, + "emissiveTexture": { + "index": 0 + }, + "extensions": { + "KHR_materials_unlit": {} + }, + "name": "Clouds", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 0 + }, + "metallicFactor": 0.0 + } + }, + { + "emissiveFactor": [ + 0.23391156271636818, + 0.23391156271636818, + 0.23391156271636818 + ], + "emissiveTexture": { + "index": 1 + }, + "extensions": { + "KHR_materials_unlit": {} + }, + "name": "Planet", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 1 + }, + "metallicFactor": 0.0 + } + } + ], + "meshes": [ + { + "name": "Object_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1, + "POSITION": 0, + "TEXCOORD_0": 2 + }, + "indices": 3, + "material": 0, + "mode": 4 + } + ] + }, + { + "name": "Object_1", + "primitives": [ + { + "attributes": { + "NORMAL": 5, + "POSITION": 4, + "TEXCOORD_0": 6 + }, + "indices": 7, + "material": 1, + "mode": 4 + } + ] + } + ], + "nodes": [ + { + "children": [ + 1 + ], + "matrix": [ + 0.9979661703109741, + 0.06371438503265381, + 0.001990502001717701, + 0.0, + 0.0, + 0.031225780025124772, + -0.9995123744010925, + 0.0, + -0.06374546885490417, + 0.9974795579910278, + 0.031162271276116593, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0 + ], + "name": "Sketchfab_model" + }, + { + "children": [ + 2 + ], + "name": "root" + }, + { + "children": [ + 3, + 5 + ], + "matrix": [ + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 2.220446049250313e-16, + 1.0, + 0.0, + 0.0, + -1.0, + 2.220446049250313e-16, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0 + ], + "name": "GLTF_SceneRootNode" + }, + { + "children": [ + 4 + ], + "name": "Clouds_1" + }, + { + "mesh": 0, + "name": "Object_4" + }, + { + "children": [ + 6 + ], + "name": "Planet_2" + }, + { + "mesh": 1, + "name": "Object_6" + } + ], + "samplers": [ + { + "magFilter": 9729, + "minFilter": 9987, + "wrapS": 10497, + "wrapT": 10497 + } + ], + "scene": 0, + "scenes": [ + { + "name": "Sketchfab_Scene", + "nodes": [ + 0 + ] + } + ], + "textures": [ + { + "sampler": 0, + "source": 0 + }, + { + "sampler": 0, + "source": 1 + } + ] +} diff --git a/app/public/planet/textures/Clouds_baseColor.png b/app/public/planet/textures/Clouds_baseColor.png new file mode 100644 index 0000000..314be79 Binary files /dev/null and b/app/public/planet/textures/Clouds_baseColor.png differ diff --git a/app/public/planet/textures/Planet_baseColor.png b/app/public/planet/textures/Planet_baseColor.png new file mode 100644 index 0000000..1f69ec6 Binary files /dev/null and b/app/public/planet/textures/Planet_baseColor.png differ diff --git a/app/src/App.jsx b/app/src/App.jsx new file mode 100644 index 0000000..83a2d72 --- /dev/null +++ b/app/src/App.jsx @@ -0,0 +1,23 @@ +import { BrowserRouter } from "react-router-dom"; +import { Hero, Navbar } from "./components"; + + +const App = () => { + + + + return ( + +
+
+ +
+
+ +
+
+
+ ); +} + +export default App; \ No newline at end of file diff --git a/app/src/assets/backend.png b/app/src/assets/backend.png new file mode 100644 index 0000000..b2edd57 Binary files /dev/null and b/app/src/assets/backend.png differ diff --git a/app/src/assets/carrent.png b/app/src/assets/carrent.png new file mode 100644 index 0000000..8140354 Binary files /dev/null and b/app/src/assets/carrent.png differ diff --git a/app/src/assets/close.svg b/app/src/assets/close.svg new file mode 100644 index 0000000..81e97e0 --- /dev/null +++ b/app/src/assets/close.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/app/src/assets/company/meta.png b/app/src/assets/company/meta.png new file mode 100644 index 0000000..d0ceea5 Binary files /dev/null and b/app/src/assets/company/meta.png differ diff --git a/app/src/assets/company/shopify.png b/app/src/assets/company/shopify.png new file mode 100644 index 0000000..bba215c Binary files /dev/null and b/app/src/assets/company/shopify.png differ diff --git a/app/src/assets/company/starbucks.png b/app/src/assets/company/starbucks.png new file mode 100644 index 0000000..76cf307 Binary files /dev/null and b/app/src/assets/company/starbucks.png differ diff --git a/app/src/assets/company/tesla.png b/app/src/assets/company/tesla.png new file mode 100644 index 0000000..8eca730 Binary files /dev/null and b/app/src/assets/company/tesla.png differ diff --git a/app/src/assets/creator.png b/app/src/assets/creator.png new file mode 100644 index 0000000..fa17ad2 Binary files /dev/null and b/app/src/assets/creator.png differ diff --git a/app/src/assets/github.png b/app/src/assets/github.png new file mode 100644 index 0000000..a735a32 Binary files /dev/null and b/app/src/assets/github.png differ diff --git a/app/src/assets/herobg.png b/app/src/assets/herobg.png new file mode 100644 index 0000000..9d0a41b Binary files /dev/null and b/app/src/assets/herobg.png differ diff --git a/app/src/assets/index.js b/app/src/assets/index.js new file mode 100644 index 0000000..613116b --- /dev/null +++ b/app/src/assets/index.js @@ -0,0 +1,62 @@ +import logo from "./logo.svg"; +import backend from "./backend.png"; +import creator from "./creator.png"; +import mobile from "./mobile.png"; +import web from "./web.png"; +import github from "./github.png"; +import menu from "./menu.svg"; +import close from "./close.svg"; + +import css from "./tech/css.png"; +import docker from "./tech/docker.png"; +import figma from "./tech/figma.png"; +import git from "./tech/git.png"; +import html from "./tech/html.png"; +import javascript from "./tech/javascript.png"; +import mongodb from "./tech/mongodb.png"; +import nodejs from "./tech/nodejs.png"; +import reactjs from "./tech/reactjs.png"; +import redux from "./tech/redux.png"; +import tailwind from "./tech/tailwind.png"; +import typescript from "./tech/typescript.png"; +import threejs from "./tech/threejs.svg"; + +import meta from "./company/meta.png"; +import shopify from "./company/shopify.png"; +import starbucks from "./company/starbucks.png"; +import tesla from "./company/tesla.png"; + +import carrent from "./carrent.png"; +import jobit from "./jobit.png"; +import tripguide from "./tripguide.png"; + +export { + logo, + backend, + creator, + mobile, + web, + github, + menu, + close, + css, + docker, + figma, + git, + html, + javascript, + mongodb, + nodejs, + reactjs, + redux, + tailwind, + typescript, + threejs, + meta, + shopify, + starbucks, + tesla, + carrent, + jobit, + tripguide, +}; diff --git a/app/src/assets/jobit.png b/app/src/assets/jobit.png new file mode 100644 index 0000000..bb53f4b Binary files /dev/null and b/app/src/assets/jobit.png differ diff --git a/app/src/assets/logo.svg b/app/src/assets/logo.svg new file mode 100644 index 0000000..b60f55d --- /dev/null +++ b/app/src/assets/logo.svg @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + diff --git a/app/src/assets/menu.svg b/app/src/assets/menu.svg new file mode 100644 index 0000000..318d5ef --- /dev/null +++ b/app/src/assets/menu.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/app/src/assets/mobile.png b/app/src/assets/mobile.png new file mode 100644 index 0000000..27a2b37 Binary files /dev/null and b/app/src/assets/mobile.png differ diff --git a/app/src/assets/tech/css.png b/app/src/assets/tech/css.png new file mode 100644 index 0000000..677d59c Binary files /dev/null and b/app/src/assets/tech/css.png differ diff --git a/app/src/assets/tech/docker.png b/app/src/assets/tech/docker.png new file mode 100644 index 0000000..c349344 Binary files /dev/null and b/app/src/assets/tech/docker.png differ diff --git a/app/src/assets/tech/figma.png b/app/src/assets/tech/figma.png new file mode 100644 index 0000000..c9f3a61 Binary files /dev/null and b/app/src/assets/tech/figma.png differ diff --git a/app/src/assets/tech/git.png b/app/src/assets/tech/git.png new file mode 100644 index 0000000..493c150 Binary files /dev/null and b/app/src/assets/tech/git.png differ diff --git a/app/src/assets/tech/html.png b/app/src/assets/tech/html.png new file mode 100644 index 0000000..9a67c31 Binary files /dev/null and b/app/src/assets/tech/html.png differ diff --git a/app/src/assets/tech/javascript.png b/app/src/assets/tech/javascript.png new file mode 100644 index 0000000..e7448b5 Binary files /dev/null and b/app/src/assets/tech/javascript.png differ diff --git a/app/src/assets/tech/mongodb.png b/app/src/assets/tech/mongodb.png new file mode 100644 index 0000000..c892f59 Binary files /dev/null and b/app/src/assets/tech/mongodb.png differ diff --git a/app/src/assets/tech/nodejs.png b/app/src/assets/tech/nodejs.png new file mode 100644 index 0000000..b81a2ce Binary files /dev/null and b/app/src/assets/tech/nodejs.png differ diff --git a/app/src/assets/tech/reactjs.png b/app/src/assets/tech/reactjs.png new file mode 100644 index 0000000..a49beb5 Binary files /dev/null and b/app/src/assets/tech/reactjs.png differ diff --git a/app/src/assets/tech/redux.png b/app/src/assets/tech/redux.png new file mode 100644 index 0000000..feecfee Binary files /dev/null and b/app/src/assets/tech/redux.png differ diff --git a/app/src/assets/tech/tailwind.png b/app/src/assets/tech/tailwind.png new file mode 100644 index 0000000..ed3981f Binary files /dev/null and b/app/src/assets/tech/tailwind.png differ diff --git a/app/src/assets/tech/threejs.svg b/app/src/assets/tech/threejs.svg new file mode 100644 index 0000000..b6a8dc8 --- /dev/null +++ b/app/src/assets/tech/threejs.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/app/src/assets/tech/typescript.png b/app/src/assets/tech/typescript.png new file mode 100644 index 0000000..695b00c Binary files /dev/null and b/app/src/assets/tech/typescript.png differ diff --git a/app/src/assets/tripguide.png b/app/src/assets/tripguide.png new file mode 100644 index 0000000..ba3469a Binary files /dev/null and b/app/src/assets/tripguide.png differ diff --git a/app/src/assets/web.png b/app/src/assets/web.png new file mode 100644 index 0000000..c29cbd0 Binary files /dev/null and b/app/src/assets/web.png differ diff --git a/app/src/components/Hero.jsx b/app/src/components/Hero.jsx new file mode 100644 index 0000000..da25526 --- /dev/null +++ b/app/src/components/Hero.jsx @@ -0,0 +1,112 @@ +import React, { useEffect, useState } from "react"; +import { styles } from "../style"; +import { ComputersCanvas } from "./canvas"; +import { Link } from "react-router-dom"; +import { navLinks } from "../constants"; +import { logo, menu, close } from "../assets"; + + +const Hero = () => { + + const [data,setData] = useState([{}]) + + // Reset Boiska + function resetField() { + var footballField = document.getElementById('footballField'); + var footballs = document.querySelectorAll('.football'); + + footballs.forEach(function (ball) { + footballField.removeChild(ball); + }); + } + // Wysłanie zapytania do serwera + function sentQuestion() { + + var ball = document.querySelector('.football'); + if (ball) { + var x = ball.style.left; + var y = ball.style.top; + + var query = "/LRegresion" + x + "&" + y + alert(query) + fetch("/LRegresion").then( + res => res.json + ).then( + data => { + setData(data) + console.log(data)`` + } + ) + + + } else { + alert('Piłka nie jest obecnie na boisku.'); + } + } + /* Funkcja dodająca listener do boiska*/ + + function boiskoListener(){ + var x = event.clientX - footballField.getBoundingClientRect().left; + var y = event.clientY - footballField.getBoundingClientRect().top; + var existingBall = document.querySelector('.football'); + if (!existingBall) { + var ball = document.createElement('div'); + ball.className = 'football'; + ball.style.left = x + 'px'; + ball.style.top = y + 'px'; + footballField.appendChild(ball); + } else { + alert('Możesz dodać tylko jedną piłkę!'); + } +} + + useEffect(()=>{ + var footballField = document.getElementById('footballField'); + footballField.addEventListener('click', boiskoListener) + },[]); + + /*zwracany komponent zawierajacy boisko*/ + + return ( +
+
+

.

+

.

+

.

+

.

+

.

+
+
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + +
+
+
+ ); +}; + +export default Hero; diff --git a/app/src/components/Loader.jsx b/app/src/components/Loader.jsx new file mode 100644 index 0000000..4abbec8 --- /dev/null +++ b/app/src/components/Loader.jsx @@ -0,0 +1,9 @@ +import React from 'react' + +const Loader = () => { + return ( +
Loader
+ ) +} + +export default Loader \ No newline at end of file diff --git a/app/src/components/Navbar.jsx b/app/src/components/Navbar.jsx new file mode 100644 index 0000000..526da09 --- /dev/null +++ b/app/src/components/Navbar.jsx @@ -0,0 +1,67 @@ +import React, { useEffect, useState } from "react"; +import { Link } from "react-router-dom"; + +import { styles } from "../style"; +import { navLinks } from "../constants"; +import { logo, menu, close } from "../assets"; + +const Navbar = () => { + const [active, setActive] = useState(""); + const [toggle, setToggle] = useState(false); + const [scrolled, setScrolled] = useState(false); + + useEffect(() => { + const handleScroll = () => { + const scrollTop = window.scrollY; + if (scrollTop > 100) { + setScrolled(true); + } else { + setScrolled(false); + } + }; + + window.addEventListener("scroll", handleScroll); + + return () => window.removeEventListener("scroll", handleScroll); + }, []); + + return ( + + ); +}; + +export default Navbar; \ No newline at end of file diff --git a/app/src/components/canvas/Ball.jsx b/app/src/components/canvas/Ball.jsx new file mode 100644 index 0000000..608cdfb --- /dev/null +++ b/app/src/components/canvas/Ball.jsx @@ -0,0 +1,9 @@ +import React from 'react' + +const Ball = () => { + return ( +
Ball
+ ) +} + +export default Ball \ No newline at end of file diff --git a/app/src/components/canvas/Computers.jsx b/app/src/components/canvas/Computers.jsx new file mode 100644 index 0000000..1d6c2bc --- /dev/null +++ b/app/src/components/canvas/Computers.jsx @@ -0,0 +1,9 @@ +import React from 'react' + +const Computers = () => { + return ( +
Computers
+ ) +} + +export default Computers \ No newline at end of file diff --git a/app/src/components/canvas/Earth.jsx b/app/src/components/canvas/Earth.jsx new file mode 100644 index 0000000..1c9168a --- /dev/null +++ b/app/src/components/canvas/Earth.jsx @@ -0,0 +1,9 @@ +import React from 'react' + +const Earth = () => { + return ( +
Earth
+ ) +} + +export default Earth \ No newline at end of file diff --git a/app/src/components/canvas/Stars.jsx b/app/src/components/canvas/Stars.jsx new file mode 100644 index 0000000..db18239 --- /dev/null +++ b/app/src/components/canvas/Stars.jsx @@ -0,0 +1,9 @@ +import React from 'react' + +const Stars = () => { + return ( +
Stars
+ ) +} + +export default Stars \ No newline at end of file diff --git a/app/src/components/canvas/index.js b/app/src/components/canvas/index.js new file mode 100644 index 0000000..2a0c2d2 --- /dev/null +++ b/app/src/components/canvas/index.js @@ -0,0 +1,6 @@ +import EarthCanvas from "./Earth"; +import BallCanvas from "./Ball"; +import ComputersCanvas from "./Computers"; +import StarsCanvas from "./Stars"; + +export { EarthCanvas, BallCanvas, ComputersCanvas, StarsCanvas }; diff --git a/app/src/components/index.js b/app/src/components/index.js new file mode 100644 index 0000000..7c615ba --- /dev/null +++ b/app/src/components/index.js @@ -0,0 +1,13 @@ +import { EarthCanvas, BallCanvas, ComputersCanvas, StarsCanvas } from './canvas'; +import Hero from './Hero'; +import Navbar from './Navbar'; + + +export { + Hero, + Navbar, + EarthCanvas, + BallCanvas, + ComputersCanvas, + StarsCanvas +} \ No newline at end of file diff --git a/app/src/constants/index.js b/app/src/constants/index.js new file mode 100644 index 0000000..16b9328 --- /dev/null +++ b/app/src/constants/index.js @@ -0,0 +1,269 @@ +import { + mobile, + backend, + creator, + web, + javascript, + typescript, + html, + css, + reactjs, + redux, + tailwind, + nodejs, + mongodb, + git, + figma, + docker, + meta, + starbucks, + tesla, + shopify, + carrent, + jobit, + tripguide, + threejs, + } from "../assets"; + + export const navLinks = [ + { + id: "Analiza", + title: "Analiza", + }, + { + id: "Zawodnicy", + title: "zawodnicy", + }, + { + id: "log_out", + title: "Wyloguj", + }, + ]; + + + + + + const services = [ + { + title: "Web Developer", + icon: web, + }, + { + title: "React Native Developer", + icon: mobile, + }, + { + title: "Backend Developer", + icon: backend, + }, + { + title: "Content Creator", + icon: creator, + }, + ]; + + const technologies = [ + { + name: "HTML 5", + icon: html, + }, + { + name: "CSS 3", + icon: css, + }, + { + name: "JavaScript", + icon: javascript, + }, + { + name: "TypeScript", + icon: typescript, + }, + { + name: "React JS", + icon: reactjs, + }, + { + name: "Redux Toolkit", + icon: redux, + }, + { + name: "Tailwind CSS", + icon: tailwind, + }, + { + name: "Node JS", + icon: nodejs, + }, + { + name: "MongoDB", + icon: mongodb, + }, + { + name: "Three JS", + icon: threejs, + }, + { + name: "git", + icon: git, + }, + { + name: "figma", + icon: figma, + }, + { + name: "docker", + icon: docker, + }, + ]; + + const experiences = [ + { + title: "React.js Developer", + company_name: "Starbucks", + icon: starbucks, + iconBg: "#383E56", + date: "March 2020 - April 2021", + points: [ + "Developing and maintaining web applications using React.js and other related technologies.", + "Collaborating with cross-functional teams including designers, product managers, and other developers to create high-quality products.", + "Implementing responsive design and ensuring cross-browser compatibility.", + "Participating in code reviews and providing constructive feedback to other developers.", + ], + }, + { + title: "React Native Developer", + company_name: "Tesla", + icon: tesla, + iconBg: "#E6DEDD", + date: "Jan 2021 - Feb 2022", + points: [ + "Developing and maintaining web applications using React.js and other related technologies.", + "Collaborating with cross-functional teams including designers, product managers, and other developers to create high-quality products.", + "Implementing responsive design and ensuring cross-browser compatibility.", + "Participating in code reviews and providing constructive feedback to other developers.", + ], + }, + { + title: "Web Developer", + company_name: "Shopify", + icon: shopify, + iconBg: "#383E56", + date: "Jan 2022 - Jan 2023", + points: [ + "Developing and maintaining web applications using React.js and other related technologies.", + "Collaborating with cross-functional teams including designers, product managers, and other developers to create high-quality products.", + "Implementing responsive design and ensuring cross-browser compatibility.", + "Participating in code reviews and providing constructive feedback to other developers.", + ], + }, + { + title: "Full stack Developer", + company_name: "Meta", + icon: meta, + iconBg: "#E6DEDD", + date: "Jan 2023 - Present", + points: [ + "Developing and maintaining web applications using React.js and other related technologies.", + "Collaborating with cross-functional teams including designers, product managers, and other developers to create high-quality products.", + "Implementing responsive design and ensuring cross-browser compatibility.", + "Participating in code reviews and providing constructive feedback to other developers.", + ], + }, + ]; + + const testimonials = [ + { + testimonial: + "I thought it was impossible to make a website as beautiful as our product, but Rick proved me wrong.", + name: "Sara Lee", + designation: "CFO", + company: "Acme Co", + image: "https://randomuser.me/api/portraits/women/4.jpg", + }, + { + testimonial: + "I've never met a web developer who truly cares about their clients' success like Rick does.", + name: "Chris Brown", + designation: "COO", + company: "DEF Corp", + image: "https://randomuser.me/api/portraits/men/5.jpg", + }, + { + testimonial: + "After Rick optimized our website, our traffic increased by 50%. We can't thank them enough!", + name: "Lisa Wang", + designation: "CTO", + company: "456 Enterprises", + image: "https://randomuser.me/api/portraits/women/6.jpg", + }, + ]; + + const projects = [ + { + name: "Car Rent", + description: + "Web-based platform that allows users to search, book, and manage car rentals from various providers, providing a convenient and efficient solution for transportation needs.", + tags: [ + { + name: "react", + color: "blue-text-gradient", + }, + { + name: "mongodb", + color: "green-text-gradient", + }, + { + name: "tailwind", + color: "pink-text-gradient", + }, + ], + image: carrent, + source_code_link: "https://github.com/", + }, + { + name: "Job IT", + description: + "Web application that enables users to search for job openings, view estimated salary ranges for positions, and locate available jobs based on their current location.", + tags: [ + { + name: "react", + color: "blue-text-gradient", + }, + { + name: "restapi", + color: "green-text-gradient", + }, + { + name: "scss", + color: "pink-text-gradient", + }, + ], + image: jobit, + source_code_link: "https://github.com/", + }, + { + name: "Trip Guide", + description: + "A comprehensive travel booking platform that allows users to book flights, hotels, and rental cars, and offers curated recommendations for popular destinations.", + tags: [ + { + name: "nextjs", + color: "blue-text-gradient", + }, + { + name: "supabase", + color: "green-text-gradient", + }, + { + name: "css", + color: "pink-text-gradient", + }, + ], + image: tripguide, + source_code_link: "https://github.com/", + }, + ]; + + export { services, technologies, experiences, testimonials, projects }; \ No newline at end of file diff --git a/app/src/flask-server/react_bs_web.code-workspace b/app/src/flask-server/react_bs_web.code-workspace new file mode 100644 index 0000000..d4bec3c --- /dev/null +++ b/app/src/flask-server/react_bs_web.code-workspace @@ -0,0 +1,9 @@ +{ + "folders": [ + { + "name": "react_bs_web", + "path": "../.." + } + ], + "settings": {} +} \ No newline at end of file diff --git a/app/src/flask-server/regresja_logistyczna.joblib b/app/src/flask-server/regresja_logistyczna.joblib new file mode 100644 index 0000000..7a1ddb7 Binary files /dev/null and b/app/src/flask-server/regresja_logistyczna.joblib differ diff --git a/app/src/flask-server/server.py b/app/src/flask-server/server.py new file mode 100644 index 0000000..1c4ee4d --- /dev/null +++ b/app/src/flask-server/server.py @@ -0,0 +1,18 @@ +from flask import Flask +from flask_cors import CORS +app = Flask(__name__) + +CORS(app) + +# model Api +@app.route("/members") +def members(): + return{"members":["Member1","Member2","Member3"]} + +@app.route("/LRegresion&") +def LRegresion(x,y): + num = x+y + return str(num) + +if __name__ == "__main__": + app.run(debug = True) \ No newline at end of file diff --git a/app/src/flask-server/venv/Lib/site-packages/Jinja2-3.1.2.dist-info/INSTALLER b/app/src/flask-server/venv/Lib/site-packages/Jinja2-3.1.2.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/Jinja2-3.1.2.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/app/src/flask-server/venv/Lib/site-packages/Jinja2-3.1.2.dist-info/LICENSE.rst b/app/src/flask-server/venv/Lib/site-packages/Jinja2-3.1.2.dist-info/LICENSE.rst new file mode 100644 index 0000000..c37cae4 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/Jinja2-3.1.2.dist-info/LICENSE.rst @@ -0,0 +1,28 @@ +Copyright 2007 Pallets + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/app/src/flask-server/venv/Lib/site-packages/Jinja2-3.1.2.dist-info/METADATA b/app/src/flask-server/venv/Lib/site-packages/Jinja2-3.1.2.dist-info/METADATA new file mode 100644 index 0000000..f54bb5c --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/Jinja2-3.1.2.dist-info/METADATA @@ -0,0 +1,113 @@ +Metadata-Version: 2.1 +Name: Jinja2 +Version: 3.1.2 +Summary: A very fast and expressive template engine. +Home-page: https://palletsprojects.com/p/jinja/ +Author: Armin Ronacher +Author-email: armin.ronacher@active-4.com +Maintainer: Pallets +Maintainer-email: contact@palletsprojects.com +License: BSD-3-Clause +Project-URL: Donate, https://palletsprojects.com/donate +Project-URL: Documentation, https://jinja.palletsprojects.com/ +Project-URL: Changes, https://jinja.palletsprojects.com/changes/ +Project-URL: Source Code, https://github.com/pallets/jinja/ +Project-URL: Issue Tracker, https://github.com/pallets/jinja/issues/ +Project-URL: Twitter, https://twitter.com/PalletsTeam +Project-URL: Chat, https://discord.gg/pallets +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Text Processing :: Markup :: HTML +Requires-Python: >=3.7 +Description-Content-Type: text/x-rst +License-File: LICENSE.rst +Requires-Dist: MarkupSafe (>=2.0) +Provides-Extra: i18n +Requires-Dist: Babel (>=2.7) ; extra == 'i18n' + +Jinja +===== + +Jinja is a fast, expressive, extensible templating engine. Special +placeholders in the template allow writing code similar to Python +syntax. Then the template is passed data to render the final document. + +It includes: + +- Template inheritance and inclusion. +- Define and import macros within templates. +- HTML templates can use autoescaping to prevent XSS from untrusted + user input. +- A sandboxed environment can safely render untrusted templates. +- AsyncIO support for generating templates and calling async + functions. +- I18N support with Babel. +- Templates are compiled to optimized Python code just-in-time and + cached, or can be compiled ahead-of-time. +- Exceptions point to the correct line in templates to make debugging + easier. +- Extensible filters, tests, functions, and even syntax. + +Jinja's philosophy is that while application logic belongs in Python if +possible, it shouldn't make the template designer's job difficult by +restricting functionality too much. + + +Installing +---------- + +Install and update using `pip`_: + +.. code-block:: text + + $ pip install -U Jinja2 + +.. _pip: https://pip.pypa.io/en/stable/getting-started/ + + +In A Nutshell +------------- + +.. code-block:: jinja + + {% extends "base.html" %} + {% block title %}Members{% endblock %} + {% block content %} + + {% endblock %} + + +Donate +------ + +The Pallets organization develops and supports Jinja and other popular +packages. In order to grow the community of contributors and users, and +allow the maintainers to devote more time to the projects, `please +donate today`_. + +.. _please donate today: https://palletsprojects.com/donate + + +Links +----- + +- Documentation: https://jinja.palletsprojects.com/ +- Changes: https://jinja.palletsprojects.com/changes/ +- PyPI Releases: https://pypi.org/project/Jinja2/ +- Source Code: https://github.com/pallets/jinja/ +- Issue Tracker: https://github.com/pallets/jinja/issues/ +- Website: https://palletsprojects.com/p/jinja/ +- Twitter: https://twitter.com/PalletsTeam +- Chat: https://discord.gg/pallets + + diff --git a/app/src/flask-server/venv/Lib/site-packages/Jinja2-3.1.2.dist-info/RECORD b/app/src/flask-server/venv/Lib/site-packages/Jinja2-3.1.2.dist-info/RECORD new file mode 100644 index 0000000..af42ee3 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/Jinja2-3.1.2.dist-info/RECORD @@ -0,0 +1,58 @@ +Jinja2-3.1.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Jinja2-3.1.2.dist-info/LICENSE.rst,sha256=O0nc7kEF6ze6wQ-vG-JgQI_oXSUrjp3y4JefweCUQ3s,1475 +Jinja2-3.1.2.dist-info/METADATA,sha256=PZ6v2SIidMNixR7MRUX9f7ZWsPwtXanknqiZUmRbh4U,3539 +Jinja2-3.1.2.dist-info/RECORD,, +Jinja2-3.1.2.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92 +Jinja2-3.1.2.dist-info/entry_points.txt,sha256=zRd62fbqIyfUpsRtU7EVIFyiu1tPwfgO7EvPErnxgTE,59 +Jinja2-3.1.2.dist-info/top_level.txt,sha256=PkeVWtLb3-CqjWi1fO29OCbj55EhX_chhKrCdrVe_zs,7 +jinja2/__init__.py,sha256=8vGduD8ytwgD6GDSqpYc2m3aU-T7PKOAddvVXgGr_Fs,1927 +jinja2/__pycache__/__init__.cpython-310.pyc,, +jinja2/__pycache__/_identifier.cpython-310.pyc,, +jinja2/__pycache__/async_utils.cpython-310.pyc,, +jinja2/__pycache__/bccache.cpython-310.pyc,, +jinja2/__pycache__/compiler.cpython-310.pyc,, +jinja2/__pycache__/constants.cpython-310.pyc,, +jinja2/__pycache__/debug.cpython-310.pyc,, +jinja2/__pycache__/defaults.cpython-310.pyc,, +jinja2/__pycache__/environment.cpython-310.pyc,, +jinja2/__pycache__/exceptions.cpython-310.pyc,, +jinja2/__pycache__/ext.cpython-310.pyc,, +jinja2/__pycache__/filters.cpython-310.pyc,, +jinja2/__pycache__/idtracking.cpython-310.pyc,, +jinja2/__pycache__/lexer.cpython-310.pyc,, +jinja2/__pycache__/loaders.cpython-310.pyc,, +jinja2/__pycache__/meta.cpython-310.pyc,, +jinja2/__pycache__/nativetypes.cpython-310.pyc,, +jinja2/__pycache__/nodes.cpython-310.pyc,, +jinja2/__pycache__/optimizer.cpython-310.pyc,, +jinja2/__pycache__/parser.cpython-310.pyc,, +jinja2/__pycache__/runtime.cpython-310.pyc,, +jinja2/__pycache__/sandbox.cpython-310.pyc,, +jinja2/__pycache__/tests.cpython-310.pyc,, +jinja2/__pycache__/utils.cpython-310.pyc,, +jinja2/__pycache__/visitor.cpython-310.pyc,, +jinja2/_identifier.py,sha256=_zYctNKzRqlk_murTNlzrju1FFJL7Va_Ijqqd7ii2lU,1958 +jinja2/async_utils.py,sha256=dHlbTeaxFPtAOQEYOGYh_PHcDT0rsDaUJAFDl_0XtTg,2472 +jinja2/bccache.py,sha256=mhz5xtLxCcHRAa56azOhphIAe19u1we0ojifNMClDio,14061 +jinja2/compiler.py,sha256=Gs-N8ThJ7OWK4-reKoO8Wh1ZXz95MVphBKNVf75qBr8,72172 +jinja2/constants.py,sha256=GMoFydBF_kdpaRKPoM5cl5MviquVRLVyZtfp5-16jg0,1433 +jinja2/debug.py,sha256=iWJ432RadxJNnaMOPrjIDInz50UEgni3_HKuFXi2vuQ,6299 +jinja2/defaults.py,sha256=boBcSw78h-lp20YbaXSJsqkAI2uN_mD_TtCydpeq5wU,1267 +jinja2/environment.py,sha256=6uHIcc7ZblqOMdx_uYNKqRnnwAF0_nzbyeMP9FFtuh4,61349 +jinja2/exceptions.py,sha256=ioHeHrWwCWNaXX1inHmHVblvc4haO7AXsjCp3GfWvx0,5071 +jinja2/ext.py,sha256=ivr3P7LKbddiXDVez20EflcO3q2aHQwz9P_PgWGHVqE,31502 +jinja2/filters.py,sha256=9js1V-h2RlyW90IhLiBGLM2U-k6SCy2F4BUUMgB3K9Q,53509 +jinja2/idtracking.py,sha256=GfNmadir4oDALVxzn3DL9YInhJDr69ebXeA2ygfuCGA,10704 +jinja2/lexer.py,sha256=DW2nX9zk-6MWp65YR2bqqj0xqCvLtD-u9NWT8AnFRxQ,29726 +jinja2/loaders.py,sha256=BfptfvTVpClUd-leMkHczdyPNYFzp_n7PKOJ98iyHOg,23207 +jinja2/meta.py,sha256=GNPEvifmSaU3CMxlbheBOZjeZ277HThOPUTf1RkppKQ,4396 +jinja2/nativetypes.py,sha256=DXgORDPRmVWgy034H0xL8eF7qYoK3DrMxs-935d0Fzk,4226 +jinja2/nodes.py,sha256=i34GPRAZexXMT6bwuf5SEyvdmS-bRCy9KMjwN5O6pjk,34550 +jinja2/optimizer.py,sha256=tHkMwXxfZkbfA1KmLcqmBMSaz7RLIvvItrJcPoXTyD8,1650 +jinja2/parser.py,sha256=nHd-DFHbiygvfaPtm9rcQXJChZG7DPsWfiEsqfwKerY,39595 +jinja2/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +jinja2/runtime.py,sha256=5CmD5BjbEJxSiDNTFBeKCaq8qU4aYD2v6q2EluyExms,33476 +jinja2/sandbox.py,sha256=Y0xZeXQnH6EX5VjaV2YixESxoepnRbW_3UeQosaBU3M,14584 +jinja2/tests.py,sha256=Am5Z6Lmfr2XaH_npIfJJ8MdXtWsbLjMULZJulTAj30E,5905 +jinja2/utils.py,sha256=u9jXESxGn8ATZNVolwmkjUVu4SA-tLgV0W7PcSfPfdQ,23965 +jinja2/visitor.py,sha256=MH14C6yq24G_KVtWzjwaI7Wg14PCJIYlWW1kpkxYak0,3568 diff --git a/app/src/flask-server/venv/Lib/site-packages/Jinja2-3.1.2.dist-info/WHEEL b/app/src/flask-server/venv/Lib/site-packages/Jinja2-3.1.2.dist-info/WHEEL new file mode 100644 index 0000000..becc9a6 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/Jinja2-3.1.2.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.37.1) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/app/src/flask-server/venv/Lib/site-packages/Jinja2-3.1.2.dist-info/entry_points.txt b/app/src/flask-server/venv/Lib/site-packages/Jinja2-3.1.2.dist-info/entry_points.txt new file mode 100644 index 0000000..7b9666c --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/Jinja2-3.1.2.dist-info/entry_points.txt @@ -0,0 +1,2 @@ +[babel.extractors] +jinja2 = jinja2.ext:babel_extract[i18n] diff --git a/app/src/flask-server/venv/Lib/site-packages/Jinja2-3.1.2.dist-info/top_level.txt b/app/src/flask-server/venv/Lib/site-packages/Jinja2-3.1.2.dist-info/top_level.txt new file mode 100644 index 0000000..7f7afbf --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/Jinja2-3.1.2.dist-info/top_level.txt @@ -0,0 +1 @@ +jinja2 diff --git a/app/src/flask-server/venv/Lib/site-packages/MarkupSafe-2.1.3.dist-info/INSTALLER b/app/src/flask-server/venv/Lib/site-packages/MarkupSafe-2.1.3.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/MarkupSafe-2.1.3.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/app/src/flask-server/venv/Lib/site-packages/MarkupSafe-2.1.3.dist-info/LICENSE.rst b/app/src/flask-server/venv/Lib/site-packages/MarkupSafe-2.1.3.dist-info/LICENSE.rst new file mode 100644 index 0000000..9d227a0 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/MarkupSafe-2.1.3.dist-info/LICENSE.rst @@ -0,0 +1,28 @@ +Copyright 2010 Pallets + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/app/src/flask-server/venv/Lib/site-packages/MarkupSafe-2.1.3.dist-info/METADATA b/app/src/flask-server/venv/Lib/site-packages/MarkupSafe-2.1.3.dist-info/METADATA new file mode 100644 index 0000000..bced165 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/MarkupSafe-2.1.3.dist-info/METADATA @@ -0,0 +1,93 @@ +Metadata-Version: 2.1 +Name: MarkupSafe +Version: 2.1.3 +Summary: Safely add untrusted strings to HTML/XML markup. +Home-page: https://palletsprojects.com/p/markupsafe/ +Maintainer: Pallets +Maintainer-email: contact@palletsprojects.com +License: BSD-3-Clause +Project-URL: Donate, https://palletsprojects.com/donate +Project-URL: Documentation, https://markupsafe.palletsprojects.com/ +Project-URL: Changes, https://markupsafe.palletsprojects.com/changes/ +Project-URL: Source Code, https://github.com/pallets/markupsafe/ +Project-URL: Issue Tracker, https://github.com/pallets/markupsafe/issues/ +Project-URL: Chat, https://discord.gg/pallets +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Text Processing :: Markup :: HTML +Requires-Python: >=3.7 +Description-Content-Type: text/x-rst +License-File: LICENSE.rst + +MarkupSafe +========== + +MarkupSafe implements a text object that escapes characters so it is +safe to use in HTML and XML. Characters that have special meanings are +replaced so that they display as the actual characters. This mitigates +injection attacks, meaning untrusted user input can safely be displayed +on a page. + + +Installing +---------- + +Install and update using `pip`_: + +.. code-block:: text + + pip install -U MarkupSafe + +.. _pip: https://pip.pypa.io/en/stable/getting-started/ + + +Examples +-------- + +.. code-block:: pycon + + >>> from markupsafe import Markup, escape + + >>> # escape replaces special characters and wraps in Markup + >>> escape("") + Markup('<script>alert(document.cookie);</script>') + + >>> # wrap in Markup to mark text "safe" and prevent escaping + >>> Markup("Hello") + Markup('hello') + + >>> escape(Markup("Hello")) + Markup('hello') + + >>> # Markup is a str subclass + >>> # methods and operators escape their arguments + >>> template = Markup("Hello {name}") + >>> template.format(name='"World"') + Markup('Hello "World"') + + +Donate +------ + +The Pallets organization develops and supports MarkupSafe and other +popular packages. In order to grow the community of contributors and +users, and allow the maintainers to devote more time to the projects, +`please donate today`_. + +.. _please donate today: https://palletsprojects.com/donate + + +Links +----- + +- Documentation: https://markupsafe.palletsprojects.com/ +- Changes: https://markupsafe.palletsprojects.com/changes/ +- PyPI Releases: https://pypi.org/project/MarkupSafe/ +- Source Code: https://github.com/pallets/markupsafe/ +- Issue Tracker: https://github.com/pallets/markupsafe/issues/ +- Chat: https://discord.gg/pallets diff --git a/app/src/flask-server/venv/Lib/site-packages/MarkupSafe-2.1.3.dist-info/RECORD b/app/src/flask-server/venv/Lib/site-packages/MarkupSafe-2.1.3.dist-info/RECORD new file mode 100644 index 0000000..c62bb43 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/MarkupSafe-2.1.3.dist-info/RECORD @@ -0,0 +1,14 @@ +MarkupSafe-2.1.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +MarkupSafe-2.1.3.dist-info/LICENSE.rst,sha256=RjHsDbX9kKVH4zaBcmTGeYIUM4FG-KyUtKV_lu6MnsQ,1503 +MarkupSafe-2.1.3.dist-info/METADATA,sha256=5gU_TQw6eHpTaqkI6SPeZje6KTPlJPAV82uNiL3naKE,3096 +MarkupSafe-2.1.3.dist-info/RECORD,, +MarkupSafe-2.1.3.dist-info/WHEEL,sha256=jrOhEbqKwvzRFSJcbYXlJCyVkgVdHg4_7__YHrdTUfw,102 +MarkupSafe-2.1.3.dist-info/top_level.txt,sha256=qy0Plje5IJuvsCBjejJyhDCjEAdcDLK_2agVcex8Z6U,11 +markupsafe/__init__.py,sha256=GsRaSTjrhvg6c88PnPJNqm4MafU_mFatfXz4-h80-Qc,10642 +markupsafe/__pycache__/__init__.cpython-310.pyc,, +markupsafe/__pycache__/_native.cpython-310.pyc,, +markupsafe/_native.py,sha256=_Q7UsXCOvgdonCgqG3l5asANI6eo50EKnDM-mlwEC5M,1776 +markupsafe/_speedups.c,sha256=n3jzzaJwXcoN8nTFyA53f3vSqsWK2vujI-v6QYifjhQ,7403 +markupsafe/_speedups.cp310-win_amd64.pyd,sha256=nlgDO0l-guuFD-w6o7YZey0yek5iNTBpKjJrVebhZpI,15872 +markupsafe/_speedups.pyi,sha256=f5QtwIOP0eLrxh2v5p6SmaYmlcHIGIfmz0DovaqL0OU,238 +markupsafe/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/app/src/flask-server/venv/Lib/site-packages/MarkupSafe-2.1.3.dist-info/WHEEL b/app/src/flask-server/venv/Lib/site-packages/MarkupSafe-2.1.3.dist-info/WHEEL new file mode 100644 index 0000000..b30c5d9 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/MarkupSafe-2.1.3.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.40.0) +Root-Is-Purelib: false +Tag: cp310-cp310-win_amd64 + diff --git a/app/src/flask-server/venv/Lib/site-packages/MarkupSafe-2.1.3.dist-info/top_level.txt b/app/src/flask-server/venv/Lib/site-packages/MarkupSafe-2.1.3.dist-info/top_level.txt new file mode 100644 index 0000000..75bf729 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/MarkupSafe-2.1.3.dist-info/top_level.txt @@ -0,0 +1 @@ +markupsafe diff --git a/app/src/flask-server/venv/Lib/site-packages/_distutils_hack/__init__.py b/app/src/flask-server/venv/Lib/site-packages/_distutils_hack/__init__.py new file mode 100644 index 0000000..f987a53 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/_distutils_hack/__init__.py @@ -0,0 +1,222 @@ +# don't import any costly modules +import sys +import os + + +is_pypy = '__pypy__' in sys.builtin_module_names + + +def warn_distutils_present(): + if 'distutils' not in sys.modules: + return + if is_pypy and sys.version_info < (3, 7): + # PyPy for 3.6 unconditionally imports distutils, so bypass the warning + # https://foss.heptapod.net/pypy/pypy/-/blob/be829135bc0d758997b3566062999ee8b23872b4/lib-python/3/site.py#L250 + return + import warnings + + warnings.warn( + "Distutils was imported before Setuptools, but importing Setuptools " + "also replaces the `distutils` module in `sys.modules`. This may lead " + "to undesirable behaviors or errors. To avoid these issues, avoid " + "using distutils directly, ensure that setuptools is installed in the " + "traditional way (e.g. not an editable install), and/or make sure " + "that setuptools is always imported before distutils." + ) + + +def clear_distutils(): + if 'distutils' not in sys.modules: + return + import warnings + + warnings.warn("Setuptools is replacing distutils.") + mods = [ + name + for name in sys.modules + if name == "distutils" or name.startswith("distutils.") + ] + for name in mods: + del sys.modules[name] + + +def enabled(): + """ + Allow selection of distutils by environment variable. + """ + which = os.environ.get('SETUPTOOLS_USE_DISTUTILS', 'local') + return which == 'local' + + +def ensure_local_distutils(): + import importlib + + clear_distutils() + + # With the DistutilsMetaFinder in place, + # perform an import to cause distutils to be + # loaded from setuptools._distutils. Ref #2906. + with shim(): + importlib.import_module('distutils') + + # check that submodules load as expected + core = importlib.import_module('distutils.core') + assert '_distutils' in core.__file__, core.__file__ + assert 'setuptools._distutils.log' not in sys.modules + + +def do_override(): + """ + Ensure that the local copy of distutils is preferred over stdlib. + + See https://github.com/pypa/setuptools/issues/417#issuecomment-392298401 + for more motivation. + """ + if enabled(): + warn_distutils_present() + ensure_local_distutils() + + +class _TrivialRe: + def __init__(self, *patterns): + self._patterns = patterns + + def match(self, string): + return all(pat in string for pat in self._patterns) + + +class DistutilsMetaFinder: + def find_spec(self, fullname, path, target=None): + # optimization: only consider top level modules and those + # found in the CPython test suite. + if path is not None and not fullname.startswith('test.'): + return + + method_name = 'spec_for_{fullname}'.format(**locals()) + method = getattr(self, method_name, lambda: None) + return method() + + def spec_for_distutils(self): + if self.is_cpython(): + return + + import importlib + import importlib.abc + import importlib.util + + try: + mod = importlib.import_module('setuptools._distutils') + except Exception: + # There are a couple of cases where setuptools._distutils + # may not be present: + # - An older Setuptools without a local distutils is + # taking precedence. Ref #2957. + # - Path manipulation during sitecustomize removes + # setuptools from the path but only after the hook + # has been loaded. Ref #2980. + # In either case, fall back to stdlib behavior. + return + + class DistutilsLoader(importlib.abc.Loader): + def create_module(self, spec): + mod.__name__ = 'distutils' + return mod + + def exec_module(self, module): + pass + + return importlib.util.spec_from_loader( + 'distutils', DistutilsLoader(), origin=mod.__file__ + ) + + @staticmethod + def is_cpython(): + """ + Suppress supplying distutils for CPython (build and tests). + Ref #2965 and #3007. + """ + return os.path.isfile('pybuilddir.txt') + + def spec_for_pip(self): + """ + Ensure stdlib distutils when running under pip. + See pypa/pip#8761 for rationale. + """ + if self.pip_imported_during_build(): + return + clear_distutils() + self.spec_for_distutils = lambda: None + + @classmethod + def pip_imported_during_build(cls): + """ + Detect if pip is being imported in a build script. Ref #2355. + """ + import traceback + + return any( + cls.frame_file_is_setup(frame) for frame, line in traceback.walk_stack(None) + ) + + @staticmethod + def frame_file_is_setup(frame): + """ + Return True if the indicated frame suggests a setup.py file. + """ + # some frames may not have __file__ (#2940) + return frame.f_globals.get('__file__', '').endswith('setup.py') + + def spec_for_sensitive_tests(self): + """ + Ensure stdlib distutils when running select tests under CPython. + + python/cpython#91169 + """ + clear_distutils() + self.spec_for_distutils = lambda: None + + sensitive_tests = ( + [ + 'test.test_distutils', + 'test.test_peg_generator', + 'test.test_importlib', + ] + if sys.version_info < (3, 10) + else [ + 'test.test_distutils', + ] + ) + + +for name in DistutilsMetaFinder.sensitive_tests: + setattr( + DistutilsMetaFinder, + f'spec_for_{name}', + DistutilsMetaFinder.spec_for_sensitive_tests, + ) + + +DISTUTILS_FINDER = DistutilsMetaFinder() + + +def add_shim(): + DISTUTILS_FINDER in sys.meta_path or insert_shim() + + +class shim: + def __enter__(self): + insert_shim() + + def __exit__(self, exc, value, tb): + remove_shim() + + +def insert_shim(): + sys.meta_path.insert(0, DISTUTILS_FINDER) + + +def remove_shim(): + try: + sys.meta_path.remove(DISTUTILS_FINDER) + except ValueError: + pass diff --git a/app/src/flask-server/venv/Lib/site-packages/_distutils_hack/__pycache__/__init__.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/_distutils_hack/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000..7b5df4d Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/_distutils_hack/__pycache__/__init__.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/_distutils_hack/__pycache__/override.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/_distutils_hack/__pycache__/override.cpython-310.pyc new file mode 100644 index 0000000..c4dec1c Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/_distutils_hack/__pycache__/override.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/_distutils_hack/override.py b/app/src/flask-server/venv/Lib/site-packages/_distutils_hack/override.py new file mode 100644 index 0000000..2cc433a --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/_distutils_hack/override.py @@ -0,0 +1 @@ +__import__('_distutils_hack').do_override() diff --git a/app/src/flask-server/venv/Lib/site-packages/blinker-1.7.0.dist-info/INSTALLER b/app/src/flask-server/venv/Lib/site-packages/blinker-1.7.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/blinker-1.7.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/app/src/flask-server/venv/Lib/site-packages/blinker-1.7.0.dist-info/LICENSE.rst b/app/src/flask-server/venv/Lib/site-packages/blinker-1.7.0.dist-info/LICENSE.rst new file mode 100644 index 0000000..79c9825 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/blinker-1.7.0.dist-info/LICENSE.rst @@ -0,0 +1,20 @@ +Copyright 2010 Jason Kirtland + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/app/src/flask-server/venv/Lib/site-packages/blinker-1.7.0.dist-info/METADATA b/app/src/flask-server/venv/Lib/site-packages/blinker-1.7.0.dist-info/METADATA new file mode 100644 index 0000000..f96613c --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/blinker-1.7.0.dist-info/METADATA @@ -0,0 +1,62 @@ +Metadata-Version: 2.1 +Name: blinker +Version: 1.7.0 +Summary: Fast, simple object-to-object and broadcast signaling +Keywords: signal,emit,events,broadcast +Author-email: Jason Kirtland +Maintainer-email: Pallets Ecosystem +Requires-Python: >=3.8 +Description-Content-Type: text/x-rst +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Topic :: Software Development :: Libraries +Project-URL: Chat, https://discord.gg/pallets +Project-URL: Documentation, https://blinker.readthedocs.io +Project-URL: Homepage, https://blinker.readthedocs.io +Project-URL: Issue Tracker, https://github.com/pallets-eco/blinker/issues/ +Project-URL: Source Code, https://github.com/pallets-eco/blinker/ + +Blinker +======= + +Blinker provides a fast dispatching system that allows any number of +interested parties to subscribe to events, or "signals". + +Signal receivers can subscribe to specific senders or receive signals +sent by any sender. + +.. code-block:: pycon + + >>> from blinker import signal + >>> started = signal('round-started') + >>> def each(round): + ... print(f"Round {round}") + ... + >>> started.connect(each) + + >>> def round_two(round): + ... print("This is round two.") + ... + >>> started.connect(round_two, sender=2) + + >>> for round in range(1, 4): + ... started.send(round) + ... + Round 1! + Round 2! + This is round two. + Round 3! + + +Links +----- + +- Documentation: https://blinker.readthedocs.io/ +- Changes: https://blinker.readthedocs.io/#changes +- PyPI Releases: https://pypi.org/project/blinker/ +- Source Code: https://github.com/pallets-eco/blinker/ +- Issue Tracker: https://github.com/pallets-eco/blinker/issues/ + diff --git a/app/src/flask-server/venv/Lib/site-packages/blinker-1.7.0.dist-info/RECORD b/app/src/flask-server/venv/Lib/site-packages/blinker-1.7.0.dist-info/RECORD new file mode 100644 index 0000000..33cf5dc --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/blinker-1.7.0.dist-info/RECORD @@ -0,0 +1,14 @@ +blinker-1.7.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +blinker-1.7.0.dist-info/LICENSE.rst,sha256=nrc6HzhZekqhcCXSrhvjg5Ykx5XphdTw6Xac4p-spGc,1054 +blinker-1.7.0.dist-info/METADATA,sha256=kDgzPgrw4he78pEX88bSAqwYMVWrfUMk8QmNjekjg_U,1918 +blinker-1.7.0.dist-info/RECORD,, +blinker-1.7.0.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81 +blinker/__init__.py,sha256=s75XaRDHwSDzZ21BZUOEkQDQIcQEyT8hT7vk3EhYFQU,408 +blinker/__pycache__/__init__.cpython-310.pyc,, +blinker/__pycache__/_saferef.cpython-310.pyc,, +blinker/__pycache__/_utilities.cpython-310.pyc,, +blinker/__pycache__/base.cpython-310.pyc,, +blinker/_saferef.py,sha256=kWOTIWnCY3kOb8lZP74Rbx7bR_BLVg4TjwzNCRLhKHs,9096 +blinker/_utilities.py,sha256=S2njKDmlBpK_yCK4RT8hq98hEj30I0TQCC5mNhtY22I,2856 +blinker/base.py,sha256=FqZmAI5YzuRrvRmye1Jb-utyVOjXtF5vUVP3-1u-HtU,20544 +blinker/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/app/src/flask-server/venv/Lib/site-packages/blinker-1.7.0.dist-info/WHEEL b/app/src/flask-server/venv/Lib/site-packages/blinker-1.7.0.dist-info/WHEEL new file mode 100644 index 0000000..3b5e64b --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/blinker-1.7.0.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: flit 3.9.0 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/app/src/flask-server/venv/Lib/site-packages/blinker/__init__.py b/app/src/flask-server/venv/Lib/site-packages/blinker/__init__.py new file mode 100644 index 0000000..d014caa --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/blinker/__init__.py @@ -0,0 +1,19 @@ +from blinker.base import ANY +from blinker.base import NamedSignal +from blinker.base import Namespace +from blinker.base import receiver_connected +from blinker.base import Signal +from blinker.base import signal +from blinker.base import WeakNamespace + +__all__ = [ + "ANY", + "NamedSignal", + "Namespace", + "Signal", + "WeakNamespace", + "receiver_connected", + "signal", +] + +__version__ = "1.7.0" diff --git a/app/src/flask-server/venv/Lib/site-packages/blinker/__pycache__/__init__.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/blinker/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000..bb9d2dd Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/blinker/__pycache__/__init__.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/blinker/__pycache__/_saferef.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/blinker/__pycache__/_saferef.cpython-310.pyc new file mode 100644 index 0000000..9b81928 Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/blinker/__pycache__/_saferef.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/blinker/__pycache__/_utilities.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/blinker/__pycache__/_utilities.cpython-310.pyc new file mode 100644 index 0000000..936813b Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/blinker/__pycache__/_utilities.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/blinker/__pycache__/base.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/blinker/__pycache__/base.cpython-310.pyc new file mode 100644 index 0000000..3e76cf9 Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/blinker/__pycache__/base.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/blinker/_saferef.py b/app/src/flask-server/venv/Lib/site-packages/blinker/_saferef.py new file mode 100644 index 0000000..dcb70c1 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/blinker/_saferef.py @@ -0,0 +1,230 @@ +# extracted from Louie, http://pylouie.org/ +# updated for Python 3 +# +# Copyright (c) 2006 Patrick K. O'Brien, Mike C. Fletcher, +# Matthew R. Scott +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided +# with the distribution. +# +# * Neither the name of the nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +"""Refactored 'safe reference from dispatcher.py""" +import operator +import sys +import traceback +import weakref + + +get_self = operator.attrgetter("__self__") +get_func = operator.attrgetter("__func__") + + +def safe_ref(target, on_delete=None): + """Return a *safe* weak reference to a callable target. + + - ``target``: The object to be weakly referenced, if it's a bound + method reference, will create a BoundMethodWeakref, otherwise + creates a simple weakref. + + - ``on_delete``: If provided, will have a hard reference stored to + the callable to be called after the safe reference goes out of + scope with the reference object, (either a weakref or a + BoundMethodWeakref) as argument. + """ + try: + im_self = get_self(target) + except AttributeError: + if callable(on_delete): + return weakref.ref(target, on_delete) + else: + return weakref.ref(target) + else: + if im_self is not None: + # Turn a bound method into a BoundMethodWeakref instance. + # Keep track of these instances for lookup by disconnect(). + assert hasattr(target, "im_func") or hasattr(target, "__func__"), ( + f"safe_ref target {target!r} has im_self, but no im_func, " + "don't know how to create reference" + ) + reference = BoundMethodWeakref(target=target, on_delete=on_delete) + return reference + + +class BoundMethodWeakref: + """'Safe' and reusable weak references to instance methods. + + BoundMethodWeakref objects provide a mechanism for referencing a + bound method without requiring that the method object itself + (which is normally a transient object) is kept alive. Instead, + the BoundMethodWeakref object keeps weak references to both the + object and the function which together define the instance method. + + Attributes: + + - ``key``: The identity key for the reference, calculated by the + class's calculate_key method applied to the target instance method. + + - ``deletion_methods``: Sequence of callable objects taking single + argument, a reference to this object which will be called when + *either* the target object or target function is garbage + collected (i.e. when this object becomes invalid). These are + specified as the on_delete parameters of safe_ref calls. + + - ``weak_self``: Weak reference to the target object. + + - ``weak_func``: Weak reference to the target function. + + Class Attributes: + + - ``_all_instances``: Class attribute pointing to all live + BoundMethodWeakref objects indexed by the class's + calculate_key(target) method applied to the target objects. + This weak value dictionary is used to short-circuit creation so + that multiple references to the same (object, function) pair + produce the same BoundMethodWeakref instance. + """ + + _all_instances = weakref.WeakValueDictionary() # type: ignore[var-annotated] + + def __new__(cls, target, on_delete=None, *arguments, **named): + """Create new instance or return current instance. + + Basically this method of construction allows us to + short-circuit creation of references to already-referenced + instance methods. The key corresponding to the target is + calculated, and if there is already an existing reference, + that is returned, with its deletion_methods attribute updated. + Otherwise the new instance is created and registered in the + table of already-referenced methods. + """ + key = cls.calculate_key(target) + current = cls._all_instances.get(key) + if current is not None: + current.deletion_methods.append(on_delete) + return current + else: + base = super().__new__(cls) + cls._all_instances[key] = base + base.__init__(target, on_delete, *arguments, **named) + return base + + def __init__(self, target, on_delete=None): + """Return a weak-reference-like instance for a bound method. + + - ``target``: The instance-method target for the weak reference, + must have im_self and im_func attributes and be + reconstructable via the following, which is true of built-in + instance methods:: + + target.im_func.__get__( target.im_self ) + + - ``on_delete``: Optional callback which will be called when + this weak reference ceases to be valid (i.e. either the + object or the function is garbage collected). Should take a + single argument, which will be passed a pointer to this + object. + """ + + def remove(weak, self=self): + """Set self.isDead to True when method or instance is destroyed.""" + methods = self.deletion_methods[:] + del self.deletion_methods[:] + try: + del self.__class__._all_instances[self.key] + except KeyError: + pass + for function in methods: + try: + if callable(function): + function(self) + except Exception: + try: + traceback.print_exc() + except AttributeError: + e = sys.exc_info()[1] + print( + f"Exception during saferef {self} " + f"cleanup function {function}: {e}" + ) + + self.deletion_methods = [on_delete] + self.key = self.calculate_key(target) + im_self = get_self(target) + im_func = get_func(target) + self.weak_self = weakref.ref(im_self, remove) + self.weak_func = weakref.ref(im_func, remove) + self.self_name = str(im_self) + self.func_name = str(im_func.__name__) + + @classmethod + def calculate_key(cls, target): + """Calculate the reference key for this reference. + + Currently this is a two-tuple of the id()'s of the target + object and the target function respectively. + """ + return (id(get_self(target)), id(get_func(target))) + + def __str__(self): + """Give a friendly representation of the object.""" + return "{}({}.{})".format( + self.__class__.__name__, + self.self_name, + self.func_name, + ) + + __repr__ = __str__ + + def __hash__(self): + return hash((self.self_name, self.key)) + + def __nonzero__(self): + """Whether we are still a valid reference.""" + return self() is not None + + def __eq__(self, other): + """Compare with another reference.""" + if not isinstance(other, self.__class__): + return operator.eq(self.__class__, type(other)) + return operator.eq(self.key, other.key) + + def __call__(self): + """Return a strong reference to the bound method. + + If the target cannot be retrieved, then will return None, + otherwise returns a bound instance method for our object and + function. + + Note: You may call this method any number of times, as it does + not invalidate the reference. + """ + target = self.weak_self() + if target is not None: + function = self.weak_func() + if function is not None: + return function.__get__(target) + return None diff --git a/app/src/flask-server/venv/Lib/site-packages/blinker/_utilities.py b/app/src/flask-server/venv/Lib/site-packages/blinker/_utilities.py new file mode 100644 index 0000000..4b711c6 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/blinker/_utilities.py @@ -0,0 +1,105 @@ +from __future__ import annotations + +import typing as t +from weakref import ref + +from blinker._saferef import BoundMethodWeakref + +IdentityType = t.Union[t.Tuple[int, int], str, int] + + +class _symbol: + def __init__(self, name): + """Construct a new named symbol.""" + self.__name__ = self.name = name + + def __reduce__(self): + return symbol, (self.name,) + + def __repr__(self): + return self.name + + +_symbol.__name__ = "symbol" + + +class symbol: + """A constant symbol. + + >>> symbol('foo') is symbol('foo') + True + >>> symbol('foo') + foo + + A slight refinement of the MAGICCOOKIE=object() pattern. The primary + advantage of symbol() is its repr(). They are also singletons. + + Repeated calls of symbol('name') will all return the same instance. + + """ + + symbols = {} # type: ignore[var-annotated] + + def __new__(cls, name): + try: + return cls.symbols[name] + except KeyError: + return cls.symbols.setdefault(name, _symbol(name)) + + +def hashable_identity(obj: object) -> IdentityType: + if hasattr(obj, "__func__"): + return (id(obj.__func__), id(obj.__self__)) # type: ignore[attr-defined] + elif hasattr(obj, "im_func"): + return (id(obj.im_func), id(obj.im_self)) # type: ignore[attr-defined] + elif isinstance(obj, (int, str)): + return obj + else: + return id(obj) + + +WeakTypes = (ref, BoundMethodWeakref) + + +class annotatable_weakref(ref): + """A weakref.ref that supports custom instance attributes.""" + + receiver_id: t.Optional[IdentityType] + sender_id: t.Optional[IdentityType] + + +def reference( # type: ignore[no-untyped-def] + object, callback=None, **annotations +) -> annotatable_weakref: + """Return an annotated weak ref.""" + if callable(object): + weak = callable_reference(object, callback) + else: + weak = annotatable_weakref(object, callback) + for key, value in annotations.items(): + setattr(weak, key, value) + return weak # type: ignore[no-any-return] + + +def callable_reference(object, callback=None): + """Return an annotated weak ref, supporting bound instance methods.""" + if hasattr(object, "im_self") and object.im_self is not None: + return BoundMethodWeakref(target=object, on_delete=callback) + elif hasattr(object, "__self__") and object.__self__ is not None: + return BoundMethodWeakref(target=object, on_delete=callback) + return annotatable_weakref(object, callback) + + +class lazy_property: + """A @property that is only evaluated once.""" + + def __init__(self, deferred): + self._deferred = deferred + self.__doc__ = deferred.__doc__ + + def __get__(self, obj, cls): + if obj is None: + return self + value = self._deferred(obj) + setattr(obj, self._deferred.__name__, value) + return value diff --git a/app/src/flask-server/venv/Lib/site-packages/blinker/base.py b/app/src/flask-server/venv/Lib/site-packages/blinker/base.py new file mode 100644 index 0000000..b9d7035 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/blinker/base.py @@ -0,0 +1,558 @@ +"""Signals and events. + +A small implementation of signals, inspired by a snippet of Django signal +API client code seen in a blog post. Signals are first-class objects and +each manages its own receivers and message emission. + +The :func:`signal` function provides singleton behavior for named signals. + +""" +from __future__ import annotations + +import typing as t +from collections import defaultdict +from contextlib import contextmanager +from inspect import iscoroutinefunction +from warnings import warn +from weakref import WeakValueDictionary + +from blinker._utilities import annotatable_weakref +from blinker._utilities import hashable_identity +from blinker._utilities import IdentityType +from blinker._utilities import lazy_property +from blinker._utilities import reference +from blinker._utilities import symbol +from blinker._utilities import WeakTypes + +if t.TYPE_CHECKING: + import typing_extensions as te + + T_callable = t.TypeVar("T_callable", bound=t.Callable[..., t.Any]) + + T = t.TypeVar("T") + P = te.ParamSpec("P") + + AsyncWrapperType = t.Callable[[t.Callable[P, t.Awaitable[T]]], t.Callable[P, T]] + SyncWrapperType = t.Callable[[t.Callable[P, T]], t.Callable[P, t.Awaitable[T]]] + +ANY = symbol("ANY") +ANY.__doc__ = 'Token for "any sender".' +ANY_ID = 0 + +# NOTE: We need a reference to cast for use in weakref callbacks otherwise +# t.cast may have already been set to None during finalization. +cast = t.cast + + +class Signal: + """A notification emitter.""" + + #: An :obj:`ANY` convenience synonym, allows ``Signal.ANY`` + #: without an additional import. + ANY = ANY + + set_class: type[set] = set + + @lazy_property + def receiver_connected(self) -> Signal: + """Emitted after each :meth:`connect`. + + The signal sender is the signal instance, and the :meth:`connect` + arguments are passed through: *receiver*, *sender*, and *weak*. + + .. versionadded:: 1.2 + + """ + return Signal(doc="Emitted after a receiver connects.") + + @lazy_property + def receiver_disconnected(self) -> Signal: + """Emitted after :meth:`disconnect`. + + The sender is the signal instance, and the :meth:`disconnect` arguments + are passed through: *receiver* and *sender*. + + Note, this signal is emitted **only** when :meth:`disconnect` is + called explicitly. + + The disconnect signal can not be emitted by an automatic disconnect + (due to a weakly referenced receiver or sender going out of scope), + as the receiver and/or sender instances are no longer available for + use at the time this signal would be emitted. + + An alternative approach is available by subscribing to + :attr:`receiver_connected` and setting up a custom weakref cleanup + callback on weak receivers and senders. + + .. versionadded:: 1.2 + + """ + return Signal(doc="Emitted after a receiver disconnects.") + + def __init__(self, doc: str | None = None) -> None: + """ + :param doc: optional. If provided, will be assigned to the signal's + __doc__ attribute. + + """ + if doc: + self.__doc__ = doc + #: A mapping of connected receivers. + #: + #: The values of this mapping are not meaningful outside of the + #: internal :class:`Signal` implementation, however the boolean value + #: of the mapping is useful as an extremely efficient check to see if + #: any receivers are connected to the signal. + self.receivers: dict[IdentityType, t.Callable | annotatable_weakref] = {} + self.is_muted = False + self._by_receiver: dict[IdentityType, set[IdentityType]] = defaultdict( + self.set_class + ) + self._by_sender: dict[IdentityType, set[IdentityType]] = defaultdict( + self.set_class + ) + self._weak_senders: dict[IdentityType, annotatable_weakref] = {} + + def connect( + self, receiver: T_callable, sender: t.Any = ANY, weak: bool = True + ) -> T_callable: + """Connect *receiver* to signal events sent by *sender*. + + :param receiver: A callable. Will be invoked by :meth:`send` with + `sender=` as a single positional argument and any ``kwargs`` that + were provided to a call to :meth:`send`. + + :param sender: Any object or :obj:`ANY`, defaults to ``ANY``. + Restricts notifications delivered to *receiver* to only those + :meth:`send` emissions sent by *sender*. If ``ANY``, the receiver + will always be notified. A *receiver* may be connected to + multiple *sender* values on the same Signal through multiple calls + to :meth:`connect`. + + :param weak: If true, the Signal will hold a weakref to *receiver* + and automatically disconnect when *receiver* goes out of scope or + is garbage collected. Defaults to True. + + """ + receiver_id = hashable_identity(receiver) + receiver_ref: T_callable | annotatable_weakref + + if weak: + receiver_ref = reference(receiver, self._cleanup_receiver) + receiver_ref.receiver_id = receiver_id + else: + receiver_ref = receiver + sender_id: IdentityType + if sender is ANY: + sender_id = ANY_ID + else: + sender_id = hashable_identity(sender) + + self.receivers.setdefault(receiver_id, receiver_ref) + self._by_sender[sender_id].add(receiver_id) + self._by_receiver[receiver_id].add(sender_id) + del receiver_ref + + if sender is not ANY and sender_id not in self._weak_senders: + # wire together a cleanup for weakref-able senders + try: + sender_ref = reference(sender, self._cleanup_sender) + sender_ref.sender_id = sender_id + except TypeError: + pass + else: + self._weak_senders.setdefault(sender_id, sender_ref) + del sender_ref + + # broadcast this connection. if receivers raise, disconnect. + if "receiver_connected" in self.__dict__ and self.receiver_connected.receivers: + try: + self.receiver_connected.send( + self, receiver=receiver, sender=sender, weak=weak + ) + except TypeError as e: + self.disconnect(receiver, sender) + raise e + if receiver_connected.receivers and self is not receiver_connected: + try: + receiver_connected.send( + self, receiver_arg=receiver, sender_arg=sender, weak_arg=weak + ) + except TypeError as e: + self.disconnect(receiver, sender) + raise e + return receiver + + def connect_via( + self, sender: t.Any, weak: bool = False + ) -> t.Callable[[T_callable], T_callable]: + """Connect the decorated function as a receiver for *sender*. + + :param sender: Any object or :obj:`ANY`. The decorated function + will only receive :meth:`send` emissions sent by *sender*. If + ``ANY``, the receiver will always be notified. A function may be + decorated multiple times with differing *sender* values. + + :param weak: If true, the Signal will hold a weakref to the + decorated function and automatically disconnect when *receiver* + goes out of scope or is garbage collected. Unlike + :meth:`connect`, this defaults to False. + + The decorated function will be invoked by :meth:`send` with + `sender=` as a single positional argument and any ``kwargs`` that + were provided to the call to :meth:`send`. + + + .. versionadded:: 1.1 + + """ + + def decorator(fn: T_callable) -> T_callable: + self.connect(fn, sender, weak) + return fn + + return decorator + + @contextmanager + def connected_to( + self, receiver: t.Callable, sender: t.Any = ANY + ) -> t.Generator[None, None, None]: + """Execute a block with the signal temporarily connected to *receiver*. + + :param receiver: a receiver callable + :param sender: optional, a sender to filter on + + This is a context manager for use in the ``with`` statement. It can + be useful in unit tests. *receiver* is connected to the signal for + the duration of the ``with`` block, and will be disconnected + automatically when exiting the block: + + .. code-block:: python + + with on_ready.connected_to(receiver): + # do stuff + on_ready.send(123) + + .. versionadded:: 1.1 + + """ + self.connect(receiver, sender=sender, weak=False) + try: + yield None + finally: + self.disconnect(receiver) + + @contextmanager + def muted(self) -> t.Generator[None, None, None]: + """Context manager for temporarily disabling signal. + Useful for test purposes. + """ + self.is_muted = True + try: + yield None + except Exception as e: + raise e + finally: + self.is_muted = False + + def temporarily_connected_to( + self, receiver: t.Callable, sender: t.Any = ANY + ) -> t.ContextManager[None]: + """An alias for :meth:`connected_to`. + + :param receiver: a receiver callable + :param sender: optional, a sender to filter on + + .. versionadded:: 0.9 + + .. versionchanged:: 1.1 + Renamed to :meth:`connected_to`. ``temporarily_connected_to`` was + deprecated in 1.2 and will be removed in a subsequent version. + + """ + warn( + "temporarily_connected_to is deprecated; use connected_to instead.", + DeprecationWarning, + ) + return self.connected_to(receiver, sender) + + def send( + self, + *sender: t.Any, + _async_wrapper: AsyncWrapperType | None = None, + **kwargs: t.Any, + ) -> list[tuple[t.Callable, t.Any]]: + """Emit this signal on behalf of *sender*, passing on ``kwargs``. + + Returns a list of 2-tuples, pairing receivers with their return + value. The ordering of receiver notification is undefined. + + :param sender: Any object or ``None``. If omitted, synonymous + with ``None``. Only accepts one positional argument. + :param _async_wrapper: A callable that should wrap a coroutine + receiver and run it when called synchronously. + + :param kwargs: Data to be sent to receivers. + """ + if self.is_muted: + return [] + + sender = self._extract_sender(sender) + results = [] + for receiver in self.receivers_for(sender): + if iscoroutinefunction(receiver): + if _async_wrapper is None: + raise RuntimeError("Cannot send to a coroutine function") + receiver = _async_wrapper(receiver) + result = receiver(sender, **kwargs) + results.append((receiver, result)) + return results + + async def send_async( + self, + *sender: t.Any, + _sync_wrapper: SyncWrapperType | None = None, + **kwargs: t.Any, + ) -> list[tuple[t.Callable, t.Any]]: + """Emit this signal on behalf of *sender*, passing on ``kwargs``. + + Returns a list of 2-tuples, pairing receivers with their return + value. The ordering of receiver notification is undefined. + + :param sender: Any object or ``None``. If omitted, synonymous + with ``None``. Only accepts one positional argument. + :param _sync_wrapper: A callable that should wrap a synchronous + receiver and run it when awaited. + + :param kwargs: Data to be sent to receivers. + """ + if self.is_muted: + return [] + + sender = self._extract_sender(sender) + results = [] + for receiver in self.receivers_for(sender): + if not iscoroutinefunction(receiver): + if _sync_wrapper is None: + raise RuntimeError("Cannot send to a non-coroutine function") + receiver = _sync_wrapper(receiver) + result = await receiver(sender, **kwargs) + results.append((receiver, result)) + return results + + def _extract_sender(self, sender: t.Any) -> t.Any: + if not self.receivers: + # Ensure correct signature even on no-op sends, disable with -O + # for lowest possible cost. + if __debug__ and sender and len(sender) > 1: + raise TypeError( + f"send() accepts only one positional argument, {len(sender)} given" + ) + return [] + + # Using '*sender' rather than 'sender=None' allows 'sender' to be + # used as a keyword argument- i.e. it's an invisible name in the + # function signature. + if len(sender) == 0: + sender = None + elif len(sender) > 1: + raise TypeError( + f"send() accepts only one positional argument, {len(sender)} given" + ) + else: + sender = sender[0] + return sender + + def has_receivers_for(self, sender: t.Any) -> bool: + """True if there is probably a receiver for *sender*. + + Performs an optimistic check only. Does not guarantee that all + weakly referenced receivers are still alive. See + :meth:`receivers_for` for a stronger search. + + """ + if not self.receivers: + return False + if self._by_sender[ANY_ID]: + return True + if sender is ANY: + return False + return hashable_identity(sender) in self._by_sender + + def receivers_for( + self, sender: t.Any + ) -> t.Generator[t.Callable[[t.Any], t.Any], None, None]: + """Iterate all live receivers listening for *sender*.""" + # TODO: test receivers_for(ANY) + if self.receivers: + sender_id = hashable_identity(sender) + if sender_id in self._by_sender: + ids = self._by_sender[ANY_ID] | self._by_sender[sender_id] + else: + ids = self._by_sender[ANY_ID].copy() + for receiver_id in ids: + receiver = self.receivers.get(receiver_id) + if receiver is None: + continue + if isinstance(receiver, WeakTypes): + strong = receiver() + if strong is None: + self._disconnect(receiver_id, ANY_ID) + continue + receiver = strong + yield receiver # type: ignore[misc] + + def disconnect(self, receiver: t.Callable, sender: t.Any = ANY) -> None: + """Disconnect *receiver* from this signal's events. + + :param receiver: a previously :meth:`connected` callable + + :param sender: a specific sender to disconnect from, or :obj:`ANY` + to disconnect from all senders. Defaults to ``ANY``. + + """ + sender_id: IdentityType + if sender is ANY: + sender_id = ANY_ID + else: + sender_id = hashable_identity(sender) + receiver_id = hashable_identity(receiver) + self._disconnect(receiver_id, sender_id) + + if ( + "receiver_disconnected" in self.__dict__ + and self.receiver_disconnected.receivers + ): + self.receiver_disconnected.send(self, receiver=receiver, sender=sender) + + def _disconnect(self, receiver_id: IdentityType, sender_id: IdentityType) -> None: + if sender_id == ANY_ID: + if self._by_receiver.pop(receiver_id, False): + for bucket in self._by_sender.values(): + bucket.discard(receiver_id) + self.receivers.pop(receiver_id, None) + else: + self._by_sender[sender_id].discard(receiver_id) + self._by_receiver[receiver_id].discard(sender_id) + + def _cleanup_receiver(self, receiver_ref: annotatable_weakref) -> None: + """Disconnect a receiver from all senders.""" + self._disconnect(cast(IdentityType, receiver_ref.receiver_id), ANY_ID) + + def _cleanup_sender(self, sender_ref: annotatable_weakref) -> None: + """Disconnect all receivers from a sender.""" + sender_id = cast(IdentityType, sender_ref.sender_id) + assert sender_id != ANY_ID + self._weak_senders.pop(sender_id, None) + for receiver_id in self._by_sender.pop(sender_id, ()): + self._by_receiver[receiver_id].discard(sender_id) + + def _cleanup_bookkeeping(self) -> None: + """Prune unused sender/receiver bookkeeping. Not threadsafe. + + Connecting & disconnecting leave behind a small amount of bookkeeping + for the receiver and sender values. Typical workloads using Blinker, + for example in most web apps, Flask, CLI scripts, etc., are not + adversely affected by this bookkeeping. + + With a long-running Python process performing dynamic signal routing + with high volume- e.g. connecting to function closures, "senders" are + all unique object instances, and doing all of this over and over- you + may see memory usage will grow due to extraneous bookkeeping. (An empty + set() for each stale sender/receiver pair.) + + This method will prune that bookkeeping away, with the caveat that such + pruning is not threadsafe. The risk is that cleanup of a fully + disconnected receiver/sender pair occurs while another thread is + connecting that same pair. If you are in the highly dynamic, unique + receiver/sender situation that has lead you to this method, that + failure mode is perhaps not a big deal for you. + """ + for mapping in (self._by_sender, self._by_receiver): + for _id, bucket in list(mapping.items()): + if not bucket: + mapping.pop(_id, None) + + def _clear_state(self) -> None: + """Throw away all signal state. Useful for unit tests.""" + self._weak_senders.clear() + self.receivers.clear() + self._by_sender.clear() + self._by_receiver.clear() + + +receiver_connected = Signal( + """\ +Sent by a :class:`Signal` after a receiver connects. + +:argument: the Signal that was connected to +:keyword receiver_arg: the connected receiver +:keyword sender_arg: the sender to connect to +:keyword weak_arg: true if the connection to receiver_arg is a weak reference + +.. deprecated:: 1.2 + +As of 1.2, individual signals have their own private +:attr:`~Signal.receiver_connected` and +:attr:`~Signal.receiver_disconnected` signals with a slightly simplified +call signature. This global signal is planned to be removed in 1.6. + +""" +) + + +class NamedSignal(Signal): + """A named generic notification emitter.""" + + def __init__(self, name: str, doc: str | None = None) -> None: + Signal.__init__(self, doc) + + #: The name of this signal. + self.name = name + + def __repr__(self) -> str: + base = Signal.__repr__(self) + return f"{base[:-1]}; {self.name!r}>" # noqa: E702 + + +class Namespace(dict): + """A mapping of signal names to signals.""" + + def signal(self, name: str, doc: str | None = None) -> NamedSignal: + """Return the :class:`NamedSignal` *name*, creating it if required. + + Repeated calls to this function will return the same signal object. + + """ + try: + return self[name] # type: ignore[no-any-return] + except KeyError: + result = self.setdefault(name, NamedSignal(name, doc)) + return result # type: ignore[no-any-return] + + +class WeakNamespace(WeakValueDictionary): + """A weak mapping of signal names to signals. + + Automatically cleans up unused Signals when the last reference goes out + of scope. This namespace implementation exists for a measure of legacy + compatibility with Blinker <= 1.2, and may be dropped in the future. + + .. versionadded:: 1.3 + + """ + + def signal(self, name: str, doc: str | None = None) -> NamedSignal: + """Return the :class:`NamedSignal` *name*, creating it if required. + + Repeated calls to this function will return the same signal object. + + """ + try: + return self[name] # type: ignore[no-any-return] + except KeyError: + result = self.setdefault(name, NamedSignal(name, doc)) + return result # type: ignore[no-any-return] + + +signal = Namespace().signal diff --git a/app/src/flask-server/venv/Lib/site-packages/blinker/py.typed b/app/src/flask-server/venv/Lib/site-packages/blinker/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/app/src/flask-server/venv/Lib/site-packages/click-8.1.7.dist-info/INSTALLER b/app/src/flask-server/venv/Lib/site-packages/click-8.1.7.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/click-8.1.7.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/app/src/flask-server/venv/Lib/site-packages/click-8.1.7.dist-info/LICENSE.rst b/app/src/flask-server/venv/Lib/site-packages/click-8.1.7.dist-info/LICENSE.rst new file mode 100644 index 0000000..d12a849 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/click-8.1.7.dist-info/LICENSE.rst @@ -0,0 +1,28 @@ +Copyright 2014 Pallets + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/app/src/flask-server/venv/Lib/site-packages/click-8.1.7.dist-info/METADATA b/app/src/flask-server/venv/Lib/site-packages/click-8.1.7.dist-info/METADATA new file mode 100644 index 0000000..7a6bbb2 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/click-8.1.7.dist-info/METADATA @@ -0,0 +1,103 @@ +Metadata-Version: 2.1 +Name: click +Version: 8.1.7 +Summary: Composable command line interface toolkit +Home-page: https://palletsprojects.com/p/click/ +Maintainer: Pallets +Maintainer-email: contact@palletsprojects.com +License: BSD-3-Clause +Project-URL: Donate, https://palletsprojects.com/donate +Project-URL: Documentation, https://click.palletsprojects.com/ +Project-URL: Changes, https://click.palletsprojects.com/changes/ +Project-URL: Source Code, https://github.com/pallets/click/ +Project-URL: Issue Tracker, https://github.com/pallets/click/issues/ +Project-URL: Chat, https://discord.gg/pallets +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Requires-Python: >=3.7 +Description-Content-Type: text/x-rst +License-File: LICENSE.rst +Requires-Dist: colorama ; platform_system == "Windows" +Requires-Dist: importlib-metadata ; python_version < "3.8" + +\$ click\_ +========== + +Click is a Python package for creating beautiful command line interfaces +in a composable way with as little code as necessary. It's the "Command +Line Interface Creation Kit". It's highly configurable but comes with +sensible defaults out of the box. + +It aims to make the process of writing command line tools quick and fun +while also preventing any frustration caused by the inability to +implement an intended CLI API. + +Click in three points: + +- Arbitrary nesting of commands +- Automatic help page generation +- Supports lazy loading of subcommands at runtime + + +Installing +---------- + +Install and update using `pip`_: + +.. code-block:: text + + $ pip install -U click + +.. _pip: https://pip.pypa.io/en/stable/getting-started/ + + +A Simple Example +---------------- + +.. code-block:: python + + import click + + @click.command() + @click.option("--count", default=1, help="Number of greetings.") + @click.option("--name", prompt="Your name", help="The person to greet.") + def hello(count, name): + """Simple program that greets NAME for a total of COUNT times.""" + for _ in range(count): + click.echo(f"Hello, {name}!") + + if __name__ == '__main__': + hello() + +.. code-block:: text + + $ python hello.py --count=3 + Your name: Click + Hello, Click! + Hello, Click! + Hello, Click! + + +Donate +------ + +The Pallets organization develops and supports Click and other popular +packages. In order to grow the community of contributors and users, and +allow the maintainers to devote more time to the projects, `please +donate today`_. + +.. _please donate today: https://palletsprojects.com/donate + + +Links +----- + +- Documentation: https://click.palletsprojects.com/ +- Changes: https://click.palletsprojects.com/changes/ +- PyPI Releases: https://pypi.org/project/click/ +- Source Code: https://github.com/pallets/click +- Issue Tracker: https://github.com/pallets/click/issues +- Chat: https://discord.gg/pallets diff --git a/app/src/flask-server/venv/Lib/site-packages/click-8.1.7.dist-info/RECORD b/app/src/flask-server/venv/Lib/site-packages/click-8.1.7.dist-info/RECORD new file mode 100644 index 0000000..7bc97df --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/click-8.1.7.dist-info/RECORD @@ -0,0 +1,39 @@ +click-8.1.7.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +click-8.1.7.dist-info/LICENSE.rst,sha256=morRBqOU6FO_4h9C9OctWSgZoigF2ZG18ydQKSkrZY0,1475 +click-8.1.7.dist-info/METADATA,sha256=qIMevCxGA9yEmJOM_4WHuUJCwWpsIEVbCPOhs45YPN4,3014 +click-8.1.7.dist-info/RECORD,, +click-8.1.7.dist-info/WHEEL,sha256=5sUXSg9e4bi7lTLOHcm6QEYwO5TIF1TNbTSVFVjcJcc,92 +click-8.1.7.dist-info/top_level.txt,sha256=J1ZQogalYS4pphY_lPECoNMfw0HzTSrZglC4Yfwo4xA,6 +click/__init__.py,sha256=YDDbjm406dTOA0V8bTtdGnhN7zj5j-_dFRewZF_pLvw,3138 +click/__pycache__/__init__.cpython-310.pyc,, +click/__pycache__/_compat.cpython-310.pyc,, +click/__pycache__/_termui_impl.cpython-310.pyc,, +click/__pycache__/_textwrap.cpython-310.pyc,, +click/__pycache__/_winconsole.cpython-310.pyc,, +click/__pycache__/core.cpython-310.pyc,, +click/__pycache__/decorators.cpython-310.pyc,, +click/__pycache__/exceptions.cpython-310.pyc,, +click/__pycache__/formatting.cpython-310.pyc,, +click/__pycache__/globals.cpython-310.pyc,, +click/__pycache__/parser.cpython-310.pyc,, +click/__pycache__/shell_completion.cpython-310.pyc,, +click/__pycache__/termui.cpython-310.pyc,, +click/__pycache__/testing.cpython-310.pyc,, +click/__pycache__/types.cpython-310.pyc,, +click/__pycache__/utils.cpython-310.pyc,, +click/_compat.py,sha256=5318agQpbt4kroKsbqDOYpTSWzL_YCZVUQiTT04yXmc,18744 +click/_termui_impl.py,sha256=3dFYv4445Nw-rFvZOTBMBPYwB1bxnmNk9Du6Dm_oBSU,24069 +click/_textwrap.py,sha256=10fQ64OcBUMuK7mFvh8363_uoOxPlRItZBmKzRJDgoY,1353 +click/_winconsole.py,sha256=5ju3jQkcZD0W27WEMGqmEP4y_crUVzPCqsX_FYb7BO0,7860 +click/core.py,sha256=j6oEWtGgGna8JarD6WxhXmNnxLnfRjwXglbBc-8jr7U,114086 +click/decorators.py,sha256=-ZlbGYgV-oI8jr_oH4RpuL1PFS-5QmeuEAsLDAYgxtw,18719 +click/exceptions.py,sha256=fyROO-47HWFDjt2qupo7A3J32VlpM-ovJnfowu92K3s,9273 +click/formatting.py,sha256=Frf0-5W33-loyY_i9qrwXR8-STnW3m5gvyxLVUdyxyk,9706 +click/globals.py,sha256=TP-qM88STzc7f127h35TD_v920FgfOD2EwzqA0oE8XU,1961 +click/parser.py,sha256=LKyYQE9ZLj5KgIDXkrcTHQRXIggfoivX14_UVIn56YA,19067 +click/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +click/shell_completion.py,sha256=Ty3VM_ts0sQhj6u7eFTiLwHPoTgcXTGEAUg2OpLqYKw,18460 +click/termui.py,sha256=H7Q8FpmPelhJ2ovOhfCRhjMtCpNyjFXryAMLZODqsdc,28324 +click/testing.py,sha256=1Qd4kS5bucn1hsNIRryd0WtTMuCpkA93grkWxT8POsU,16084 +click/types.py,sha256=TZvz3hKvBztf-Hpa2enOmP4eznSPLzijjig5b_0XMxE,36391 +click/utils.py,sha256=1476UduUNY6UePGU4m18uzVHLt1sKM2PP3yWsQhbItM,20298 diff --git a/app/src/flask-server/venv/Lib/site-packages/click-8.1.7.dist-info/WHEEL b/app/src/flask-server/venv/Lib/site-packages/click-8.1.7.dist-info/WHEEL new file mode 100644 index 0000000..2c08da0 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/click-8.1.7.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.41.1) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/app/src/flask-server/venv/Lib/site-packages/click-8.1.7.dist-info/top_level.txt b/app/src/flask-server/venv/Lib/site-packages/click-8.1.7.dist-info/top_level.txt new file mode 100644 index 0000000..dca9a90 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/click-8.1.7.dist-info/top_level.txt @@ -0,0 +1 @@ +click diff --git a/app/src/flask-server/venv/Lib/site-packages/click/__init__.py b/app/src/flask-server/venv/Lib/site-packages/click/__init__.py new file mode 100644 index 0000000..9a1dab0 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/click/__init__.py @@ -0,0 +1,73 @@ +""" +Click is a simple Python module inspired by the stdlib optparse to make +writing command line scripts fun. Unlike other modules, it's based +around a simple API that does not come with too much magic and is +composable. +""" +from .core import Argument as Argument +from .core import BaseCommand as BaseCommand +from .core import Command as Command +from .core import CommandCollection as CommandCollection +from .core import Context as Context +from .core import Group as Group +from .core import MultiCommand as MultiCommand +from .core import Option as Option +from .core import Parameter as Parameter +from .decorators import argument as argument +from .decorators import command as command +from .decorators import confirmation_option as confirmation_option +from .decorators import group as group +from .decorators import help_option as help_option +from .decorators import make_pass_decorator as make_pass_decorator +from .decorators import option as option +from .decorators import pass_context as pass_context +from .decorators import pass_obj as pass_obj +from .decorators import password_option as password_option +from .decorators import version_option as version_option +from .exceptions import Abort as Abort +from .exceptions import BadArgumentUsage as BadArgumentUsage +from .exceptions import BadOptionUsage as BadOptionUsage +from .exceptions import BadParameter as BadParameter +from .exceptions import ClickException as ClickException +from .exceptions import FileError as FileError +from .exceptions import MissingParameter as MissingParameter +from .exceptions import NoSuchOption as NoSuchOption +from .exceptions import UsageError as UsageError +from .formatting import HelpFormatter as HelpFormatter +from .formatting import wrap_text as wrap_text +from .globals import get_current_context as get_current_context +from .parser import OptionParser as OptionParser +from .termui import clear as clear +from .termui import confirm as confirm +from .termui import echo_via_pager as echo_via_pager +from .termui import edit as edit +from .termui import getchar as getchar +from .termui import launch as launch +from .termui import pause as pause +from .termui import progressbar as progressbar +from .termui import prompt as prompt +from .termui import secho as secho +from .termui import style as style +from .termui import unstyle as unstyle +from .types import BOOL as BOOL +from .types import Choice as Choice +from .types import DateTime as DateTime +from .types import File as File +from .types import FLOAT as FLOAT +from .types import FloatRange as FloatRange +from .types import INT as INT +from .types import IntRange as IntRange +from .types import ParamType as ParamType +from .types import Path as Path +from .types import STRING as STRING +from .types import Tuple as Tuple +from .types import UNPROCESSED as UNPROCESSED +from .types import UUID as UUID +from .utils import echo as echo +from .utils import format_filename as format_filename +from .utils import get_app_dir as get_app_dir +from .utils import get_binary_stream as get_binary_stream +from .utils import get_text_stream as get_text_stream +from .utils import open_file as open_file + +__version__ = "8.1.7" diff --git a/app/src/flask-server/venv/Lib/site-packages/click/__pycache__/__init__.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/click/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000..c785500 Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/click/__pycache__/__init__.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/click/__pycache__/_compat.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/click/__pycache__/_compat.cpython-310.pyc new file mode 100644 index 0000000..0753e8c Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/click/__pycache__/_compat.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/click/__pycache__/_termui_impl.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/click/__pycache__/_termui_impl.cpython-310.pyc new file mode 100644 index 0000000..9904b60 Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/click/__pycache__/_termui_impl.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/click/__pycache__/_textwrap.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/click/__pycache__/_textwrap.cpython-310.pyc new file mode 100644 index 0000000..94f6d8b Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/click/__pycache__/_textwrap.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/click/__pycache__/_winconsole.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/click/__pycache__/_winconsole.cpython-310.pyc new file mode 100644 index 0000000..f81f1bc Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/click/__pycache__/_winconsole.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/click/__pycache__/core.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/click/__pycache__/core.cpython-310.pyc new file mode 100644 index 0000000..d282334 Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/click/__pycache__/core.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/click/__pycache__/decorators.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/click/__pycache__/decorators.cpython-310.pyc new file mode 100644 index 0000000..719e383 Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/click/__pycache__/decorators.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/click/__pycache__/exceptions.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/click/__pycache__/exceptions.cpython-310.pyc new file mode 100644 index 0000000..cfe5000 Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/click/__pycache__/exceptions.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/click/__pycache__/formatting.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/click/__pycache__/formatting.cpython-310.pyc new file mode 100644 index 0000000..86f7c13 Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/click/__pycache__/formatting.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/click/__pycache__/globals.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/click/__pycache__/globals.cpython-310.pyc new file mode 100644 index 0000000..9d0930c Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/click/__pycache__/globals.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/click/__pycache__/parser.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/click/__pycache__/parser.cpython-310.pyc new file mode 100644 index 0000000..c7f85fd Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/click/__pycache__/parser.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/click/__pycache__/shell_completion.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/click/__pycache__/shell_completion.cpython-310.pyc new file mode 100644 index 0000000..0c56236 Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/click/__pycache__/shell_completion.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/click/__pycache__/termui.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/click/__pycache__/termui.cpython-310.pyc new file mode 100644 index 0000000..079ab9d Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/click/__pycache__/termui.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/click/__pycache__/testing.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/click/__pycache__/testing.cpython-310.pyc new file mode 100644 index 0000000..798405f Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/click/__pycache__/testing.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/click/__pycache__/types.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/click/__pycache__/types.cpython-310.pyc new file mode 100644 index 0000000..2d0c8c0 Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/click/__pycache__/types.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/click/__pycache__/utils.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/click/__pycache__/utils.cpython-310.pyc new file mode 100644 index 0000000..1829689 Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/click/__pycache__/utils.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/click/_compat.py b/app/src/flask-server/venv/Lib/site-packages/click/_compat.py new file mode 100644 index 0000000..23f8866 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/click/_compat.py @@ -0,0 +1,623 @@ +import codecs +import io +import os +import re +import sys +import typing as t +from weakref import WeakKeyDictionary + +CYGWIN = sys.platform.startswith("cygwin") +WIN = sys.platform.startswith("win") +auto_wrap_for_ansi: t.Optional[t.Callable[[t.TextIO], t.TextIO]] = None +_ansi_re = re.compile(r"\033\[[;?0-9]*[a-zA-Z]") + + +def _make_text_stream( + stream: t.BinaryIO, + encoding: t.Optional[str], + errors: t.Optional[str], + force_readable: bool = False, + force_writable: bool = False, +) -> t.TextIO: + if encoding is None: + encoding = get_best_encoding(stream) + if errors is None: + errors = "replace" + return _NonClosingTextIOWrapper( + stream, + encoding, + errors, + line_buffering=True, + force_readable=force_readable, + force_writable=force_writable, + ) + + +def is_ascii_encoding(encoding: str) -> bool: + """Checks if a given encoding is ascii.""" + try: + return codecs.lookup(encoding).name == "ascii" + except LookupError: + return False + + +def get_best_encoding(stream: t.IO[t.Any]) -> str: + """Returns the default stream encoding if not found.""" + rv = getattr(stream, "encoding", None) or sys.getdefaultencoding() + if is_ascii_encoding(rv): + return "utf-8" + return rv + + +class _NonClosingTextIOWrapper(io.TextIOWrapper): + def __init__( + self, + stream: t.BinaryIO, + encoding: t.Optional[str], + errors: t.Optional[str], + force_readable: bool = False, + force_writable: bool = False, + **extra: t.Any, + ) -> None: + self._stream = stream = t.cast( + t.BinaryIO, _FixupStream(stream, force_readable, force_writable) + ) + super().__init__(stream, encoding, errors, **extra) + + def __del__(self) -> None: + try: + self.detach() + except Exception: + pass + + def isatty(self) -> bool: + # https://bitbucket.org/pypy/pypy/issue/1803 + return self._stream.isatty() + + +class _FixupStream: + """The new io interface needs more from streams than streams + traditionally implement. As such, this fix-up code is necessary in + some circumstances. + + The forcing of readable and writable flags are there because some tools + put badly patched objects on sys (one such offender are certain version + of jupyter notebook). + """ + + def __init__( + self, + stream: t.BinaryIO, + force_readable: bool = False, + force_writable: bool = False, + ): + self._stream = stream + self._force_readable = force_readable + self._force_writable = force_writable + + def __getattr__(self, name: str) -> t.Any: + return getattr(self._stream, name) + + def read1(self, size: int) -> bytes: + f = getattr(self._stream, "read1", None) + + if f is not None: + return t.cast(bytes, f(size)) + + return self._stream.read(size) + + def readable(self) -> bool: + if self._force_readable: + return True + x = getattr(self._stream, "readable", None) + if x is not None: + return t.cast(bool, x()) + try: + self._stream.read(0) + except Exception: + return False + return True + + def writable(self) -> bool: + if self._force_writable: + return True + x = getattr(self._stream, "writable", None) + if x is not None: + return t.cast(bool, x()) + try: + self._stream.write("") # type: ignore + except Exception: + try: + self._stream.write(b"") + except Exception: + return False + return True + + def seekable(self) -> bool: + x = getattr(self._stream, "seekable", None) + if x is not None: + return t.cast(bool, x()) + try: + self._stream.seek(self._stream.tell()) + except Exception: + return False + return True + + +def _is_binary_reader(stream: t.IO[t.Any], default: bool = False) -> bool: + try: + return isinstance(stream.read(0), bytes) + except Exception: + return default + # This happens in some cases where the stream was already + # closed. In this case, we assume the default. + + +def _is_binary_writer(stream: t.IO[t.Any], default: bool = False) -> bool: + try: + stream.write(b"") + except Exception: + try: + stream.write("") + return False + except Exception: + pass + return default + return True + + +def _find_binary_reader(stream: t.IO[t.Any]) -> t.Optional[t.BinaryIO]: + # We need to figure out if the given stream is already binary. + # This can happen because the official docs recommend detaching + # the streams to get binary streams. Some code might do this, so + # we need to deal with this case explicitly. + if _is_binary_reader(stream, False): + return t.cast(t.BinaryIO, stream) + + buf = getattr(stream, "buffer", None) + + # Same situation here; this time we assume that the buffer is + # actually binary in case it's closed. + if buf is not None and _is_binary_reader(buf, True): + return t.cast(t.BinaryIO, buf) + + return None + + +def _find_binary_writer(stream: t.IO[t.Any]) -> t.Optional[t.BinaryIO]: + # We need to figure out if the given stream is already binary. + # This can happen because the official docs recommend detaching + # the streams to get binary streams. Some code might do this, so + # we need to deal with this case explicitly. + if _is_binary_writer(stream, False): + return t.cast(t.BinaryIO, stream) + + buf = getattr(stream, "buffer", None) + + # Same situation here; this time we assume that the buffer is + # actually binary in case it's closed. + if buf is not None and _is_binary_writer(buf, True): + return t.cast(t.BinaryIO, buf) + + return None + + +def _stream_is_misconfigured(stream: t.TextIO) -> bool: + """A stream is misconfigured if its encoding is ASCII.""" + # If the stream does not have an encoding set, we assume it's set + # to ASCII. This appears to happen in certain unittest + # environments. It's not quite clear what the correct behavior is + # but this at least will force Click to recover somehow. + return is_ascii_encoding(getattr(stream, "encoding", None) or "ascii") + + +def _is_compat_stream_attr(stream: t.TextIO, attr: str, value: t.Optional[str]) -> bool: + """A stream attribute is compatible if it is equal to the + desired value or the desired value is unset and the attribute + has a value. + """ + stream_value = getattr(stream, attr, None) + return stream_value == value or (value is None and stream_value is not None) + + +def _is_compatible_text_stream( + stream: t.TextIO, encoding: t.Optional[str], errors: t.Optional[str] +) -> bool: + """Check if a stream's encoding and errors attributes are + compatible with the desired values. + """ + return _is_compat_stream_attr( + stream, "encoding", encoding + ) and _is_compat_stream_attr(stream, "errors", errors) + + +def _force_correct_text_stream( + text_stream: t.IO[t.Any], + encoding: t.Optional[str], + errors: t.Optional[str], + is_binary: t.Callable[[t.IO[t.Any], bool], bool], + find_binary: t.Callable[[t.IO[t.Any]], t.Optional[t.BinaryIO]], + force_readable: bool = False, + force_writable: bool = False, +) -> t.TextIO: + if is_binary(text_stream, False): + binary_reader = t.cast(t.BinaryIO, text_stream) + else: + text_stream = t.cast(t.TextIO, text_stream) + # If the stream looks compatible, and won't default to a + # misconfigured ascii encoding, return it as-is. + if _is_compatible_text_stream(text_stream, encoding, errors) and not ( + encoding is None and _stream_is_misconfigured(text_stream) + ): + return text_stream + + # Otherwise, get the underlying binary reader. + possible_binary_reader = find_binary(text_stream) + + # If that's not possible, silently use the original reader + # and get mojibake instead of exceptions. + if possible_binary_reader is None: + return text_stream + + binary_reader = possible_binary_reader + + # Default errors to replace instead of strict in order to get + # something that works. + if errors is None: + errors = "replace" + + # Wrap the binary stream in a text stream with the correct + # encoding parameters. + return _make_text_stream( + binary_reader, + encoding, + errors, + force_readable=force_readable, + force_writable=force_writable, + ) + + +def _force_correct_text_reader( + text_reader: t.IO[t.Any], + encoding: t.Optional[str], + errors: t.Optional[str], + force_readable: bool = False, +) -> t.TextIO: + return _force_correct_text_stream( + text_reader, + encoding, + errors, + _is_binary_reader, + _find_binary_reader, + force_readable=force_readable, + ) + + +def _force_correct_text_writer( + text_writer: t.IO[t.Any], + encoding: t.Optional[str], + errors: t.Optional[str], + force_writable: bool = False, +) -> t.TextIO: + return _force_correct_text_stream( + text_writer, + encoding, + errors, + _is_binary_writer, + _find_binary_writer, + force_writable=force_writable, + ) + + +def get_binary_stdin() -> t.BinaryIO: + reader = _find_binary_reader(sys.stdin) + if reader is None: + raise RuntimeError("Was not able to determine binary stream for sys.stdin.") + return reader + + +def get_binary_stdout() -> t.BinaryIO: + writer = _find_binary_writer(sys.stdout) + if writer is None: + raise RuntimeError("Was not able to determine binary stream for sys.stdout.") + return writer + + +def get_binary_stderr() -> t.BinaryIO: + writer = _find_binary_writer(sys.stderr) + if writer is None: + raise RuntimeError("Was not able to determine binary stream for sys.stderr.") + return writer + + +def get_text_stdin( + encoding: t.Optional[str] = None, errors: t.Optional[str] = None +) -> t.TextIO: + rv = _get_windows_console_stream(sys.stdin, encoding, errors) + if rv is not None: + return rv + return _force_correct_text_reader(sys.stdin, encoding, errors, force_readable=True) + + +def get_text_stdout( + encoding: t.Optional[str] = None, errors: t.Optional[str] = None +) -> t.TextIO: + rv = _get_windows_console_stream(sys.stdout, encoding, errors) + if rv is not None: + return rv + return _force_correct_text_writer(sys.stdout, encoding, errors, force_writable=True) + + +def get_text_stderr( + encoding: t.Optional[str] = None, errors: t.Optional[str] = None +) -> t.TextIO: + rv = _get_windows_console_stream(sys.stderr, encoding, errors) + if rv is not None: + return rv + return _force_correct_text_writer(sys.stderr, encoding, errors, force_writable=True) + + +def _wrap_io_open( + file: t.Union[str, "os.PathLike[str]", int], + mode: str, + encoding: t.Optional[str], + errors: t.Optional[str], +) -> t.IO[t.Any]: + """Handles not passing ``encoding`` and ``errors`` in binary mode.""" + if "b" in mode: + return open(file, mode) + + return open(file, mode, encoding=encoding, errors=errors) + + +def open_stream( + filename: "t.Union[str, os.PathLike[str]]", + mode: str = "r", + encoding: t.Optional[str] = None, + errors: t.Optional[str] = "strict", + atomic: bool = False, +) -> t.Tuple[t.IO[t.Any], bool]: + binary = "b" in mode + filename = os.fspath(filename) + + # Standard streams first. These are simple because they ignore the + # atomic flag. Use fsdecode to handle Path("-"). + if os.fsdecode(filename) == "-": + if any(m in mode for m in ["w", "a", "x"]): + if binary: + return get_binary_stdout(), False + return get_text_stdout(encoding=encoding, errors=errors), False + if binary: + return get_binary_stdin(), False + return get_text_stdin(encoding=encoding, errors=errors), False + + # Non-atomic writes directly go out through the regular open functions. + if not atomic: + return _wrap_io_open(filename, mode, encoding, errors), True + + # Some usability stuff for atomic writes + if "a" in mode: + raise ValueError( + "Appending to an existing file is not supported, because that" + " would involve an expensive `copy`-operation to a temporary" + " file. Open the file in normal `w`-mode and copy explicitly" + " if that's what you're after." + ) + if "x" in mode: + raise ValueError("Use the `overwrite`-parameter instead.") + if "w" not in mode: + raise ValueError("Atomic writes only make sense with `w`-mode.") + + # Atomic writes are more complicated. They work by opening a file + # as a proxy in the same folder and then using the fdopen + # functionality to wrap it in a Python file. Then we wrap it in an + # atomic file that moves the file over on close. + import errno + import random + + try: + perm: t.Optional[int] = os.stat(filename).st_mode + except OSError: + perm = None + + flags = os.O_RDWR | os.O_CREAT | os.O_EXCL + + if binary: + flags |= getattr(os, "O_BINARY", 0) + + while True: + tmp_filename = os.path.join( + os.path.dirname(filename), + f".__atomic-write{random.randrange(1 << 32):08x}", + ) + try: + fd = os.open(tmp_filename, flags, 0o666 if perm is None else perm) + break + except OSError as e: + if e.errno == errno.EEXIST or ( + os.name == "nt" + and e.errno == errno.EACCES + and os.path.isdir(e.filename) + and os.access(e.filename, os.W_OK) + ): + continue + raise + + if perm is not None: + os.chmod(tmp_filename, perm) # in case perm includes bits in umask + + f = _wrap_io_open(fd, mode, encoding, errors) + af = _AtomicFile(f, tmp_filename, os.path.realpath(filename)) + return t.cast(t.IO[t.Any], af), True + + +class _AtomicFile: + def __init__(self, f: t.IO[t.Any], tmp_filename: str, real_filename: str) -> None: + self._f = f + self._tmp_filename = tmp_filename + self._real_filename = real_filename + self.closed = False + + @property + def name(self) -> str: + return self._real_filename + + def close(self, delete: bool = False) -> None: + if self.closed: + return + self._f.close() + os.replace(self._tmp_filename, self._real_filename) + self.closed = True + + def __getattr__(self, name: str) -> t.Any: + return getattr(self._f, name) + + def __enter__(self) -> "_AtomicFile": + return self + + def __exit__(self, exc_type: t.Optional[t.Type[BaseException]], *_: t.Any) -> None: + self.close(delete=exc_type is not None) + + def __repr__(self) -> str: + return repr(self._f) + + +def strip_ansi(value: str) -> str: + return _ansi_re.sub("", value) + + +def _is_jupyter_kernel_output(stream: t.IO[t.Any]) -> bool: + while isinstance(stream, (_FixupStream, _NonClosingTextIOWrapper)): + stream = stream._stream + + return stream.__class__.__module__.startswith("ipykernel.") + + +def should_strip_ansi( + stream: t.Optional[t.IO[t.Any]] = None, color: t.Optional[bool] = None +) -> bool: + if color is None: + if stream is None: + stream = sys.stdin + return not isatty(stream) and not _is_jupyter_kernel_output(stream) + return not color + + +# On Windows, wrap the output streams with colorama to support ANSI +# color codes. +# NOTE: double check is needed so mypy does not analyze this on Linux +if sys.platform.startswith("win") and WIN: + from ._winconsole import _get_windows_console_stream + + def _get_argv_encoding() -> str: + import locale + + return locale.getpreferredencoding() + + _ansi_stream_wrappers: t.MutableMapping[t.TextIO, t.TextIO] = WeakKeyDictionary() + + def auto_wrap_for_ansi( # noqa: F811 + stream: t.TextIO, color: t.Optional[bool] = None + ) -> t.TextIO: + """Support ANSI color and style codes on Windows by wrapping a + stream with colorama. + """ + try: + cached = _ansi_stream_wrappers.get(stream) + except Exception: + cached = None + + if cached is not None: + return cached + + import colorama + + strip = should_strip_ansi(stream, color) + ansi_wrapper = colorama.AnsiToWin32(stream, strip=strip) + rv = t.cast(t.TextIO, ansi_wrapper.stream) + _write = rv.write + + def _safe_write(s): + try: + return _write(s) + except BaseException: + ansi_wrapper.reset_all() + raise + + rv.write = _safe_write + + try: + _ansi_stream_wrappers[stream] = rv + except Exception: + pass + + return rv + +else: + + def _get_argv_encoding() -> str: + return getattr(sys.stdin, "encoding", None) or sys.getfilesystemencoding() + + def _get_windows_console_stream( + f: t.TextIO, encoding: t.Optional[str], errors: t.Optional[str] + ) -> t.Optional[t.TextIO]: + return None + + +def term_len(x: str) -> int: + return len(strip_ansi(x)) + + +def isatty(stream: t.IO[t.Any]) -> bool: + try: + return stream.isatty() + except Exception: + return False + + +def _make_cached_stream_func( + src_func: t.Callable[[], t.Optional[t.TextIO]], + wrapper_func: t.Callable[[], t.TextIO], +) -> t.Callable[[], t.Optional[t.TextIO]]: + cache: t.MutableMapping[t.TextIO, t.TextIO] = WeakKeyDictionary() + + def func() -> t.Optional[t.TextIO]: + stream = src_func() + + if stream is None: + return None + + try: + rv = cache.get(stream) + except Exception: + rv = None + if rv is not None: + return rv + rv = wrapper_func() + try: + cache[stream] = rv + except Exception: + pass + return rv + + return func + + +_default_text_stdin = _make_cached_stream_func(lambda: sys.stdin, get_text_stdin) +_default_text_stdout = _make_cached_stream_func(lambda: sys.stdout, get_text_stdout) +_default_text_stderr = _make_cached_stream_func(lambda: sys.stderr, get_text_stderr) + + +binary_streams: t.Mapping[str, t.Callable[[], t.BinaryIO]] = { + "stdin": get_binary_stdin, + "stdout": get_binary_stdout, + "stderr": get_binary_stderr, +} + +text_streams: t.Mapping[ + str, t.Callable[[t.Optional[str], t.Optional[str]], t.TextIO] +] = { + "stdin": get_text_stdin, + "stdout": get_text_stdout, + "stderr": get_text_stderr, +} diff --git a/app/src/flask-server/venv/Lib/site-packages/click/_termui_impl.py b/app/src/flask-server/venv/Lib/site-packages/click/_termui_impl.py new file mode 100644 index 0000000..f744657 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/click/_termui_impl.py @@ -0,0 +1,739 @@ +""" +This module contains implementations for the termui module. To keep the +import time of Click down, some infrequently used functionality is +placed in this module and only imported as needed. +""" +import contextlib +import math +import os +import sys +import time +import typing as t +from gettext import gettext as _ +from io import StringIO +from types import TracebackType + +from ._compat import _default_text_stdout +from ._compat import CYGWIN +from ._compat import get_best_encoding +from ._compat import isatty +from ._compat import open_stream +from ._compat import strip_ansi +from ._compat import term_len +from ._compat import WIN +from .exceptions import ClickException +from .utils import echo + +V = t.TypeVar("V") + +if os.name == "nt": + BEFORE_BAR = "\r" + AFTER_BAR = "\n" +else: + BEFORE_BAR = "\r\033[?25l" + AFTER_BAR = "\033[?25h\n" + + +class ProgressBar(t.Generic[V]): + def __init__( + self, + iterable: t.Optional[t.Iterable[V]], + length: t.Optional[int] = None, + fill_char: str = "#", + empty_char: str = " ", + bar_template: str = "%(bar)s", + info_sep: str = " ", + show_eta: bool = True, + show_percent: t.Optional[bool] = None, + show_pos: bool = False, + item_show_func: t.Optional[t.Callable[[t.Optional[V]], t.Optional[str]]] = None, + label: t.Optional[str] = None, + file: t.Optional[t.TextIO] = None, + color: t.Optional[bool] = None, + update_min_steps: int = 1, + width: int = 30, + ) -> None: + self.fill_char = fill_char + self.empty_char = empty_char + self.bar_template = bar_template + self.info_sep = info_sep + self.show_eta = show_eta + self.show_percent = show_percent + self.show_pos = show_pos + self.item_show_func = item_show_func + self.label: str = label or "" + + if file is None: + file = _default_text_stdout() + + # There are no standard streams attached to write to. For example, + # pythonw on Windows. + if file is None: + file = StringIO() + + self.file = file + self.color = color + self.update_min_steps = update_min_steps + self._completed_intervals = 0 + self.width: int = width + self.autowidth: bool = width == 0 + + if length is None: + from operator import length_hint + + length = length_hint(iterable, -1) + + if length == -1: + length = None + if iterable is None: + if length is None: + raise TypeError("iterable or length is required") + iterable = t.cast(t.Iterable[V], range(length)) + self.iter: t.Iterable[V] = iter(iterable) + self.length = length + self.pos = 0 + self.avg: t.List[float] = [] + self.last_eta: float + self.start: float + self.start = self.last_eta = time.time() + self.eta_known: bool = False + self.finished: bool = False + self.max_width: t.Optional[int] = None + self.entered: bool = False + self.current_item: t.Optional[V] = None + self.is_hidden: bool = not isatty(self.file) + self._last_line: t.Optional[str] = None + + def __enter__(self) -> "ProgressBar[V]": + self.entered = True + self.render_progress() + return self + + def __exit__( + self, + exc_type: t.Optional[t.Type[BaseException]], + exc_value: t.Optional[BaseException], + tb: t.Optional[TracebackType], + ) -> None: + self.render_finish() + + def __iter__(self) -> t.Iterator[V]: + if not self.entered: + raise RuntimeError("You need to use progress bars in a with block.") + self.render_progress() + return self.generator() + + def __next__(self) -> V: + # Iteration is defined in terms of a generator function, + # returned by iter(self); use that to define next(). This works + # because `self.iter` is an iterable consumed by that generator, + # so it is re-entry safe. Calling `next(self.generator())` + # twice works and does "what you want". + return next(iter(self)) + + def render_finish(self) -> None: + if self.is_hidden: + return + self.file.write(AFTER_BAR) + self.file.flush() + + @property + def pct(self) -> float: + if self.finished: + return 1.0 + return min(self.pos / (float(self.length or 1) or 1), 1.0) + + @property + def time_per_iteration(self) -> float: + if not self.avg: + return 0.0 + return sum(self.avg) / float(len(self.avg)) + + @property + def eta(self) -> float: + if self.length is not None and not self.finished: + return self.time_per_iteration * (self.length - self.pos) + return 0.0 + + def format_eta(self) -> str: + if self.eta_known: + t = int(self.eta) + seconds = t % 60 + t //= 60 + minutes = t % 60 + t //= 60 + hours = t % 24 + t //= 24 + if t > 0: + return f"{t}d {hours:02}:{minutes:02}:{seconds:02}" + else: + return f"{hours:02}:{minutes:02}:{seconds:02}" + return "" + + def format_pos(self) -> str: + pos = str(self.pos) + if self.length is not None: + pos += f"/{self.length}" + return pos + + def format_pct(self) -> str: + return f"{int(self.pct * 100): 4}%"[1:] + + def format_bar(self) -> str: + if self.length is not None: + bar_length = int(self.pct * self.width) + bar = self.fill_char * bar_length + bar += self.empty_char * (self.width - bar_length) + elif self.finished: + bar = self.fill_char * self.width + else: + chars = list(self.empty_char * (self.width or 1)) + if self.time_per_iteration != 0: + chars[ + int( + (math.cos(self.pos * self.time_per_iteration) / 2.0 + 0.5) + * self.width + ) + ] = self.fill_char + bar = "".join(chars) + return bar + + def format_progress_line(self) -> str: + show_percent = self.show_percent + + info_bits = [] + if self.length is not None and show_percent is None: + show_percent = not self.show_pos + + if self.show_pos: + info_bits.append(self.format_pos()) + if show_percent: + info_bits.append(self.format_pct()) + if self.show_eta and self.eta_known and not self.finished: + info_bits.append(self.format_eta()) + if self.item_show_func is not None: + item_info = self.item_show_func(self.current_item) + if item_info is not None: + info_bits.append(item_info) + + return ( + self.bar_template + % { + "label": self.label, + "bar": self.format_bar(), + "info": self.info_sep.join(info_bits), + } + ).rstrip() + + def render_progress(self) -> None: + import shutil + + if self.is_hidden: + # Only output the label as it changes if the output is not a + # TTY. Use file=stderr if you expect to be piping stdout. + if self._last_line != self.label: + self._last_line = self.label + echo(self.label, file=self.file, color=self.color) + + return + + buf = [] + # Update width in case the terminal has been resized + if self.autowidth: + old_width = self.width + self.width = 0 + clutter_length = term_len(self.format_progress_line()) + new_width = max(0, shutil.get_terminal_size().columns - clutter_length) + if new_width < old_width: + buf.append(BEFORE_BAR) + buf.append(" " * self.max_width) # type: ignore + self.max_width = new_width + self.width = new_width + + clear_width = self.width + if self.max_width is not None: + clear_width = self.max_width + + buf.append(BEFORE_BAR) + line = self.format_progress_line() + line_len = term_len(line) + if self.max_width is None or self.max_width < line_len: + self.max_width = line_len + + buf.append(line) + buf.append(" " * (clear_width - line_len)) + line = "".join(buf) + # Render the line only if it changed. + + if line != self._last_line: + self._last_line = line + echo(line, file=self.file, color=self.color, nl=False) + self.file.flush() + + def make_step(self, n_steps: int) -> None: + self.pos += n_steps + if self.length is not None and self.pos >= self.length: + self.finished = True + + if (time.time() - self.last_eta) < 1.0: + return + + self.last_eta = time.time() + + # self.avg is a rolling list of length <= 7 of steps where steps are + # defined as time elapsed divided by the total progress through + # self.length. + if self.pos: + step = (time.time() - self.start) / self.pos + else: + step = time.time() - self.start + + self.avg = self.avg[-6:] + [step] + + self.eta_known = self.length is not None + + def update(self, n_steps: int, current_item: t.Optional[V] = None) -> None: + """Update the progress bar by advancing a specified number of + steps, and optionally set the ``current_item`` for this new + position. + + :param n_steps: Number of steps to advance. + :param current_item: Optional item to set as ``current_item`` + for the updated position. + + .. versionchanged:: 8.0 + Added the ``current_item`` optional parameter. + + .. versionchanged:: 8.0 + Only render when the number of steps meets the + ``update_min_steps`` threshold. + """ + if current_item is not None: + self.current_item = current_item + + self._completed_intervals += n_steps + + if self._completed_intervals >= self.update_min_steps: + self.make_step(self._completed_intervals) + self.render_progress() + self._completed_intervals = 0 + + def finish(self) -> None: + self.eta_known = False + self.current_item = None + self.finished = True + + def generator(self) -> t.Iterator[V]: + """Return a generator which yields the items added to the bar + during construction, and updates the progress bar *after* the + yielded block returns. + """ + # WARNING: the iterator interface for `ProgressBar` relies on + # this and only works because this is a simple generator which + # doesn't create or manage additional state. If this function + # changes, the impact should be evaluated both against + # `iter(bar)` and `next(bar)`. `next()` in particular may call + # `self.generator()` repeatedly, and this must remain safe in + # order for that interface to work. + if not self.entered: + raise RuntimeError("You need to use progress bars in a with block.") + + if self.is_hidden: + yield from self.iter + else: + for rv in self.iter: + self.current_item = rv + + # This allows show_item_func to be updated before the + # item is processed. Only trigger at the beginning of + # the update interval. + if self._completed_intervals == 0: + self.render_progress() + + yield rv + self.update(1) + + self.finish() + self.render_progress() + + +def pager(generator: t.Iterable[str], color: t.Optional[bool] = None) -> None: + """Decide what method to use for paging through text.""" + stdout = _default_text_stdout() + + # There are no standard streams attached to write to. For example, + # pythonw on Windows. + if stdout is None: + stdout = StringIO() + + if not isatty(sys.stdin) or not isatty(stdout): + return _nullpager(stdout, generator, color) + pager_cmd = (os.environ.get("PAGER", None) or "").strip() + if pager_cmd: + if WIN: + return _tempfilepager(generator, pager_cmd, color) + return _pipepager(generator, pager_cmd, color) + if os.environ.get("TERM") in ("dumb", "emacs"): + return _nullpager(stdout, generator, color) + if WIN or sys.platform.startswith("os2"): + return _tempfilepager(generator, "more <", color) + if hasattr(os, "system") and os.system("(less) 2>/dev/null") == 0: + return _pipepager(generator, "less", color) + + import tempfile + + fd, filename = tempfile.mkstemp() + os.close(fd) + try: + if hasattr(os, "system") and os.system(f'more "{filename}"') == 0: + return _pipepager(generator, "more", color) + return _nullpager(stdout, generator, color) + finally: + os.unlink(filename) + + +def _pipepager(generator: t.Iterable[str], cmd: str, color: t.Optional[bool]) -> None: + """Page through text by feeding it to another program. Invoking a + pager through this might support colors. + """ + import subprocess + + env = dict(os.environ) + + # If we're piping to less we might support colors under the + # condition that + cmd_detail = cmd.rsplit("/", 1)[-1].split() + if color is None and cmd_detail[0] == "less": + less_flags = f"{os.environ.get('LESS', '')}{' '.join(cmd_detail[1:])}" + if not less_flags: + env["LESS"] = "-R" + color = True + elif "r" in less_flags or "R" in less_flags: + color = True + + c = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, env=env) + stdin = t.cast(t.BinaryIO, c.stdin) + encoding = get_best_encoding(stdin) + try: + for text in generator: + if not color: + text = strip_ansi(text) + + stdin.write(text.encode(encoding, "replace")) + except (OSError, KeyboardInterrupt): + pass + else: + stdin.close() + + # Less doesn't respect ^C, but catches it for its own UI purposes (aborting + # search or other commands inside less). + # + # That means when the user hits ^C, the parent process (click) terminates, + # but less is still alive, paging the output and messing up the terminal. + # + # If the user wants to make the pager exit on ^C, they should set + # `LESS='-K'`. It's not our decision to make. + while True: + try: + c.wait() + except KeyboardInterrupt: + pass + else: + break + + +def _tempfilepager( + generator: t.Iterable[str], cmd: str, color: t.Optional[bool] +) -> None: + """Page through text by invoking a program on a temporary file.""" + import tempfile + + fd, filename = tempfile.mkstemp() + # TODO: This never terminates if the passed generator never terminates. + text = "".join(generator) + if not color: + text = strip_ansi(text) + encoding = get_best_encoding(sys.stdout) + with open_stream(filename, "wb")[0] as f: + f.write(text.encode(encoding)) + try: + os.system(f'{cmd} "{filename}"') + finally: + os.close(fd) + os.unlink(filename) + + +def _nullpager( + stream: t.TextIO, generator: t.Iterable[str], color: t.Optional[bool] +) -> None: + """Simply print unformatted text. This is the ultimate fallback.""" + for text in generator: + if not color: + text = strip_ansi(text) + stream.write(text) + + +class Editor: + def __init__( + self, + editor: t.Optional[str] = None, + env: t.Optional[t.Mapping[str, str]] = None, + require_save: bool = True, + extension: str = ".txt", + ) -> None: + self.editor = editor + self.env = env + self.require_save = require_save + self.extension = extension + + def get_editor(self) -> str: + if self.editor is not None: + return self.editor + for key in "VISUAL", "EDITOR": + rv = os.environ.get(key) + if rv: + return rv + if WIN: + return "notepad" + for editor in "sensible-editor", "vim", "nano": + if os.system(f"which {editor} >/dev/null 2>&1") == 0: + return editor + return "vi" + + def edit_file(self, filename: str) -> None: + import subprocess + + editor = self.get_editor() + environ: t.Optional[t.Dict[str, str]] = None + + if self.env: + environ = os.environ.copy() + environ.update(self.env) + + try: + c = subprocess.Popen(f'{editor} "{filename}"', env=environ, shell=True) + exit_code = c.wait() + if exit_code != 0: + raise ClickException( + _("{editor}: Editing failed").format(editor=editor) + ) + except OSError as e: + raise ClickException( + _("{editor}: Editing failed: {e}").format(editor=editor, e=e) + ) from e + + def edit(self, text: t.Optional[t.AnyStr]) -> t.Optional[t.AnyStr]: + import tempfile + + if not text: + data = b"" + elif isinstance(text, (bytes, bytearray)): + data = text + else: + if text and not text.endswith("\n"): + text += "\n" + + if WIN: + data = text.replace("\n", "\r\n").encode("utf-8-sig") + else: + data = text.encode("utf-8") + + fd, name = tempfile.mkstemp(prefix="editor-", suffix=self.extension) + f: t.BinaryIO + + try: + with os.fdopen(fd, "wb") as f: + f.write(data) + + # If the filesystem resolution is 1 second, like Mac OS + # 10.12 Extended, or 2 seconds, like FAT32, and the editor + # closes very fast, require_save can fail. Set the modified + # time to be 2 seconds in the past to work around this. + os.utime(name, (os.path.getatime(name), os.path.getmtime(name) - 2)) + # Depending on the resolution, the exact value might not be + # recorded, so get the new recorded value. + timestamp = os.path.getmtime(name) + + self.edit_file(name) + + if self.require_save and os.path.getmtime(name) == timestamp: + return None + + with open(name, "rb") as f: + rv = f.read() + + if isinstance(text, (bytes, bytearray)): + return rv + + return rv.decode("utf-8-sig").replace("\r\n", "\n") # type: ignore + finally: + os.unlink(name) + + +def open_url(url: str, wait: bool = False, locate: bool = False) -> int: + import subprocess + + def _unquote_file(url: str) -> str: + from urllib.parse import unquote + + if url.startswith("file://"): + url = unquote(url[7:]) + + return url + + if sys.platform == "darwin": + args = ["open"] + if wait: + args.append("-W") + if locate: + args.append("-R") + args.append(_unquote_file(url)) + null = open("/dev/null", "w") + try: + return subprocess.Popen(args, stderr=null).wait() + finally: + null.close() + elif WIN: + if locate: + url = _unquote_file(url.replace('"', "")) + args = f'explorer /select,"{url}"' + else: + url = url.replace('"', "") + wait_str = "/WAIT" if wait else "" + args = f'start {wait_str} "" "{url}"' + return os.system(args) + elif CYGWIN: + if locate: + url = os.path.dirname(_unquote_file(url).replace('"', "")) + args = f'cygstart "{url}"' + else: + url = url.replace('"', "") + wait_str = "-w" if wait else "" + args = f'cygstart {wait_str} "{url}"' + return os.system(args) + + try: + if locate: + url = os.path.dirname(_unquote_file(url)) or "." + else: + url = _unquote_file(url) + c = subprocess.Popen(["xdg-open", url]) + if wait: + return c.wait() + return 0 + except OSError: + if url.startswith(("http://", "https://")) and not locate and not wait: + import webbrowser + + webbrowser.open(url) + return 0 + return 1 + + +def _translate_ch_to_exc(ch: str) -> t.Optional[BaseException]: + if ch == "\x03": + raise KeyboardInterrupt() + + if ch == "\x04" and not WIN: # Unix-like, Ctrl+D + raise EOFError() + + if ch == "\x1a" and WIN: # Windows, Ctrl+Z + raise EOFError() + + return None + + +if WIN: + import msvcrt + + @contextlib.contextmanager + def raw_terminal() -> t.Iterator[int]: + yield -1 + + def getchar(echo: bool) -> str: + # The function `getch` will return a bytes object corresponding to + # the pressed character. Since Windows 10 build 1803, it will also + # return \x00 when called a second time after pressing a regular key. + # + # `getwch` does not share this probably-bugged behavior. Moreover, it + # returns a Unicode object by default, which is what we want. + # + # Either of these functions will return \x00 or \xe0 to indicate + # a special key, and you need to call the same function again to get + # the "rest" of the code. The fun part is that \u00e0 is + # "latin small letter a with grave", so if you type that on a French + # keyboard, you _also_ get a \xe0. + # E.g., consider the Up arrow. This returns \xe0 and then \x48. The + # resulting Unicode string reads as "a with grave" + "capital H". + # This is indistinguishable from when the user actually types + # "a with grave" and then "capital H". + # + # When \xe0 is returned, we assume it's part of a special-key sequence + # and call `getwch` again, but that means that when the user types + # the \u00e0 character, `getchar` doesn't return until a second + # character is typed. + # The alternative is returning immediately, but that would mess up + # cross-platform handling of arrow keys and others that start with + # \xe0. Another option is using `getch`, but then we can't reliably + # read non-ASCII characters, because return values of `getch` are + # limited to the current 8-bit codepage. + # + # Anyway, Click doesn't claim to do this Right(tm), and using `getwch` + # is doing the right thing in more situations than with `getch`. + func: t.Callable[[], str] + + if echo: + func = msvcrt.getwche # type: ignore + else: + func = msvcrt.getwch # type: ignore + + rv = func() + + if rv in ("\x00", "\xe0"): + # \x00 and \xe0 are control characters that indicate special key, + # see above. + rv += func() + + _translate_ch_to_exc(rv) + return rv + +else: + import tty + import termios + + @contextlib.contextmanager + def raw_terminal() -> t.Iterator[int]: + f: t.Optional[t.TextIO] + fd: int + + if not isatty(sys.stdin): + f = open("/dev/tty") + fd = f.fileno() + else: + fd = sys.stdin.fileno() + f = None + + try: + old_settings = termios.tcgetattr(fd) + + try: + tty.setraw(fd) + yield fd + finally: + termios.tcsetattr(fd, termios.TCSADRAIN, old_settings) + sys.stdout.flush() + + if f is not None: + f.close() + except termios.error: + pass + + def getchar(echo: bool) -> str: + with raw_terminal() as fd: + ch = os.read(fd, 32).decode(get_best_encoding(sys.stdin), "replace") + + if echo and isatty(sys.stdout): + sys.stdout.write(ch) + + _translate_ch_to_exc(ch) + return ch diff --git a/app/src/flask-server/venv/Lib/site-packages/click/_textwrap.py b/app/src/flask-server/venv/Lib/site-packages/click/_textwrap.py new file mode 100644 index 0000000..b47dcbd --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/click/_textwrap.py @@ -0,0 +1,49 @@ +import textwrap +import typing as t +from contextlib import contextmanager + + +class TextWrapper(textwrap.TextWrapper): + def _handle_long_word( + self, + reversed_chunks: t.List[str], + cur_line: t.List[str], + cur_len: int, + width: int, + ) -> None: + space_left = max(width - cur_len, 1) + + if self.break_long_words: + last = reversed_chunks[-1] + cut = last[:space_left] + res = last[space_left:] + cur_line.append(cut) + reversed_chunks[-1] = res + elif not cur_line: + cur_line.append(reversed_chunks.pop()) + + @contextmanager + def extra_indent(self, indent: str) -> t.Iterator[None]: + old_initial_indent = self.initial_indent + old_subsequent_indent = self.subsequent_indent + self.initial_indent += indent + self.subsequent_indent += indent + + try: + yield + finally: + self.initial_indent = old_initial_indent + self.subsequent_indent = old_subsequent_indent + + def indent_only(self, text: str) -> str: + rv = [] + + for idx, line in enumerate(text.splitlines()): + indent = self.initial_indent + + if idx > 0: + indent = self.subsequent_indent + + rv.append(f"{indent}{line}") + + return "\n".join(rv) diff --git a/app/src/flask-server/venv/Lib/site-packages/click/_winconsole.py b/app/src/flask-server/venv/Lib/site-packages/click/_winconsole.py new file mode 100644 index 0000000..6b20df3 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/click/_winconsole.py @@ -0,0 +1,279 @@ +# This module is based on the excellent work by Adam Bartoš who +# provided a lot of what went into the implementation here in +# the discussion to issue1602 in the Python bug tracker. +# +# There are some general differences in regards to how this works +# compared to the original patches as we do not need to patch +# the entire interpreter but just work in our little world of +# echo and prompt. +import io +import sys +import time +import typing as t +from ctypes import byref +from ctypes import c_char +from ctypes import c_char_p +from ctypes import c_int +from ctypes import c_ssize_t +from ctypes import c_ulong +from ctypes import c_void_p +from ctypes import POINTER +from ctypes import py_object +from ctypes import Structure +from ctypes.wintypes import DWORD +from ctypes.wintypes import HANDLE +from ctypes.wintypes import LPCWSTR +from ctypes.wintypes import LPWSTR + +from ._compat import _NonClosingTextIOWrapper + +assert sys.platform == "win32" +import msvcrt # noqa: E402 +from ctypes import windll # noqa: E402 +from ctypes import WINFUNCTYPE # noqa: E402 + +c_ssize_p = POINTER(c_ssize_t) + +kernel32 = windll.kernel32 +GetStdHandle = kernel32.GetStdHandle +ReadConsoleW = kernel32.ReadConsoleW +WriteConsoleW = kernel32.WriteConsoleW +GetConsoleMode = kernel32.GetConsoleMode +GetLastError = kernel32.GetLastError +GetCommandLineW = WINFUNCTYPE(LPWSTR)(("GetCommandLineW", windll.kernel32)) +CommandLineToArgvW = WINFUNCTYPE(POINTER(LPWSTR), LPCWSTR, POINTER(c_int))( + ("CommandLineToArgvW", windll.shell32) +) +LocalFree = WINFUNCTYPE(c_void_p, c_void_p)(("LocalFree", windll.kernel32)) + +STDIN_HANDLE = GetStdHandle(-10) +STDOUT_HANDLE = GetStdHandle(-11) +STDERR_HANDLE = GetStdHandle(-12) + +PyBUF_SIMPLE = 0 +PyBUF_WRITABLE = 1 + +ERROR_SUCCESS = 0 +ERROR_NOT_ENOUGH_MEMORY = 8 +ERROR_OPERATION_ABORTED = 995 + +STDIN_FILENO = 0 +STDOUT_FILENO = 1 +STDERR_FILENO = 2 + +EOF = b"\x1a" +MAX_BYTES_WRITTEN = 32767 + +try: + from ctypes import pythonapi +except ImportError: + # On PyPy we cannot get buffers so our ability to operate here is + # severely limited. + get_buffer = None +else: + + class Py_buffer(Structure): + _fields_ = [ + ("buf", c_void_p), + ("obj", py_object), + ("len", c_ssize_t), + ("itemsize", c_ssize_t), + ("readonly", c_int), + ("ndim", c_int), + ("format", c_char_p), + ("shape", c_ssize_p), + ("strides", c_ssize_p), + ("suboffsets", c_ssize_p), + ("internal", c_void_p), + ] + + PyObject_GetBuffer = pythonapi.PyObject_GetBuffer + PyBuffer_Release = pythonapi.PyBuffer_Release + + def get_buffer(obj, writable=False): + buf = Py_buffer() + flags = PyBUF_WRITABLE if writable else PyBUF_SIMPLE + PyObject_GetBuffer(py_object(obj), byref(buf), flags) + + try: + buffer_type = c_char * buf.len + return buffer_type.from_address(buf.buf) + finally: + PyBuffer_Release(byref(buf)) + + +class _WindowsConsoleRawIOBase(io.RawIOBase): + def __init__(self, handle): + self.handle = handle + + def isatty(self): + super().isatty() + return True + + +class _WindowsConsoleReader(_WindowsConsoleRawIOBase): + def readable(self): + return True + + def readinto(self, b): + bytes_to_be_read = len(b) + if not bytes_to_be_read: + return 0 + elif bytes_to_be_read % 2: + raise ValueError( + "cannot read odd number of bytes from UTF-16-LE encoded console" + ) + + buffer = get_buffer(b, writable=True) + code_units_to_be_read = bytes_to_be_read // 2 + code_units_read = c_ulong() + + rv = ReadConsoleW( + HANDLE(self.handle), + buffer, + code_units_to_be_read, + byref(code_units_read), + None, + ) + if GetLastError() == ERROR_OPERATION_ABORTED: + # wait for KeyboardInterrupt + time.sleep(0.1) + if not rv: + raise OSError(f"Windows error: {GetLastError()}") + + if buffer[0] == EOF: + return 0 + return 2 * code_units_read.value + + +class _WindowsConsoleWriter(_WindowsConsoleRawIOBase): + def writable(self): + return True + + @staticmethod + def _get_error_message(errno): + if errno == ERROR_SUCCESS: + return "ERROR_SUCCESS" + elif errno == ERROR_NOT_ENOUGH_MEMORY: + return "ERROR_NOT_ENOUGH_MEMORY" + return f"Windows error {errno}" + + def write(self, b): + bytes_to_be_written = len(b) + buf = get_buffer(b) + code_units_to_be_written = min(bytes_to_be_written, MAX_BYTES_WRITTEN) // 2 + code_units_written = c_ulong() + + WriteConsoleW( + HANDLE(self.handle), + buf, + code_units_to_be_written, + byref(code_units_written), + None, + ) + bytes_written = 2 * code_units_written.value + + if bytes_written == 0 and bytes_to_be_written > 0: + raise OSError(self._get_error_message(GetLastError())) + return bytes_written + + +class ConsoleStream: + def __init__(self, text_stream: t.TextIO, byte_stream: t.BinaryIO) -> None: + self._text_stream = text_stream + self.buffer = byte_stream + + @property + def name(self) -> str: + return self.buffer.name + + def write(self, x: t.AnyStr) -> int: + if isinstance(x, str): + return self._text_stream.write(x) + try: + self.flush() + except Exception: + pass + return self.buffer.write(x) + + def writelines(self, lines: t.Iterable[t.AnyStr]) -> None: + for line in lines: + self.write(line) + + def __getattr__(self, name: str) -> t.Any: + return getattr(self._text_stream, name) + + def isatty(self) -> bool: + return self.buffer.isatty() + + def __repr__(self): + return f"" + + +def _get_text_stdin(buffer_stream: t.BinaryIO) -> t.TextIO: + text_stream = _NonClosingTextIOWrapper( + io.BufferedReader(_WindowsConsoleReader(STDIN_HANDLE)), + "utf-16-le", + "strict", + line_buffering=True, + ) + return t.cast(t.TextIO, ConsoleStream(text_stream, buffer_stream)) + + +def _get_text_stdout(buffer_stream: t.BinaryIO) -> t.TextIO: + text_stream = _NonClosingTextIOWrapper( + io.BufferedWriter(_WindowsConsoleWriter(STDOUT_HANDLE)), + "utf-16-le", + "strict", + line_buffering=True, + ) + return t.cast(t.TextIO, ConsoleStream(text_stream, buffer_stream)) + + +def _get_text_stderr(buffer_stream: t.BinaryIO) -> t.TextIO: + text_stream = _NonClosingTextIOWrapper( + io.BufferedWriter(_WindowsConsoleWriter(STDERR_HANDLE)), + "utf-16-le", + "strict", + line_buffering=True, + ) + return t.cast(t.TextIO, ConsoleStream(text_stream, buffer_stream)) + + +_stream_factories: t.Mapping[int, t.Callable[[t.BinaryIO], t.TextIO]] = { + 0: _get_text_stdin, + 1: _get_text_stdout, + 2: _get_text_stderr, +} + + +def _is_console(f: t.TextIO) -> bool: + if not hasattr(f, "fileno"): + return False + + try: + fileno = f.fileno() + except (OSError, io.UnsupportedOperation): + return False + + handle = msvcrt.get_osfhandle(fileno) + return bool(GetConsoleMode(handle, byref(DWORD()))) + + +def _get_windows_console_stream( + f: t.TextIO, encoding: t.Optional[str], errors: t.Optional[str] +) -> t.Optional[t.TextIO]: + if ( + get_buffer is not None + and encoding in {"utf-16-le", None} + and errors in {"strict", None} + and _is_console(f) + ): + func = _stream_factories.get(f.fileno()) + if func is not None: + b = getattr(f, "buffer", None) + + if b is None: + return None + + return func(b) diff --git a/app/src/flask-server/venv/Lib/site-packages/click/core.py b/app/src/flask-server/venv/Lib/site-packages/click/core.py new file mode 100644 index 0000000..cc65e89 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/click/core.py @@ -0,0 +1,3042 @@ +import enum +import errno +import inspect +import os +import sys +import typing as t +from collections import abc +from contextlib import contextmanager +from contextlib import ExitStack +from functools import update_wrapper +from gettext import gettext as _ +from gettext import ngettext +from itertools import repeat +from types import TracebackType + +from . import types +from .exceptions import Abort +from .exceptions import BadParameter +from .exceptions import ClickException +from .exceptions import Exit +from .exceptions import MissingParameter +from .exceptions import UsageError +from .formatting import HelpFormatter +from .formatting import join_options +from .globals import pop_context +from .globals import push_context +from .parser import _flag_needs_value +from .parser import OptionParser +from .parser import split_opt +from .termui import confirm +from .termui import prompt +from .termui import style +from .utils import _detect_program_name +from .utils import _expand_args +from .utils import echo +from .utils import make_default_short_help +from .utils import make_str +from .utils import PacifyFlushWrapper + +if t.TYPE_CHECKING: + import typing_extensions as te + from .shell_completion import CompletionItem + +F = t.TypeVar("F", bound=t.Callable[..., t.Any]) +V = t.TypeVar("V") + + +def _complete_visible_commands( + ctx: "Context", incomplete: str +) -> t.Iterator[t.Tuple[str, "Command"]]: + """List all the subcommands of a group that start with the + incomplete value and aren't hidden. + + :param ctx: Invocation context for the group. + :param incomplete: Value being completed. May be empty. + """ + multi = t.cast(MultiCommand, ctx.command) + + for name in multi.list_commands(ctx): + if name.startswith(incomplete): + command = multi.get_command(ctx, name) + + if command is not None and not command.hidden: + yield name, command + + +def _check_multicommand( + base_command: "MultiCommand", cmd_name: str, cmd: "Command", register: bool = False +) -> None: + if not base_command.chain or not isinstance(cmd, MultiCommand): + return + if register: + hint = ( + "It is not possible to add multi commands as children to" + " another multi command that is in chain mode." + ) + else: + hint = ( + "Found a multi command as subcommand to a multi command" + " that is in chain mode. This is not supported." + ) + raise RuntimeError( + f"{hint}. Command {base_command.name!r} is set to chain and" + f" {cmd_name!r} was added as a subcommand but it in itself is a" + f" multi command. ({cmd_name!r} is a {type(cmd).__name__}" + f" within a chained {type(base_command).__name__} named" + f" {base_command.name!r})." + ) + + +def batch(iterable: t.Iterable[V], batch_size: int) -> t.List[t.Tuple[V, ...]]: + return list(zip(*repeat(iter(iterable), batch_size))) + + +@contextmanager +def augment_usage_errors( + ctx: "Context", param: t.Optional["Parameter"] = None +) -> t.Iterator[None]: + """Context manager that attaches extra information to exceptions.""" + try: + yield + except BadParameter as e: + if e.ctx is None: + e.ctx = ctx + if param is not None and e.param is None: + e.param = param + raise + except UsageError as e: + if e.ctx is None: + e.ctx = ctx + raise + + +def iter_params_for_processing( + invocation_order: t.Sequence["Parameter"], + declaration_order: t.Sequence["Parameter"], +) -> t.List["Parameter"]: + """Given a sequence of parameters in the order as should be considered + for processing and an iterable of parameters that exist, this returns + a list in the correct order as they should be processed. + """ + + def sort_key(item: "Parameter") -> t.Tuple[bool, float]: + try: + idx: float = invocation_order.index(item) + except ValueError: + idx = float("inf") + + return not item.is_eager, idx + + return sorted(declaration_order, key=sort_key) + + +class ParameterSource(enum.Enum): + """This is an :class:`~enum.Enum` that indicates the source of a + parameter's value. + + Use :meth:`click.Context.get_parameter_source` to get the + source for a parameter by name. + + .. versionchanged:: 8.0 + Use :class:`~enum.Enum` and drop the ``validate`` method. + + .. versionchanged:: 8.0 + Added the ``PROMPT`` value. + """ + + COMMANDLINE = enum.auto() + """The value was provided by the command line args.""" + ENVIRONMENT = enum.auto() + """The value was provided with an environment variable.""" + DEFAULT = enum.auto() + """Used the default specified by the parameter.""" + DEFAULT_MAP = enum.auto() + """Used a default provided by :attr:`Context.default_map`.""" + PROMPT = enum.auto() + """Used a prompt to confirm a default or provide a value.""" + + +class Context: + """The context is a special internal object that holds state relevant + for the script execution at every single level. It's normally invisible + to commands unless they opt-in to getting access to it. + + The context is useful as it can pass internal objects around and can + control special execution features such as reading data from + environment variables. + + A context can be used as context manager in which case it will call + :meth:`close` on teardown. + + :param command: the command class for this context. + :param parent: the parent context. + :param info_name: the info name for this invocation. Generally this + is the most descriptive name for the script or + command. For the toplevel script it is usually + the name of the script, for commands below it it's + the name of the script. + :param obj: an arbitrary object of user data. + :param auto_envvar_prefix: the prefix to use for automatic environment + variables. If this is `None` then reading + from environment variables is disabled. This + does not affect manually set environment + variables which are always read. + :param default_map: a dictionary (like object) with default values + for parameters. + :param terminal_width: the width of the terminal. The default is + inherit from parent context. If no context + defines the terminal width then auto + detection will be applied. + :param max_content_width: the maximum width for content rendered by + Click (this currently only affects help + pages). This defaults to 80 characters if + not overridden. In other words: even if the + terminal is larger than that, Click will not + format things wider than 80 characters by + default. In addition to that, formatters might + add some safety mapping on the right. + :param resilient_parsing: if this flag is enabled then Click will + parse without any interactivity or callback + invocation. Default values will also be + ignored. This is useful for implementing + things such as completion support. + :param allow_extra_args: if this is set to `True` then extra arguments + at the end will not raise an error and will be + kept on the context. The default is to inherit + from the command. + :param allow_interspersed_args: if this is set to `False` then options + and arguments cannot be mixed. The + default is to inherit from the command. + :param ignore_unknown_options: instructs click to ignore options it does + not know and keeps them for later + processing. + :param help_option_names: optionally a list of strings that define how + the default help parameter is named. The + default is ``['--help']``. + :param token_normalize_func: an optional function that is used to + normalize tokens (options, choices, + etc.). This for instance can be used to + implement case insensitive behavior. + :param color: controls if the terminal supports ANSI colors or not. The + default is autodetection. This is only needed if ANSI + codes are used in texts that Click prints which is by + default not the case. This for instance would affect + help output. + :param show_default: Show the default value for commands. If this + value is not set, it defaults to the value from the parent + context. ``Command.show_default`` overrides this default for the + specific command. + + .. versionchanged:: 8.1 + The ``show_default`` parameter is overridden by + ``Command.show_default``, instead of the other way around. + + .. versionchanged:: 8.0 + The ``show_default`` parameter defaults to the value from the + parent context. + + .. versionchanged:: 7.1 + Added the ``show_default`` parameter. + + .. versionchanged:: 4.0 + Added the ``color``, ``ignore_unknown_options``, and + ``max_content_width`` parameters. + + .. versionchanged:: 3.0 + Added the ``allow_extra_args`` and ``allow_interspersed_args`` + parameters. + + .. versionchanged:: 2.0 + Added the ``resilient_parsing``, ``help_option_names``, and + ``token_normalize_func`` parameters. + """ + + #: The formatter class to create with :meth:`make_formatter`. + #: + #: .. versionadded:: 8.0 + formatter_class: t.Type["HelpFormatter"] = HelpFormatter + + def __init__( + self, + command: "Command", + parent: t.Optional["Context"] = None, + info_name: t.Optional[str] = None, + obj: t.Optional[t.Any] = None, + auto_envvar_prefix: t.Optional[str] = None, + default_map: t.Optional[t.MutableMapping[str, t.Any]] = None, + terminal_width: t.Optional[int] = None, + max_content_width: t.Optional[int] = None, + resilient_parsing: bool = False, + allow_extra_args: t.Optional[bool] = None, + allow_interspersed_args: t.Optional[bool] = None, + ignore_unknown_options: t.Optional[bool] = None, + help_option_names: t.Optional[t.List[str]] = None, + token_normalize_func: t.Optional[t.Callable[[str], str]] = None, + color: t.Optional[bool] = None, + show_default: t.Optional[bool] = None, + ) -> None: + #: the parent context or `None` if none exists. + self.parent = parent + #: the :class:`Command` for this context. + self.command = command + #: the descriptive information name + self.info_name = info_name + #: Map of parameter names to their parsed values. Parameters + #: with ``expose_value=False`` are not stored. + self.params: t.Dict[str, t.Any] = {} + #: the leftover arguments. + self.args: t.List[str] = [] + #: protected arguments. These are arguments that are prepended + #: to `args` when certain parsing scenarios are encountered but + #: must be never propagated to another arguments. This is used + #: to implement nested parsing. + self.protected_args: t.List[str] = [] + #: the collected prefixes of the command's options. + self._opt_prefixes: t.Set[str] = set(parent._opt_prefixes) if parent else set() + + if obj is None and parent is not None: + obj = parent.obj + + #: the user object stored. + self.obj: t.Any = obj + self._meta: t.Dict[str, t.Any] = getattr(parent, "meta", {}) + + #: A dictionary (-like object) with defaults for parameters. + if ( + default_map is None + and info_name is not None + and parent is not None + and parent.default_map is not None + ): + default_map = parent.default_map.get(info_name) + + self.default_map: t.Optional[t.MutableMapping[str, t.Any]] = default_map + + #: This flag indicates if a subcommand is going to be executed. A + #: group callback can use this information to figure out if it's + #: being executed directly or because the execution flow passes + #: onwards to a subcommand. By default it's None, but it can be + #: the name of the subcommand to execute. + #: + #: If chaining is enabled this will be set to ``'*'`` in case + #: any commands are executed. It is however not possible to + #: figure out which ones. If you require this knowledge you + #: should use a :func:`result_callback`. + self.invoked_subcommand: t.Optional[str] = None + + if terminal_width is None and parent is not None: + terminal_width = parent.terminal_width + + #: The width of the terminal (None is autodetection). + self.terminal_width: t.Optional[int] = terminal_width + + if max_content_width is None and parent is not None: + max_content_width = parent.max_content_width + + #: The maximum width of formatted content (None implies a sensible + #: default which is 80 for most things). + self.max_content_width: t.Optional[int] = max_content_width + + if allow_extra_args is None: + allow_extra_args = command.allow_extra_args + + #: Indicates if the context allows extra args or if it should + #: fail on parsing. + #: + #: .. versionadded:: 3.0 + self.allow_extra_args = allow_extra_args + + if allow_interspersed_args is None: + allow_interspersed_args = command.allow_interspersed_args + + #: Indicates if the context allows mixing of arguments and + #: options or not. + #: + #: .. versionadded:: 3.0 + self.allow_interspersed_args: bool = allow_interspersed_args + + if ignore_unknown_options is None: + ignore_unknown_options = command.ignore_unknown_options + + #: Instructs click to ignore options that a command does not + #: understand and will store it on the context for later + #: processing. This is primarily useful for situations where you + #: want to call into external programs. Generally this pattern is + #: strongly discouraged because it's not possibly to losslessly + #: forward all arguments. + #: + #: .. versionadded:: 4.0 + self.ignore_unknown_options: bool = ignore_unknown_options + + if help_option_names is None: + if parent is not None: + help_option_names = parent.help_option_names + else: + help_option_names = ["--help"] + + #: The names for the help options. + self.help_option_names: t.List[str] = help_option_names + + if token_normalize_func is None and parent is not None: + token_normalize_func = parent.token_normalize_func + + #: An optional normalization function for tokens. This is + #: options, choices, commands etc. + self.token_normalize_func: t.Optional[ + t.Callable[[str], str] + ] = token_normalize_func + + #: Indicates if resilient parsing is enabled. In that case Click + #: will do its best to not cause any failures and default values + #: will be ignored. Useful for completion. + self.resilient_parsing: bool = resilient_parsing + + # If there is no envvar prefix yet, but the parent has one and + # the command on this level has a name, we can expand the envvar + # prefix automatically. + if auto_envvar_prefix is None: + if ( + parent is not None + and parent.auto_envvar_prefix is not None + and self.info_name is not None + ): + auto_envvar_prefix = ( + f"{parent.auto_envvar_prefix}_{self.info_name.upper()}" + ) + else: + auto_envvar_prefix = auto_envvar_prefix.upper() + + if auto_envvar_prefix is not None: + auto_envvar_prefix = auto_envvar_prefix.replace("-", "_") + + self.auto_envvar_prefix: t.Optional[str] = auto_envvar_prefix + + if color is None and parent is not None: + color = parent.color + + #: Controls if styling output is wanted or not. + self.color: t.Optional[bool] = color + + if show_default is None and parent is not None: + show_default = parent.show_default + + #: Show option default values when formatting help text. + self.show_default: t.Optional[bool] = show_default + + self._close_callbacks: t.List[t.Callable[[], t.Any]] = [] + self._depth = 0 + self._parameter_source: t.Dict[str, ParameterSource] = {} + self._exit_stack = ExitStack() + + def to_info_dict(self) -> t.Dict[str, t.Any]: + """Gather information that could be useful for a tool generating + user-facing documentation. This traverses the entire CLI + structure. + + .. code-block:: python + + with Context(cli) as ctx: + info = ctx.to_info_dict() + + .. versionadded:: 8.0 + """ + return { + "command": self.command.to_info_dict(self), + "info_name": self.info_name, + "allow_extra_args": self.allow_extra_args, + "allow_interspersed_args": self.allow_interspersed_args, + "ignore_unknown_options": self.ignore_unknown_options, + "auto_envvar_prefix": self.auto_envvar_prefix, + } + + def __enter__(self) -> "Context": + self._depth += 1 + push_context(self) + return self + + def __exit__( + self, + exc_type: t.Optional[t.Type[BaseException]], + exc_value: t.Optional[BaseException], + tb: t.Optional[TracebackType], + ) -> None: + self._depth -= 1 + if self._depth == 0: + self.close() + pop_context() + + @contextmanager + def scope(self, cleanup: bool = True) -> t.Iterator["Context"]: + """This helper method can be used with the context object to promote + it to the current thread local (see :func:`get_current_context`). + The default behavior of this is to invoke the cleanup functions which + can be disabled by setting `cleanup` to `False`. The cleanup + functions are typically used for things such as closing file handles. + + If the cleanup is intended the context object can also be directly + used as a context manager. + + Example usage:: + + with ctx.scope(): + assert get_current_context() is ctx + + This is equivalent:: + + with ctx: + assert get_current_context() is ctx + + .. versionadded:: 5.0 + + :param cleanup: controls if the cleanup functions should be run or + not. The default is to run these functions. In + some situations the context only wants to be + temporarily pushed in which case this can be disabled. + Nested pushes automatically defer the cleanup. + """ + if not cleanup: + self._depth += 1 + try: + with self as rv: + yield rv + finally: + if not cleanup: + self._depth -= 1 + + @property + def meta(self) -> t.Dict[str, t.Any]: + """This is a dictionary which is shared with all the contexts + that are nested. It exists so that click utilities can store some + state here if they need to. It is however the responsibility of + that code to manage this dictionary well. + + The keys are supposed to be unique dotted strings. For instance + module paths are a good choice for it. What is stored in there is + irrelevant for the operation of click. However what is important is + that code that places data here adheres to the general semantics of + the system. + + Example usage:: + + LANG_KEY = f'{__name__}.lang' + + def set_language(value): + ctx = get_current_context() + ctx.meta[LANG_KEY] = value + + def get_language(): + return get_current_context().meta.get(LANG_KEY, 'en_US') + + .. versionadded:: 5.0 + """ + return self._meta + + def make_formatter(self) -> HelpFormatter: + """Creates the :class:`~click.HelpFormatter` for the help and + usage output. + + To quickly customize the formatter class used without overriding + this method, set the :attr:`formatter_class` attribute. + + .. versionchanged:: 8.0 + Added the :attr:`formatter_class` attribute. + """ + return self.formatter_class( + width=self.terminal_width, max_width=self.max_content_width + ) + + def with_resource(self, context_manager: t.ContextManager[V]) -> V: + """Register a resource as if it were used in a ``with`` + statement. The resource will be cleaned up when the context is + popped. + + Uses :meth:`contextlib.ExitStack.enter_context`. It calls the + resource's ``__enter__()`` method and returns the result. When + the context is popped, it closes the stack, which calls the + resource's ``__exit__()`` method. + + To register a cleanup function for something that isn't a + context manager, use :meth:`call_on_close`. Or use something + from :mod:`contextlib` to turn it into a context manager first. + + .. code-block:: python + + @click.group() + @click.option("--name") + @click.pass_context + def cli(ctx): + ctx.obj = ctx.with_resource(connect_db(name)) + + :param context_manager: The context manager to enter. + :return: Whatever ``context_manager.__enter__()`` returns. + + .. versionadded:: 8.0 + """ + return self._exit_stack.enter_context(context_manager) + + def call_on_close(self, f: t.Callable[..., t.Any]) -> t.Callable[..., t.Any]: + """Register a function to be called when the context tears down. + + This can be used to close resources opened during the script + execution. Resources that support Python's context manager + protocol which would be used in a ``with`` statement should be + registered with :meth:`with_resource` instead. + + :param f: The function to execute on teardown. + """ + return self._exit_stack.callback(f) + + def close(self) -> None: + """Invoke all close callbacks registered with + :meth:`call_on_close`, and exit all context managers entered + with :meth:`with_resource`. + """ + self._exit_stack.close() + # In case the context is reused, create a new exit stack. + self._exit_stack = ExitStack() + + @property + def command_path(self) -> str: + """The computed command path. This is used for the ``usage`` + information on the help page. It's automatically created by + combining the info names of the chain of contexts to the root. + """ + rv = "" + if self.info_name is not None: + rv = self.info_name + if self.parent is not None: + parent_command_path = [self.parent.command_path] + + if isinstance(self.parent.command, Command): + for param in self.parent.command.get_params(self): + parent_command_path.extend(param.get_usage_pieces(self)) + + rv = f"{' '.join(parent_command_path)} {rv}" + return rv.lstrip() + + def find_root(self) -> "Context": + """Finds the outermost context.""" + node = self + while node.parent is not None: + node = node.parent + return node + + def find_object(self, object_type: t.Type[V]) -> t.Optional[V]: + """Finds the closest object of a given type.""" + node: t.Optional["Context"] = self + + while node is not None: + if isinstance(node.obj, object_type): + return node.obj + + node = node.parent + + return None + + def ensure_object(self, object_type: t.Type[V]) -> V: + """Like :meth:`find_object` but sets the innermost object to a + new instance of `object_type` if it does not exist. + """ + rv = self.find_object(object_type) + if rv is None: + self.obj = rv = object_type() + return rv + + @t.overload + def lookup_default( + self, name: str, call: "te.Literal[True]" = True + ) -> t.Optional[t.Any]: + ... + + @t.overload + def lookup_default( + self, name: str, call: "te.Literal[False]" = ... + ) -> t.Optional[t.Union[t.Any, t.Callable[[], t.Any]]]: + ... + + def lookup_default(self, name: str, call: bool = True) -> t.Optional[t.Any]: + """Get the default for a parameter from :attr:`default_map`. + + :param name: Name of the parameter. + :param call: If the default is a callable, call it. Disable to + return the callable instead. + + .. versionchanged:: 8.0 + Added the ``call`` parameter. + """ + if self.default_map is not None: + value = self.default_map.get(name) + + if call and callable(value): + return value() + + return value + + return None + + def fail(self, message: str) -> "te.NoReturn": + """Aborts the execution of the program with a specific error + message. + + :param message: the error message to fail with. + """ + raise UsageError(message, self) + + def abort(self) -> "te.NoReturn": + """Aborts the script.""" + raise Abort() + + def exit(self, code: int = 0) -> "te.NoReturn": + """Exits the application with a given exit code.""" + raise Exit(code) + + def get_usage(self) -> str: + """Helper method to get formatted usage string for the current + context and command. + """ + return self.command.get_usage(self) + + def get_help(self) -> str: + """Helper method to get formatted help page for the current + context and command. + """ + return self.command.get_help(self) + + def _make_sub_context(self, command: "Command") -> "Context": + """Create a new context of the same type as this context, but + for a new command. + + :meta private: + """ + return type(self)(command, info_name=command.name, parent=self) + + @t.overload + def invoke( + __self, # noqa: B902 + __callback: "t.Callable[..., V]", + *args: t.Any, + **kwargs: t.Any, + ) -> V: + ... + + @t.overload + def invoke( + __self, # noqa: B902 + __callback: "Command", + *args: t.Any, + **kwargs: t.Any, + ) -> t.Any: + ... + + def invoke( + __self, # noqa: B902 + __callback: t.Union["Command", "t.Callable[..., V]"], + *args: t.Any, + **kwargs: t.Any, + ) -> t.Union[t.Any, V]: + """Invokes a command callback in exactly the way it expects. There + are two ways to invoke this method: + + 1. the first argument can be a callback and all other arguments and + keyword arguments are forwarded directly to the function. + 2. the first argument is a click command object. In that case all + arguments are forwarded as well but proper click parameters + (options and click arguments) must be keyword arguments and Click + will fill in defaults. + + Note that before Click 3.2 keyword arguments were not properly filled + in against the intention of this code and no context was created. For + more information about this change and why it was done in a bugfix + release see :ref:`upgrade-to-3.2`. + + .. versionchanged:: 8.0 + All ``kwargs`` are tracked in :attr:`params` so they will be + passed if :meth:`forward` is called at multiple levels. + """ + if isinstance(__callback, Command): + other_cmd = __callback + + if other_cmd.callback is None: + raise TypeError( + "The given command does not have a callback that can be invoked." + ) + else: + __callback = t.cast("t.Callable[..., V]", other_cmd.callback) + + ctx = __self._make_sub_context(other_cmd) + + for param in other_cmd.params: + if param.name not in kwargs and param.expose_value: + kwargs[param.name] = param.type_cast_value( # type: ignore + ctx, param.get_default(ctx) + ) + + # Track all kwargs as params, so that forward() will pass + # them on in subsequent calls. + ctx.params.update(kwargs) + else: + ctx = __self + + with augment_usage_errors(__self): + with ctx: + return __callback(*args, **kwargs) + + def forward( + __self, __cmd: "Command", *args: t.Any, **kwargs: t.Any # noqa: B902 + ) -> t.Any: + """Similar to :meth:`invoke` but fills in default keyword + arguments from the current context if the other command expects + it. This cannot invoke callbacks directly, only other commands. + + .. versionchanged:: 8.0 + All ``kwargs`` are tracked in :attr:`params` so they will be + passed if ``forward`` is called at multiple levels. + """ + # Can only forward to other commands, not direct callbacks. + if not isinstance(__cmd, Command): + raise TypeError("Callback is not a command.") + + for param in __self.params: + if param not in kwargs: + kwargs[param] = __self.params[param] + + return __self.invoke(__cmd, *args, **kwargs) + + def set_parameter_source(self, name: str, source: ParameterSource) -> None: + """Set the source of a parameter. This indicates the location + from which the value of the parameter was obtained. + + :param name: The name of the parameter. + :param source: A member of :class:`~click.core.ParameterSource`. + """ + self._parameter_source[name] = source + + def get_parameter_source(self, name: str) -> t.Optional[ParameterSource]: + """Get the source of a parameter. This indicates the location + from which the value of the parameter was obtained. + + This can be useful for determining when a user specified a value + on the command line that is the same as the default value. It + will be :attr:`~click.core.ParameterSource.DEFAULT` only if the + value was actually taken from the default. + + :param name: The name of the parameter. + :rtype: ParameterSource + + .. versionchanged:: 8.0 + Returns ``None`` if the parameter was not provided from any + source. + """ + return self._parameter_source.get(name) + + +class BaseCommand: + """The base command implements the minimal API contract of commands. + Most code will never use this as it does not implement a lot of useful + functionality but it can act as the direct subclass of alternative + parsing methods that do not depend on the Click parser. + + For instance, this can be used to bridge Click and other systems like + argparse or docopt. + + Because base commands do not implement a lot of the API that other + parts of Click take for granted, they are not supported for all + operations. For instance, they cannot be used with the decorators + usually and they have no built-in callback system. + + .. versionchanged:: 2.0 + Added the `context_settings` parameter. + + :param name: the name of the command to use unless a group overrides it. + :param context_settings: an optional dictionary with defaults that are + passed to the context object. + """ + + #: The context class to create with :meth:`make_context`. + #: + #: .. versionadded:: 8.0 + context_class: t.Type[Context] = Context + #: the default for the :attr:`Context.allow_extra_args` flag. + allow_extra_args = False + #: the default for the :attr:`Context.allow_interspersed_args` flag. + allow_interspersed_args = True + #: the default for the :attr:`Context.ignore_unknown_options` flag. + ignore_unknown_options = False + + def __init__( + self, + name: t.Optional[str], + context_settings: t.Optional[t.MutableMapping[str, t.Any]] = None, + ) -> None: + #: the name the command thinks it has. Upon registering a command + #: on a :class:`Group` the group will default the command name + #: with this information. You should instead use the + #: :class:`Context`\'s :attr:`~Context.info_name` attribute. + self.name = name + + if context_settings is None: + context_settings = {} + + #: an optional dictionary with defaults passed to the context. + self.context_settings: t.MutableMapping[str, t.Any] = context_settings + + def to_info_dict(self, ctx: Context) -> t.Dict[str, t.Any]: + """Gather information that could be useful for a tool generating + user-facing documentation. This traverses the entire structure + below this command. + + Use :meth:`click.Context.to_info_dict` to traverse the entire + CLI structure. + + :param ctx: A :class:`Context` representing this command. + + .. versionadded:: 8.0 + """ + return {"name": self.name} + + def __repr__(self) -> str: + return f"<{self.__class__.__name__} {self.name}>" + + def get_usage(self, ctx: Context) -> str: + raise NotImplementedError("Base commands cannot get usage") + + def get_help(self, ctx: Context) -> str: + raise NotImplementedError("Base commands cannot get help") + + def make_context( + self, + info_name: t.Optional[str], + args: t.List[str], + parent: t.Optional[Context] = None, + **extra: t.Any, + ) -> Context: + """This function when given an info name and arguments will kick + off the parsing and create a new :class:`Context`. It does not + invoke the actual command callback though. + + To quickly customize the context class used without overriding + this method, set the :attr:`context_class` attribute. + + :param info_name: the info name for this invocation. Generally this + is the most descriptive name for the script or + command. For the toplevel script it's usually + the name of the script, for commands below it's + the name of the command. + :param args: the arguments to parse as list of strings. + :param parent: the parent context if available. + :param extra: extra keyword arguments forwarded to the context + constructor. + + .. versionchanged:: 8.0 + Added the :attr:`context_class` attribute. + """ + for key, value in self.context_settings.items(): + if key not in extra: + extra[key] = value + + ctx = self.context_class( + self, info_name=info_name, parent=parent, **extra # type: ignore + ) + + with ctx.scope(cleanup=False): + self.parse_args(ctx, args) + return ctx + + def parse_args(self, ctx: Context, args: t.List[str]) -> t.List[str]: + """Given a context and a list of arguments this creates the parser + and parses the arguments, then modifies the context as necessary. + This is automatically invoked by :meth:`make_context`. + """ + raise NotImplementedError("Base commands do not know how to parse arguments.") + + def invoke(self, ctx: Context) -> t.Any: + """Given a context, this invokes the command. The default + implementation is raising a not implemented error. + """ + raise NotImplementedError("Base commands are not invocable by default") + + def shell_complete(self, ctx: Context, incomplete: str) -> t.List["CompletionItem"]: + """Return a list of completions for the incomplete value. Looks + at the names of chained multi-commands. + + Any command could be part of a chained multi-command, so sibling + commands are valid at any point during command completion. Other + command classes will return more completions. + + :param ctx: Invocation context for this command. + :param incomplete: Value being completed. May be empty. + + .. versionadded:: 8.0 + """ + from click.shell_completion import CompletionItem + + results: t.List["CompletionItem"] = [] + + while ctx.parent is not None: + ctx = ctx.parent + + if isinstance(ctx.command, MultiCommand) and ctx.command.chain: + results.extend( + CompletionItem(name, help=command.get_short_help_str()) + for name, command in _complete_visible_commands(ctx, incomplete) + if name not in ctx.protected_args + ) + + return results + + @t.overload + def main( + self, + args: t.Optional[t.Sequence[str]] = None, + prog_name: t.Optional[str] = None, + complete_var: t.Optional[str] = None, + standalone_mode: "te.Literal[True]" = True, + **extra: t.Any, + ) -> "te.NoReturn": + ... + + @t.overload + def main( + self, + args: t.Optional[t.Sequence[str]] = None, + prog_name: t.Optional[str] = None, + complete_var: t.Optional[str] = None, + standalone_mode: bool = ..., + **extra: t.Any, + ) -> t.Any: + ... + + def main( + self, + args: t.Optional[t.Sequence[str]] = None, + prog_name: t.Optional[str] = None, + complete_var: t.Optional[str] = None, + standalone_mode: bool = True, + windows_expand_args: bool = True, + **extra: t.Any, + ) -> t.Any: + """This is the way to invoke a script with all the bells and + whistles as a command line application. This will always terminate + the application after a call. If this is not wanted, ``SystemExit`` + needs to be caught. + + This method is also available by directly calling the instance of + a :class:`Command`. + + :param args: the arguments that should be used for parsing. If not + provided, ``sys.argv[1:]`` is used. + :param prog_name: the program name that should be used. By default + the program name is constructed by taking the file + name from ``sys.argv[0]``. + :param complete_var: the environment variable that controls the + bash completion support. The default is + ``"__COMPLETE"`` with prog_name in + uppercase. + :param standalone_mode: the default behavior is to invoke the script + in standalone mode. Click will then + handle exceptions and convert them into + error messages and the function will never + return but shut down the interpreter. If + this is set to `False` they will be + propagated to the caller and the return + value of this function is the return value + of :meth:`invoke`. + :param windows_expand_args: Expand glob patterns, user dir, and + env vars in command line args on Windows. + :param extra: extra keyword arguments are forwarded to the context + constructor. See :class:`Context` for more information. + + .. versionchanged:: 8.0.1 + Added the ``windows_expand_args`` parameter to allow + disabling command line arg expansion on Windows. + + .. versionchanged:: 8.0 + When taking arguments from ``sys.argv`` on Windows, glob + patterns, user dir, and env vars are expanded. + + .. versionchanged:: 3.0 + Added the ``standalone_mode`` parameter. + """ + if args is None: + args = sys.argv[1:] + + if os.name == "nt" and windows_expand_args: + args = _expand_args(args) + else: + args = list(args) + + if prog_name is None: + prog_name = _detect_program_name() + + # Process shell completion requests and exit early. + self._main_shell_completion(extra, prog_name, complete_var) + + try: + try: + with self.make_context(prog_name, args, **extra) as ctx: + rv = self.invoke(ctx) + if not standalone_mode: + return rv + # it's not safe to `ctx.exit(rv)` here! + # note that `rv` may actually contain data like "1" which + # has obvious effects + # more subtle case: `rv=[None, None]` can come out of + # chained commands which all returned `None` -- so it's not + # even always obvious that `rv` indicates success/failure + # by its truthiness/falsiness + ctx.exit() + except (EOFError, KeyboardInterrupt) as e: + echo(file=sys.stderr) + raise Abort() from e + except ClickException as e: + if not standalone_mode: + raise + e.show() + sys.exit(e.exit_code) + except OSError as e: + if e.errno == errno.EPIPE: + sys.stdout = t.cast(t.TextIO, PacifyFlushWrapper(sys.stdout)) + sys.stderr = t.cast(t.TextIO, PacifyFlushWrapper(sys.stderr)) + sys.exit(1) + else: + raise + except Exit as e: + if standalone_mode: + sys.exit(e.exit_code) + else: + # in non-standalone mode, return the exit code + # note that this is only reached if `self.invoke` above raises + # an Exit explicitly -- thus bypassing the check there which + # would return its result + # the results of non-standalone execution may therefore be + # somewhat ambiguous: if there are codepaths which lead to + # `ctx.exit(1)` and to `return 1`, the caller won't be able to + # tell the difference between the two + return e.exit_code + except Abort: + if not standalone_mode: + raise + echo(_("Aborted!"), file=sys.stderr) + sys.exit(1) + + def _main_shell_completion( + self, + ctx_args: t.MutableMapping[str, t.Any], + prog_name: str, + complete_var: t.Optional[str] = None, + ) -> None: + """Check if the shell is asking for tab completion, process + that, then exit early. Called from :meth:`main` before the + program is invoked. + + :param prog_name: Name of the executable in the shell. + :param complete_var: Name of the environment variable that holds + the completion instruction. Defaults to + ``_{PROG_NAME}_COMPLETE``. + + .. versionchanged:: 8.2.0 + Dots (``.``) in ``prog_name`` are replaced with underscores (``_``). + """ + if complete_var is None: + complete_name = prog_name.replace("-", "_").replace(".", "_") + complete_var = f"_{complete_name}_COMPLETE".upper() + + instruction = os.environ.get(complete_var) + + if not instruction: + return + + from .shell_completion import shell_complete + + rv = shell_complete(self, ctx_args, prog_name, complete_var, instruction) + sys.exit(rv) + + def __call__(self, *args: t.Any, **kwargs: t.Any) -> t.Any: + """Alias for :meth:`main`.""" + return self.main(*args, **kwargs) + + +class Command(BaseCommand): + """Commands are the basic building block of command line interfaces in + Click. A basic command handles command line parsing and might dispatch + more parsing to commands nested below it. + + :param name: the name of the command to use unless a group overrides it. + :param context_settings: an optional dictionary with defaults that are + passed to the context object. + :param callback: the callback to invoke. This is optional. + :param params: the parameters to register with this command. This can + be either :class:`Option` or :class:`Argument` objects. + :param help: the help string to use for this command. + :param epilog: like the help string but it's printed at the end of the + help page after everything else. + :param short_help: the short help to use for this command. This is + shown on the command listing of the parent command. + :param add_help_option: by default each command registers a ``--help`` + option. This can be disabled by this parameter. + :param no_args_is_help: this controls what happens if no arguments are + provided. This option is disabled by default. + If enabled this will add ``--help`` as argument + if no arguments are passed + :param hidden: hide this command from help outputs. + + :param deprecated: issues a message indicating that + the command is deprecated. + + .. versionchanged:: 8.1 + ``help``, ``epilog``, and ``short_help`` are stored unprocessed, + all formatting is done when outputting help text, not at init, + and is done even if not using the ``@command`` decorator. + + .. versionchanged:: 8.0 + Added a ``repr`` showing the command name. + + .. versionchanged:: 7.1 + Added the ``no_args_is_help`` parameter. + + .. versionchanged:: 2.0 + Added the ``context_settings`` parameter. + """ + + def __init__( + self, + name: t.Optional[str], + context_settings: t.Optional[t.MutableMapping[str, t.Any]] = None, + callback: t.Optional[t.Callable[..., t.Any]] = None, + params: t.Optional[t.List["Parameter"]] = None, + help: t.Optional[str] = None, + epilog: t.Optional[str] = None, + short_help: t.Optional[str] = None, + options_metavar: t.Optional[str] = "[OPTIONS]", + add_help_option: bool = True, + no_args_is_help: bool = False, + hidden: bool = False, + deprecated: bool = False, + ) -> None: + super().__init__(name, context_settings) + #: the callback to execute when the command fires. This might be + #: `None` in which case nothing happens. + self.callback = callback + #: the list of parameters for this command in the order they + #: should show up in the help page and execute. Eager parameters + #: will automatically be handled before non eager ones. + self.params: t.List["Parameter"] = params or [] + self.help = help + self.epilog = epilog + self.options_metavar = options_metavar + self.short_help = short_help + self.add_help_option = add_help_option + self.no_args_is_help = no_args_is_help + self.hidden = hidden + self.deprecated = deprecated + + def to_info_dict(self, ctx: Context) -> t.Dict[str, t.Any]: + info_dict = super().to_info_dict(ctx) + info_dict.update( + params=[param.to_info_dict() for param in self.get_params(ctx)], + help=self.help, + epilog=self.epilog, + short_help=self.short_help, + hidden=self.hidden, + deprecated=self.deprecated, + ) + return info_dict + + def get_usage(self, ctx: Context) -> str: + """Formats the usage line into a string and returns it. + + Calls :meth:`format_usage` internally. + """ + formatter = ctx.make_formatter() + self.format_usage(ctx, formatter) + return formatter.getvalue().rstrip("\n") + + def get_params(self, ctx: Context) -> t.List["Parameter"]: + rv = self.params + help_option = self.get_help_option(ctx) + + if help_option is not None: + rv = [*rv, help_option] + + return rv + + def format_usage(self, ctx: Context, formatter: HelpFormatter) -> None: + """Writes the usage line into the formatter. + + This is a low-level method called by :meth:`get_usage`. + """ + pieces = self.collect_usage_pieces(ctx) + formatter.write_usage(ctx.command_path, " ".join(pieces)) + + def collect_usage_pieces(self, ctx: Context) -> t.List[str]: + """Returns all the pieces that go into the usage line and returns + it as a list of strings. + """ + rv = [self.options_metavar] if self.options_metavar else [] + + for param in self.get_params(ctx): + rv.extend(param.get_usage_pieces(ctx)) + + return rv + + def get_help_option_names(self, ctx: Context) -> t.List[str]: + """Returns the names for the help option.""" + all_names = set(ctx.help_option_names) + for param in self.params: + all_names.difference_update(param.opts) + all_names.difference_update(param.secondary_opts) + return list(all_names) + + def get_help_option(self, ctx: Context) -> t.Optional["Option"]: + """Returns the help option object.""" + help_options = self.get_help_option_names(ctx) + + if not help_options or not self.add_help_option: + return None + + def show_help(ctx: Context, param: "Parameter", value: str) -> None: + if value and not ctx.resilient_parsing: + echo(ctx.get_help(), color=ctx.color) + ctx.exit() + + return Option( + help_options, + is_flag=True, + is_eager=True, + expose_value=False, + callback=show_help, + help=_("Show this message and exit."), + ) + + def make_parser(self, ctx: Context) -> OptionParser: + """Creates the underlying option parser for this command.""" + parser = OptionParser(ctx) + for param in self.get_params(ctx): + param.add_to_parser(parser, ctx) + return parser + + def get_help(self, ctx: Context) -> str: + """Formats the help into a string and returns it. + + Calls :meth:`format_help` internally. + """ + formatter = ctx.make_formatter() + self.format_help(ctx, formatter) + return formatter.getvalue().rstrip("\n") + + def get_short_help_str(self, limit: int = 45) -> str: + """Gets short help for the command or makes it by shortening the + long help string. + """ + if self.short_help: + text = inspect.cleandoc(self.short_help) + elif self.help: + text = make_default_short_help(self.help, limit) + else: + text = "" + + if self.deprecated: + text = _("(Deprecated) {text}").format(text=text) + + return text.strip() + + def format_help(self, ctx: Context, formatter: HelpFormatter) -> None: + """Writes the help into the formatter if it exists. + + This is a low-level method called by :meth:`get_help`. + + This calls the following methods: + + - :meth:`format_usage` + - :meth:`format_help_text` + - :meth:`format_options` + - :meth:`format_epilog` + """ + self.format_usage(ctx, formatter) + self.format_help_text(ctx, formatter) + self.format_options(ctx, formatter) + self.format_epilog(ctx, formatter) + + def format_help_text(self, ctx: Context, formatter: HelpFormatter) -> None: + """Writes the help text to the formatter if it exists.""" + if self.help is not None: + # truncate the help text to the first form feed + text = inspect.cleandoc(self.help).partition("\f")[0] + else: + text = "" + + if self.deprecated: + text = _("(Deprecated) {text}").format(text=text) + + if text: + formatter.write_paragraph() + + with formatter.indentation(): + formatter.write_text(text) + + def format_options(self, ctx: Context, formatter: HelpFormatter) -> None: + """Writes all the options into the formatter if they exist.""" + opts = [] + for param in self.get_params(ctx): + rv = param.get_help_record(ctx) + if rv is not None: + opts.append(rv) + + if opts: + with formatter.section(_("Options")): + formatter.write_dl(opts) + + def format_epilog(self, ctx: Context, formatter: HelpFormatter) -> None: + """Writes the epilog into the formatter if it exists.""" + if self.epilog: + epilog = inspect.cleandoc(self.epilog) + formatter.write_paragraph() + + with formatter.indentation(): + formatter.write_text(epilog) + + def parse_args(self, ctx: Context, args: t.List[str]) -> t.List[str]: + if not args and self.no_args_is_help and not ctx.resilient_parsing: + echo(ctx.get_help(), color=ctx.color) + ctx.exit() + + parser = self.make_parser(ctx) + opts, args, param_order = parser.parse_args(args=args) + + for param in iter_params_for_processing(param_order, self.get_params(ctx)): + value, args = param.handle_parse_result(ctx, opts, args) + + if args and not ctx.allow_extra_args and not ctx.resilient_parsing: + ctx.fail( + ngettext( + "Got unexpected extra argument ({args})", + "Got unexpected extra arguments ({args})", + len(args), + ).format(args=" ".join(map(str, args))) + ) + + ctx.args = args + ctx._opt_prefixes.update(parser._opt_prefixes) + return args + + def invoke(self, ctx: Context) -> t.Any: + """Given a context, this invokes the attached callback (if it exists) + in the right way. + """ + if self.deprecated: + message = _( + "DeprecationWarning: The command {name!r} is deprecated." + ).format(name=self.name) + echo(style(message, fg="red"), err=True) + + if self.callback is not None: + return ctx.invoke(self.callback, **ctx.params) + + def shell_complete(self, ctx: Context, incomplete: str) -> t.List["CompletionItem"]: + """Return a list of completions for the incomplete value. Looks + at the names of options and chained multi-commands. + + :param ctx: Invocation context for this command. + :param incomplete: Value being completed. May be empty. + + .. versionadded:: 8.0 + """ + from click.shell_completion import CompletionItem + + results: t.List["CompletionItem"] = [] + + if incomplete and not incomplete[0].isalnum(): + for param in self.get_params(ctx): + if ( + not isinstance(param, Option) + or param.hidden + or ( + not param.multiple + and ctx.get_parameter_source(param.name) # type: ignore + is ParameterSource.COMMANDLINE + ) + ): + continue + + results.extend( + CompletionItem(name, help=param.help) + for name in [*param.opts, *param.secondary_opts] + if name.startswith(incomplete) + ) + + results.extend(super().shell_complete(ctx, incomplete)) + return results + + +class MultiCommand(Command): + """A multi command is the basic implementation of a command that + dispatches to subcommands. The most common version is the + :class:`Group`. + + :param invoke_without_command: this controls how the multi command itself + is invoked. By default it's only invoked + if a subcommand is provided. + :param no_args_is_help: this controls what happens if no arguments are + provided. This option is enabled by default if + `invoke_without_command` is disabled or disabled + if it's enabled. If enabled this will add + ``--help`` as argument if no arguments are + passed. + :param subcommand_metavar: the string that is used in the documentation + to indicate the subcommand place. + :param chain: if this is set to `True` chaining of multiple subcommands + is enabled. This restricts the form of commands in that + they cannot have optional arguments but it allows + multiple commands to be chained together. + :param result_callback: The result callback to attach to this multi + command. This can be set or changed later with the + :meth:`result_callback` decorator. + :param attrs: Other command arguments described in :class:`Command`. + """ + + allow_extra_args = True + allow_interspersed_args = False + + def __init__( + self, + name: t.Optional[str] = None, + invoke_without_command: bool = False, + no_args_is_help: t.Optional[bool] = None, + subcommand_metavar: t.Optional[str] = None, + chain: bool = False, + result_callback: t.Optional[t.Callable[..., t.Any]] = None, + **attrs: t.Any, + ) -> None: + super().__init__(name, **attrs) + + if no_args_is_help is None: + no_args_is_help = not invoke_without_command + + self.no_args_is_help = no_args_is_help + self.invoke_without_command = invoke_without_command + + if subcommand_metavar is None: + if chain: + subcommand_metavar = "COMMAND1 [ARGS]... [COMMAND2 [ARGS]...]..." + else: + subcommand_metavar = "COMMAND [ARGS]..." + + self.subcommand_metavar = subcommand_metavar + self.chain = chain + # The result callback that is stored. This can be set or + # overridden with the :func:`result_callback` decorator. + self._result_callback = result_callback + + if self.chain: + for param in self.params: + if isinstance(param, Argument) and not param.required: + raise RuntimeError( + "Multi commands in chain mode cannot have" + " optional arguments." + ) + + def to_info_dict(self, ctx: Context) -> t.Dict[str, t.Any]: + info_dict = super().to_info_dict(ctx) + commands = {} + + for name in self.list_commands(ctx): + command = self.get_command(ctx, name) + + if command is None: + continue + + sub_ctx = ctx._make_sub_context(command) + + with sub_ctx.scope(cleanup=False): + commands[name] = command.to_info_dict(sub_ctx) + + info_dict.update(commands=commands, chain=self.chain) + return info_dict + + def collect_usage_pieces(self, ctx: Context) -> t.List[str]: + rv = super().collect_usage_pieces(ctx) + rv.append(self.subcommand_metavar) + return rv + + def format_options(self, ctx: Context, formatter: HelpFormatter) -> None: + super().format_options(ctx, formatter) + self.format_commands(ctx, formatter) + + def result_callback(self, replace: bool = False) -> t.Callable[[F], F]: + """Adds a result callback to the command. By default if a + result callback is already registered this will chain them but + this can be disabled with the `replace` parameter. The result + callback is invoked with the return value of the subcommand + (or the list of return values from all subcommands if chaining + is enabled) as well as the parameters as they would be passed + to the main callback. + + Example:: + + @click.group() + @click.option('-i', '--input', default=23) + def cli(input): + return 42 + + @cli.result_callback() + def process_result(result, input): + return result + input + + :param replace: if set to `True` an already existing result + callback will be removed. + + .. versionchanged:: 8.0 + Renamed from ``resultcallback``. + + .. versionadded:: 3.0 + """ + + def decorator(f: F) -> F: + old_callback = self._result_callback + + if old_callback is None or replace: + self._result_callback = f + return f + + def function(__value, *args, **kwargs): # type: ignore + inner = old_callback(__value, *args, **kwargs) + return f(inner, *args, **kwargs) + + self._result_callback = rv = update_wrapper(t.cast(F, function), f) + return rv + + return decorator + + def format_commands(self, ctx: Context, formatter: HelpFormatter) -> None: + """Extra format methods for multi methods that adds all the commands + after the options. + """ + commands = [] + for subcommand in self.list_commands(ctx): + cmd = self.get_command(ctx, subcommand) + # What is this, the tool lied about a command. Ignore it + if cmd is None: + continue + if cmd.hidden: + continue + + commands.append((subcommand, cmd)) + + # allow for 3 times the default spacing + if len(commands): + limit = formatter.width - 6 - max(len(cmd[0]) for cmd in commands) + + rows = [] + for subcommand, cmd in commands: + help = cmd.get_short_help_str(limit) + rows.append((subcommand, help)) + + if rows: + with formatter.section(_("Commands")): + formatter.write_dl(rows) + + def parse_args(self, ctx: Context, args: t.List[str]) -> t.List[str]: + if not args and self.no_args_is_help and not ctx.resilient_parsing: + echo(ctx.get_help(), color=ctx.color) + ctx.exit() + + rest = super().parse_args(ctx, args) + + if self.chain: + ctx.protected_args = rest + ctx.args = [] + elif rest: + ctx.protected_args, ctx.args = rest[:1], rest[1:] + + return ctx.args + + def invoke(self, ctx: Context) -> t.Any: + def _process_result(value: t.Any) -> t.Any: + if self._result_callback is not None: + value = ctx.invoke(self._result_callback, value, **ctx.params) + return value + + if not ctx.protected_args: + if self.invoke_without_command: + # No subcommand was invoked, so the result callback is + # invoked with the group return value for regular + # groups, or an empty list for chained groups. + with ctx: + rv = super().invoke(ctx) + return _process_result([] if self.chain else rv) + ctx.fail(_("Missing command.")) + + # Fetch args back out + args = [*ctx.protected_args, *ctx.args] + ctx.args = [] + ctx.protected_args = [] + + # If we're not in chain mode, we only allow the invocation of a + # single command but we also inform the current context about the + # name of the command to invoke. + if not self.chain: + # Make sure the context is entered so we do not clean up + # resources until the result processor has worked. + with ctx: + cmd_name, cmd, args = self.resolve_command(ctx, args) + assert cmd is not None + ctx.invoked_subcommand = cmd_name + super().invoke(ctx) + sub_ctx = cmd.make_context(cmd_name, args, parent=ctx) + with sub_ctx: + return _process_result(sub_ctx.command.invoke(sub_ctx)) + + # In chain mode we create the contexts step by step, but after the + # base command has been invoked. Because at that point we do not + # know the subcommands yet, the invoked subcommand attribute is + # set to ``*`` to inform the command that subcommands are executed + # but nothing else. + with ctx: + ctx.invoked_subcommand = "*" if args else None + super().invoke(ctx) + + # Otherwise we make every single context and invoke them in a + # chain. In that case the return value to the result processor + # is the list of all invoked subcommand's results. + contexts = [] + while args: + cmd_name, cmd, args = self.resolve_command(ctx, args) + assert cmd is not None + sub_ctx = cmd.make_context( + cmd_name, + args, + parent=ctx, + allow_extra_args=True, + allow_interspersed_args=False, + ) + contexts.append(sub_ctx) + args, sub_ctx.args = sub_ctx.args, [] + + rv = [] + for sub_ctx in contexts: + with sub_ctx: + rv.append(sub_ctx.command.invoke(sub_ctx)) + return _process_result(rv) + + def resolve_command( + self, ctx: Context, args: t.List[str] + ) -> t.Tuple[t.Optional[str], t.Optional[Command], t.List[str]]: + cmd_name = make_str(args[0]) + original_cmd_name = cmd_name + + # Get the command + cmd = self.get_command(ctx, cmd_name) + + # If we can't find the command but there is a normalization + # function available, we try with that one. + if cmd is None and ctx.token_normalize_func is not None: + cmd_name = ctx.token_normalize_func(cmd_name) + cmd = self.get_command(ctx, cmd_name) + + # If we don't find the command we want to show an error message + # to the user that it was not provided. However, there is + # something else we should do: if the first argument looks like + # an option we want to kick off parsing again for arguments to + # resolve things like --help which now should go to the main + # place. + if cmd is None and not ctx.resilient_parsing: + if split_opt(cmd_name)[0]: + self.parse_args(ctx, ctx.args) + ctx.fail(_("No such command {name!r}.").format(name=original_cmd_name)) + return cmd_name if cmd else None, cmd, args[1:] + + def get_command(self, ctx: Context, cmd_name: str) -> t.Optional[Command]: + """Given a context and a command name, this returns a + :class:`Command` object if it exists or returns `None`. + """ + raise NotImplementedError + + def list_commands(self, ctx: Context) -> t.List[str]: + """Returns a list of subcommand names in the order they should + appear. + """ + return [] + + def shell_complete(self, ctx: Context, incomplete: str) -> t.List["CompletionItem"]: + """Return a list of completions for the incomplete value. Looks + at the names of options, subcommands, and chained + multi-commands. + + :param ctx: Invocation context for this command. + :param incomplete: Value being completed. May be empty. + + .. versionadded:: 8.0 + """ + from click.shell_completion import CompletionItem + + results = [ + CompletionItem(name, help=command.get_short_help_str()) + for name, command in _complete_visible_commands(ctx, incomplete) + ] + results.extend(super().shell_complete(ctx, incomplete)) + return results + + +class Group(MultiCommand): + """A group allows a command to have subcommands attached. This is + the most common way to implement nesting in Click. + + :param name: The name of the group command. + :param commands: A dict mapping names to :class:`Command` objects. + Can also be a list of :class:`Command`, which will use + :attr:`Command.name` to create the dict. + :param attrs: Other command arguments described in + :class:`MultiCommand`, :class:`Command`, and + :class:`BaseCommand`. + + .. versionchanged:: 8.0 + The ``commands`` argument can be a list of command objects. + """ + + #: If set, this is used by the group's :meth:`command` decorator + #: as the default :class:`Command` class. This is useful to make all + #: subcommands use a custom command class. + #: + #: .. versionadded:: 8.0 + command_class: t.Optional[t.Type[Command]] = None + + #: If set, this is used by the group's :meth:`group` decorator + #: as the default :class:`Group` class. This is useful to make all + #: subgroups use a custom group class. + #: + #: If set to the special value :class:`type` (literally + #: ``group_class = type``), this group's class will be used as the + #: default class. This makes a custom group class continue to make + #: custom groups. + #: + #: .. versionadded:: 8.0 + group_class: t.Optional[t.Union[t.Type["Group"], t.Type[type]]] = None + # Literal[type] isn't valid, so use Type[type] + + def __init__( + self, + name: t.Optional[str] = None, + commands: t.Optional[ + t.Union[t.MutableMapping[str, Command], t.Sequence[Command]] + ] = None, + **attrs: t.Any, + ) -> None: + super().__init__(name, **attrs) + + if commands is None: + commands = {} + elif isinstance(commands, abc.Sequence): + commands = {c.name: c for c in commands if c.name is not None} + + #: The registered subcommands by their exported names. + self.commands: t.MutableMapping[str, Command] = commands + + def add_command(self, cmd: Command, name: t.Optional[str] = None) -> None: + """Registers another :class:`Command` with this group. If the name + is not provided, the name of the command is used. + """ + name = name or cmd.name + if name is None: + raise TypeError("Command has no name.") + _check_multicommand(self, name, cmd, register=True) + self.commands[name] = cmd + + @t.overload + def command(self, __func: t.Callable[..., t.Any]) -> Command: + ... + + @t.overload + def command( + self, *args: t.Any, **kwargs: t.Any + ) -> t.Callable[[t.Callable[..., t.Any]], Command]: + ... + + def command( + self, *args: t.Any, **kwargs: t.Any + ) -> t.Union[t.Callable[[t.Callable[..., t.Any]], Command], Command]: + """A shortcut decorator for declaring and attaching a command to + the group. This takes the same arguments as :func:`command` and + immediately registers the created command with this group by + calling :meth:`add_command`. + + To customize the command class used, set the + :attr:`command_class` attribute. + + .. versionchanged:: 8.1 + This decorator can be applied without parentheses. + + .. versionchanged:: 8.0 + Added the :attr:`command_class` attribute. + """ + from .decorators import command + + func: t.Optional[t.Callable[..., t.Any]] = None + + if args and callable(args[0]): + assert ( + len(args) == 1 and not kwargs + ), "Use 'command(**kwargs)(callable)' to provide arguments." + (func,) = args + args = () + + if self.command_class and kwargs.get("cls") is None: + kwargs["cls"] = self.command_class + + def decorator(f: t.Callable[..., t.Any]) -> Command: + cmd: Command = command(*args, **kwargs)(f) + self.add_command(cmd) + return cmd + + if func is not None: + return decorator(func) + + return decorator + + @t.overload + def group(self, __func: t.Callable[..., t.Any]) -> "Group": + ... + + @t.overload + def group( + self, *args: t.Any, **kwargs: t.Any + ) -> t.Callable[[t.Callable[..., t.Any]], "Group"]: + ... + + def group( + self, *args: t.Any, **kwargs: t.Any + ) -> t.Union[t.Callable[[t.Callable[..., t.Any]], "Group"], "Group"]: + """A shortcut decorator for declaring and attaching a group to + the group. This takes the same arguments as :func:`group` and + immediately registers the created group with this group by + calling :meth:`add_command`. + + To customize the group class used, set the :attr:`group_class` + attribute. + + .. versionchanged:: 8.1 + This decorator can be applied without parentheses. + + .. versionchanged:: 8.0 + Added the :attr:`group_class` attribute. + """ + from .decorators import group + + func: t.Optional[t.Callable[..., t.Any]] = None + + if args and callable(args[0]): + assert ( + len(args) == 1 and not kwargs + ), "Use 'group(**kwargs)(callable)' to provide arguments." + (func,) = args + args = () + + if self.group_class is not None and kwargs.get("cls") is None: + if self.group_class is type: + kwargs["cls"] = type(self) + else: + kwargs["cls"] = self.group_class + + def decorator(f: t.Callable[..., t.Any]) -> "Group": + cmd: Group = group(*args, **kwargs)(f) + self.add_command(cmd) + return cmd + + if func is not None: + return decorator(func) + + return decorator + + def get_command(self, ctx: Context, cmd_name: str) -> t.Optional[Command]: + return self.commands.get(cmd_name) + + def list_commands(self, ctx: Context) -> t.List[str]: + return sorted(self.commands) + + +class CommandCollection(MultiCommand): + """A command collection is a multi command that merges multiple multi + commands together into one. This is a straightforward implementation + that accepts a list of different multi commands as sources and + provides all the commands for each of them. + + See :class:`MultiCommand` and :class:`Command` for the description of + ``name`` and ``attrs``. + """ + + def __init__( + self, + name: t.Optional[str] = None, + sources: t.Optional[t.List[MultiCommand]] = None, + **attrs: t.Any, + ) -> None: + super().__init__(name, **attrs) + #: The list of registered multi commands. + self.sources: t.List[MultiCommand] = sources or [] + + def add_source(self, multi_cmd: MultiCommand) -> None: + """Adds a new multi command to the chain dispatcher.""" + self.sources.append(multi_cmd) + + def get_command(self, ctx: Context, cmd_name: str) -> t.Optional[Command]: + for source in self.sources: + rv = source.get_command(ctx, cmd_name) + + if rv is not None: + if self.chain: + _check_multicommand(self, cmd_name, rv) + + return rv + + return None + + def list_commands(self, ctx: Context) -> t.List[str]: + rv: t.Set[str] = set() + + for source in self.sources: + rv.update(source.list_commands(ctx)) + + return sorted(rv) + + +def _check_iter(value: t.Any) -> t.Iterator[t.Any]: + """Check if the value is iterable but not a string. Raises a type + error, or return an iterator over the value. + """ + if isinstance(value, str): + raise TypeError + + return iter(value) + + +class Parameter: + r"""A parameter to a command comes in two versions: they are either + :class:`Option`\s or :class:`Argument`\s. Other subclasses are currently + not supported by design as some of the internals for parsing are + intentionally not finalized. + + Some settings are supported by both options and arguments. + + :param param_decls: the parameter declarations for this option or + argument. This is a list of flags or argument + names. + :param type: the type that should be used. Either a :class:`ParamType` + or a Python type. The latter is converted into the former + automatically if supported. + :param required: controls if this is optional or not. + :param default: the default value if omitted. This can also be a callable, + in which case it's invoked when the default is needed + without any arguments. + :param callback: A function to further process or validate the value + after type conversion. It is called as ``f(ctx, param, value)`` + and must return the value. It is called for all sources, + including prompts. + :param nargs: the number of arguments to match. If not ``1`` the return + value is a tuple instead of single value. The default for + nargs is ``1`` (except if the type is a tuple, then it's + the arity of the tuple). If ``nargs=-1``, all remaining + parameters are collected. + :param metavar: how the value is represented in the help page. + :param expose_value: if this is `True` then the value is passed onwards + to the command callback and stored on the context, + otherwise it's skipped. + :param is_eager: eager values are processed before non eager ones. This + should not be set for arguments or it will inverse the + order of processing. + :param envvar: a string or list of strings that are environment variables + that should be checked. + :param shell_complete: A function that returns custom shell + completions. Used instead of the param's type completion if + given. Takes ``ctx, param, incomplete`` and must return a list + of :class:`~click.shell_completion.CompletionItem` or a list of + strings. + + .. versionchanged:: 8.0 + ``process_value`` validates required parameters and bounded + ``nargs``, and invokes the parameter callback before returning + the value. This allows the callback to validate prompts. + ``full_process_value`` is removed. + + .. versionchanged:: 8.0 + ``autocompletion`` is renamed to ``shell_complete`` and has new + semantics described above. The old name is deprecated and will + be removed in 8.1, until then it will be wrapped to match the + new requirements. + + .. versionchanged:: 8.0 + For ``multiple=True, nargs>1``, the default must be a list of + tuples. + + .. versionchanged:: 8.0 + Setting a default is no longer required for ``nargs>1``, it will + default to ``None``. ``multiple=True`` or ``nargs=-1`` will + default to ``()``. + + .. versionchanged:: 7.1 + Empty environment variables are ignored rather than taking the + empty string value. This makes it possible for scripts to clear + variables if they can't unset them. + + .. versionchanged:: 2.0 + Changed signature for parameter callback to also be passed the + parameter. The old callback format will still work, but it will + raise a warning to give you a chance to migrate the code easier. + """ + + param_type_name = "parameter" + + def __init__( + self, + param_decls: t.Optional[t.Sequence[str]] = None, + type: t.Optional[t.Union[types.ParamType, t.Any]] = None, + required: bool = False, + default: t.Optional[t.Union[t.Any, t.Callable[[], t.Any]]] = None, + callback: t.Optional[t.Callable[[Context, "Parameter", t.Any], t.Any]] = None, + nargs: t.Optional[int] = None, + multiple: bool = False, + metavar: t.Optional[str] = None, + expose_value: bool = True, + is_eager: bool = False, + envvar: t.Optional[t.Union[str, t.Sequence[str]]] = None, + shell_complete: t.Optional[ + t.Callable[ + [Context, "Parameter", str], + t.Union[t.List["CompletionItem"], t.List[str]], + ] + ] = None, + ) -> None: + self.name: t.Optional[str] + self.opts: t.List[str] + self.secondary_opts: t.List[str] + self.name, self.opts, self.secondary_opts = self._parse_decls( + param_decls or (), expose_value + ) + self.type: types.ParamType = types.convert_type(type, default) + + # Default nargs to what the type tells us if we have that + # information available. + if nargs is None: + if self.type.is_composite: + nargs = self.type.arity + else: + nargs = 1 + + self.required = required + self.callback = callback + self.nargs = nargs + self.multiple = multiple + self.expose_value = expose_value + self.default = default + self.is_eager = is_eager + self.metavar = metavar + self.envvar = envvar + self._custom_shell_complete = shell_complete + + if __debug__: + if self.type.is_composite and nargs != self.type.arity: + raise ValueError( + f"'nargs' must be {self.type.arity} (or None) for" + f" type {self.type!r}, but it was {nargs}." + ) + + # Skip no default or callable default. + check_default = default if not callable(default) else None + + if check_default is not None: + if multiple: + try: + # Only check the first value against nargs. + check_default = next(_check_iter(check_default), None) + except TypeError: + raise ValueError( + "'default' must be a list when 'multiple' is true." + ) from None + + # Can be None for multiple with empty default. + if nargs != 1 and check_default is not None: + try: + _check_iter(check_default) + except TypeError: + if multiple: + message = ( + "'default' must be a list of lists when 'multiple' is" + " true and 'nargs' != 1." + ) + else: + message = "'default' must be a list when 'nargs' != 1." + + raise ValueError(message) from None + + if nargs > 1 and len(check_default) != nargs: + subject = "item length" if multiple else "length" + raise ValueError( + f"'default' {subject} must match nargs={nargs}." + ) + + def to_info_dict(self) -> t.Dict[str, t.Any]: + """Gather information that could be useful for a tool generating + user-facing documentation. + + Use :meth:`click.Context.to_info_dict` to traverse the entire + CLI structure. + + .. versionadded:: 8.0 + """ + return { + "name": self.name, + "param_type_name": self.param_type_name, + "opts": self.opts, + "secondary_opts": self.secondary_opts, + "type": self.type.to_info_dict(), + "required": self.required, + "nargs": self.nargs, + "multiple": self.multiple, + "default": self.default, + "envvar": self.envvar, + } + + def __repr__(self) -> str: + return f"<{self.__class__.__name__} {self.name}>" + + def _parse_decls( + self, decls: t.Sequence[str], expose_value: bool + ) -> t.Tuple[t.Optional[str], t.List[str], t.List[str]]: + raise NotImplementedError() + + @property + def human_readable_name(self) -> str: + """Returns the human readable name of this parameter. This is the + same as the name for options, but the metavar for arguments. + """ + return self.name # type: ignore + + def make_metavar(self) -> str: + if self.metavar is not None: + return self.metavar + + metavar = self.type.get_metavar(self) + + if metavar is None: + metavar = self.type.name.upper() + + if self.nargs != 1: + metavar += "..." + + return metavar + + @t.overload + def get_default( + self, ctx: Context, call: "te.Literal[True]" = True + ) -> t.Optional[t.Any]: + ... + + @t.overload + def get_default( + self, ctx: Context, call: bool = ... + ) -> t.Optional[t.Union[t.Any, t.Callable[[], t.Any]]]: + ... + + def get_default( + self, ctx: Context, call: bool = True + ) -> t.Optional[t.Union[t.Any, t.Callable[[], t.Any]]]: + """Get the default for the parameter. Tries + :meth:`Context.lookup_default` first, then the local default. + + :param ctx: Current context. + :param call: If the default is a callable, call it. Disable to + return the callable instead. + + .. versionchanged:: 8.0.2 + Type casting is no longer performed when getting a default. + + .. versionchanged:: 8.0.1 + Type casting can fail in resilient parsing mode. Invalid + defaults will not prevent showing help text. + + .. versionchanged:: 8.0 + Looks at ``ctx.default_map`` first. + + .. versionchanged:: 8.0 + Added the ``call`` parameter. + """ + value = ctx.lookup_default(self.name, call=False) # type: ignore + + if value is None: + value = self.default + + if call and callable(value): + value = value() + + return value + + def add_to_parser(self, parser: OptionParser, ctx: Context) -> None: + raise NotImplementedError() + + def consume_value( + self, ctx: Context, opts: t.Mapping[str, t.Any] + ) -> t.Tuple[t.Any, ParameterSource]: + value = opts.get(self.name) # type: ignore + source = ParameterSource.COMMANDLINE + + if value is None: + value = self.value_from_envvar(ctx) + source = ParameterSource.ENVIRONMENT + + if value is None: + value = ctx.lookup_default(self.name) # type: ignore + source = ParameterSource.DEFAULT_MAP + + if value is None: + value = self.get_default(ctx) + source = ParameterSource.DEFAULT + + return value, source + + def type_cast_value(self, ctx: Context, value: t.Any) -> t.Any: + """Convert and validate a value against the option's + :attr:`type`, :attr:`multiple`, and :attr:`nargs`. + """ + if value is None: + return () if self.multiple or self.nargs == -1 else None + + def check_iter(value: t.Any) -> t.Iterator[t.Any]: + try: + return _check_iter(value) + except TypeError: + # This should only happen when passing in args manually, + # the parser should construct an iterable when parsing + # the command line. + raise BadParameter( + _("Value must be an iterable."), ctx=ctx, param=self + ) from None + + if self.nargs == 1 or self.type.is_composite: + + def convert(value: t.Any) -> t.Any: + return self.type(value, param=self, ctx=ctx) + + elif self.nargs == -1: + + def convert(value: t.Any) -> t.Any: # t.Tuple[t.Any, ...] + return tuple(self.type(x, self, ctx) for x in check_iter(value)) + + else: # nargs > 1 + + def convert(value: t.Any) -> t.Any: # t.Tuple[t.Any, ...] + value = tuple(check_iter(value)) + + if len(value) != self.nargs: + raise BadParameter( + ngettext( + "Takes {nargs} values but 1 was given.", + "Takes {nargs} values but {len} were given.", + len(value), + ).format(nargs=self.nargs, len=len(value)), + ctx=ctx, + param=self, + ) + + return tuple(self.type(x, self, ctx) for x in value) + + if self.multiple: + return tuple(convert(x) for x in check_iter(value)) + + return convert(value) + + def value_is_missing(self, value: t.Any) -> bool: + if value is None: + return True + + if (self.nargs != 1 or self.multiple) and value == (): + return True + + return False + + def process_value(self, ctx: Context, value: t.Any) -> t.Any: + value = self.type_cast_value(ctx, value) + + if self.required and self.value_is_missing(value): + raise MissingParameter(ctx=ctx, param=self) + + if self.callback is not None: + value = self.callback(ctx, self, value) + + return value + + def resolve_envvar_value(self, ctx: Context) -> t.Optional[str]: + if self.envvar is None: + return None + + if isinstance(self.envvar, str): + rv = os.environ.get(self.envvar) + + if rv: + return rv + else: + for envvar in self.envvar: + rv = os.environ.get(envvar) + + if rv: + return rv + + return None + + def value_from_envvar(self, ctx: Context) -> t.Optional[t.Any]: + rv: t.Optional[t.Any] = self.resolve_envvar_value(ctx) + + if rv is not None and self.nargs != 1: + rv = self.type.split_envvar_value(rv) + + return rv + + def handle_parse_result( + self, ctx: Context, opts: t.Mapping[str, t.Any], args: t.List[str] + ) -> t.Tuple[t.Any, t.List[str]]: + with augment_usage_errors(ctx, param=self): + value, source = self.consume_value(ctx, opts) + ctx.set_parameter_source(self.name, source) # type: ignore + + try: + value = self.process_value(ctx, value) + except Exception: + if not ctx.resilient_parsing: + raise + + value = None + + if self.expose_value: + ctx.params[self.name] = value # type: ignore + + return value, args + + def get_help_record(self, ctx: Context) -> t.Optional[t.Tuple[str, str]]: + pass + + def get_usage_pieces(self, ctx: Context) -> t.List[str]: + return [] + + def get_error_hint(self, ctx: Context) -> str: + """Get a stringified version of the param for use in error messages to + indicate which param caused the error. + """ + hint_list = self.opts or [self.human_readable_name] + return " / ".join(f"'{x}'" for x in hint_list) + + def shell_complete(self, ctx: Context, incomplete: str) -> t.List["CompletionItem"]: + """Return a list of completions for the incomplete value. If a + ``shell_complete`` function was given during init, it is used. + Otherwise, the :attr:`type` + :meth:`~click.types.ParamType.shell_complete` function is used. + + :param ctx: Invocation context for this command. + :param incomplete: Value being completed. May be empty. + + .. versionadded:: 8.0 + """ + if self._custom_shell_complete is not None: + results = self._custom_shell_complete(ctx, self, incomplete) + + if results and isinstance(results[0], str): + from click.shell_completion import CompletionItem + + results = [CompletionItem(c) for c in results] + + return t.cast(t.List["CompletionItem"], results) + + return self.type.shell_complete(ctx, self, incomplete) + + +class Option(Parameter): + """Options are usually optional values on the command line and + have some extra features that arguments don't have. + + All other parameters are passed onwards to the parameter constructor. + + :param show_default: Show the default value for this option in its + help text. Values are not shown by default, unless + :attr:`Context.show_default` is ``True``. If this value is a + string, it shows that string in parentheses instead of the + actual value. This is particularly useful for dynamic options. + For single option boolean flags, the default remains hidden if + its value is ``False``. + :param show_envvar: Controls if an environment variable should be + shown on the help page. Normally, environment variables are not + shown. + :param prompt: If set to ``True`` or a non empty string then the + user will be prompted for input. If set to ``True`` the prompt + will be the option name capitalized. + :param confirmation_prompt: Prompt a second time to confirm the + value if it was prompted for. Can be set to a string instead of + ``True`` to customize the message. + :param prompt_required: If set to ``False``, the user will be + prompted for input only when the option was specified as a flag + without a value. + :param hide_input: If this is ``True`` then the input on the prompt + will be hidden from the user. This is useful for password input. + :param is_flag: forces this option to act as a flag. The default is + auto detection. + :param flag_value: which value should be used for this flag if it's + enabled. This is set to a boolean automatically if + the option string contains a slash to mark two options. + :param multiple: if this is set to `True` then the argument is accepted + multiple times and recorded. This is similar to ``nargs`` + in how it works but supports arbitrary number of + arguments. + :param count: this flag makes an option increment an integer. + :param allow_from_autoenv: if this is enabled then the value of this + parameter will be pulled from an environment + variable in case a prefix is defined on the + context. + :param help: the help string. + :param hidden: hide this option from help outputs. + :param attrs: Other command arguments described in :class:`Parameter`. + + .. versionchanged:: 8.1.0 + Help text indentation is cleaned here instead of only in the + ``@option`` decorator. + + .. versionchanged:: 8.1.0 + The ``show_default`` parameter overrides + ``Context.show_default``. + + .. versionchanged:: 8.1.0 + The default of a single option boolean flag is not shown if the + default value is ``False``. + + .. versionchanged:: 8.0.1 + ``type`` is detected from ``flag_value`` if given. + """ + + param_type_name = "option" + + def __init__( + self, + param_decls: t.Optional[t.Sequence[str]] = None, + show_default: t.Union[bool, str, None] = None, + prompt: t.Union[bool, str] = False, + confirmation_prompt: t.Union[bool, str] = False, + prompt_required: bool = True, + hide_input: bool = False, + is_flag: t.Optional[bool] = None, + flag_value: t.Optional[t.Any] = None, + multiple: bool = False, + count: bool = False, + allow_from_autoenv: bool = True, + type: t.Optional[t.Union[types.ParamType, t.Any]] = None, + help: t.Optional[str] = None, + hidden: bool = False, + show_choices: bool = True, + show_envvar: bool = False, + **attrs: t.Any, + ) -> None: + if help: + help = inspect.cleandoc(help) + + default_is_missing = "default" not in attrs + super().__init__(param_decls, type=type, multiple=multiple, **attrs) + + if prompt is True: + if self.name is None: + raise TypeError("'name' is required with 'prompt=True'.") + + prompt_text: t.Optional[str] = self.name.replace("_", " ").capitalize() + elif prompt is False: + prompt_text = None + else: + prompt_text = prompt + + self.prompt = prompt_text + self.confirmation_prompt = confirmation_prompt + self.prompt_required = prompt_required + self.hide_input = hide_input + self.hidden = hidden + + # If prompt is enabled but not required, then the option can be + # used as a flag to indicate using prompt or flag_value. + self._flag_needs_value = self.prompt is not None and not self.prompt_required + + if is_flag is None: + if flag_value is not None: + # Implicitly a flag because flag_value was set. + is_flag = True + elif self._flag_needs_value: + # Not a flag, but when used as a flag it shows a prompt. + is_flag = False + else: + # Implicitly a flag because flag options were given. + is_flag = bool(self.secondary_opts) + elif is_flag is False and not self._flag_needs_value: + # Not a flag, and prompt is not enabled, can be used as a + # flag if flag_value is set. + self._flag_needs_value = flag_value is not None + + self.default: t.Union[t.Any, t.Callable[[], t.Any]] + + if is_flag and default_is_missing and not self.required: + if multiple: + self.default = () + else: + self.default = False + + if flag_value is None: + flag_value = not self.default + + self.type: types.ParamType + if is_flag and type is None: + # Re-guess the type from the flag value instead of the + # default. + self.type = types.convert_type(None, flag_value) + + self.is_flag: bool = is_flag + self.is_bool_flag: bool = is_flag and isinstance(self.type, types.BoolParamType) + self.flag_value: t.Any = flag_value + + # Counting + self.count = count + if count: + if type is None: + self.type = types.IntRange(min=0) + if default_is_missing: + self.default = 0 + + self.allow_from_autoenv = allow_from_autoenv + self.help = help + self.show_default = show_default + self.show_choices = show_choices + self.show_envvar = show_envvar + + if __debug__: + if self.nargs == -1: + raise TypeError("nargs=-1 is not supported for options.") + + if self.prompt and self.is_flag and not self.is_bool_flag: + raise TypeError("'prompt' is not valid for non-boolean flag.") + + if not self.is_bool_flag and self.secondary_opts: + raise TypeError("Secondary flag is not valid for non-boolean flag.") + + if self.is_bool_flag and self.hide_input and self.prompt is not None: + raise TypeError( + "'prompt' with 'hide_input' is not valid for boolean flag." + ) + + if self.count: + if self.multiple: + raise TypeError("'count' is not valid with 'multiple'.") + + if self.is_flag: + raise TypeError("'count' is not valid with 'is_flag'.") + + def to_info_dict(self) -> t.Dict[str, t.Any]: + info_dict = super().to_info_dict() + info_dict.update( + help=self.help, + prompt=self.prompt, + is_flag=self.is_flag, + flag_value=self.flag_value, + count=self.count, + hidden=self.hidden, + ) + return info_dict + + def _parse_decls( + self, decls: t.Sequence[str], expose_value: bool + ) -> t.Tuple[t.Optional[str], t.List[str], t.List[str]]: + opts = [] + secondary_opts = [] + name = None + possible_names = [] + + for decl in decls: + if decl.isidentifier(): + if name is not None: + raise TypeError(f"Name '{name}' defined twice") + name = decl + else: + split_char = ";" if decl[:1] == "/" else "/" + if split_char in decl: + first, second = decl.split(split_char, 1) + first = first.rstrip() + if first: + possible_names.append(split_opt(first)) + opts.append(first) + second = second.lstrip() + if second: + secondary_opts.append(second.lstrip()) + if first == second: + raise ValueError( + f"Boolean option {decl!r} cannot use the" + " same flag for true/false." + ) + else: + possible_names.append(split_opt(decl)) + opts.append(decl) + + if name is None and possible_names: + possible_names.sort(key=lambda x: -len(x[0])) # group long options first + name = possible_names[0][1].replace("-", "_").lower() + if not name.isidentifier(): + name = None + + if name is None: + if not expose_value: + return None, opts, secondary_opts + raise TypeError("Could not determine name for option") + + if not opts and not secondary_opts: + raise TypeError( + f"No options defined but a name was passed ({name})." + " Did you mean to declare an argument instead? Did" + f" you mean to pass '--{name}'?" + ) + + return name, opts, secondary_opts + + def add_to_parser(self, parser: OptionParser, ctx: Context) -> None: + if self.multiple: + action = "append" + elif self.count: + action = "count" + else: + action = "store" + + if self.is_flag: + action = f"{action}_const" + + if self.is_bool_flag and self.secondary_opts: + parser.add_option( + obj=self, opts=self.opts, dest=self.name, action=action, const=True + ) + parser.add_option( + obj=self, + opts=self.secondary_opts, + dest=self.name, + action=action, + const=False, + ) + else: + parser.add_option( + obj=self, + opts=self.opts, + dest=self.name, + action=action, + const=self.flag_value, + ) + else: + parser.add_option( + obj=self, + opts=self.opts, + dest=self.name, + action=action, + nargs=self.nargs, + ) + + def get_help_record(self, ctx: Context) -> t.Optional[t.Tuple[str, str]]: + if self.hidden: + return None + + any_prefix_is_slash = False + + def _write_opts(opts: t.Sequence[str]) -> str: + nonlocal any_prefix_is_slash + + rv, any_slashes = join_options(opts) + + if any_slashes: + any_prefix_is_slash = True + + if not self.is_flag and not self.count: + rv += f" {self.make_metavar()}" + + return rv + + rv = [_write_opts(self.opts)] + + if self.secondary_opts: + rv.append(_write_opts(self.secondary_opts)) + + help = self.help or "" + extra = [] + + if self.show_envvar: + envvar = self.envvar + + if envvar is None: + if ( + self.allow_from_autoenv + and ctx.auto_envvar_prefix is not None + and self.name is not None + ): + envvar = f"{ctx.auto_envvar_prefix}_{self.name.upper()}" + + if envvar is not None: + var_str = ( + envvar + if isinstance(envvar, str) + else ", ".join(str(d) for d in envvar) + ) + extra.append(_("env var: {var}").format(var=var_str)) + + # Temporarily enable resilient parsing to avoid type casting + # failing for the default. Might be possible to extend this to + # help formatting in general. + resilient = ctx.resilient_parsing + ctx.resilient_parsing = True + + try: + default_value = self.get_default(ctx, call=False) + finally: + ctx.resilient_parsing = resilient + + show_default = False + show_default_is_str = False + + if self.show_default is not None: + if isinstance(self.show_default, str): + show_default_is_str = show_default = True + else: + show_default = self.show_default + elif ctx.show_default is not None: + show_default = ctx.show_default + + if show_default_is_str or (show_default and (default_value is not None)): + if show_default_is_str: + default_string = f"({self.show_default})" + elif isinstance(default_value, (list, tuple)): + default_string = ", ".join(str(d) for d in default_value) + elif inspect.isfunction(default_value): + default_string = _("(dynamic)") + elif self.is_bool_flag and self.secondary_opts: + # For boolean flags that have distinct True/False opts, + # use the opt without prefix instead of the value. + default_string = split_opt( + (self.opts if self.default else self.secondary_opts)[0] + )[1] + elif self.is_bool_flag and not self.secondary_opts and not default_value: + default_string = "" + else: + default_string = str(default_value) + + if default_string: + extra.append(_("default: {default}").format(default=default_string)) + + if ( + isinstance(self.type, types._NumberRangeBase) + # skip count with default range type + and not (self.count and self.type.min == 0 and self.type.max is None) + ): + range_str = self.type._describe_range() + + if range_str: + extra.append(range_str) + + if self.required: + extra.append(_("required")) + + if extra: + extra_str = "; ".join(extra) + help = f"{help} [{extra_str}]" if help else f"[{extra_str}]" + + return ("; " if any_prefix_is_slash else " / ").join(rv), help + + @t.overload + def get_default( + self, ctx: Context, call: "te.Literal[True]" = True + ) -> t.Optional[t.Any]: + ... + + @t.overload + def get_default( + self, ctx: Context, call: bool = ... + ) -> t.Optional[t.Union[t.Any, t.Callable[[], t.Any]]]: + ... + + def get_default( + self, ctx: Context, call: bool = True + ) -> t.Optional[t.Union[t.Any, t.Callable[[], t.Any]]]: + # If we're a non boolean flag our default is more complex because + # we need to look at all flags in the same group to figure out + # if we're the default one in which case we return the flag + # value as default. + if self.is_flag and not self.is_bool_flag: + for param in ctx.command.params: + if param.name == self.name and param.default: + return t.cast(Option, param).flag_value + + return None + + return super().get_default(ctx, call=call) + + def prompt_for_value(self, ctx: Context) -> t.Any: + """This is an alternative flow that can be activated in the full + value processing if a value does not exist. It will prompt the + user until a valid value exists and then returns the processed + value as result. + """ + assert self.prompt is not None + + # Calculate the default before prompting anything to be stable. + default = self.get_default(ctx) + + # If this is a prompt for a flag we need to handle this + # differently. + if self.is_bool_flag: + return confirm(self.prompt, default) + + return prompt( + self.prompt, + default=default, + type=self.type, + hide_input=self.hide_input, + show_choices=self.show_choices, + confirmation_prompt=self.confirmation_prompt, + value_proc=lambda x: self.process_value(ctx, x), + ) + + def resolve_envvar_value(self, ctx: Context) -> t.Optional[str]: + rv = super().resolve_envvar_value(ctx) + + if rv is not None: + return rv + + if ( + self.allow_from_autoenv + and ctx.auto_envvar_prefix is not None + and self.name is not None + ): + envvar = f"{ctx.auto_envvar_prefix}_{self.name.upper()}" + rv = os.environ.get(envvar) + + if rv: + return rv + + return None + + def value_from_envvar(self, ctx: Context) -> t.Optional[t.Any]: + rv: t.Optional[t.Any] = self.resolve_envvar_value(ctx) + + if rv is None: + return None + + value_depth = (self.nargs != 1) + bool(self.multiple) + + if value_depth > 0: + rv = self.type.split_envvar_value(rv) + + if self.multiple and self.nargs != 1: + rv = batch(rv, self.nargs) + + return rv + + def consume_value( + self, ctx: Context, opts: t.Mapping[str, "Parameter"] + ) -> t.Tuple[t.Any, ParameterSource]: + value, source = super().consume_value(ctx, opts) + + # The parser will emit a sentinel value if the option can be + # given as a flag without a value. This is different from None + # to distinguish from the flag not being given at all. + if value is _flag_needs_value: + if self.prompt is not None and not ctx.resilient_parsing: + value = self.prompt_for_value(ctx) + source = ParameterSource.PROMPT + else: + value = self.flag_value + source = ParameterSource.COMMANDLINE + + elif ( + self.multiple + and value is not None + and any(v is _flag_needs_value for v in value) + ): + value = [self.flag_value if v is _flag_needs_value else v for v in value] + source = ParameterSource.COMMANDLINE + + # The value wasn't set, or used the param's default, prompt if + # prompting is enabled. + elif ( + source in {None, ParameterSource.DEFAULT} + and self.prompt is not None + and (self.required or self.prompt_required) + and not ctx.resilient_parsing + ): + value = self.prompt_for_value(ctx) + source = ParameterSource.PROMPT + + return value, source + + +class Argument(Parameter): + """Arguments are positional parameters to a command. They generally + provide fewer features than options but can have infinite ``nargs`` + and are required by default. + + All parameters are passed onwards to the constructor of :class:`Parameter`. + """ + + param_type_name = "argument" + + def __init__( + self, + param_decls: t.Sequence[str], + required: t.Optional[bool] = None, + **attrs: t.Any, + ) -> None: + if required is None: + if attrs.get("default") is not None: + required = False + else: + required = attrs.get("nargs", 1) > 0 + + if "multiple" in attrs: + raise TypeError("__init__() got an unexpected keyword argument 'multiple'.") + + super().__init__(param_decls, required=required, **attrs) + + if __debug__: + if self.default is not None and self.nargs == -1: + raise TypeError("'default' is not supported for nargs=-1.") + + @property + def human_readable_name(self) -> str: + if self.metavar is not None: + return self.metavar + return self.name.upper() # type: ignore + + def make_metavar(self) -> str: + if self.metavar is not None: + return self.metavar + var = self.type.get_metavar(self) + if not var: + var = self.name.upper() # type: ignore + if not self.required: + var = f"[{var}]" + if self.nargs != 1: + var += "..." + return var + + def _parse_decls( + self, decls: t.Sequence[str], expose_value: bool + ) -> t.Tuple[t.Optional[str], t.List[str], t.List[str]]: + if not decls: + if not expose_value: + return None, [], [] + raise TypeError("Could not determine name for argument") + if len(decls) == 1: + name = arg = decls[0] + name = name.replace("-", "_").lower() + else: + raise TypeError( + "Arguments take exactly one parameter declaration, got" + f" {len(decls)}." + ) + return name, [arg], [] + + def get_usage_pieces(self, ctx: Context) -> t.List[str]: + return [self.make_metavar()] + + def get_error_hint(self, ctx: Context) -> str: + return f"'{self.make_metavar()}'" + + def add_to_parser(self, parser: OptionParser, ctx: Context) -> None: + parser.add_argument(dest=self.name, nargs=self.nargs, obj=self) diff --git a/app/src/flask-server/venv/Lib/site-packages/click/decorators.py b/app/src/flask-server/venv/Lib/site-packages/click/decorators.py new file mode 100644 index 0000000..d9bba95 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/click/decorators.py @@ -0,0 +1,561 @@ +import inspect +import types +import typing as t +from functools import update_wrapper +from gettext import gettext as _ + +from .core import Argument +from .core import Command +from .core import Context +from .core import Group +from .core import Option +from .core import Parameter +from .globals import get_current_context +from .utils import echo + +if t.TYPE_CHECKING: + import typing_extensions as te + + P = te.ParamSpec("P") + +R = t.TypeVar("R") +T = t.TypeVar("T") +_AnyCallable = t.Callable[..., t.Any] +FC = t.TypeVar("FC", bound=t.Union[_AnyCallable, Command]) + + +def pass_context(f: "t.Callable[te.Concatenate[Context, P], R]") -> "t.Callable[P, R]": + """Marks a callback as wanting to receive the current context + object as first argument. + """ + + def new_func(*args: "P.args", **kwargs: "P.kwargs") -> "R": + return f(get_current_context(), *args, **kwargs) + + return update_wrapper(new_func, f) + + +def pass_obj(f: "t.Callable[te.Concatenate[t.Any, P], R]") -> "t.Callable[P, R]": + """Similar to :func:`pass_context`, but only pass the object on the + context onwards (:attr:`Context.obj`). This is useful if that object + represents the state of a nested system. + """ + + def new_func(*args: "P.args", **kwargs: "P.kwargs") -> "R": + return f(get_current_context().obj, *args, **kwargs) + + return update_wrapper(new_func, f) + + +def make_pass_decorator( + object_type: t.Type[T], ensure: bool = False +) -> t.Callable[["t.Callable[te.Concatenate[T, P], R]"], "t.Callable[P, R]"]: + """Given an object type this creates a decorator that will work + similar to :func:`pass_obj` but instead of passing the object of the + current context, it will find the innermost context of type + :func:`object_type`. + + This generates a decorator that works roughly like this:: + + from functools import update_wrapper + + def decorator(f): + @pass_context + def new_func(ctx, *args, **kwargs): + obj = ctx.find_object(object_type) + return ctx.invoke(f, obj, *args, **kwargs) + return update_wrapper(new_func, f) + return decorator + + :param object_type: the type of the object to pass. + :param ensure: if set to `True`, a new object will be created and + remembered on the context if it's not there yet. + """ + + def decorator(f: "t.Callable[te.Concatenate[T, P], R]") -> "t.Callable[P, R]": + def new_func(*args: "P.args", **kwargs: "P.kwargs") -> "R": + ctx = get_current_context() + + obj: t.Optional[T] + if ensure: + obj = ctx.ensure_object(object_type) + else: + obj = ctx.find_object(object_type) + + if obj is None: + raise RuntimeError( + "Managed to invoke callback without a context" + f" object of type {object_type.__name__!r}" + " existing." + ) + + return ctx.invoke(f, obj, *args, **kwargs) + + return update_wrapper(new_func, f) + + return decorator # type: ignore[return-value] + + +def pass_meta_key( + key: str, *, doc_description: t.Optional[str] = None +) -> "t.Callable[[t.Callable[te.Concatenate[t.Any, P], R]], t.Callable[P, R]]": + """Create a decorator that passes a key from + :attr:`click.Context.meta` as the first argument to the decorated + function. + + :param key: Key in ``Context.meta`` to pass. + :param doc_description: Description of the object being passed, + inserted into the decorator's docstring. Defaults to "the 'key' + key from Context.meta". + + .. versionadded:: 8.0 + """ + + def decorator(f: "t.Callable[te.Concatenate[t.Any, P], R]") -> "t.Callable[P, R]": + def new_func(*args: "P.args", **kwargs: "P.kwargs") -> R: + ctx = get_current_context() + obj = ctx.meta[key] + return ctx.invoke(f, obj, *args, **kwargs) + + return update_wrapper(new_func, f) + + if doc_description is None: + doc_description = f"the {key!r} key from :attr:`click.Context.meta`" + + decorator.__doc__ = ( + f"Decorator that passes {doc_description} as the first argument" + " to the decorated function." + ) + return decorator # type: ignore[return-value] + + +CmdType = t.TypeVar("CmdType", bound=Command) + + +# variant: no call, directly as decorator for a function. +@t.overload +def command(name: _AnyCallable) -> Command: + ... + + +# variant: with positional name and with positional or keyword cls argument: +# @command(namearg, CommandCls, ...) or @command(namearg, cls=CommandCls, ...) +@t.overload +def command( + name: t.Optional[str], + cls: t.Type[CmdType], + **attrs: t.Any, +) -> t.Callable[[_AnyCallable], CmdType]: + ... + + +# variant: name omitted, cls _must_ be a keyword argument, @command(cls=CommandCls, ...) +@t.overload +def command( + name: None = None, + *, + cls: t.Type[CmdType], + **attrs: t.Any, +) -> t.Callable[[_AnyCallable], CmdType]: + ... + + +# variant: with optional string name, no cls argument provided. +@t.overload +def command( + name: t.Optional[str] = ..., cls: None = None, **attrs: t.Any +) -> t.Callable[[_AnyCallable], Command]: + ... + + +def command( + name: t.Union[t.Optional[str], _AnyCallable] = None, + cls: t.Optional[t.Type[CmdType]] = None, + **attrs: t.Any, +) -> t.Union[Command, t.Callable[[_AnyCallable], t.Union[Command, CmdType]]]: + r"""Creates a new :class:`Command` and uses the decorated function as + callback. This will also automatically attach all decorated + :func:`option`\s and :func:`argument`\s as parameters to the command. + + The name of the command defaults to the name of the function with + underscores replaced by dashes. If you want to change that, you can + pass the intended name as the first argument. + + All keyword arguments are forwarded to the underlying command class. + For the ``params`` argument, any decorated params are appended to + the end of the list. + + Once decorated the function turns into a :class:`Command` instance + that can be invoked as a command line utility or be attached to a + command :class:`Group`. + + :param name: the name of the command. This defaults to the function + name with underscores replaced by dashes. + :param cls: the command class to instantiate. This defaults to + :class:`Command`. + + .. versionchanged:: 8.1 + This decorator can be applied without parentheses. + + .. versionchanged:: 8.1 + The ``params`` argument can be used. Decorated params are + appended to the end of the list. + """ + + func: t.Optional[t.Callable[[_AnyCallable], t.Any]] = None + + if callable(name): + func = name + name = None + assert cls is None, "Use 'command(cls=cls)(callable)' to specify a class." + assert not attrs, "Use 'command(**kwargs)(callable)' to provide arguments." + + if cls is None: + cls = t.cast(t.Type[CmdType], Command) + + def decorator(f: _AnyCallable) -> CmdType: + if isinstance(f, Command): + raise TypeError("Attempted to convert a callback into a command twice.") + + attr_params = attrs.pop("params", None) + params = attr_params if attr_params is not None else [] + + try: + decorator_params = f.__click_params__ # type: ignore + except AttributeError: + pass + else: + del f.__click_params__ # type: ignore + params.extend(reversed(decorator_params)) + + if attrs.get("help") is None: + attrs["help"] = f.__doc__ + + if t.TYPE_CHECKING: + assert cls is not None + assert not callable(name) + + cmd = cls( + name=name or f.__name__.lower().replace("_", "-"), + callback=f, + params=params, + **attrs, + ) + cmd.__doc__ = f.__doc__ + return cmd + + if func is not None: + return decorator(func) + + return decorator + + +GrpType = t.TypeVar("GrpType", bound=Group) + + +# variant: no call, directly as decorator for a function. +@t.overload +def group(name: _AnyCallable) -> Group: + ... + + +# variant: with positional name and with positional or keyword cls argument: +# @group(namearg, GroupCls, ...) or @group(namearg, cls=GroupCls, ...) +@t.overload +def group( + name: t.Optional[str], + cls: t.Type[GrpType], + **attrs: t.Any, +) -> t.Callable[[_AnyCallable], GrpType]: + ... + + +# variant: name omitted, cls _must_ be a keyword argument, @group(cmd=GroupCls, ...) +@t.overload +def group( + name: None = None, + *, + cls: t.Type[GrpType], + **attrs: t.Any, +) -> t.Callable[[_AnyCallable], GrpType]: + ... + + +# variant: with optional string name, no cls argument provided. +@t.overload +def group( + name: t.Optional[str] = ..., cls: None = None, **attrs: t.Any +) -> t.Callable[[_AnyCallable], Group]: + ... + + +def group( + name: t.Union[str, _AnyCallable, None] = None, + cls: t.Optional[t.Type[GrpType]] = None, + **attrs: t.Any, +) -> t.Union[Group, t.Callable[[_AnyCallable], t.Union[Group, GrpType]]]: + """Creates a new :class:`Group` with a function as callback. This + works otherwise the same as :func:`command` just that the `cls` + parameter is set to :class:`Group`. + + .. versionchanged:: 8.1 + This decorator can be applied without parentheses. + """ + if cls is None: + cls = t.cast(t.Type[GrpType], Group) + + if callable(name): + return command(cls=cls, **attrs)(name) + + return command(name, cls, **attrs) + + +def _param_memo(f: t.Callable[..., t.Any], param: Parameter) -> None: + if isinstance(f, Command): + f.params.append(param) + else: + if not hasattr(f, "__click_params__"): + f.__click_params__ = [] # type: ignore + + f.__click_params__.append(param) # type: ignore + + +def argument( + *param_decls: str, cls: t.Optional[t.Type[Argument]] = None, **attrs: t.Any +) -> t.Callable[[FC], FC]: + """Attaches an argument to the command. All positional arguments are + passed as parameter declarations to :class:`Argument`; all keyword + arguments are forwarded unchanged (except ``cls``). + This is equivalent to creating an :class:`Argument` instance manually + and attaching it to the :attr:`Command.params` list. + + For the default argument class, refer to :class:`Argument` and + :class:`Parameter` for descriptions of parameters. + + :param cls: the argument class to instantiate. This defaults to + :class:`Argument`. + :param param_decls: Passed as positional arguments to the constructor of + ``cls``. + :param attrs: Passed as keyword arguments to the constructor of ``cls``. + """ + if cls is None: + cls = Argument + + def decorator(f: FC) -> FC: + _param_memo(f, cls(param_decls, **attrs)) + return f + + return decorator + + +def option( + *param_decls: str, cls: t.Optional[t.Type[Option]] = None, **attrs: t.Any +) -> t.Callable[[FC], FC]: + """Attaches an option to the command. All positional arguments are + passed as parameter declarations to :class:`Option`; all keyword + arguments are forwarded unchanged (except ``cls``). + This is equivalent to creating an :class:`Option` instance manually + and attaching it to the :attr:`Command.params` list. + + For the default option class, refer to :class:`Option` and + :class:`Parameter` for descriptions of parameters. + + :param cls: the option class to instantiate. This defaults to + :class:`Option`. + :param param_decls: Passed as positional arguments to the constructor of + ``cls``. + :param attrs: Passed as keyword arguments to the constructor of ``cls``. + """ + if cls is None: + cls = Option + + def decorator(f: FC) -> FC: + _param_memo(f, cls(param_decls, **attrs)) + return f + + return decorator + + +def confirmation_option(*param_decls: str, **kwargs: t.Any) -> t.Callable[[FC], FC]: + """Add a ``--yes`` option which shows a prompt before continuing if + not passed. If the prompt is declined, the program will exit. + + :param param_decls: One or more option names. Defaults to the single + value ``"--yes"``. + :param kwargs: Extra arguments are passed to :func:`option`. + """ + + def callback(ctx: Context, param: Parameter, value: bool) -> None: + if not value: + ctx.abort() + + if not param_decls: + param_decls = ("--yes",) + + kwargs.setdefault("is_flag", True) + kwargs.setdefault("callback", callback) + kwargs.setdefault("expose_value", False) + kwargs.setdefault("prompt", "Do you want to continue?") + kwargs.setdefault("help", "Confirm the action without prompting.") + return option(*param_decls, **kwargs) + + +def password_option(*param_decls: str, **kwargs: t.Any) -> t.Callable[[FC], FC]: + """Add a ``--password`` option which prompts for a password, hiding + input and asking to enter the value again for confirmation. + + :param param_decls: One or more option names. Defaults to the single + value ``"--password"``. + :param kwargs: Extra arguments are passed to :func:`option`. + """ + if not param_decls: + param_decls = ("--password",) + + kwargs.setdefault("prompt", True) + kwargs.setdefault("confirmation_prompt", True) + kwargs.setdefault("hide_input", True) + return option(*param_decls, **kwargs) + + +def version_option( + version: t.Optional[str] = None, + *param_decls: str, + package_name: t.Optional[str] = None, + prog_name: t.Optional[str] = None, + message: t.Optional[str] = None, + **kwargs: t.Any, +) -> t.Callable[[FC], FC]: + """Add a ``--version`` option which immediately prints the version + number and exits the program. + + If ``version`` is not provided, Click will try to detect it using + :func:`importlib.metadata.version` to get the version for the + ``package_name``. On Python < 3.8, the ``importlib_metadata`` + backport must be installed. + + If ``package_name`` is not provided, Click will try to detect it by + inspecting the stack frames. This will be used to detect the + version, so it must match the name of the installed package. + + :param version: The version number to show. If not provided, Click + will try to detect it. + :param param_decls: One or more option names. Defaults to the single + value ``"--version"``. + :param package_name: The package name to detect the version from. If + not provided, Click will try to detect it. + :param prog_name: The name of the CLI to show in the message. If not + provided, it will be detected from the command. + :param message: The message to show. The values ``%(prog)s``, + ``%(package)s``, and ``%(version)s`` are available. Defaults to + ``"%(prog)s, version %(version)s"``. + :param kwargs: Extra arguments are passed to :func:`option`. + :raise RuntimeError: ``version`` could not be detected. + + .. versionchanged:: 8.0 + Add the ``package_name`` parameter, and the ``%(package)s`` + value for messages. + + .. versionchanged:: 8.0 + Use :mod:`importlib.metadata` instead of ``pkg_resources``. The + version is detected based on the package name, not the entry + point name. The Python package name must match the installed + package name, or be passed with ``package_name=``. + """ + if message is None: + message = _("%(prog)s, version %(version)s") + + if version is None and package_name is None: + frame = inspect.currentframe() + f_back = frame.f_back if frame is not None else None + f_globals = f_back.f_globals if f_back is not None else None + # break reference cycle + # https://docs.python.org/3/library/inspect.html#the-interpreter-stack + del frame + + if f_globals is not None: + package_name = f_globals.get("__name__") + + if package_name == "__main__": + package_name = f_globals.get("__package__") + + if package_name: + package_name = package_name.partition(".")[0] + + def callback(ctx: Context, param: Parameter, value: bool) -> None: + if not value or ctx.resilient_parsing: + return + + nonlocal prog_name + nonlocal version + + if prog_name is None: + prog_name = ctx.find_root().info_name + + if version is None and package_name is not None: + metadata: t.Optional[types.ModuleType] + + try: + from importlib import metadata # type: ignore + except ImportError: + # Python < 3.8 + import importlib_metadata as metadata # type: ignore + + try: + version = metadata.version(package_name) # type: ignore + except metadata.PackageNotFoundError: # type: ignore + raise RuntimeError( + f"{package_name!r} is not installed. Try passing" + " 'package_name' instead." + ) from None + + if version is None: + raise RuntimeError( + f"Could not determine the version for {package_name!r} automatically." + ) + + echo( + message % {"prog": prog_name, "package": package_name, "version": version}, + color=ctx.color, + ) + ctx.exit() + + if not param_decls: + param_decls = ("--version",) + + kwargs.setdefault("is_flag", True) + kwargs.setdefault("expose_value", False) + kwargs.setdefault("is_eager", True) + kwargs.setdefault("help", _("Show the version and exit.")) + kwargs["callback"] = callback + return option(*param_decls, **kwargs) + + +def help_option(*param_decls: str, **kwargs: t.Any) -> t.Callable[[FC], FC]: + """Add a ``--help`` option which immediately prints the help page + and exits the program. + + This is usually unnecessary, as the ``--help`` option is added to + each command automatically unless ``add_help_option=False`` is + passed. + + :param param_decls: One or more option names. Defaults to the single + value ``"--help"``. + :param kwargs: Extra arguments are passed to :func:`option`. + """ + + def callback(ctx: Context, param: Parameter, value: bool) -> None: + if not value or ctx.resilient_parsing: + return + + echo(ctx.get_help(), color=ctx.color) + ctx.exit() + + if not param_decls: + param_decls = ("--help",) + + kwargs.setdefault("is_flag", True) + kwargs.setdefault("expose_value", False) + kwargs.setdefault("is_eager", True) + kwargs.setdefault("help", _("Show this message and exit.")) + kwargs["callback"] = callback + return option(*param_decls, **kwargs) diff --git a/app/src/flask-server/venv/Lib/site-packages/click/exceptions.py b/app/src/flask-server/venv/Lib/site-packages/click/exceptions.py new file mode 100644 index 0000000..fe68a36 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/click/exceptions.py @@ -0,0 +1,288 @@ +import typing as t +from gettext import gettext as _ +from gettext import ngettext + +from ._compat import get_text_stderr +from .utils import echo +from .utils import format_filename + +if t.TYPE_CHECKING: + from .core import Command + from .core import Context + from .core import Parameter + + +def _join_param_hints( + param_hint: t.Optional[t.Union[t.Sequence[str], str]] +) -> t.Optional[str]: + if param_hint is not None and not isinstance(param_hint, str): + return " / ".join(repr(x) for x in param_hint) + + return param_hint + + +class ClickException(Exception): + """An exception that Click can handle and show to the user.""" + + #: The exit code for this exception. + exit_code = 1 + + def __init__(self, message: str) -> None: + super().__init__(message) + self.message = message + + def format_message(self) -> str: + return self.message + + def __str__(self) -> str: + return self.message + + def show(self, file: t.Optional[t.IO[t.Any]] = None) -> None: + if file is None: + file = get_text_stderr() + + echo(_("Error: {message}").format(message=self.format_message()), file=file) + + +class UsageError(ClickException): + """An internal exception that signals a usage error. This typically + aborts any further handling. + + :param message: the error message to display. + :param ctx: optionally the context that caused this error. Click will + fill in the context automatically in some situations. + """ + + exit_code = 2 + + def __init__(self, message: str, ctx: t.Optional["Context"] = None) -> None: + super().__init__(message) + self.ctx = ctx + self.cmd: t.Optional["Command"] = self.ctx.command if self.ctx else None + + def show(self, file: t.Optional[t.IO[t.Any]] = None) -> None: + if file is None: + file = get_text_stderr() + color = None + hint = "" + if ( + self.ctx is not None + and self.ctx.command.get_help_option(self.ctx) is not None + ): + hint = _("Try '{command} {option}' for help.").format( + command=self.ctx.command_path, option=self.ctx.help_option_names[0] + ) + hint = f"{hint}\n" + if self.ctx is not None: + color = self.ctx.color + echo(f"{self.ctx.get_usage()}\n{hint}", file=file, color=color) + echo( + _("Error: {message}").format(message=self.format_message()), + file=file, + color=color, + ) + + +class BadParameter(UsageError): + """An exception that formats out a standardized error message for a + bad parameter. This is useful when thrown from a callback or type as + Click will attach contextual information to it (for instance, which + parameter it is). + + .. versionadded:: 2.0 + + :param param: the parameter object that caused this error. This can + be left out, and Click will attach this info itself + if possible. + :param param_hint: a string that shows up as parameter name. This + can be used as alternative to `param` in cases + where custom validation should happen. If it is + a string it's used as such, if it's a list then + each item is quoted and separated. + """ + + def __init__( + self, + message: str, + ctx: t.Optional["Context"] = None, + param: t.Optional["Parameter"] = None, + param_hint: t.Optional[str] = None, + ) -> None: + super().__init__(message, ctx) + self.param = param + self.param_hint = param_hint + + def format_message(self) -> str: + if self.param_hint is not None: + param_hint = self.param_hint + elif self.param is not None: + param_hint = self.param.get_error_hint(self.ctx) # type: ignore + else: + return _("Invalid value: {message}").format(message=self.message) + + return _("Invalid value for {param_hint}: {message}").format( + param_hint=_join_param_hints(param_hint), message=self.message + ) + + +class MissingParameter(BadParameter): + """Raised if click required an option or argument but it was not + provided when invoking the script. + + .. versionadded:: 4.0 + + :param param_type: a string that indicates the type of the parameter. + The default is to inherit the parameter type from + the given `param`. Valid values are ``'parameter'``, + ``'option'`` or ``'argument'``. + """ + + def __init__( + self, + message: t.Optional[str] = None, + ctx: t.Optional["Context"] = None, + param: t.Optional["Parameter"] = None, + param_hint: t.Optional[str] = None, + param_type: t.Optional[str] = None, + ) -> None: + super().__init__(message or "", ctx, param, param_hint) + self.param_type = param_type + + def format_message(self) -> str: + if self.param_hint is not None: + param_hint: t.Optional[str] = self.param_hint + elif self.param is not None: + param_hint = self.param.get_error_hint(self.ctx) # type: ignore + else: + param_hint = None + + param_hint = _join_param_hints(param_hint) + param_hint = f" {param_hint}" if param_hint else "" + + param_type = self.param_type + if param_type is None and self.param is not None: + param_type = self.param.param_type_name + + msg = self.message + if self.param is not None: + msg_extra = self.param.type.get_missing_message(self.param) + if msg_extra: + if msg: + msg += f". {msg_extra}" + else: + msg = msg_extra + + msg = f" {msg}" if msg else "" + + # Translate param_type for known types. + if param_type == "argument": + missing = _("Missing argument") + elif param_type == "option": + missing = _("Missing option") + elif param_type == "parameter": + missing = _("Missing parameter") + else: + missing = _("Missing {param_type}").format(param_type=param_type) + + return f"{missing}{param_hint}.{msg}" + + def __str__(self) -> str: + if not self.message: + param_name = self.param.name if self.param else None + return _("Missing parameter: {param_name}").format(param_name=param_name) + else: + return self.message + + +class NoSuchOption(UsageError): + """Raised if click attempted to handle an option that does not + exist. + + .. versionadded:: 4.0 + """ + + def __init__( + self, + option_name: str, + message: t.Optional[str] = None, + possibilities: t.Optional[t.Sequence[str]] = None, + ctx: t.Optional["Context"] = None, + ) -> None: + if message is None: + message = _("No such option: {name}").format(name=option_name) + + super().__init__(message, ctx) + self.option_name = option_name + self.possibilities = possibilities + + def format_message(self) -> str: + if not self.possibilities: + return self.message + + possibility_str = ", ".join(sorted(self.possibilities)) + suggest = ngettext( + "Did you mean {possibility}?", + "(Possible options: {possibilities})", + len(self.possibilities), + ).format(possibility=possibility_str, possibilities=possibility_str) + return f"{self.message} {suggest}" + + +class BadOptionUsage(UsageError): + """Raised if an option is generally supplied but the use of the option + was incorrect. This is for instance raised if the number of arguments + for an option is not correct. + + .. versionadded:: 4.0 + + :param option_name: the name of the option being used incorrectly. + """ + + def __init__( + self, option_name: str, message: str, ctx: t.Optional["Context"] = None + ) -> None: + super().__init__(message, ctx) + self.option_name = option_name + + +class BadArgumentUsage(UsageError): + """Raised if an argument is generally supplied but the use of the argument + was incorrect. This is for instance raised if the number of values + for an argument is not correct. + + .. versionadded:: 6.0 + """ + + +class FileError(ClickException): + """Raised if a file cannot be opened.""" + + def __init__(self, filename: str, hint: t.Optional[str] = None) -> None: + if hint is None: + hint = _("unknown error") + + super().__init__(hint) + self.ui_filename: str = format_filename(filename) + self.filename = filename + + def format_message(self) -> str: + return _("Could not open file {filename!r}: {message}").format( + filename=self.ui_filename, message=self.message + ) + + +class Abort(RuntimeError): + """An internal signalling exception that signals Click to abort.""" + + +class Exit(RuntimeError): + """An exception that indicates that the application should exit with some + status code. + + :param code: the status code to exit with. + """ + + __slots__ = ("exit_code",) + + def __init__(self, code: int = 0) -> None: + self.exit_code: int = code diff --git a/app/src/flask-server/venv/Lib/site-packages/click/formatting.py b/app/src/flask-server/venv/Lib/site-packages/click/formatting.py new file mode 100644 index 0000000..ddd2a2f --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/click/formatting.py @@ -0,0 +1,301 @@ +import typing as t +from contextlib import contextmanager +from gettext import gettext as _ + +from ._compat import term_len +from .parser import split_opt + +# Can force a width. This is used by the test system +FORCED_WIDTH: t.Optional[int] = None + + +def measure_table(rows: t.Iterable[t.Tuple[str, str]]) -> t.Tuple[int, ...]: + widths: t.Dict[int, int] = {} + + for row in rows: + for idx, col in enumerate(row): + widths[idx] = max(widths.get(idx, 0), term_len(col)) + + return tuple(y for x, y in sorted(widths.items())) + + +def iter_rows( + rows: t.Iterable[t.Tuple[str, str]], col_count: int +) -> t.Iterator[t.Tuple[str, ...]]: + for row in rows: + yield row + ("",) * (col_count - len(row)) + + +def wrap_text( + text: str, + width: int = 78, + initial_indent: str = "", + subsequent_indent: str = "", + preserve_paragraphs: bool = False, +) -> str: + """A helper function that intelligently wraps text. By default, it + assumes that it operates on a single paragraph of text but if the + `preserve_paragraphs` parameter is provided it will intelligently + handle paragraphs (defined by two empty lines). + + If paragraphs are handled, a paragraph can be prefixed with an empty + line containing the ``\\b`` character (``\\x08``) to indicate that + no rewrapping should happen in that block. + + :param text: the text that should be rewrapped. + :param width: the maximum width for the text. + :param initial_indent: the initial indent that should be placed on the + first line as a string. + :param subsequent_indent: the indent string that should be placed on + each consecutive line. + :param preserve_paragraphs: if this flag is set then the wrapping will + intelligently handle paragraphs. + """ + from ._textwrap import TextWrapper + + text = text.expandtabs() + wrapper = TextWrapper( + width, + initial_indent=initial_indent, + subsequent_indent=subsequent_indent, + replace_whitespace=False, + ) + if not preserve_paragraphs: + return wrapper.fill(text) + + p: t.List[t.Tuple[int, bool, str]] = [] + buf: t.List[str] = [] + indent = None + + def _flush_par() -> None: + if not buf: + return + if buf[0].strip() == "\b": + p.append((indent or 0, True, "\n".join(buf[1:]))) + else: + p.append((indent or 0, False, " ".join(buf))) + del buf[:] + + for line in text.splitlines(): + if not line: + _flush_par() + indent = None + else: + if indent is None: + orig_len = term_len(line) + line = line.lstrip() + indent = orig_len - term_len(line) + buf.append(line) + _flush_par() + + rv = [] + for indent, raw, text in p: + with wrapper.extra_indent(" " * indent): + if raw: + rv.append(wrapper.indent_only(text)) + else: + rv.append(wrapper.fill(text)) + + return "\n\n".join(rv) + + +class HelpFormatter: + """This class helps with formatting text-based help pages. It's + usually just needed for very special internal cases, but it's also + exposed so that developers can write their own fancy outputs. + + At present, it always writes into memory. + + :param indent_increment: the additional increment for each level. + :param width: the width for the text. This defaults to the terminal + width clamped to a maximum of 78. + """ + + def __init__( + self, + indent_increment: int = 2, + width: t.Optional[int] = None, + max_width: t.Optional[int] = None, + ) -> None: + import shutil + + self.indent_increment = indent_increment + if max_width is None: + max_width = 80 + if width is None: + width = FORCED_WIDTH + if width is None: + width = max(min(shutil.get_terminal_size().columns, max_width) - 2, 50) + self.width = width + self.current_indent = 0 + self.buffer: t.List[str] = [] + + def write(self, string: str) -> None: + """Writes a unicode string into the internal buffer.""" + self.buffer.append(string) + + def indent(self) -> None: + """Increases the indentation.""" + self.current_indent += self.indent_increment + + def dedent(self) -> None: + """Decreases the indentation.""" + self.current_indent -= self.indent_increment + + def write_usage( + self, prog: str, args: str = "", prefix: t.Optional[str] = None + ) -> None: + """Writes a usage line into the buffer. + + :param prog: the program name. + :param args: whitespace separated list of arguments. + :param prefix: The prefix for the first line. Defaults to + ``"Usage: "``. + """ + if prefix is None: + prefix = f"{_('Usage:')} " + + usage_prefix = f"{prefix:>{self.current_indent}}{prog} " + text_width = self.width - self.current_indent + + if text_width >= (term_len(usage_prefix) + 20): + # The arguments will fit to the right of the prefix. + indent = " " * term_len(usage_prefix) + self.write( + wrap_text( + args, + text_width, + initial_indent=usage_prefix, + subsequent_indent=indent, + ) + ) + else: + # The prefix is too long, put the arguments on the next line. + self.write(usage_prefix) + self.write("\n") + indent = " " * (max(self.current_indent, term_len(prefix)) + 4) + self.write( + wrap_text( + args, text_width, initial_indent=indent, subsequent_indent=indent + ) + ) + + self.write("\n") + + def write_heading(self, heading: str) -> None: + """Writes a heading into the buffer.""" + self.write(f"{'':>{self.current_indent}}{heading}:\n") + + def write_paragraph(self) -> None: + """Writes a paragraph into the buffer.""" + if self.buffer: + self.write("\n") + + def write_text(self, text: str) -> None: + """Writes re-indented text into the buffer. This rewraps and + preserves paragraphs. + """ + indent = " " * self.current_indent + self.write( + wrap_text( + text, + self.width, + initial_indent=indent, + subsequent_indent=indent, + preserve_paragraphs=True, + ) + ) + self.write("\n") + + def write_dl( + self, + rows: t.Sequence[t.Tuple[str, str]], + col_max: int = 30, + col_spacing: int = 2, + ) -> None: + """Writes a definition list into the buffer. This is how options + and commands are usually formatted. + + :param rows: a list of two item tuples for the terms and values. + :param col_max: the maximum width of the first column. + :param col_spacing: the number of spaces between the first and + second column. + """ + rows = list(rows) + widths = measure_table(rows) + if len(widths) != 2: + raise TypeError("Expected two columns for definition list") + + first_col = min(widths[0], col_max) + col_spacing + + for first, second in iter_rows(rows, len(widths)): + self.write(f"{'':>{self.current_indent}}{first}") + if not second: + self.write("\n") + continue + if term_len(first) <= first_col - col_spacing: + self.write(" " * (first_col - term_len(first))) + else: + self.write("\n") + self.write(" " * (first_col + self.current_indent)) + + text_width = max(self.width - first_col - 2, 10) + wrapped_text = wrap_text(second, text_width, preserve_paragraphs=True) + lines = wrapped_text.splitlines() + + if lines: + self.write(f"{lines[0]}\n") + + for line in lines[1:]: + self.write(f"{'':>{first_col + self.current_indent}}{line}\n") + else: + self.write("\n") + + @contextmanager + def section(self, name: str) -> t.Iterator[None]: + """Helpful context manager that writes a paragraph, a heading, + and the indents. + + :param name: the section name that is written as heading. + """ + self.write_paragraph() + self.write_heading(name) + self.indent() + try: + yield + finally: + self.dedent() + + @contextmanager + def indentation(self) -> t.Iterator[None]: + """A context manager that increases the indentation.""" + self.indent() + try: + yield + finally: + self.dedent() + + def getvalue(self) -> str: + """Returns the buffer contents.""" + return "".join(self.buffer) + + +def join_options(options: t.Sequence[str]) -> t.Tuple[str, bool]: + """Given a list of option strings this joins them in the most appropriate + way and returns them in the form ``(formatted_string, + any_prefix_is_slash)`` where the second item in the tuple is a flag that + indicates if any of the option prefixes was a slash. + """ + rv = [] + any_prefix_is_slash = False + + for opt in options: + prefix = split_opt(opt)[0] + + if prefix == "/": + any_prefix_is_slash = True + + rv.append((len(prefix), opt)) + + rv.sort(key=lambda x: x[0]) + return ", ".join(x[1] for x in rv), any_prefix_is_slash diff --git a/app/src/flask-server/venv/Lib/site-packages/click/globals.py b/app/src/flask-server/venv/Lib/site-packages/click/globals.py new file mode 100644 index 0000000..480058f --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/click/globals.py @@ -0,0 +1,68 @@ +import typing as t +from threading import local + +if t.TYPE_CHECKING: + import typing_extensions as te + from .core import Context + +_local = local() + + +@t.overload +def get_current_context(silent: "te.Literal[False]" = False) -> "Context": + ... + + +@t.overload +def get_current_context(silent: bool = ...) -> t.Optional["Context"]: + ... + + +def get_current_context(silent: bool = False) -> t.Optional["Context"]: + """Returns the current click context. This can be used as a way to + access the current context object from anywhere. This is a more implicit + alternative to the :func:`pass_context` decorator. This function is + primarily useful for helpers such as :func:`echo` which might be + interested in changing its behavior based on the current context. + + To push the current context, :meth:`Context.scope` can be used. + + .. versionadded:: 5.0 + + :param silent: if set to `True` the return value is `None` if no context + is available. The default behavior is to raise a + :exc:`RuntimeError`. + """ + try: + return t.cast("Context", _local.stack[-1]) + except (AttributeError, IndexError) as e: + if not silent: + raise RuntimeError("There is no active click context.") from e + + return None + + +def push_context(ctx: "Context") -> None: + """Pushes a new context to the current stack.""" + _local.__dict__.setdefault("stack", []).append(ctx) + + +def pop_context() -> None: + """Removes the top level from the stack.""" + _local.stack.pop() + + +def resolve_color_default(color: t.Optional[bool] = None) -> t.Optional[bool]: + """Internal helper to get the default value of the color flag. If a + value is passed it's returned unchanged, otherwise it's looked up from + the current context. + """ + if color is not None: + return color + + ctx = get_current_context(silent=True) + + if ctx is not None: + return ctx.color + + return None diff --git a/app/src/flask-server/venv/Lib/site-packages/click/parser.py b/app/src/flask-server/venv/Lib/site-packages/click/parser.py new file mode 100644 index 0000000..5fa7adf --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/click/parser.py @@ -0,0 +1,529 @@ +""" +This module started out as largely a copy paste from the stdlib's +optparse module with the features removed that we do not need from +optparse because we implement them in Click on a higher level (for +instance type handling, help formatting and a lot more). + +The plan is to remove more and more from here over time. + +The reason this is a different module and not optparse from the stdlib +is that there are differences in 2.x and 3.x about the error messages +generated and optparse in the stdlib uses gettext for no good reason +and might cause us issues. + +Click uses parts of optparse written by Gregory P. Ward and maintained +by the Python Software Foundation. This is limited to code in parser.py. + +Copyright 2001-2006 Gregory P. Ward. All rights reserved. +Copyright 2002-2006 Python Software Foundation. All rights reserved. +""" +# This code uses parts of optparse written by Gregory P. Ward and +# maintained by the Python Software Foundation. +# Copyright 2001-2006 Gregory P. Ward +# Copyright 2002-2006 Python Software Foundation +import typing as t +from collections import deque +from gettext import gettext as _ +from gettext import ngettext + +from .exceptions import BadArgumentUsage +from .exceptions import BadOptionUsage +from .exceptions import NoSuchOption +from .exceptions import UsageError + +if t.TYPE_CHECKING: + import typing_extensions as te + from .core import Argument as CoreArgument + from .core import Context + from .core import Option as CoreOption + from .core import Parameter as CoreParameter + +V = t.TypeVar("V") + +# Sentinel value that indicates an option was passed as a flag without a +# value but is not a flag option. Option.consume_value uses this to +# prompt or use the flag_value. +_flag_needs_value = object() + + +def _unpack_args( + args: t.Sequence[str], nargs_spec: t.Sequence[int] +) -> t.Tuple[t.Sequence[t.Union[str, t.Sequence[t.Optional[str]], None]], t.List[str]]: + """Given an iterable of arguments and an iterable of nargs specifications, + it returns a tuple with all the unpacked arguments at the first index + and all remaining arguments as the second. + + The nargs specification is the number of arguments that should be consumed + or `-1` to indicate that this position should eat up all the remainders. + + Missing items are filled with `None`. + """ + args = deque(args) + nargs_spec = deque(nargs_spec) + rv: t.List[t.Union[str, t.Tuple[t.Optional[str], ...], None]] = [] + spos: t.Optional[int] = None + + def _fetch(c: "te.Deque[V]") -> t.Optional[V]: + try: + if spos is None: + return c.popleft() + else: + return c.pop() + except IndexError: + return None + + while nargs_spec: + nargs = _fetch(nargs_spec) + + if nargs is None: + continue + + if nargs == 1: + rv.append(_fetch(args)) + elif nargs > 1: + x = [_fetch(args) for _ in range(nargs)] + + # If we're reversed, we're pulling in the arguments in reverse, + # so we need to turn them around. + if spos is not None: + x.reverse() + + rv.append(tuple(x)) + elif nargs < 0: + if spos is not None: + raise TypeError("Cannot have two nargs < 0") + + spos = len(rv) + rv.append(None) + + # spos is the position of the wildcard (star). If it's not `None`, + # we fill it with the remainder. + if spos is not None: + rv[spos] = tuple(args) + args = [] + rv[spos + 1 :] = reversed(rv[spos + 1 :]) + + return tuple(rv), list(args) + + +def split_opt(opt: str) -> t.Tuple[str, str]: + first = opt[:1] + if first.isalnum(): + return "", opt + if opt[1:2] == first: + return opt[:2], opt[2:] + return first, opt[1:] + + +def normalize_opt(opt: str, ctx: t.Optional["Context"]) -> str: + if ctx is None or ctx.token_normalize_func is None: + return opt + prefix, opt = split_opt(opt) + return f"{prefix}{ctx.token_normalize_func(opt)}" + + +def split_arg_string(string: str) -> t.List[str]: + """Split an argument string as with :func:`shlex.split`, but don't + fail if the string is incomplete. Ignores a missing closing quote or + incomplete escape sequence and uses the partial token as-is. + + .. code-block:: python + + split_arg_string("example 'my file") + ["example", "my file"] + + split_arg_string("example my\\") + ["example", "my"] + + :param string: String to split. + """ + import shlex + + lex = shlex.shlex(string, posix=True) + lex.whitespace_split = True + lex.commenters = "" + out = [] + + try: + for token in lex: + out.append(token) + except ValueError: + # Raised when end-of-string is reached in an invalid state. Use + # the partial token as-is. The quote or escape character is in + # lex.state, not lex.token. + out.append(lex.token) + + return out + + +class Option: + def __init__( + self, + obj: "CoreOption", + opts: t.Sequence[str], + dest: t.Optional[str], + action: t.Optional[str] = None, + nargs: int = 1, + const: t.Optional[t.Any] = None, + ): + self._short_opts = [] + self._long_opts = [] + self.prefixes: t.Set[str] = set() + + for opt in opts: + prefix, value = split_opt(opt) + if not prefix: + raise ValueError(f"Invalid start character for option ({opt})") + self.prefixes.add(prefix[0]) + if len(prefix) == 1 and len(value) == 1: + self._short_opts.append(opt) + else: + self._long_opts.append(opt) + self.prefixes.add(prefix) + + if action is None: + action = "store" + + self.dest = dest + self.action = action + self.nargs = nargs + self.const = const + self.obj = obj + + @property + def takes_value(self) -> bool: + return self.action in ("store", "append") + + def process(self, value: t.Any, state: "ParsingState") -> None: + if self.action == "store": + state.opts[self.dest] = value # type: ignore + elif self.action == "store_const": + state.opts[self.dest] = self.const # type: ignore + elif self.action == "append": + state.opts.setdefault(self.dest, []).append(value) # type: ignore + elif self.action == "append_const": + state.opts.setdefault(self.dest, []).append(self.const) # type: ignore + elif self.action == "count": + state.opts[self.dest] = state.opts.get(self.dest, 0) + 1 # type: ignore + else: + raise ValueError(f"unknown action '{self.action}'") + state.order.append(self.obj) + + +class Argument: + def __init__(self, obj: "CoreArgument", dest: t.Optional[str], nargs: int = 1): + self.dest = dest + self.nargs = nargs + self.obj = obj + + def process( + self, + value: t.Union[t.Optional[str], t.Sequence[t.Optional[str]]], + state: "ParsingState", + ) -> None: + if self.nargs > 1: + assert value is not None + holes = sum(1 for x in value if x is None) + if holes == len(value): + value = None + elif holes != 0: + raise BadArgumentUsage( + _("Argument {name!r} takes {nargs} values.").format( + name=self.dest, nargs=self.nargs + ) + ) + + if self.nargs == -1 and self.obj.envvar is not None and value == (): + # Replace empty tuple with None so that a value from the + # environment may be tried. + value = None + + state.opts[self.dest] = value # type: ignore + state.order.append(self.obj) + + +class ParsingState: + def __init__(self, rargs: t.List[str]) -> None: + self.opts: t.Dict[str, t.Any] = {} + self.largs: t.List[str] = [] + self.rargs = rargs + self.order: t.List["CoreParameter"] = [] + + +class OptionParser: + """The option parser is an internal class that is ultimately used to + parse options and arguments. It's modelled after optparse and brings + a similar but vastly simplified API. It should generally not be used + directly as the high level Click classes wrap it for you. + + It's not nearly as extensible as optparse or argparse as it does not + implement features that are implemented on a higher level (such as + types or defaults). + + :param ctx: optionally the :class:`~click.Context` where this parser + should go with. + """ + + def __init__(self, ctx: t.Optional["Context"] = None) -> None: + #: The :class:`~click.Context` for this parser. This might be + #: `None` for some advanced use cases. + self.ctx = ctx + #: This controls how the parser deals with interspersed arguments. + #: If this is set to `False`, the parser will stop on the first + #: non-option. Click uses this to implement nested subcommands + #: safely. + self.allow_interspersed_args: bool = True + #: This tells the parser how to deal with unknown options. By + #: default it will error out (which is sensible), but there is a + #: second mode where it will ignore it and continue processing + #: after shifting all the unknown options into the resulting args. + self.ignore_unknown_options: bool = False + + if ctx is not None: + self.allow_interspersed_args = ctx.allow_interspersed_args + self.ignore_unknown_options = ctx.ignore_unknown_options + + self._short_opt: t.Dict[str, Option] = {} + self._long_opt: t.Dict[str, Option] = {} + self._opt_prefixes = {"-", "--"} + self._args: t.List[Argument] = [] + + def add_option( + self, + obj: "CoreOption", + opts: t.Sequence[str], + dest: t.Optional[str], + action: t.Optional[str] = None, + nargs: int = 1, + const: t.Optional[t.Any] = None, + ) -> None: + """Adds a new option named `dest` to the parser. The destination + is not inferred (unlike with optparse) and needs to be explicitly + provided. Action can be any of ``store``, ``store_const``, + ``append``, ``append_const`` or ``count``. + + The `obj` can be used to identify the option in the order list + that is returned from the parser. + """ + opts = [normalize_opt(opt, self.ctx) for opt in opts] + option = Option(obj, opts, dest, action=action, nargs=nargs, const=const) + self._opt_prefixes.update(option.prefixes) + for opt in option._short_opts: + self._short_opt[opt] = option + for opt in option._long_opts: + self._long_opt[opt] = option + + def add_argument( + self, obj: "CoreArgument", dest: t.Optional[str], nargs: int = 1 + ) -> None: + """Adds a positional argument named `dest` to the parser. + + The `obj` can be used to identify the option in the order list + that is returned from the parser. + """ + self._args.append(Argument(obj, dest=dest, nargs=nargs)) + + def parse_args( + self, args: t.List[str] + ) -> t.Tuple[t.Dict[str, t.Any], t.List[str], t.List["CoreParameter"]]: + """Parses positional arguments and returns ``(values, args, order)`` + for the parsed options and arguments as well as the leftover + arguments if there are any. The order is a list of objects as they + appear on the command line. If arguments appear multiple times they + will be memorized multiple times as well. + """ + state = ParsingState(args) + try: + self._process_args_for_options(state) + self._process_args_for_args(state) + except UsageError: + if self.ctx is None or not self.ctx.resilient_parsing: + raise + return state.opts, state.largs, state.order + + def _process_args_for_args(self, state: ParsingState) -> None: + pargs, args = _unpack_args( + state.largs + state.rargs, [x.nargs for x in self._args] + ) + + for idx, arg in enumerate(self._args): + arg.process(pargs[idx], state) + + state.largs = args + state.rargs = [] + + def _process_args_for_options(self, state: ParsingState) -> None: + while state.rargs: + arg = state.rargs.pop(0) + arglen = len(arg) + # Double dashes always handled explicitly regardless of what + # prefixes are valid. + if arg == "--": + return + elif arg[:1] in self._opt_prefixes and arglen > 1: + self._process_opts(arg, state) + elif self.allow_interspersed_args: + state.largs.append(arg) + else: + state.rargs.insert(0, arg) + return + + # Say this is the original argument list: + # [arg0, arg1, ..., arg(i-1), arg(i), arg(i+1), ..., arg(N-1)] + # ^ + # (we are about to process arg(i)). + # + # Then rargs is [arg(i), ..., arg(N-1)] and largs is a *subset* of + # [arg0, ..., arg(i-1)] (any options and their arguments will have + # been removed from largs). + # + # The while loop will usually consume 1 or more arguments per pass. + # If it consumes 1 (eg. arg is an option that takes no arguments), + # then after _process_arg() is done the situation is: + # + # largs = subset of [arg0, ..., arg(i)] + # rargs = [arg(i+1), ..., arg(N-1)] + # + # If allow_interspersed_args is false, largs will always be + # *empty* -- still a subset of [arg0, ..., arg(i-1)], but + # not a very interesting subset! + + def _match_long_opt( + self, opt: str, explicit_value: t.Optional[str], state: ParsingState + ) -> None: + if opt not in self._long_opt: + from difflib import get_close_matches + + possibilities = get_close_matches(opt, self._long_opt) + raise NoSuchOption(opt, possibilities=possibilities, ctx=self.ctx) + + option = self._long_opt[opt] + if option.takes_value: + # At this point it's safe to modify rargs by injecting the + # explicit value, because no exception is raised in this + # branch. This means that the inserted value will be fully + # consumed. + if explicit_value is not None: + state.rargs.insert(0, explicit_value) + + value = self._get_value_from_state(opt, option, state) + + elif explicit_value is not None: + raise BadOptionUsage( + opt, _("Option {name!r} does not take a value.").format(name=opt) + ) + + else: + value = None + + option.process(value, state) + + def _match_short_opt(self, arg: str, state: ParsingState) -> None: + stop = False + i = 1 + prefix = arg[0] + unknown_options = [] + + for ch in arg[1:]: + opt = normalize_opt(f"{prefix}{ch}", self.ctx) + option = self._short_opt.get(opt) + i += 1 + + if not option: + if self.ignore_unknown_options: + unknown_options.append(ch) + continue + raise NoSuchOption(opt, ctx=self.ctx) + if option.takes_value: + # Any characters left in arg? Pretend they're the + # next arg, and stop consuming characters of arg. + if i < len(arg): + state.rargs.insert(0, arg[i:]) + stop = True + + value = self._get_value_from_state(opt, option, state) + + else: + value = None + + option.process(value, state) + + if stop: + break + + # If we got any unknown options we recombine the string of the + # remaining options and re-attach the prefix, then report that + # to the state as new larg. This way there is basic combinatorics + # that can be achieved while still ignoring unknown arguments. + if self.ignore_unknown_options and unknown_options: + state.largs.append(f"{prefix}{''.join(unknown_options)}") + + def _get_value_from_state( + self, option_name: str, option: Option, state: ParsingState + ) -> t.Any: + nargs = option.nargs + + if len(state.rargs) < nargs: + if option.obj._flag_needs_value: + # Option allows omitting the value. + value = _flag_needs_value + else: + raise BadOptionUsage( + option_name, + ngettext( + "Option {name!r} requires an argument.", + "Option {name!r} requires {nargs} arguments.", + nargs, + ).format(name=option_name, nargs=nargs), + ) + elif nargs == 1: + next_rarg = state.rargs[0] + + if ( + option.obj._flag_needs_value + and isinstance(next_rarg, str) + and next_rarg[:1] in self._opt_prefixes + and len(next_rarg) > 1 + ): + # The next arg looks like the start of an option, don't + # use it as the value if omitting the value is allowed. + value = _flag_needs_value + else: + value = state.rargs.pop(0) + else: + value = tuple(state.rargs[:nargs]) + del state.rargs[:nargs] + + return value + + def _process_opts(self, arg: str, state: ParsingState) -> None: + explicit_value = None + # Long option handling happens in two parts. The first part is + # supporting explicitly attached values. In any case, we will try + # to long match the option first. + if "=" in arg: + long_opt, explicit_value = arg.split("=", 1) + else: + long_opt = arg + norm_long_opt = normalize_opt(long_opt, self.ctx) + + # At this point we will match the (assumed) long option through + # the long option matching code. Note that this allows options + # like "-foo" to be matched as long options. + try: + self._match_long_opt(norm_long_opt, explicit_value, state) + except NoSuchOption: + # At this point the long option matching failed, and we need + # to try with short options. However there is a special rule + # which says, that if we have a two character options prefix + # (applies to "--foo" for instance), we do not dispatch to the + # short option code and will instead raise the no option + # error. + if arg[:2] not in self._opt_prefixes: + self._match_short_opt(arg, state) + return + + if not self.ignore_unknown_options: + raise + + state.largs.append(arg) diff --git a/app/src/flask-server/venv/Lib/site-packages/click/py.typed b/app/src/flask-server/venv/Lib/site-packages/click/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/app/src/flask-server/venv/Lib/site-packages/click/shell_completion.py b/app/src/flask-server/venv/Lib/site-packages/click/shell_completion.py new file mode 100644 index 0000000..dc9e00b --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/click/shell_completion.py @@ -0,0 +1,596 @@ +import os +import re +import typing as t +from gettext import gettext as _ + +from .core import Argument +from .core import BaseCommand +from .core import Context +from .core import MultiCommand +from .core import Option +from .core import Parameter +from .core import ParameterSource +from .parser import split_arg_string +from .utils import echo + + +def shell_complete( + cli: BaseCommand, + ctx_args: t.MutableMapping[str, t.Any], + prog_name: str, + complete_var: str, + instruction: str, +) -> int: + """Perform shell completion for the given CLI program. + + :param cli: Command being called. + :param ctx_args: Extra arguments to pass to + ``cli.make_context``. + :param prog_name: Name of the executable in the shell. + :param complete_var: Name of the environment variable that holds + the completion instruction. + :param instruction: Value of ``complete_var`` with the completion + instruction and shell, in the form ``instruction_shell``. + :return: Status code to exit with. + """ + shell, _, instruction = instruction.partition("_") + comp_cls = get_completion_class(shell) + + if comp_cls is None: + return 1 + + comp = comp_cls(cli, ctx_args, prog_name, complete_var) + + if instruction == "source": + echo(comp.source()) + return 0 + + if instruction == "complete": + echo(comp.complete()) + return 0 + + return 1 + + +class CompletionItem: + """Represents a completion value and metadata about the value. The + default metadata is ``type`` to indicate special shell handling, + and ``help`` if a shell supports showing a help string next to the + value. + + Arbitrary parameters can be passed when creating the object, and + accessed using ``item.attr``. If an attribute wasn't passed, + accessing it returns ``None``. + + :param value: The completion suggestion. + :param type: Tells the shell script to provide special completion + support for the type. Click uses ``"dir"`` and ``"file"``. + :param help: String shown next to the value if supported. + :param kwargs: Arbitrary metadata. The built-in implementations + don't use this, but custom type completions paired with custom + shell support could use it. + """ + + __slots__ = ("value", "type", "help", "_info") + + def __init__( + self, + value: t.Any, + type: str = "plain", + help: t.Optional[str] = None, + **kwargs: t.Any, + ) -> None: + self.value: t.Any = value + self.type: str = type + self.help: t.Optional[str] = help + self._info = kwargs + + def __getattr__(self, name: str) -> t.Any: + return self._info.get(name) + + +# Only Bash >= 4.4 has the nosort option. +_SOURCE_BASH = """\ +%(complete_func)s() { + local IFS=$'\\n' + local response + + response=$(env COMP_WORDS="${COMP_WORDS[*]}" COMP_CWORD=$COMP_CWORD \ +%(complete_var)s=bash_complete $1) + + for completion in $response; do + IFS=',' read type value <<< "$completion" + + if [[ $type == 'dir' ]]; then + COMPREPLY=() + compopt -o dirnames + elif [[ $type == 'file' ]]; then + COMPREPLY=() + compopt -o default + elif [[ $type == 'plain' ]]; then + COMPREPLY+=($value) + fi + done + + return 0 +} + +%(complete_func)s_setup() { + complete -o nosort -F %(complete_func)s %(prog_name)s +} + +%(complete_func)s_setup; +""" + +_SOURCE_ZSH = """\ +#compdef %(prog_name)s + +%(complete_func)s() { + local -a completions + local -a completions_with_descriptions + local -a response + (( ! $+commands[%(prog_name)s] )) && return 1 + + response=("${(@f)$(env COMP_WORDS="${words[*]}" COMP_CWORD=$((CURRENT-1)) \ +%(complete_var)s=zsh_complete %(prog_name)s)}") + + for type key descr in ${response}; do + if [[ "$type" == "plain" ]]; then + if [[ "$descr" == "_" ]]; then + completions+=("$key") + else + completions_with_descriptions+=("$key":"$descr") + fi + elif [[ "$type" == "dir" ]]; then + _path_files -/ + elif [[ "$type" == "file" ]]; then + _path_files -f + fi + done + + if [ -n "$completions_with_descriptions" ]; then + _describe -V unsorted completions_with_descriptions -U + fi + + if [ -n "$completions" ]; then + compadd -U -V unsorted -a completions + fi +} + +if [[ $zsh_eval_context[-1] == loadautofunc ]]; then + # autoload from fpath, call function directly + %(complete_func)s "$@" +else + # eval/source/. command, register function for later + compdef %(complete_func)s %(prog_name)s +fi +""" + +_SOURCE_FISH = """\ +function %(complete_func)s; + set -l response (env %(complete_var)s=fish_complete COMP_WORDS=(commandline -cp) \ +COMP_CWORD=(commandline -t) %(prog_name)s); + + for completion in $response; + set -l metadata (string split "," $completion); + + if test $metadata[1] = "dir"; + __fish_complete_directories $metadata[2]; + else if test $metadata[1] = "file"; + __fish_complete_path $metadata[2]; + else if test $metadata[1] = "plain"; + echo $metadata[2]; + end; + end; +end; + +complete --no-files --command %(prog_name)s --arguments \ +"(%(complete_func)s)"; +""" + + +class ShellComplete: + """Base class for providing shell completion support. A subclass for + a given shell will override attributes and methods to implement the + completion instructions (``source`` and ``complete``). + + :param cli: Command being called. + :param prog_name: Name of the executable in the shell. + :param complete_var: Name of the environment variable that holds + the completion instruction. + + .. versionadded:: 8.0 + """ + + name: t.ClassVar[str] + """Name to register the shell as with :func:`add_completion_class`. + This is used in completion instructions (``{name}_source`` and + ``{name}_complete``). + """ + + source_template: t.ClassVar[str] + """Completion script template formatted by :meth:`source`. This must + be provided by subclasses. + """ + + def __init__( + self, + cli: BaseCommand, + ctx_args: t.MutableMapping[str, t.Any], + prog_name: str, + complete_var: str, + ) -> None: + self.cli = cli + self.ctx_args = ctx_args + self.prog_name = prog_name + self.complete_var = complete_var + + @property + def func_name(self) -> str: + """The name of the shell function defined by the completion + script. + """ + safe_name = re.sub(r"\W*", "", self.prog_name.replace("-", "_"), flags=re.ASCII) + return f"_{safe_name}_completion" + + def source_vars(self) -> t.Dict[str, t.Any]: + """Vars for formatting :attr:`source_template`. + + By default this provides ``complete_func``, ``complete_var``, + and ``prog_name``. + """ + return { + "complete_func": self.func_name, + "complete_var": self.complete_var, + "prog_name": self.prog_name, + } + + def source(self) -> str: + """Produce the shell script that defines the completion + function. By default this ``%``-style formats + :attr:`source_template` with the dict returned by + :meth:`source_vars`. + """ + return self.source_template % self.source_vars() + + def get_completion_args(self) -> t.Tuple[t.List[str], str]: + """Use the env vars defined by the shell script to return a + tuple of ``args, incomplete``. This must be implemented by + subclasses. + """ + raise NotImplementedError + + def get_completions( + self, args: t.List[str], incomplete: str + ) -> t.List[CompletionItem]: + """Determine the context and last complete command or parameter + from the complete args. Call that object's ``shell_complete`` + method to get the completions for the incomplete value. + + :param args: List of complete args before the incomplete value. + :param incomplete: Value being completed. May be empty. + """ + ctx = _resolve_context(self.cli, self.ctx_args, self.prog_name, args) + obj, incomplete = _resolve_incomplete(ctx, args, incomplete) + return obj.shell_complete(ctx, incomplete) + + def format_completion(self, item: CompletionItem) -> str: + """Format a completion item into the form recognized by the + shell script. This must be implemented by subclasses. + + :param item: Completion item to format. + """ + raise NotImplementedError + + def complete(self) -> str: + """Produce the completion data to send back to the shell. + + By default this calls :meth:`get_completion_args`, gets the + completions, then calls :meth:`format_completion` for each + completion. + """ + args, incomplete = self.get_completion_args() + completions = self.get_completions(args, incomplete) + out = [self.format_completion(item) for item in completions] + return "\n".join(out) + + +class BashComplete(ShellComplete): + """Shell completion for Bash.""" + + name = "bash" + source_template = _SOURCE_BASH + + @staticmethod + def _check_version() -> None: + import subprocess + + output = subprocess.run( + ["bash", "-c", 'echo "${BASH_VERSION}"'], stdout=subprocess.PIPE + ) + match = re.search(r"^(\d+)\.(\d+)\.\d+", output.stdout.decode()) + + if match is not None: + major, minor = match.groups() + + if major < "4" or major == "4" and minor < "4": + echo( + _( + "Shell completion is not supported for Bash" + " versions older than 4.4." + ), + err=True, + ) + else: + echo( + _("Couldn't detect Bash version, shell completion is not supported."), + err=True, + ) + + def source(self) -> str: + self._check_version() + return super().source() + + def get_completion_args(self) -> t.Tuple[t.List[str], str]: + cwords = split_arg_string(os.environ["COMP_WORDS"]) + cword = int(os.environ["COMP_CWORD"]) + args = cwords[1:cword] + + try: + incomplete = cwords[cword] + except IndexError: + incomplete = "" + + return args, incomplete + + def format_completion(self, item: CompletionItem) -> str: + return f"{item.type},{item.value}" + + +class ZshComplete(ShellComplete): + """Shell completion for Zsh.""" + + name = "zsh" + source_template = _SOURCE_ZSH + + def get_completion_args(self) -> t.Tuple[t.List[str], str]: + cwords = split_arg_string(os.environ["COMP_WORDS"]) + cword = int(os.environ["COMP_CWORD"]) + args = cwords[1:cword] + + try: + incomplete = cwords[cword] + except IndexError: + incomplete = "" + + return args, incomplete + + def format_completion(self, item: CompletionItem) -> str: + return f"{item.type}\n{item.value}\n{item.help if item.help else '_'}" + + +class FishComplete(ShellComplete): + """Shell completion for Fish.""" + + name = "fish" + source_template = _SOURCE_FISH + + def get_completion_args(self) -> t.Tuple[t.List[str], str]: + cwords = split_arg_string(os.environ["COMP_WORDS"]) + incomplete = os.environ["COMP_CWORD"] + args = cwords[1:] + + # Fish stores the partial word in both COMP_WORDS and + # COMP_CWORD, remove it from complete args. + if incomplete and args and args[-1] == incomplete: + args.pop() + + return args, incomplete + + def format_completion(self, item: CompletionItem) -> str: + if item.help: + return f"{item.type},{item.value}\t{item.help}" + + return f"{item.type},{item.value}" + + +ShellCompleteType = t.TypeVar("ShellCompleteType", bound=t.Type[ShellComplete]) + + +_available_shells: t.Dict[str, t.Type[ShellComplete]] = { + "bash": BashComplete, + "fish": FishComplete, + "zsh": ZshComplete, +} + + +def add_completion_class( + cls: ShellCompleteType, name: t.Optional[str] = None +) -> ShellCompleteType: + """Register a :class:`ShellComplete` subclass under the given name. + The name will be provided by the completion instruction environment + variable during completion. + + :param cls: The completion class that will handle completion for the + shell. + :param name: Name to register the class under. Defaults to the + class's ``name`` attribute. + """ + if name is None: + name = cls.name + + _available_shells[name] = cls + + return cls + + +def get_completion_class(shell: str) -> t.Optional[t.Type[ShellComplete]]: + """Look up a registered :class:`ShellComplete` subclass by the name + provided by the completion instruction environment variable. If the + name isn't registered, returns ``None``. + + :param shell: Name the class is registered under. + """ + return _available_shells.get(shell) + + +def _is_incomplete_argument(ctx: Context, param: Parameter) -> bool: + """Determine if the given parameter is an argument that can still + accept values. + + :param ctx: Invocation context for the command represented by the + parsed complete args. + :param param: Argument object being checked. + """ + if not isinstance(param, Argument): + return False + + assert param.name is not None + # Will be None if expose_value is False. + value = ctx.params.get(param.name) + return ( + param.nargs == -1 + or ctx.get_parameter_source(param.name) is not ParameterSource.COMMANDLINE + or ( + param.nargs > 1 + and isinstance(value, (tuple, list)) + and len(value) < param.nargs + ) + ) + + +def _start_of_option(ctx: Context, value: str) -> bool: + """Check if the value looks like the start of an option.""" + if not value: + return False + + c = value[0] + return c in ctx._opt_prefixes + + +def _is_incomplete_option(ctx: Context, args: t.List[str], param: Parameter) -> bool: + """Determine if the given parameter is an option that needs a value. + + :param args: List of complete args before the incomplete value. + :param param: Option object being checked. + """ + if not isinstance(param, Option): + return False + + if param.is_flag or param.count: + return False + + last_option = None + + for index, arg in enumerate(reversed(args)): + if index + 1 > param.nargs: + break + + if _start_of_option(ctx, arg): + last_option = arg + + return last_option is not None and last_option in param.opts + + +def _resolve_context( + cli: BaseCommand, + ctx_args: t.MutableMapping[str, t.Any], + prog_name: str, + args: t.List[str], +) -> Context: + """Produce the context hierarchy starting with the command and + traversing the complete arguments. This only follows the commands, + it doesn't trigger input prompts or callbacks. + + :param cli: Command being called. + :param prog_name: Name of the executable in the shell. + :param args: List of complete args before the incomplete value. + """ + ctx_args["resilient_parsing"] = True + ctx = cli.make_context(prog_name, args.copy(), **ctx_args) + args = ctx.protected_args + ctx.args + + while args: + command = ctx.command + + if isinstance(command, MultiCommand): + if not command.chain: + name, cmd, args = command.resolve_command(ctx, args) + + if cmd is None: + return ctx + + ctx = cmd.make_context(name, args, parent=ctx, resilient_parsing=True) + args = ctx.protected_args + ctx.args + else: + sub_ctx = ctx + + while args: + name, cmd, args = command.resolve_command(ctx, args) + + if cmd is None: + return ctx + + sub_ctx = cmd.make_context( + name, + args, + parent=ctx, + allow_extra_args=True, + allow_interspersed_args=False, + resilient_parsing=True, + ) + args = sub_ctx.args + + ctx = sub_ctx + args = [*sub_ctx.protected_args, *sub_ctx.args] + else: + break + + return ctx + + +def _resolve_incomplete( + ctx: Context, args: t.List[str], incomplete: str +) -> t.Tuple[t.Union[BaseCommand, Parameter], str]: + """Find the Click object that will handle the completion of the + incomplete value. Return the object and the incomplete value. + + :param ctx: Invocation context for the command represented by + the parsed complete args. + :param args: List of complete args before the incomplete value. + :param incomplete: Value being completed. May be empty. + """ + # Different shells treat an "=" between a long option name and + # value differently. Might keep the value joined, return the "=" + # as a separate item, or return the split name and value. Always + # split and discard the "=" to make completion easier. + if incomplete == "=": + incomplete = "" + elif "=" in incomplete and _start_of_option(ctx, incomplete): + name, _, incomplete = incomplete.partition("=") + args.append(name) + + # The "--" marker tells Click to stop treating values as options + # even if they start with the option character. If it hasn't been + # given and the incomplete arg looks like an option, the current + # command will provide option name completions. + if "--" not in args and _start_of_option(ctx, incomplete): + return ctx.command, incomplete + + params = ctx.command.get_params(ctx) + + # If the last complete arg is an option name with an incomplete + # value, the option will provide value completions. + for param in params: + if _is_incomplete_option(ctx, args, param): + return param, incomplete + + # It's not an option name or value. The first argument without a + # parsed value will provide value completions. + for param in params: + if _is_incomplete_argument(ctx, param): + return param, incomplete + + # There were no unparsed arguments, the command may be a group that + # will provide command name completions. + return ctx.command, incomplete diff --git a/app/src/flask-server/venv/Lib/site-packages/click/termui.py b/app/src/flask-server/venv/Lib/site-packages/click/termui.py new file mode 100644 index 0000000..db7a4b2 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/click/termui.py @@ -0,0 +1,784 @@ +import inspect +import io +import itertools +import sys +import typing as t +from gettext import gettext as _ + +from ._compat import isatty +from ._compat import strip_ansi +from .exceptions import Abort +from .exceptions import UsageError +from .globals import resolve_color_default +from .types import Choice +from .types import convert_type +from .types import ParamType +from .utils import echo +from .utils import LazyFile + +if t.TYPE_CHECKING: + from ._termui_impl import ProgressBar + +V = t.TypeVar("V") + +# The prompt functions to use. The doc tools currently override these +# functions to customize how they work. +visible_prompt_func: t.Callable[[str], str] = input + +_ansi_colors = { + "black": 30, + "red": 31, + "green": 32, + "yellow": 33, + "blue": 34, + "magenta": 35, + "cyan": 36, + "white": 37, + "reset": 39, + "bright_black": 90, + "bright_red": 91, + "bright_green": 92, + "bright_yellow": 93, + "bright_blue": 94, + "bright_magenta": 95, + "bright_cyan": 96, + "bright_white": 97, +} +_ansi_reset_all = "\033[0m" + + +def hidden_prompt_func(prompt: str) -> str: + import getpass + + return getpass.getpass(prompt) + + +def _build_prompt( + text: str, + suffix: str, + show_default: bool = False, + default: t.Optional[t.Any] = None, + show_choices: bool = True, + type: t.Optional[ParamType] = None, +) -> str: + prompt = text + if type is not None and show_choices and isinstance(type, Choice): + prompt += f" ({', '.join(map(str, type.choices))})" + if default is not None and show_default: + prompt = f"{prompt} [{_format_default(default)}]" + return f"{prompt}{suffix}" + + +def _format_default(default: t.Any) -> t.Any: + if isinstance(default, (io.IOBase, LazyFile)) and hasattr(default, "name"): + return default.name + + return default + + +def prompt( + text: str, + default: t.Optional[t.Any] = None, + hide_input: bool = False, + confirmation_prompt: t.Union[bool, str] = False, + type: t.Optional[t.Union[ParamType, t.Any]] = None, + value_proc: t.Optional[t.Callable[[str], t.Any]] = None, + prompt_suffix: str = ": ", + show_default: bool = True, + err: bool = False, + show_choices: bool = True, +) -> t.Any: + """Prompts a user for input. This is a convenience function that can + be used to prompt a user for input later. + + If the user aborts the input by sending an interrupt signal, this + function will catch it and raise a :exc:`Abort` exception. + + :param text: the text to show for the prompt. + :param default: the default value to use if no input happens. If this + is not given it will prompt until it's aborted. + :param hide_input: if this is set to true then the input value will + be hidden. + :param confirmation_prompt: Prompt a second time to confirm the + value. Can be set to a string instead of ``True`` to customize + the message. + :param type: the type to use to check the value against. + :param value_proc: if this parameter is provided it's a function that + is invoked instead of the type conversion to + convert a value. + :param prompt_suffix: a suffix that should be added to the prompt. + :param show_default: shows or hides the default value in the prompt. + :param err: if set to true the file defaults to ``stderr`` instead of + ``stdout``, the same as with echo. + :param show_choices: Show or hide choices if the passed type is a Choice. + For example if type is a Choice of either day or week, + show_choices is true and text is "Group by" then the + prompt will be "Group by (day, week): ". + + .. versionadded:: 8.0 + ``confirmation_prompt`` can be a custom string. + + .. versionadded:: 7.0 + Added the ``show_choices`` parameter. + + .. versionadded:: 6.0 + Added unicode support for cmd.exe on Windows. + + .. versionadded:: 4.0 + Added the `err` parameter. + + """ + + def prompt_func(text: str) -> str: + f = hidden_prompt_func if hide_input else visible_prompt_func + try: + # Write the prompt separately so that we get nice + # coloring through colorama on Windows + echo(text.rstrip(" "), nl=False, err=err) + # Echo a space to stdout to work around an issue where + # readline causes backspace to clear the whole line. + return f(" ") + except (KeyboardInterrupt, EOFError): + # getpass doesn't print a newline if the user aborts input with ^C. + # Allegedly this behavior is inherited from getpass(3). + # A doc bug has been filed at https://bugs.python.org/issue24711 + if hide_input: + echo(None, err=err) + raise Abort() from None + + if value_proc is None: + value_proc = convert_type(type, default) + + prompt = _build_prompt( + text, prompt_suffix, show_default, default, show_choices, type + ) + + if confirmation_prompt: + if confirmation_prompt is True: + confirmation_prompt = _("Repeat for confirmation") + + confirmation_prompt = _build_prompt(confirmation_prompt, prompt_suffix) + + while True: + while True: + value = prompt_func(prompt) + if value: + break + elif default is not None: + value = default + break + try: + result = value_proc(value) + except UsageError as e: + if hide_input: + echo(_("Error: The value you entered was invalid."), err=err) + else: + echo(_("Error: {e.message}").format(e=e), err=err) # noqa: B306 + continue + if not confirmation_prompt: + return result + while True: + value2 = prompt_func(confirmation_prompt) + is_empty = not value and not value2 + if value2 or is_empty: + break + if value == value2: + return result + echo(_("Error: The two entered values do not match."), err=err) + + +def confirm( + text: str, + default: t.Optional[bool] = False, + abort: bool = False, + prompt_suffix: str = ": ", + show_default: bool = True, + err: bool = False, +) -> bool: + """Prompts for confirmation (yes/no question). + + If the user aborts the input by sending a interrupt signal this + function will catch it and raise a :exc:`Abort` exception. + + :param text: the question to ask. + :param default: The default value to use when no input is given. If + ``None``, repeat until input is given. + :param abort: if this is set to `True` a negative answer aborts the + exception by raising :exc:`Abort`. + :param prompt_suffix: a suffix that should be added to the prompt. + :param show_default: shows or hides the default value in the prompt. + :param err: if set to true the file defaults to ``stderr`` instead of + ``stdout``, the same as with echo. + + .. versionchanged:: 8.0 + Repeat until input is given if ``default`` is ``None``. + + .. versionadded:: 4.0 + Added the ``err`` parameter. + """ + prompt = _build_prompt( + text, + prompt_suffix, + show_default, + "y/n" if default is None else ("Y/n" if default else "y/N"), + ) + + while True: + try: + # Write the prompt separately so that we get nice + # coloring through colorama on Windows + echo(prompt.rstrip(" "), nl=False, err=err) + # Echo a space to stdout to work around an issue where + # readline causes backspace to clear the whole line. + value = visible_prompt_func(" ").lower().strip() + except (KeyboardInterrupt, EOFError): + raise Abort() from None + if value in ("y", "yes"): + rv = True + elif value in ("n", "no"): + rv = False + elif default is not None and value == "": + rv = default + else: + echo(_("Error: invalid input"), err=err) + continue + break + if abort and not rv: + raise Abort() + return rv + + +def echo_via_pager( + text_or_generator: t.Union[t.Iterable[str], t.Callable[[], t.Iterable[str]], str], + color: t.Optional[bool] = None, +) -> None: + """This function takes a text and shows it via an environment specific + pager on stdout. + + .. versionchanged:: 3.0 + Added the `color` flag. + + :param text_or_generator: the text to page, or alternatively, a + generator emitting the text to page. + :param color: controls if the pager supports ANSI colors or not. The + default is autodetection. + """ + color = resolve_color_default(color) + + if inspect.isgeneratorfunction(text_or_generator): + i = t.cast(t.Callable[[], t.Iterable[str]], text_or_generator)() + elif isinstance(text_or_generator, str): + i = [text_or_generator] + else: + i = iter(t.cast(t.Iterable[str], text_or_generator)) + + # convert every element of i to a text type if necessary + text_generator = (el if isinstance(el, str) else str(el) for el in i) + + from ._termui_impl import pager + + return pager(itertools.chain(text_generator, "\n"), color) + + +def progressbar( + iterable: t.Optional[t.Iterable[V]] = None, + length: t.Optional[int] = None, + label: t.Optional[str] = None, + show_eta: bool = True, + show_percent: t.Optional[bool] = None, + show_pos: bool = False, + item_show_func: t.Optional[t.Callable[[t.Optional[V]], t.Optional[str]]] = None, + fill_char: str = "#", + empty_char: str = "-", + bar_template: str = "%(label)s [%(bar)s] %(info)s", + info_sep: str = " ", + width: int = 36, + file: t.Optional[t.TextIO] = None, + color: t.Optional[bool] = None, + update_min_steps: int = 1, +) -> "ProgressBar[V]": + """This function creates an iterable context manager that can be used + to iterate over something while showing a progress bar. It will + either iterate over the `iterable` or `length` items (that are counted + up). While iteration happens, this function will print a rendered + progress bar to the given `file` (defaults to stdout) and will attempt + to calculate remaining time and more. By default, this progress bar + will not be rendered if the file is not a terminal. + + The context manager creates the progress bar. When the context + manager is entered the progress bar is already created. With every + iteration over the progress bar, the iterable passed to the bar is + advanced and the bar is updated. When the context manager exits, + a newline is printed and the progress bar is finalized on screen. + + Note: The progress bar is currently designed for use cases where the + total progress can be expected to take at least several seconds. + Because of this, the ProgressBar class object won't display + progress that is considered too fast, and progress where the time + between steps is less than a second. + + No printing must happen or the progress bar will be unintentionally + destroyed. + + Example usage:: + + with progressbar(items) as bar: + for item in bar: + do_something_with(item) + + Alternatively, if no iterable is specified, one can manually update the + progress bar through the `update()` method instead of directly + iterating over the progress bar. The update method accepts the number + of steps to increment the bar with:: + + with progressbar(length=chunks.total_bytes) as bar: + for chunk in chunks: + process_chunk(chunk) + bar.update(chunks.bytes) + + The ``update()`` method also takes an optional value specifying the + ``current_item`` at the new position. This is useful when used + together with ``item_show_func`` to customize the output for each + manual step:: + + with click.progressbar( + length=total_size, + label='Unzipping archive', + item_show_func=lambda a: a.filename + ) as bar: + for archive in zip_file: + archive.extract() + bar.update(archive.size, archive) + + :param iterable: an iterable to iterate over. If not provided the length + is required. + :param length: the number of items to iterate over. By default the + progressbar will attempt to ask the iterator about its + length, which might or might not work. If an iterable is + also provided this parameter can be used to override the + length. If an iterable is not provided the progress bar + will iterate over a range of that length. + :param label: the label to show next to the progress bar. + :param show_eta: enables or disables the estimated time display. This is + automatically disabled if the length cannot be + determined. + :param show_percent: enables or disables the percentage display. The + default is `True` if the iterable has a length or + `False` if not. + :param show_pos: enables or disables the absolute position display. The + default is `False`. + :param item_show_func: A function called with the current item which + can return a string to show next to the progress bar. If the + function returns ``None`` nothing is shown. The current item can + be ``None``, such as when entering and exiting the bar. + :param fill_char: the character to use to show the filled part of the + progress bar. + :param empty_char: the character to use to show the non-filled part of + the progress bar. + :param bar_template: the format string to use as template for the bar. + The parameters in it are ``label`` for the label, + ``bar`` for the progress bar and ``info`` for the + info section. + :param info_sep: the separator between multiple info items (eta etc.) + :param width: the width of the progress bar in characters, 0 means full + terminal width + :param file: The file to write to. If this is not a terminal then + only the label is printed. + :param color: controls if the terminal supports ANSI colors or not. The + default is autodetection. This is only needed if ANSI + codes are included anywhere in the progress bar output + which is not the case by default. + :param update_min_steps: Render only when this many updates have + completed. This allows tuning for very fast iterators. + + .. versionchanged:: 8.0 + Output is shown even if execution time is less than 0.5 seconds. + + .. versionchanged:: 8.0 + ``item_show_func`` shows the current item, not the previous one. + + .. versionchanged:: 8.0 + Labels are echoed if the output is not a TTY. Reverts a change + in 7.0 that removed all output. + + .. versionadded:: 8.0 + Added the ``update_min_steps`` parameter. + + .. versionchanged:: 4.0 + Added the ``color`` parameter. Added the ``update`` method to + the object. + + .. versionadded:: 2.0 + """ + from ._termui_impl import ProgressBar + + color = resolve_color_default(color) + return ProgressBar( + iterable=iterable, + length=length, + show_eta=show_eta, + show_percent=show_percent, + show_pos=show_pos, + item_show_func=item_show_func, + fill_char=fill_char, + empty_char=empty_char, + bar_template=bar_template, + info_sep=info_sep, + file=file, + label=label, + width=width, + color=color, + update_min_steps=update_min_steps, + ) + + +def clear() -> None: + """Clears the terminal screen. This will have the effect of clearing + the whole visible space of the terminal and moving the cursor to the + top left. This does not do anything if not connected to a terminal. + + .. versionadded:: 2.0 + """ + if not isatty(sys.stdout): + return + + # ANSI escape \033[2J clears the screen, \033[1;1H moves the cursor + echo("\033[2J\033[1;1H", nl=False) + + +def _interpret_color( + color: t.Union[int, t.Tuple[int, int, int], str], offset: int = 0 +) -> str: + if isinstance(color, int): + return f"{38 + offset};5;{color:d}" + + if isinstance(color, (tuple, list)): + r, g, b = color + return f"{38 + offset};2;{r:d};{g:d};{b:d}" + + return str(_ansi_colors[color] + offset) + + +def style( + text: t.Any, + fg: t.Optional[t.Union[int, t.Tuple[int, int, int], str]] = None, + bg: t.Optional[t.Union[int, t.Tuple[int, int, int], str]] = None, + bold: t.Optional[bool] = None, + dim: t.Optional[bool] = None, + underline: t.Optional[bool] = None, + overline: t.Optional[bool] = None, + italic: t.Optional[bool] = None, + blink: t.Optional[bool] = None, + reverse: t.Optional[bool] = None, + strikethrough: t.Optional[bool] = None, + reset: bool = True, +) -> str: + """Styles a text with ANSI styles and returns the new string. By + default the styling is self contained which means that at the end + of the string a reset code is issued. This can be prevented by + passing ``reset=False``. + + Examples:: + + click.echo(click.style('Hello World!', fg='green')) + click.echo(click.style('ATTENTION!', blink=True)) + click.echo(click.style('Some things', reverse=True, fg='cyan')) + click.echo(click.style('More colors', fg=(255, 12, 128), bg=117)) + + Supported color names: + + * ``black`` (might be a gray) + * ``red`` + * ``green`` + * ``yellow`` (might be an orange) + * ``blue`` + * ``magenta`` + * ``cyan`` + * ``white`` (might be light gray) + * ``bright_black`` + * ``bright_red`` + * ``bright_green`` + * ``bright_yellow`` + * ``bright_blue`` + * ``bright_magenta`` + * ``bright_cyan`` + * ``bright_white`` + * ``reset`` (reset the color code only) + + If the terminal supports it, color may also be specified as: + + - An integer in the interval [0, 255]. The terminal must support + 8-bit/256-color mode. + - An RGB tuple of three integers in [0, 255]. The terminal must + support 24-bit/true-color mode. + + See https://en.wikipedia.org/wiki/ANSI_color and + https://gist.github.com/XVilka/8346728 for more information. + + :param text: the string to style with ansi codes. + :param fg: if provided this will become the foreground color. + :param bg: if provided this will become the background color. + :param bold: if provided this will enable or disable bold mode. + :param dim: if provided this will enable or disable dim mode. This is + badly supported. + :param underline: if provided this will enable or disable underline. + :param overline: if provided this will enable or disable overline. + :param italic: if provided this will enable or disable italic. + :param blink: if provided this will enable or disable blinking. + :param reverse: if provided this will enable or disable inverse + rendering (foreground becomes background and the + other way round). + :param strikethrough: if provided this will enable or disable + striking through text. + :param reset: by default a reset-all code is added at the end of the + string which means that styles do not carry over. This + can be disabled to compose styles. + + .. versionchanged:: 8.0 + A non-string ``message`` is converted to a string. + + .. versionchanged:: 8.0 + Added support for 256 and RGB color codes. + + .. versionchanged:: 8.0 + Added the ``strikethrough``, ``italic``, and ``overline`` + parameters. + + .. versionchanged:: 7.0 + Added support for bright colors. + + .. versionadded:: 2.0 + """ + if not isinstance(text, str): + text = str(text) + + bits = [] + + if fg: + try: + bits.append(f"\033[{_interpret_color(fg)}m") + except KeyError: + raise TypeError(f"Unknown color {fg!r}") from None + + if bg: + try: + bits.append(f"\033[{_interpret_color(bg, 10)}m") + except KeyError: + raise TypeError(f"Unknown color {bg!r}") from None + + if bold is not None: + bits.append(f"\033[{1 if bold else 22}m") + if dim is not None: + bits.append(f"\033[{2 if dim else 22}m") + if underline is not None: + bits.append(f"\033[{4 if underline else 24}m") + if overline is not None: + bits.append(f"\033[{53 if overline else 55}m") + if italic is not None: + bits.append(f"\033[{3 if italic else 23}m") + if blink is not None: + bits.append(f"\033[{5 if blink else 25}m") + if reverse is not None: + bits.append(f"\033[{7 if reverse else 27}m") + if strikethrough is not None: + bits.append(f"\033[{9 if strikethrough else 29}m") + bits.append(text) + if reset: + bits.append(_ansi_reset_all) + return "".join(bits) + + +def unstyle(text: str) -> str: + """Removes ANSI styling information from a string. Usually it's not + necessary to use this function as Click's echo function will + automatically remove styling if necessary. + + .. versionadded:: 2.0 + + :param text: the text to remove style information from. + """ + return strip_ansi(text) + + +def secho( + message: t.Optional[t.Any] = None, + file: t.Optional[t.IO[t.AnyStr]] = None, + nl: bool = True, + err: bool = False, + color: t.Optional[bool] = None, + **styles: t.Any, +) -> None: + """This function combines :func:`echo` and :func:`style` into one + call. As such the following two calls are the same:: + + click.secho('Hello World!', fg='green') + click.echo(click.style('Hello World!', fg='green')) + + All keyword arguments are forwarded to the underlying functions + depending on which one they go with. + + Non-string types will be converted to :class:`str`. However, + :class:`bytes` are passed directly to :meth:`echo` without applying + style. If you want to style bytes that represent text, call + :meth:`bytes.decode` first. + + .. versionchanged:: 8.0 + A non-string ``message`` is converted to a string. Bytes are + passed through without style applied. + + .. versionadded:: 2.0 + """ + if message is not None and not isinstance(message, (bytes, bytearray)): + message = style(message, **styles) + + return echo(message, file=file, nl=nl, err=err, color=color) + + +def edit( + text: t.Optional[t.AnyStr] = None, + editor: t.Optional[str] = None, + env: t.Optional[t.Mapping[str, str]] = None, + require_save: bool = True, + extension: str = ".txt", + filename: t.Optional[str] = None, +) -> t.Optional[t.AnyStr]: + r"""Edits the given text in the defined editor. If an editor is given + (should be the full path to the executable but the regular operating + system search path is used for finding the executable) it overrides + the detected editor. Optionally, some environment variables can be + used. If the editor is closed without changes, `None` is returned. In + case a file is edited directly the return value is always `None` and + `require_save` and `extension` are ignored. + + If the editor cannot be opened a :exc:`UsageError` is raised. + + Note for Windows: to simplify cross-platform usage, the newlines are + automatically converted from POSIX to Windows and vice versa. As such, + the message here will have ``\n`` as newline markers. + + :param text: the text to edit. + :param editor: optionally the editor to use. Defaults to automatic + detection. + :param env: environment variables to forward to the editor. + :param require_save: if this is true, then not saving in the editor + will make the return value become `None`. + :param extension: the extension to tell the editor about. This defaults + to `.txt` but changing this might change syntax + highlighting. + :param filename: if provided it will edit this file instead of the + provided text contents. It will not use a temporary + file as an indirection in that case. + """ + from ._termui_impl import Editor + + ed = Editor(editor=editor, env=env, require_save=require_save, extension=extension) + + if filename is None: + return ed.edit(text) + + ed.edit_file(filename) + return None + + +def launch(url: str, wait: bool = False, locate: bool = False) -> int: + """This function launches the given URL (or filename) in the default + viewer application for this file type. If this is an executable, it + might launch the executable in a new session. The return value is + the exit code of the launched application. Usually, ``0`` indicates + success. + + Examples:: + + click.launch('https://click.palletsprojects.com/') + click.launch('/my/downloaded/file', locate=True) + + .. versionadded:: 2.0 + + :param url: URL or filename of the thing to launch. + :param wait: Wait for the program to exit before returning. This + only works if the launched program blocks. In particular, + ``xdg-open`` on Linux does not block. + :param locate: if this is set to `True` then instead of launching the + application associated with the URL it will attempt to + launch a file manager with the file located. This + might have weird effects if the URL does not point to + the filesystem. + """ + from ._termui_impl import open_url + + return open_url(url, wait=wait, locate=locate) + + +# If this is provided, getchar() calls into this instead. This is used +# for unittesting purposes. +_getchar: t.Optional[t.Callable[[bool], str]] = None + + +def getchar(echo: bool = False) -> str: + """Fetches a single character from the terminal and returns it. This + will always return a unicode character and under certain rare + circumstances this might return more than one character. The + situations which more than one character is returned is when for + whatever reason multiple characters end up in the terminal buffer or + standard input was not actually a terminal. + + Note that this will always read from the terminal, even if something + is piped into the standard input. + + Note for Windows: in rare cases when typing non-ASCII characters, this + function might wait for a second character and then return both at once. + This is because certain Unicode characters look like special-key markers. + + .. versionadded:: 2.0 + + :param echo: if set to `True`, the character read will also show up on + the terminal. The default is to not show it. + """ + global _getchar + + if _getchar is None: + from ._termui_impl import getchar as f + + _getchar = f + + return _getchar(echo) + + +def raw_terminal() -> t.ContextManager[int]: + from ._termui_impl import raw_terminal as f + + return f() + + +def pause(info: t.Optional[str] = None, err: bool = False) -> None: + """This command stops execution and waits for the user to press any + key to continue. This is similar to the Windows batch "pause" + command. If the program is not run through a terminal, this command + will instead do nothing. + + .. versionadded:: 2.0 + + .. versionadded:: 4.0 + Added the `err` parameter. + + :param info: The message to print before pausing. Defaults to + ``"Press any key to continue..."``. + :param err: if set to message goes to ``stderr`` instead of + ``stdout``, the same as with echo. + """ + if not isatty(sys.stdin) or not isatty(sys.stdout): + return + + if info is None: + info = _("Press any key to continue...") + + try: + if info: + echo(info, nl=False, err=err) + try: + getchar() + except (KeyboardInterrupt, EOFError): + pass + finally: + if info: + echo(err=err) diff --git a/app/src/flask-server/venv/Lib/site-packages/click/testing.py b/app/src/flask-server/venv/Lib/site-packages/click/testing.py new file mode 100644 index 0000000..e0df0d2 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/click/testing.py @@ -0,0 +1,479 @@ +import contextlib +import io +import os +import shlex +import shutil +import sys +import tempfile +import typing as t +from types import TracebackType + +from . import formatting +from . import termui +from . import utils +from ._compat import _find_binary_reader + +if t.TYPE_CHECKING: + from .core import BaseCommand + + +class EchoingStdin: + def __init__(self, input: t.BinaryIO, output: t.BinaryIO) -> None: + self._input = input + self._output = output + self._paused = False + + def __getattr__(self, x: str) -> t.Any: + return getattr(self._input, x) + + def _echo(self, rv: bytes) -> bytes: + if not self._paused: + self._output.write(rv) + + return rv + + def read(self, n: int = -1) -> bytes: + return self._echo(self._input.read(n)) + + def read1(self, n: int = -1) -> bytes: + return self._echo(self._input.read1(n)) # type: ignore + + def readline(self, n: int = -1) -> bytes: + return self._echo(self._input.readline(n)) + + def readlines(self) -> t.List[bytes]: + return [self._echo(x) for x in self._input.readlines()] + + def __iter__(self) -> t.Iterator[bytes]: + return iter(self._echo(x) for x in self._input) + + def __repr__(self) -> str: + return repr(self._input) + + +@contextlib.contextmanager +def _pause_echo(stream: t.Optional[EchoingStdin]) -> t.Iterator[None]: + if stream is None: + yield + else: + stream._paused = True + yield + stream._paused = False + + +class _NamedTextIOWrapper(io.TextIOWrapper): + def __init__( + self, buffer: t.BinaryIO, name: str, mode: str, **kwargs: t.Any + ) -> None: + super().__init__(buffer, **kwargs) + self._name = name + self._mode = mode + + @property + def name(self) -> str: + return self._name + + @property + def mode(self) -> str: + return self._mode + + +def make_input_stream( + input: t.Optional[t.Union[str, bytes, t.IO[t.Any]]], charset: str +) -> t.BinaryIO: + # Is already an input stream. + if hasattr(input, "read"): + rv = _find_binary_reader(t.cast(t.IO[t.Any], input)) + + if rv is not None: + return rv + + raise TypeError("Could not find binary reader for input stream.") + + if input is None: + input = b"" + elif isinstance(input, str): + input = input.encode(charset) + + return io.BytesIO(input) + + +class Result: + """Holds the captured result of an invoked CLI script.""" + + def __init__( + self, + runner: "CliRunner", + stdout_bytes: bytes, + stderr_bytes: t.Optional[bytes], + return_value: t.Any, + exit_code: int, + exception: t.Optional[BaseException], + exc_info: t.Optional[ + t.Tuple[t.Type[BaseException], BaseException, TracebackType] + ] = None, + ): + #: The runner that created the result + self.runner = runner + #: The standard output as bytes. + self.stdout_bytes = stdout_bytes + #: The standard error as bytes, or None if not available + self.stderr_bytes = stderr_bytes + #: The value returned from the invoked command. + #: + #: .. versionadded:: 8.0 + self.return_value = return_value + #: The exit code as integer. + self.exit_code = exit_code + #: The exception that happened if one did. + self.exception = exception + #: The traceback + self.exc_info = exc_info + + @property + def output(self) -> str: + """The (standard) output as unicode string.""" + return self.stdout + + @property + def stdout(self) -> str: + """The standard output as unicode string.""" + return self.stdout_bytes.decode(self.runner.charset, "replace").replace( + "\r\n", "\n" + ) + + @property + def stderr(self) -> str: + """The standard error as unicode string.""" + if self.stderr_bytes is None: + raise ValueError("stderr not separately captured") + return self.stderr_bytes.decode(self.runner.charset, "replace").replace( + "\r\n", "\n" + ) + + def __repr__(self) -> str: + exc_str = repr(self.exception) if self.exception else "okay" + return f"<{type(self).__name__} {exc_str}>" + + +class CliRunner: + """The CLI runner provides functionality to invoke a Click command line + script for unittesting purposes in a isolated environment. This only + works in single-threaded systems without any concurrency as it changes the + global interpreter state. + + :param charset: the character set for the input and output data. + :param env: a dictionary with environment variables for overriding. + :param echo_stdin: if this is set to `True`, then reading from stdin writes + to stdout. This is useful for showing examples in + some circumstances. Note that regular prompts + will automatically echo the input. + :param mix_stderr: if this is set to `False`, then stdout and stderr are + preserved as independent streams. This is useful for + Unix-philosophy apps that have predictable stdout and + noisy stderr, such that each may be measured + independently + """ + + def __init__( + self, + charset: str = "utf-8", + env: t.Optional[t.Mapping[str, t.Optional[str]]] = None, + echo_stdin: bool = False, + mix_stderr: bool = True, + ) -> None: + self.charset = charset + self.env: t.Mapping[str, t.Optional[str]] = env or {} + self.echo_stdin = echo_stdin + self.mix_stderr = mix_stderr + + def get_default_prog_name(self, cli: "BaseCommand") -> str: + """Given a command object it will return the default program name + for it. The default is the `name` attribute or ``"root"`` if not + set. + """ + return cli.name or "root" + + def make_env( + self, overrides: t.Optional[t.Mapping[str, t.Optional[str]]] = None + ) -> t.Mapping[str, t.Optional[str]]: + """Returns the environment overrides for invoking a script.""" + rv = dict(self.env) + if overrides: + rv.update(overrides) + return rv + + @contextlib.contextmanager + def isolation( + self, + input: t.Optional[t.Union[str, bytes, t.IO[t.Any]]] = None, + env: t.Optional[t.Mapping[str, t.Optional[str]]] = None, + color: bool = False, + ) -> t.Iterator[t.Tuple[io.BytesIO, t.Optional[io.BytesIO]]]: + """A context manager that sets up the isolation for invoking of a + command line tool. This sets up stdin with the given input data + and `os.environ` with the overrides from the given dictionary. + This also rebinds some internals in Click to be mocked (like the + prompt functionality). + + This is automatically done in the :meth:`invoke` method. + + :param input: the input stream to put into sys.stdin. + :param env: the environment overrides as dictionary. + :param color: whether the output should contain color codes. The + application can still override this explicitly. + + .. versionchanged:: 8.0 + ``stderr`` is opened with ``errors="backslashreplace"`` + instead of the default ``"strict"``. + + .. versionchanged:: 4.0 + Added the ``color`` parameter. + """ + bytes_input = make_input_stream(input, self.charset) + echo_input = None + + old_stdin = sys.stdin + old_stdout = sys.stdout + old_stderr = sys.stderr + old_forced_width = formatting.FORCED_WIDTH + formatting.FORCED_WIDTH = 80 + + env = self.make_env(env) + + bytes_output = io.BytesIO() + + if self.echo_stdin: + bytes_input = echo_input = t.cast( + t.BinaryIO, EchoingStdin(bytes_input, bytes_output) + ) + + sys.stdin = text_input = _NamedTextIOWrapper( + bytes_input, encoding=self.charset, name="", mode="r" + ) + + if self.echo_stdin: + # Force unbuffered reads, otherwise TextIOWrapper reads a + # large chunk which is echoed early. + text_input._CHUNK_SIZE = 1 # type: ignore + + sys.stdout = _NamedTextIOWrapper( + bytes_output, encoding=self.charset, name="", mode="w" + ) + + bytes_error = None + if self.mix_stderr: + sys.stderr = sys.stdout + else: + bytes_error = io.BytesIO() + sys.stderr = _NamedTextIOWrapper( + bytes_error, + encoding=self.charset, + name="", + mode="w", + errors="backslashreplace", + ) + + @_pause_echo(echo_input) # type: ignore + def visible_input(prompt: t.Optional[str] = None) -> str: + sys.stdout.write(prompt or "") + val = text_input.readline().rstrip("\r\n") + sys.stdout.write(f"{val}\n") + sys.stdout.flush() + return val + + @_pause_echo(echo_input) # type: ignore + def hidden_input(prompt: t.Optional[str] = None) -> str: + sys.stdout.write(f"{prompt or ''}\n") + sys.stdout.flush() + return text_input.readline().rstrip("\r\n") + + @_pause_echo(echo_input) # type: ignore + def _getchar(echo: bool) -> str: + char = sys.stdin.read(1) + + if echo: + sys.stdout.write(char) + + sys.stdout.flush() + return char + + default_color = color + + def should_strip_ansi( + stream: t.Optional[t.IO[t.Any]] = None, color: t.Optional[bool] = None + ) -> bool: + if color is None: + return not default_color + return not color + + old_visible_prompt_func = termui.visible_prompt_func + old_hidden_prompt_func = termui.hidden_prompt_func + old__getchar_func = termui._getchar + old_should_strip_ansi = utils.should_strip_ansi # type: ignore + termui.visible_prompt_func = visible_input + termui.hidden_prompt_func = hidden_input + termui._getchar = _getchar + utils.should_strip_ansi = should_strip_ansi # type: ignore + + old_env = {} + try: + for key, value in env.items(): + old_env[key] = os.environ.get(key) + if value is None: + try: + del os.environ[key] + except Exception: + pass + else: + os.environ[key] = value + yield (bytes_output, bytes_error) + finally: + for key, value in old_env.items(): + if value is None: + try: + del os.environ[key] + except Exception: + pass + else: + os.environ[key] = value + sys.stdout = old_stdout + sys.stderr = old_stderr + sys.stdin = old_stdin + termui.visible_prompt_func = old_visible_prompt_func + termui.hidden_prompt_func = old_hidden_prompt_func + termui._getchar = old__getchar_func + utils.should_strip_ansi = old_should_strip_ansi # type: ignore + formatting.FORCED_WIDTH = old_forced_width + + def invoke( + self, + cli: "BaseCommand", + args: t.Optional[t.Union[str, t.Sequence[str]]] = None, + input: t.Optional[t.Union[str, bytes, t.IO[t.Any]]] = None, + env: t.Optional[t.Mapping[str, t.Optional[str]]] = None, + catch_exceptions: bool = True, + color: bool = False, + **extra: t.Any, + ) -> Result: + """Invokes a command in an isolated environment. The arguments are + forwarded directly to the command line script, the `extra` keyword + arguments are passed to the :meth:`~clickpkg.Command.main` function of + the command. + + This returns a :class:`Result` object. + + :param cli: the command to invoke + :param args: the arguments to invoke. It may be given as an iterable + or a string. When given as string it will be interpreted + as a Unix shell command. More details at + :func:`shlex.split`. + :param input: the input data for `sys.stdin`. + :param env: the environment overrides. + :param catch_exceptions: Whether to catch any other exceptions than + ``SystemExit``. + :param extra: the keyword arguments to pass to :meth:`main`. + :param color: whether the output should contain color codes. The + application can still override this explicitly. + + .. versionchanged:: 8.0 + The result object has the ``return_value`` attribute with + the value returned from the invoked command. + + .. versionchanged:: 4.0 + Added the ``color`` parameter. + + .. versionchanged:: 3.0 + Added the ``catch_exceptions`` parameter. + + .. versionchanged:: 3.0 + The result object has the ``exc_info`` attribute with the + traceback if available. + """ + exc_info = None + with self.isolation(input=input, env=env, color=color) as outstreams: + return_value = None + exception: t.Optional[BaseException] = None + exit_code = 0 + + if isinstance(args, str): + args = shlex.split(args) + + try: + prog_name = extra.pop("prog_name") + except KeyError: + prog_name = self.get_default_prog_name(cli) + + try: + return_value = cli.main(args=args or (), prog_name=prog_name, **extra) + except SystemExit as e: + exc_info = sys.exc_info() + e_code = t.cast(t.Optional[t.Union[int, t.Any]], e.code) + + if e_code is None: + e_code = 0 + + if e_code != 0: + exception = e + + if not isinstance(e_code, int): + sys.stdout.write(str(e_code)) + sys.stdout.write("\n") + e_code = 1 + + exit_code = e_code + + except Exception as e: + if not catch_exceptions: + raise + exception = e + exit_code = 1 + exc_info = sys.exc_info() + finally: + sys.stdout.flush() + stdout = outstreams[0].getvalue() + if self.mix_stderr: + stderr = None + else: + stderr = outstreams[1].getvalue() # type: ignore + + return Result( + runner=self, + stdout_bytes=stdout, + stderr_bytes=stderr, + return_value=return_value, + exit_code=exit_code, + exception=exception, + exc_info=exc_info, # type: ignore + ) + + @contextlib.contextmanager + def isolated_filesystem( + self, temp_dir: t.Optional[t.Union[str, "os.PathLike[str]"]] = None + ) -> t.Iterator[str]: + """A context manager that creates a temporary directory and + changes the current working directory to it. This isolates tests + that affect the contents of the CWD to prevent them from + interfering with each other. + + :param temp_dir: Create the temporary directory under this + directory. If given, the created directory is not removed + when exiting. + + .. versionchanged:: 8.0 + Added the ``temp_dir`` parameter. + """ + cwd = os.getcwd() + dt = tempfile.mkdtemp(dir=temp_dir) + os.chdir(dt) + + try: + yield dt + finally: + os.chdir(cwd) + + if temp_dir is None: + try: + shutil.rmtree(dt) + except OSError: # noqa: B014 + pass diff --git a/app/src/flask-server/venv/Lib/site-packages/click/types.py b/app/src/flask-server/venv/Lib/site-packages/click/types.py new file mode 100644 index 0000000..2b1d179 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/click/types.py @@ -0,0 +1,1089 @@ +import os +import stat +import sys +import typing as t +from datetime import datetime +from gettext import gettext as _ +from gettext import ngettext + +from ._compat import _get_argv_encoding +from ._compat import open_stream +from .exceptions import BadParameter +from .utils import format_filename +from .utils import LazyFile +from .utils import safecall + +if t.TYPE_CHECKING: + import typing_extensions as te + from .core import Context + from .core import Parameter + from .shell_completion import CompletionItem + + +class ParamType: + """Represents the type of a parameter. Validates and converts values + from the command line or Python into the correct type. + + To implement a custom type, subclass and implement at least the + following: + + - The :attr:`name` class attribute must be set. + - Calling an instance of the type with ``None`` must return + ``None``. This is already implemented by default. + - :meth:`convert` must convert string values to the correct type. + - :meth:`convert` must accept values that are already the correct + type. + - It must be able to convert a value if the ``ctx`` and ``param`` + arguments are ``None``. This can occur when converting prompt + input. + """ + + is_composite: t.ClassVar[bool] = False + arity: t.ClassVar[int] = 1 + + #: the descriptive name of this type + name: str + + #: if a list of this type is expected and the value is pulled from a + #: string environment variable, this is what splits it up. `None` + #: means any whitespace. For all parameters the general rule is that + #: whitespace splits them up. The exception are paths and files which + #: are split by ``os.path.pathsep`` by default (":" on Unix and ";" on + #: Windows). + envvar_list_splitter: t.ClassVar[t.Optional[str]] = None + + def to_info_dict(self) -> t.Dict[str, t.Any]: + """Gather information that could be useful for a tool generating + user-facing documentation. + + Use :meth:`click.Context.to_info_dict` to traverse the entire + CLI structure. + + .. versionadded:: 8.0 + """ + # The class name without the "ParamType" suffix. + param_type = type(self).__name__.partition("ParamType")[0] + param_type = param_type.partition("ParameterType")[0] + + # Custom subclasses might not remember to set a name. + if hasattr(self, "name"): + name = self.name + else: + name = param_type + + return {"param_type": param_type, "name": name} + + def __call__( + self, + value: t.Any, + param: t.Optional["Parameter"] = None, + ctx: t.Optional["Context"] = None, + ) -> t.Any: + if value is not None: + return self.convert(value, param, ctx) + + def get_metavar(self, param: "Parameter") -> t.Optional[str]: + """Returns the metavar default for this param if it provides one.""" + + def get_missing_message(self, param: "Parameter") -> t.Optional[str]: + """Optionally might return extra information about a missing + parameter. + + .. versionadded:: 2.0 + """ + + def convert( + self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] + ) -> t.Any: + """Convert the value to the correct type. This is not called if + the value is ``None`` (the missing value). + + This must accept string values from the command line, as well as + values that are already the correct type. It may also convert + other compatible types. + + The ``param`` and ``ctx`` arguments may be ``None`` in certain + situations, such as when converting prompt input. + + If the value cannot be converted, call :meth:`fail` with a + descriptive message. + + :param value: The value to convert. + :param param: The parameter that is using this type to convert + its value. May be ``None``. + :param ctx: The current context that arrived at this value. May + be ``None``. + """ + return value + + def split_envvar_value(self, rv: str) -> t.Sequence[str]: + """Given a value from an environment variable this splits it up + into small chunks depending on the defined envvar list splitter. + + If the splitter is set to `None`, which means that whitespace splits, + then leading and trailing whitespace is ignored. Otherwise, leading + and trailing splitters usually lead to empty items being included. + """ + return (rv or "").split(self.envvar_list_splitter) + + def fail( + self, + message: str, + param: t.Optional["Parameter"] = None, + ctx: t.Optional["Context"] = None, + ) -> "t.NoReturn": + """Helper method to fail with an invalid value message.""" + raise BadParameter(message, ctx=ctx, param=param) + + def shell_complete( + self, ctx: "Context", param: "Parameter", incomplete: str + ) -> t.List["CompletionItem"]: + """Return a list of + :class:`~click.shell_completion.CompletionItem` objects for the + incomplete value. Most types do not provide completions, but + some do, and this allows custom types to provide custom + completions as well. + + :param ctx: Invocation context for this command. + :param param: The parameter that is requesting completion. + :param incomplete: Value being completed. May be empty. + + .. versionadded:: 8.0 + """ + return [] + + +class CompositeParamType(ParamType): + is_composite = True + + @property + def arity(self) -> int: # type: ignore + raise NotImplementedError() + + +class FuncParamType(ParamType): + def __init__(self, func: t.Callable[[t.Any], t.Any]) -> None: + self.name: str = func.__name__ + self.func = func + + def to_info_dict(self) -> t.Dict[str, t.Any]: + info_dict = super().to_info_dict() + info_dict["func"] = self.func + return info_dict + + def convert( + self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] + ) -> t.Any: + try: + return self.func(value) + except ValueError: + try: + value = str(value) + except UnicodeError: + value = value.decode("utf-8", "replace") + + self.fail(value, param, ctx) + + +class UnprocessedParamType(ParamType): + name = "text" + + def convert( + self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] + ) -> t.Any: + return value + + def __repr__(self) -> str: + return "UNPROCESSED" + + +class StringParamType(ParamType): + name = "text" + + def convert( + self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] + ) -> t.Any: + if isinstance(value, bytes): + enc = _get_argv_encoding() + try: + value = value.decode(enc) + except UnicodeError: + fs_enc = sys.getfilesystemencoding() + if fs_enc != enc: + try: + value = value.decode(fs_enc) + except UnicodeError: + value = value.decode("utf-8", "replace") + else: + value = value.decode("utf-8", "replace") + return value + return str(value) + + def __repr__(self) -> str: + return "STRING" + + +class Choice(ParamType): + """The choice type allows a value to be checked against a fixed set + of supported values. All of these values have to be strings. + + You should only pass a list or tuple of choices. Other iterables + (like generators) may lead to surprising results. + + The resulting value will always be one of the originally passed choices + regardless of ``case_sensitive`` or any ``ctx.token_normalize_func`` + being specified. + + See :ref:`choice-opts` for an example. + + :param case_sensitive: Set to false to make choices case + insensitive. Defaults to true. + """ + + name = "choice" + + def __init__(self, choices: t.Sequence[str], case_sensitive: bool = True) -> None: + self.choices = choices + self.case_sensitive = case_sensitive + + def to_info_dict(self) -> t.Dict[str, t.Any]: + info_dict = super().to_info_dict() + info_dict["choices"] = self.choices + info_dict["case_sensitive"] = self.case_sensitive + return info_dict + + def get_metavar(self, param: "Parameter") -> str: + choices_str = "|".join(self.choices) + + # Use curly braces to indicate a required argument. + if param.required and param.param_type_name == "argument": + return f"{{{choices_str}}}" + + # Use square braces to indicate an option or optional argument. + return f"[{choices_str}]" + + def get_missing_message(self, param: "Parameter") -> str: + return _("Choose from:\n\t{choices}").format(choices=",\n\t".join(self.choices)) + + def convert( + self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] + ) -> t.Any: + # Match through normalization and case sensitivity + # first do token_normalize_func, then lowercase + # preserve original `value` to produce an accurate message in + # `self.fail` + normed_value = value + normed_choices = {choice: choice for choice in self.choices} + + if ctx is not None and ctx.token_normalize_func is not None: + normed_value = ctx.token_normalize_func(value) + normed_choices = { + ctx.token_normalize_func(normed_choice): original + for normed_choice, original in normed_choices.items() + } + + if not self.case_sensitive: + normed_value = normed_value.casefold() + normed_choices = { + normed_choice.casefold(): original + for normed_choice, original in normed_choices.items() + } + + if normed_value in normed_choices: + return normed_choices[normed_value] + + choices_str = ", ".join(map(repr, self.choices)) + self.fail( + ngettext( + "{value!r} is not {choice}.", + "{value!r} is not one of {choices}.", + len(self.choices), + ).format(value=value, choice=choices_str, choices=choices_str), + param, + ctx, + ) + + def __repr__(self) -> str: + return f"Choice({list(self.choices)})" + + def shell_complete( + self, ctx: "Context", param: "Parameter", incomplete: str + ) -> t.List["CompletionItem"]: + """Complete choices that start with the incomplete value. + + :param ctx: Invocation context for this command. + :param param: The parameter that is requesting completion. + :param incomplete: Value being completed. May be empty. + + .. versionadded:: 8.0 + """ + from click.shell_completion import CompletionItem + + str_choices = map(str, self.choices) + + if self.case_sensitive: + matched = (c for c in str_choices if c.startswith(incomplete)) + else: + incomplete = incomplete.lower() + matched = (c for c in str_choices if c.lower().startswith(incomplete)) + + return [CompletionItem(c) for c in matched] + + +class DateTime(ParamType): + """The DateTime type converts date strings into `datetime` objects. + + The format strings which are checked are configurable, but default to some + common (non-timezone aware) ISO 8601 formats. + + When specifying *DateTime* formats, you should only pass a list or a tuple. + Other iterables, like generators, may lead to surprising results. + + The format strings are processed using ``datetime.strptime``, and this + consequently defines the format strings which are allowed. + + Parsing is tried using each format, in order, and the first format which + parses successfully is used. + + :param formats: A list or tuple of date format strings, in the order in + which they should be tried. Defaults to + ``'%Y-%m-%d'``, ``'%Y-%m-%dT%H:%M:%S'``, + ``'%Y-%m-%d %H:%M:%S'``. + """ + + name = "datetime" + + def __init__(self, formats: t.Optional[t.Sequence[str]] = None): + self.formats: t.Sequence[str] = formats or [ + "%Y-%m-%d", + "%Y-%m-%dT%H:%M:%S", + "%Y-%m-%d %H:%M:%S", + ] + + def to_info_dict(self) -> t.Dict[str, t.Any]: + info_dict = super().to_info_dict() + info_dict["formats"] = self.formats + return info_dict + + def get_metavar(self, param: "Parameter") -> str: + return f"[{'|'.join(self.formats)}]" + + def _try_to_convert_date(self, value: t.Any, format: str) -> t.Optional[datetime]: + try: + return datetime.strptime(value, format) + except ValueError: + return None + + def convert( + self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] + ) -> t.Any: + if isinstance(value, datetime): + return value + + for format in self.formats: + converted = self._try_to_convert_date(value, format) + + if converted is not None: + return converted + + formats_str = ", ".join(map(repr, self.formats)) + self.fail( + ngettext( + "{value!r} does not match the format {format}.", + "{value!r} does not match the formats {formats}.", + len(self.formats), + ).format(value=value, format=formats_str, formats=formats_str), + param, + ctx, + ) + + def __repr__(self) -> str: + return "DateTime" + + +class _NumberParamTypeBase(ParamType): + _number_class: t.ClassVar[t.Type[t.Any]] + + def convert( + self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] + ) -> t.Any: + try: + return self._number_class(value) + except ValueError: + self.fail( + _("{value!r} is not a valid {number_type}.").format( + value=value, number_type=self.name + ), + param, + ctx, + ) + + +class _NumberRangeBase(_NumberParamTypeBase): + def __init__( + self, + min: t.Optional[float] = None, + max: t.Optional[float] = None, + min_open: bool = False, + max_open: bool = False, + clamp: bool = False, + ) -> None: + self.min = min + self.max = max + self.min_open = min_open + self.max_open = max_open + self.clamp = clamp + + def to_info_dict(self) -> t.Dict[str, t.Any]: + info_dict = super().to_info_dict() + info_dict.update( + min=self.min, + max=self.max, + min_open=self.min_open, + max_open=self.max_open, + clamp=self.clamp, + ) + return info_dict + + def convert( + self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] + ) -> t.Any: + import operator + + rv = super().convert(value, param, ctx) + lt_min: bool = self.min is not None and ( + operator.le if self.min_open else operator.lt + )(rv, self.min) + gt_max: bool = self.max is not None and ( + operator.ge if self.max_open else operator.gt + )(rv, self.max) + + if self.clamp: + if lt_min: + return self._clamp(self.min, 1, self.min_open) # type: ignore + + if gt_max: + return self._clamp(self.max, -1, self.max_open) # type: ignore + + if lt_min or gt_max: + self.fail( + _("{value} is not in the range {range}.").format( + value=rv, range=self._describe_range() + ), + param, + ctx, + ) + + return rv + + def _clamp(self, bound: float, dir: "te.Literal[1, -1]", open: bool) -> float: + """Find the valid value to clamp to bound in the given + direction. + + :param bound: The boundary value. + :param dir: 1 or -1 indicating the direction to move. + :param open: If true, the range does not include the bound. + """ + raise NotImplementedError + + def _describe_range(self) -> str: + """Describe the range for use in help text.""" + if self.min is None: + op = "<" if self.max_open else "<=" + return f"x{op}{self.max}" + + if self.max is None: + op = ">" if self.min_open else ">=" + return f"x{op}{self.min}" + + lop = "<" if self.min_open else "<=" + rop = "<" if self.max_open else "<=" + return f"{self.min}{lop}x{rop}{self.max}" + + def __repr__(self) -> str: + clamp = " clamped" if self.clamp else "" + return f"<{type(self).__name__} {self._describe_range()}{clamp}>" + + +class IntParamType(_NumberParamTypeBase): + name = "integer" + _number_class = int + + def __repr__(self) -> str: + return "INT" + + +class IntRange(_NumberRangeBase, IntParamType): + """Restrict an :data:`click.INT` value to a range of accepted + values. See :ref:`ranges`. + + If ``min`` or ``max`` are not passed, any value is accepted in that + direction. If ``min_open`` or ``max_open`` are enabled, the + corresponding boundary is not included in the range. + + If ``clamp`` is enabled, a value outside the range is clamped to the + boundary instead of failing. + + .. versionchanged:: 8.0 + Added the ``min_open`` and ``max_open`` parameters. + """ + + name = "integer range" + + def _clamp( # type: ignore + self, bound: int, dir: "te.Literal[1, -1]", open: bool + ) -> int: + if not open: + return bound + + return bound + dir + + +class FloatParamType(_NumberParamTypeBase): + name = "float" + _number_class = float + + def __repr__(self) -> str: + return "FLOAT" + + +class FloatRange(_NumberRangeBase, FloatParamType): + """Restrict a :data:`click.FLOAT` value to a range of accepted + values. See :ref:`ranges`. + + If ``min`` or ``max`` are not passed, any value is accepted in that + direction. If ``min_open`` or ``max_open`` are enabled, the + corresponding boundary is not included in the range. + + If ``clamp`` is enabled, a value outside the range is clamped to the + boundary instead of failing. This is not supported if either + boundary is marked ``open``. + + .. versionchanged:: 8.0 + Added the ``min_open`` and ``max_open`` parameters. + """ + + name = "float range" + + def __init__( + self, + min: t.Optional[float] = None, + max: t.Optional[float] = None, + min_open: bool = False, + max_open: bool = False, + clamp: bool = False, + ) -> None: + super().__init__( + min=min, max=max, min_open=min_open, max_open=max_open, clamp=clamp + ) + + if (min_open or max_open) and clamp: + raise TypeError("Clamping is not supported for open bounds.") + + def _clamp(self, bound: float, dir: "te.Literal[1, -1]", open: bool) -> float: + if not open: + return bound + + # Could use Python 3.9's math.nextafter here, but clamping an + # open float range doesn't seem to be particularly useful. It's + # left up to the user to write a callback to do it if needed. + raise RuntimeError("Clamping is not supported for open bounds.") + + +class BoolParamType(ParamType): + name = "boolean" + + def convert( + self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] + ) -> t.Any: + if value in {False, True}: + return bool(value) + + norm = value.strip().lower() + + if norm in {"1", "true", "t", "yes", "y", "on"}: + return True + + if norm in {"0", "false", "f", "no", "n", "off"}: + return False + + self.fail( + _("{value!r} is not a valid boolean.").format(value=value), param, ctx + ) + + def __repr__(self) -> str: + return "BOOL" + + +class UUIDParameterType(ParamType): + name = "uuid" + + def convert( + self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] + ) -> t.Any: + import uuid + + if isinstance(value, uuid.UUID): + return value + + value = value.strip() + + try: + return uuid.UUID(value) + except ValueError: + self.fail( + _("{value!r} is not a valid UUID.").format(value=value), param, ctx + ) + + def __repr__(self) -> str: + return "UUID" + + +class File(ParamType): + """Declares a parameter to be a file for reading or writing. The file + is automatically closed once the context tears down (after the command + finished working). + + Files can be opened for reading or writing. The special value ``-`` + indicates stdin or stdout depending on the mode. + + By default, the file is opened for reading text data, but it can also be + opened in binary mode or for writing. The encoding parameter can be used + to force a specific encoding. + + The `lazy` flag controls if the file should be opened immediately or upon + first IO. The default is to be non-lazy for standard input and output + streams as well as files opened for reading, `lazy` otherwise. When opening a + file lazily for reading, it is still opened temporarily for validation, but + will not be held open until first IO. lazy is mainly useful when opening + for writing to avoid creating the file until it is needed. + + Starting with Click 2.0, files can also be opened atomically in which + case all writes go into a separate file in the same folder and upon + completion the file will be moved over to the original location. This + is useful if a file regularly read by other users is modified. + + See :ref:`file-args` for more information. + """ + + name = "filename" + envvar_list_splitter: t.ClassVar[str] = os.path.pathsep + + def __init__( + self, + mode: str = "r", + encoding: t.Optional[str] = None, + errors: t.Optional[str] = "strict", + lazy: t.Optional[bool] = None, + atomic: bool = False, + ) -> None: + self.mode = mode + self.encoding = encoding + self.errors = errors + self.lazy = lazy + self.atomic = atomic + + def to_info_dict(self) -> t.Dict[str, t.Any]: + info_dict = super().to_info_dict() + info_dict.update(mode=self.mode, encoding=self.encoding) + return info_dict + + def resolve_lazy_flag(self, value: "t.Union[str, os.PathLike[str]]") -> bool: + if self.lazy is not None: + return self.lazy + if os.fspath(value) == "-": + return False + elif "w" in self.mode: + return True + return False + + def convert( + self, + value: t.Union[str, "os.PathLike[str]", t.IO[t.Any]], + param: t.Optional["Parameter"], + ctx: t.Optional["Context"], + ) -> t.IO[t.Any]: + if _is_file_like(value): + return value + + value = t.cast("t.Union[str, os.PathLike[str]]", value) + + try: + lazy = self.resolve_lazy_flag(value) + + if lazy: + lf = LazyFile( + value, self.mode, self.encoding, self.errors, atomic=self.atomic + ) + + if ctx is not None: + ctx.call_on_close(lf.close_intelligently) + + return t.cast(t.IO[t.Any], lf) + + f, should_close = open_stream( + value, self.mode, self.encoding, self.errors, atomic=self.atomic + ) + + # If a context is provided, we automatically close the file + # at the end of the context execution (or flush out). If a + # context does not exist, it's the caller's responsibility to + # properly close the file. This for instance happens when the + # type is used with prompts. + if ctx is not None: + if should_close: + ctx.call_on_close(safecall(f.close)) + else: + ctx.call_on_close(safecall(f.flush)) + + return f + except OSError as e: # noqa: B014 + self.fail(f"'{format_filename(value)}': {e.strerror}", param, ctx) + + def shell_complete( + self, ctx: "Context", param: "Parameter", incomplete: str + ) -> t.List["CompletionItem"]: + """Return a special completion marker that tells the completion + system to use the shell to provide file path completions. + + :param ctx: Invocation context for this command. + :param param: The parameter that is requesting completion. + :param incomplete: Value being completed. May be empty. + + .. versionadded:: 8.0 + """ + from click.shell_completion import CompletionItem + + return [CompletionItem(incomplete, type="file")] + + +def _is_file_like(value: t.Any) -> "te.TypeGuard[t.IO[t.Any]]": + return hasattr(value, "read") or hasattr(value, "write") + + +class Path(ParamType): + """The ``Path`` type is similar to the :class:`File` type, but + returns the filename instead of an open file. Various checks can be + enabled to validate the type of file and permissions. + + :param exists: The file or directory needs to exist for the value to + be valid. If this is not set to ``True``, and the file does not + exist, then all further checks are silently skipped. + :param file_okay: Allow a file as a value. + :param dir_okay: Allow a directory as a value. + :param readable: if true, a readable check is performed. + :param writable: if true, a writable check is performed. + :param executable: if true, an executable check is performed. + :param resolve_path: Make the value absolute and resolve any + symlinks. A ``~`` is not expanded, as this is supposed to be + done by the shell only. + :param allow_dash: Allow a single dash as a value, which indicates + a standard stream (but does not open it). Use + :func:`~click.open_file` to handle opening this value. + :param path_type: Convert the incoming path value to this type. If + ``None``, keep Python's default, which is ``str``. Useful to + convert to :class:`pathlib.Path`. + + .. versionchanged:: 8.1 + Added the ``executable`` parameter. + + .. versionchanged:: 8.0 + Allow passing ``path_type=pathlib.Path``. + + .. versionchanged:: 6.0 + Added the ``allow_dash`` parameter. + """ + + envvar_list_splitter: t.ClassVar[str] = os.path.pathsep + + def __init__( + self, + exists: bool = False, + file_okay: bool = True, + dir_okay: bool = True, + writable: bool = False, + readable: bool = True, + resolve_path: bool = False, + allow_dash: bool = False, + path_type: t.Optional[t.Type[t.Any]] = None, + executable: bool = False, + ): + self.exists = exists + self.file_okay = file_okay + self.dir_okay = dir_okay + self.readable = readable + self.writable = writable + self.executable = executable + self.resolve_path = resolve_path + self.allow_dash = allow_dash + self.type = path_type + + if self.file_okay and not self.dir_okay: + self.name: str = _("file") + elif self.dir_okay and not self.file_okay: + self.name = _("directory") + else: + self.name = _("path") + + def to_info_dict(self) -> t.Dict[str, t.Any]: + info_dict = super().to_info_dict() + info_dict.update( + exists=self.exists, + file_okay=self.file_okay, + dir_okay=self.dir_okay, + writable=self.writable, + readable=self.readable, + allow_dash=self.allow_dash, + ) + return info_dict + + def coerce_path_result( + self, value: "t.Union[str, os.PathLike[str]]" + ) -> "t.Union[str, bytes, os.PathLike[str]]": + if self.type is not None and not isinstance(value, self.type): + if self.type is str: + return os.fsdecode(value) + elif self.type is bytes: + return os.fsencode(value) + else: + return t.cast("os.PathLike[str]", self.type(value)) + + return value + + def convert( + self, + value: "t.Union[str, os.PathLike[str]]", + param: t.Optional["Parameter"], + ctx: t.Optional["Context"], + ) -> "t.Union[str, bytes, os.PathLike[str]]": + rv = value + + is_dash = self.file_okay and self.allow_dash and rv in (b"-", "-") + + if not is_dash: + if self.resolve_path: + # os.path.realpath doesn't resolve symlinks on Windows + # until Python 3.8. Use pathlib for now. + import pathlib + + rv = os.fsdecode(pathlib.Path(rv).resolve()) + + try: + st = os.stat(rv) + except OSError: + if not self.exists: + return self.coerce_path_result(rv) + self.fail( + _("{name} {filename!r} does not exist.").format( + name=self.name.title(), filename=format_filename(value) + ), + param, + ctx, + ) + + if not self.file_okay and stat.S_ISREG(st.st_mode): + self.fail( + _("{name} {filename!r} is a file.").format( + name=self.name.title(), filename=format_filename(value) + ), + param, + ctx, + ) + if not self.dir_okay and stat.S_ISDIR(st.st_mode): + self.fail( + _("{name} '{filename}' is a directory.").format( + name=self.name.title(), filename=format_filename(value) + ), + param, + ctx, + ) + + if self.readable and not os.access(rv, os.R_OK): + self.fail( + _("{name} {filename!r} is not readable.").format( + name=self.name.title(), filename=format_filename(value) + ), + param, + ctx, + ) + + if self.writable and not os.access(rv, os.W_OK): + self.fail( + _("{name} {filename!r} is not writable.").format( + name=self.name.title(), filename=format_filename(value) + ), + param, + ctx, + ) + + if self.executable and not os.access(value, os.X_OK): + self.fail( + _("{name} {filename!r} is not executable.").format( + name=self.name.title(), filename=format_filename(value) + ), + param, + ctx, + ) + + return self.coerce_path_result(rv) + + def shell_complete( + self, ctx: "Context", param: "Parameter", incomplete: str + ) -> t.List["CompletionItem"]: + """Return a special completion marker that tells the completion + system to use the shell to provide path completions for only + directories or any paths. + + :param ctx: Invocation context for this command. + :param param: The parameter that is requesting completion. + :param incomplete: Value being completed. May be empty. + + .. versionadded:: 8.0 + """ + from click.shell_completion import CompletionItem + + type = "dir" if self.dir_okay and not self.file_okay else "file" + return [CompletionItem(incomplete, type=type)] + + +class Tuple(CompositeParamType): + """The default behavior of Click is to apply a type on a value directly. + This works well in most cases, except for when `nargs` is set to a fixed + count and different types should be used for different items. In this + case the :class:`Tuple` type can be used. This type can only be used + if `nargs` is set to a fixed number. + + For more information see :ref:`tuple-type`. + + This can be selected by using a Python tuple literal as a type. + + :param types: a list of types that should be used for the tuple items. + """ + + def __init__(self, types: t.Sequence[t.Union[t.Type[t.Any], ParamType]]) -> None: + self.types: t.Sequence[ParamType] = [convert_type(ty) for ty in types] + + def to_info_dict(self) -> t.Dict[str, t.Any]: + info_dict = super().to_info_dict() + info_dict["types"] = [t.to_info_dict() for t in self.types] + return info_dict + + @property + def name(self) -> str: # type: ignore + return f"<{' '.join(ty.name for ty in self.types)}>" + + @property + def arity(self) -> int: # type: ignore + return len(self.types) + + def convert( + self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] + ) -> t.Any: + len_type = len(self.types) + len_value = len(value) + + if len_value != len_type: + self.fail( + ngettext( + "{len_type} values are required, but {len_value} was given.", + "{len_type} values are required, but {len_value} were given.", + len_value, + ).format(len_type=len_type, len_value=len_value), + param=param, + ctx=ctx, + ) + + return tuple(ty(x, param, ctx) for ty, x in zip(self.types, value)) + + +def convert_type(ty: t.Optional[t.Any], default: t.Optional[t.Any] = None) -> ParamType: + """Find the most appropriate :class:`ParamType` for the given Python + type. If the type isn't provided, it can be inferred from a default + value. + """ + guessed_type = False + + if ty is None and default is not None: + if isinstance(default, (tuple, list)): + # If the default is empty, ty will remain None and will + # return STRING. + if default: + item = default[0] + + # A tuple of tuples needs to detect the inner types. + # Can't call convert recursively because that would + # incorrectly unwind the tuple to a single type. + if isinstance(item, (tuple, list)): + ty = tuple(map(type, item)) + else: + ty = type(item) + else: + ty = type(default) + + guessed_type = True + + if isinstance(ty, tuple): + return Tuple(ty) + + if isinstance(ty, ParamType): + return ty + + if ty is str or ty is None: + return STRING + + if ty is int: + return INT + + if ty is float: + return FLOAT + + if ty is bool: + return BOOL + + if guessed_type: + return STRING + + if __debug__: + try: + if issubclass(ty, ParamType): + raise AssertionError( + f"Attempted to use an uninstantiated parameter type ({ty})." + ) + except TypeError: + # ty is an instance (correct), so issubclass fails. + pass + + return FuncParamType(ty) + + +#: A dummy parameter type that just does nothing. From a user's +#: perspective this appears to just be the same as `STRING` but +#: internally no string conversion takes place if the input was bytes. +#: This is usually useful when working with file paths as they can +#: appear in bytes and unicode. +#: +#: For path related uses the :class:`Path` type is a better choice but +#: there are situations where an unprocessed type is useful which is why +#: it is is provided. +#: +#: .. versionadded:: 4.0 +UNPROCESSED = UnprocessedParamType() + +#: A unicode string parameter type which is the implicit default. This +#: can also be selected by using ``str`` as type. +STRING = StringParamType() + +#: An integer parameter. This can also be selected by using ``int`` as +#: type. +INT = IntParamType() + +#: A floating point value parameter. This can also be selected by using +#: ``float`` as type. +FLOAT = FloatParamType() + +#: A boolean parameter. This is the default for boolean flags. This can +#: also be selected by using ``bool`` as a type. +BOOL = BoolParamType() + +#: A UUID parameter. +UUID = UUIDParameterType() diff --git a/app/src/flask-server/venv/Lib/site-packages/click/utils.py b/app/src/flask-server/venv/Lib/site-packages/click/utils.py new file mode 100644 index 0000000..d536434 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/click/utils.py @@ -0,0 +1,624 @@ +import os +import re +import sys +import typing as t +from functools import update_wrapper +from types import ModuleType +from types import TracebackType + +from ._compat import _default_text_stderr +from ._compat import _default_text_stdout +from ._compat import _find_binary_writer +from ._compat import auto_wrap_for_ansi +from ._compat import binary_streams +from ._compat import open_stream +from ._compat import should_strip_ansi +from ._compat import strip_ansi +from ._compat import text_streams +from ._compat import WIN +from .globals import resolve_color_default + +if t.TYPE_CHECKING: + import typing_extensions as te + + P = te.ParamSpec("P") + +R = t.TypeVar("R") + + +def _posixify(name: str) -> str: + return "-".join(name.split()).lower() + + +def safecall(func: "t.Callable[P, R]") -> "t.Callable[P, t.Optional[R]]": + """Wraps a function so that it swallows exceptions.""" + + def wrapper(*args: "P.args", **kwargs: "P.kwargs") -> t.Optional[R]: + try: + return func(*args, **kwargs) + except Exception: + pass + return None + + return update_wrapper(wrapper, func) + + +def make_str(value: t.Any) -> str: + """Converts a value into a valid string.""" + if isinstance(value, bytes): + try: + return value.decode(sys.getfilesystemencoding()) + except UnicodeError: + return value.decode("utf-8", "replace") + return str(value) + + +def make_default_short_help(help: str, max_length: int = 45) -> str: + """Returns a condensed version of help string.""" + # Consider only the first paragraph. + paragraph_end = help.find("\n\n") + + if paragraph_end != -1: + help = help[:paragraph_end] + + # Collapse newlines, tabs, and spaces. + words = help.split() + + if not words: + return "" + + # The first paragraph started with a "no rewrap" marker, ignore it. + if words[0] == "\b": + words = words[1:] + + total_length = 0 + last_index = len(words) - 1 + + for i, word in enumerate(words): + total_length += len(word) + (i > 0) + + if total_length > max_length: # too long, truncate + break + + if word[-1] == ".": # sentence end, truncate without "..." + return " ".join(words[: i + 1]) + + if total_length == max_length and i != last_index: + break # not at sentence end, truncate with "..." + else: + return " ".join(words) # no truncation needed + + # Account for the length of the suffix. + total_length += len("...") + + # remove words until the length is short enough + while i > 0: + total_length -= len(words[i]) + (i > 0) + + if total_length <= max_length: + break + + i -= 1 + + return " ".join(words[:i]) + "..." + + +class LazyFile: + """A lazy file works like a regular file but it does not fully open + the file but it does perform some basic checks early to see if the + filename parameter does make sense. This is useful for safely opening + files for writing. + """ + + def __init__( + self, + filename: t.Union[str, "os.PathLike[str]"], + mode: str = "r", + encoding: t.Optional[str] = None, + errors: t.Optional[str] = "strict", + atomic: bool = False, + ): + self.name: str = os.fspath(filename) + self.mode = mode + self.encoding = encoding + self.errors = errors + self.atomic = atomic + self._f: t.Optional[t.IO[t.Any]] + self.should_close: bool + + if self.name == "-": + self._f, self.should_close = open_stream(filename, mode, encoding, errors) + else: + if "r" in mode: + # Open and close the file in case we're opening it for + # reading so that we can catch at least some errors in + # some cases early. + open(filename, mode).close() + self._f = None + self.should_close = True + + def __getattr__(self, name: str) -> t.Any: + return getattr(self.open(), name) + + def __repr__(self) -> str: + if self._f is not None: + return repr(self._f) + return f"" + + def open(self) -> t.IO[t.Any]: + """Opens the file if it's not yet open. This call might fail with + a :exc:`FileError`. Not handling this error will produce an error + that Click shows. + """ + if self._f is not None: + return self._f + try: + rv, self.should_close = open_stream( + self.name, self.mode, self.encoding, self.errors, atomic=self.atomic + ) + except OSError as e: # noqa: E402 + from .exceptions import FileError + + raise FileError(self.name, hint=e.strerror) from e + self._f = rv + return rv + + def close(self) -> None: + """Closes the underlying file, no matter what.""" + if self._f is not None: + self._f.close() + + def close_intelligently(self) -> None: + """This function only closes the file if it was opened by the lazy + file wrapper. For instance this will never close stdin. + """ + if self.should_close: + self.close() + + def __enter__(self) -> "LazyFile": + return self + + def __exit__( + self, + exc_type: t.Optional[t.Type[BaseException]], + exc_value: t.Optional[BaseException], + tb: t.Optional[TracebackType], + ) -> None: + self.close_intelligently() + + def __iter__(self) -> t.Iterator[t.AnyStr]: + self.open() + return iter(self._f) # type: ignore + + +class KeepOpenFile: + def __init__(self, file: t.IO[t.Any]) -> None: + self._file: t.IO[t.Any] = file + + def __getattr__(self, name: str) -> t.Any: + return getattr(self._file, name) + + def __enter__(self) -> "KeepOpenFile": + return self + + def __exit__( + self, + exc_type: t.Optional[t.Type[BaseException]], + exc_value: t.Optional[BaseException], + tb: t.Optional[TracebackType], + ) -> None: + pass + + def __repr__(self) -> str: + return repr(self._file) + + def __iter__(self) -> t.Iterator[t.AnyStr]: + return iter(self._file) + + +def echo( + message: t.Optional[t.Any] = None, + file: t.Optional[t.IO[t.Any]] = None, + nl: bool = True, + err: bool = False, + color: t.Optional[bool] = None, +) -> None: + """Print a message and newline to stdout or a file. This should be + used instead of :func:`print` because it provides better support + for different data, files, and environments. + + Compared to :func:`print`, this does the following: + + - Ensures that the output encoding is not misconfigured on Linux. + - Supports Unicode in the Windows console. + - Supports writing to binary outputs, and supports writing bytes + to text outputs. + - Supports colors and styles on Windows. + - Removes ANSI color and style codes if the output does not look + like an interactive terminal. + - Always flushes the output. + + :param message: The string or bytes to output. Other objects are + converted to strings. + :param file: The file to write to. Defaults to ``stdout``. + :param err: Write to ``stderr`` instead of ``stdout``. + :param nl: Print a newline after the message. Enabled by default. + :param color: Force showing or hiding colors and other styles. By + default Click will remove color if the output does not look like + an interactive terminal. + + .. versionchanged:: 6.0 + Support Unicode output on the Windows console. Click does not + modify ``sys.stdout``, so ``sys.stdout.write()`` and ``print()`` + will still not support Unicode. + + .. versionchanged:: 4.0 + Added the ``color`` parameter. + + .. versionadded:: 3.0 + Added the ``err`` parameter. + + .. versionchanged:: 2.0 + Support colors on Windows if colorama is installed. + """ + if file is None: + if err: + file = _default_text_stderr() + else: + file = _default_text_stdout() + + # There are no standard streams attached to write to. For example, + # pythonw on Windows. + if file is None: + return + + # Convert non bytes/text into the native string type. + if message is not None and not isinstance(message, (str, bytes, bytearray)): + out: t.Optional[t.Union[str, bytes]] = str(message) + else: + out = message + + if nl: + out = out or "" + if isinstance(out, str): + out += "\n" + else: + out += b"\n" + + if not out: + file.flush() + return + + # If there is a message and the value looks like bytes, we manually + # need to find the binary stream and write the message in there. + # This is done separately so that most stream types will work as you + # would expect. Eg: you can write to StringIO for other cases. + if isinstance(out, (bytes, bytearray)): + binary_file = _find_binary_writer(file) + + if binary_file is not None: + file.flush() + binary_file.write(out) + binary_file.flush() + return + + # ANSI style code support. For no message or bytes, nothing happens. + # When outputting to a file instead of a terminal, strip codes. + else: + color = resolve_color_default(color) + + if should_strip_ansi(file, color): + out = strip_ansi(out) + elif WIN: + if auto_wrap_for_ansi is not None: + file = auto_wrap_for_ansi(file) # type: ignore + elif not color: + out = strip_ansi(out) + + file.write(out) # type: ignore + file.flush() + + +def get_binary_stream(name: "te.Literal['stdin', 'stdout', 'stderr']") -> t.BinaryIO: + """Returns a system stream for byte processing. + + :param name: the name of the stream to open. Valid names are ``'stdin'``, + ``'stdout'`` and ``'stderr'`` + """ + opener = binary_streams.get(name) + if opener is None: + raise TypeError(f"Unknown standard stream '{name}'") + return opener() + + +def get_text_stream( + name: "te.Literal['stdin', 'stdout', 'stderr']", + encoding: t.Optional[str] = None, + errors: t.Optional[str] = "strict", +) -> t.TextIO: + """Returns a system stream for text processing. This usually returns + a wrapped stream around a binary stream returned from + :func:`get_binary_stream` but it also can take shortcuts for already + correctly configured streams. + + :param name: the name of the stream to open. Valid names are ``'stdin'``, + ``'stdout'`` and ``'stderr'`` + :param encoding: overrides the detected default encoding. + :param errors: overrides the default error mode. + """ + opener = text_streams.get(name) + if opener is None: + raise TypeError(f"Unknown standard stream '{name}'") + return opener(encoding, errors) + + +def open_file( + filename: str, + mode: str = "r", + encoding: t.Optional[str] = None, + errors: t.Optional[str] = "strict", + lazy: bool = False, + atomic: bool = False, +) -> t.IO[t.Any]: + """Open a file, with extra behavior to handle ``'-'`` to indicate + a standard stream, lazy open on write, and atomic write. Similar to + the behavior of the :class:`~click.File` param type. + + If ``'-'`` is given to open ``stdout`` or ``stdin``, the stream is + wrapped so that using it in a context manager will not close it. + This makes it possible to use the function without accidentally + closing a standard stream: + + .. code-block:: python + + with open_file(filename) as f: + ... + + :param filename: The name of the file to open, or ``'-'`` for + ``stdin``/``stdout``. + :param mode: The mode in which to open the file. + :param encoding: The encoding to decode or encode a file opened in + text mode. + :param errors: The error handling mode. + :param lazy: Wait to open the file until it is accessed. For read + mode, the file is temporarily opened to raise access errors + early, then closed until it is read again. + :param atomic: Write to a temporary file and replace the given file + on close. + + .. versionadded:: 3.0 + """ + if lazy: + return t.cast( + t.IO[t.Any], LazyFile(filename, mode, encoding, errors, atomic=atomic) + ) + + f, should_close = open_stream(filename, mode, encoding, errors, atomic=atomic) + + if not should_close: + f = t.cast(t.IO[t.Any], KeepOpenFile(f)) + + return f + + +def format_filename( + filename: "t.Union[str, bytes, os.PathLike[str], os.PathLike[bytes]]", + shorten: bool = False, +) -> str: + """Format a filename as a string for display. Ensures the filename can be + displayed by replacing any invalid bytes or surrogate escapes in the name + with the replacement character ``�``. + + Invalid bytes or surrogate escapes will raise an error when written to a + stream with ``errors="strict". This will typically happen with ``stdout`` + when the locale is something like ``en_GB.UTF-8``. + + Many scenarios *are* safe to write surrogates though, due to PEP 538 and + PEP 540, including: + + - Writing to ``stderr``, which uses ``errors="backslashreplace"``. + - The system has ``LANG=C.UTF-8``, ``C``, or ``POSIX``. Python opens + stdout and stderr with ``errors="surrogateescape"``. + - None of ``LANG/LC_*`` are set. Python assumes ``LANG=C.UTF-8``. + - Python is started in UTF-8 mode with ``PYTHONUTF8=1`` or ``-X utf8``. + Python opens stdout and stderr with ``errors="surrogateescape"``. + + :param filename: formats a filename for UI display. This will also convert + the filename into unicode without failing. + :param shorten: this optionally shortens the filename to strip of the + path that leads up to it. + """ + if shorten: + filename = os.path.basename(filename) + else: + filename = os.fspath(filename) + + if isinstance(filename, bytes): + filename = filename.decode(sys.getfilesystemencoding(), "replace") + else: + filename = filename.encode("utf-8", "surrogateescape").decode( + "utf-8", "replace" + ) + + return filename + + +def get_app_dir(app_name: str, roaming: bool = True, force_posix: bool = False) -> str: + r"""Returns the config folder for the application. The default behavior + is to return whatever is most appropriate for the operating system. + + To give you an idea, for an app called ``"Foo Bar"``, something like + the following folders could be returned: + + Mac OS X: + ``~/Library/Application Support/Foo Bar`` + Mac OS X (POSIX): + ``~/.foo-bar`` + Unix: + ``~/.config/foo-bar`` + Unix (POSIX): + ``~/.foo-bar`` + Windows (roaming): + ``C:\Users\\AppData\Roaming\Foo Bar`` + Windows (not roaming): + ``C:\Users\\AppData\Local\Foo Bar`` + + .. versionadded:: 2.0 + + :param app_name: the application name. This should be properly capitalized + and can contain whitespace. + :param roaming: controls if the folder should be roaming or not on Windows. + Has no effect otherwise. + :param force_posix: if this is set to `True` then on any POSIX system the + folder will be stored in the home folder with a leading + dot instead of the XDG config home or darwin's + application support folder. + """ + if WIN: + key = "APPDATA" if roaming else "LOCALAPPDATA" + folder = os.environ.get(key) + if folder is None: + folder = os.path.expanduser("~") + return os.path.join(folder, app_name) + if force_posix: + return os.path.join(os.path.expanduser(f"~/.{_posixify(app_name)}")) + if sys.platform == "darwin": + return os.path.join( + os.path.expanduser("~/Library/Application Support"), app_name + ) + return os.path.join( + os.environ.get("XDG_CONFIG_HOME", os.path.expanduser("~/.config")), + _posixify(app_name), + ) + + +class PacifyFlushWrapper: + """This wrapper is used to catch and suppress BrokenPipeErrors resulting + from ``.flush()`` being called on broken pipe during the shutdown/final-GC + of the Python interpreter. Notably ``.flush()`` is always called on + ``sys.stdout`` and ``sys.stderr``. So as to have minimal impact on any + other cleanup code, and the case where the underlying file is not a broken + pipe, all calls and attributes are proxied. + """ + + def __init__(self, wrapped: t.IO[t.Any]) -> None: + self.wrapped = wrapped + + def flush(self) -> None: + try: + self.wrapped.flush() + except OSError as e: + import errno + + if e.errno != errno.EPIPE: + raise + + def __getattr__(self, attr: str) -> t.Any: + return getattr(self.wrapped, attr) + + +def _detect_program_name( + path: t.Optional[str] = None, _main: t.Optional[ModuleType] = None +) -> str: + """Determine the command used to run the program, for use in help + text. If a file or entry point was executed, the file name is + returned. If ``python -m`` was used to execute a module or package, + ``python -m name`` is returned. + + This doesn't try to be too precise, the goal is to give a concise + name for help text. Files are only shown as their name without the + path. ``python`` is only shown for modules, and the full path to + ``sys.executable`` is not shown. + + :param path: The Python file being executed. Python puts this in + ``sys.argv[0]``, which is used by default. + :param _main: The ``__main__`` module. This should only be passed + during internal testing. + + .. versionadded:: 8.0 + Based on command args detection in the Werkzeug reloader. + + :meta private: + """ + if _main is None: + _main = sys.modules["__main__"] + + if not path: + path = sys.argv[0] + + # The value of __package__ indicates how Python was called. It may + # not exist if a setuptools script is installed as an egg. It may be + # set incorrectly for entry points created with pip on Windows. + # It is set to "" inside a Shiv or PEX zipapp. + if getattr(_main, "__package__", None) in {None, ""} or ( + os.name == "nt" + and _main.__package__ == "" + and not os.path.exists(path) + and os.path.exists(f"{path}.exe") + ): + # Executed a file, like "python app.py". + return os.path.basename(path) + + # Executed a module, like "python -m example". + # Rewritten by Python from "-m script" to "/path/to/script.py". + # Need to look at main module to determine how it was executed. + py_module = t.cast(str, _main.__package__) + name = os.path.splitext(os.path.basename(path))[0] + + # A submodule like "example.cli". + if name != "__main__": + py_module = f"{py_module}.{name}" + + return f"python -m {py_module.lstrip('.')}" + + +def _expand_args( + args: t.Iterable[str], + *, + user: bool = True, + env: bool = True, + glob_recursive: bool = True, +) -> t.List[str]: + """Simulate Unix shell expansion with Python functions. + + See :func:`glob.glob`, :func:`os.path.expanduser`, and + :func:`os.path.expandvars`. + + This is intended for use on Windows, where the shell does not do any + expansion. It may not exactly match what a Unix shell would do. + + :param args: List of command line arguments to expand. + :param user: Expand user home directory. + :param env: Expand environment variables. + :param glob_recursive: ``**`` matches directories recursively. + + .. versionchanged:: 8.1 + Invalid glob patterns are treated as empty expansions rather + than raising an error. + + .. versionadded:: 8.0 + + :meta private: + """ + from glob import glob + + out = [] + + for arg in args: + if user: + arg = os.path.expanduser(arg) + + if env: + arg = os.path.expandvars(arg) + + try: + matches = glob(arg, recursive=glob_recursive) + except re.error: + matches = [] + + if not matches: + out.append(arg) + else: + out.extend(matches) + + return out diff --git a/app/src/flask-server/venv/Lib/site-packages/colorama-0.4.6.dist-info/INSTALLER b/app/src/flask-server/venv/Lib/site-packages/colorama-0.4.6.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/colorama-0.4.6.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/app/src/flask-server/venv/Lib/site-packages/colorama-0.4.6.dist-info/METADATA b/app/src/flask-server/venv/Lib/site-packages/colorama-0.4.6.dist-info/METADATA new file mode 100644 index 0000000..a1b5c57 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/colorama-0.4.6.dist-info/METADATA @@ -0,0 +1,441 @@ +Metadata-Version: 2.1 +Name: colorama +Version: 0.4.6 +Summary: Cross-platform colored terminal text. +Project-URL: Homepage, https://github.com/tartley/colorama +Author-email: Jonathan Hartley +License-File: LICENSE.txt +Keywords: ansi,color,colour,crossplatform,terminal,text,windows,xplatform +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Console +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Terminals +Requires-Python: !=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7 +Description-Content-Type: text/x-rst + +.. image:: https://img.shields.io/pypi/v/colorama.svg + :target: https://pypi.org/project/colorama/ + :alt: Latest Version + +.. image:: https://img.shields.io/pypi/pyversions/colorama.svg + :target: https://pypi.org/project/colorama/ + :alt: Supported Python versions + +.. image:: https://github.com/tartley/colorama/actions/workflows/test.yml/badge.svg + :target: https://github.com/tartley/colorama/actions/workflows/test.yml + :alt: Build Status + +Colorama +======== + +Makes ANSI escape character sequences (for producing colored terminal text and +cursor positioning) work under MS Windows. + +.. |donate| image:: https://www.paypalobjects.com/en_US/i/btn/btn_donate_SM.gif + :target: https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=2MZ9D2GMLYCUJ&item_name=Colorama¤cy_code=USD + :alt: Donate with Paypal + +`PyPI for releases `_ | +`Github for source `_ | +`Colorama for enterprise on Tidelift `_ + +If you find Colorama useful, please |donate| to the authors. Thank you! + +Installation +------------ + +Tested on CPython 2.7, 3.7, 3.8, 3.9 and 3.10 and Pypy 2.7 and 3.8. + +No requirements other than the standard library. + +.. code-block:: bash + + pip install colorama + # or + conda install -c anaconda colorama + +Description +----------- + +ANSI escape character sequences have long been used to produce colored terminal +text and cursor positioning on Unix and Macs. Colorama makes this work on +Windows, too, by wrapping ``stdout``, stripping ANSI sequences it finds (which +would appear as gobbledygook in the output), and converting them into the +appropriate win32 calls to modify the state of the terminal. On other platforms, +Colorama does nothing. + +This has the upshot of providing a simple cross-platform API for printing +colored terminal text from Python, and has the happy side-effect that existing +applications or libraries which use ANSI sequences to produce colored output on +Linux or Macs can now also work on Windows, simply by calling +``colorama.just_fix_windows_console()`` (since v0.4.6) or ``colorama.init()`` +(all versions, but may have other side-effects – see below). + +An alternative approach is to install ``ansi.sys`` on Windows machines, which +provides the same behaviour for all applications running in terminals. Colorama +is intended for situations where that isn't easy (e.g., maybe your app doesn't +have an installer.) + +Demo scripts in the source code repository print some colored text using +ANSI sequences. Compare their output under Gnome-terminal's built in ANSI +handling, versus on Windows Command-Prompt using Colorama: + +.. image:: https://github.com/tartley/colorama/raw/master/screenshots/ubuntu-demo.png + :width: 661 + :height: 357 + :alt: ANSI sequences on Ubuntu under gnome-terminal. + +.. image:: https://github.com/tartley/colorama/raw/master/screenshots/windows-demo.png + :width: 668 + :height: 325 + :alt: Same ANSI sequences on Windows, using Colorama. + +These screenshots show that, on Windows, Colorama does not support ANSI 'dim +text'; it looks the same as 'normal text'. + +Usage +----- + +Initialisation +.............. + +If the only thing you want from Colorama is to get ANSI escapes to work on +Windows, then run: + +.. code-block:: python + + from colorama import just_fix_windows_console + just_fix_windows_console() + +If you're on a recent version of Windows 10 or better, and your stdout/stderr +are pointing to a Windows console, then this will flip the magic configuration +switch to enable Windows' built-in ANSI support. + +If you're on an older version of Windows, and your stdout/stderr are pointing to +a Windows console, then this will wrap ``sys.stdout`` and/or ``sys.stderr`` in a +magic file object that intercepts ANSI escape sequences and issues the +appropriate Win32 calls to emulate them. + +In all other circumstances, it does nothing whatsoever. Basically the idea is +that this makes Windows act like Unix with respect to ANSI escape handling. + +It's safe to call this function multiple times. It's safe to call this function +on non-Windows platforms, but it won't do anything. It's safe to call this +function when one or both of your stdout/stderr are redirected to a file – it +won't do anything to those streams. + +Alternatively, you can use the older interface with more features (but also more +potential footguns): + +.. code-block:: python + + from colorama import init + init() + +This does the same thing as ``just_fix_windows_console``, except for the +following differences: + +- It's not safe to call ``init`` multiple times; you can end up with multiple + layers of wrapping and broken ANSI support. + +- Colorama will apply a heuristic to guess whether stdout/stderr support ANSI, + and if it thinks they don't, then it will wrap ``sys.stdout`` and + ``sys.stderr`` in a magic file object that strips out ANSI escape sequences + before printing them. This happens on all platforms, and can be convenient if + you want to write your code to emit ANSI escape sequences unconditionally, and + let Colorama decide whether they should actually be output. But note that + Colorama's heuristic is not particularly clever. + +- ``init`` also accepts explicit keyword args to enable/disable various + functionality – see below. + +To stop using Colorama before your program exits, simply call ``deinit()``. +This will restore ``stdout`` and ``stderr`` to their original values, so that +Colorama is disabled. To resume using Colorama again, call ``reinit()``; it is +cheaper than calling ``init()`` again (but does the same thing). + +Most users should depend on ``colorama >= 0.4.6``, and use +``just_fix_windows_console``. The old ``init`` interface will be supported +indefinitely for backwards compatibility, but we don't plan to fix any issues +with it, also for backwards compatibility. + +Colored Output +.............. + +Cross-platform printing of colored text can then be done using Colorama's +constant shorthand for ANSI escape sequences. These are deliberately +rudimentary, see below. + +.. code-block:: python + + from colorama import Fore, Back, Style + print(Fore.RED + 'some red text') + print(Back.GREEN + 'and with a green background') + print(Style.DIM + 'and in dim text') + print(Style.RESET_ALL) + print('back to normal now') + +...or simply by manually printing ANSI sequences from your own code: + +.. code-block:: python + + print('\033[31m' + 'some red text') + print('\033[39m') # and reset to default color + +...or, Colorama can be used in conjunction with existing ANSI libraries +such as the venerable `Termcolor `_ +the fabulous `Blessings `_, +or the incredible `_Rich `_. + +If you wish Colorama's Fore, Back and Style constants were more capable, +then consider using one of the above highly capable libraries to generate +colors, etc, and use Colorama just for its primary purpose: to convert +those ANSI sequences to also work on Windows: + +SIMILARLY, do not send PRs adding the generation of new ANSI types to Colorama. +We are only interested in converting ANSI codes to win32 API calls, not +shortcuts like the above to generate ANSI characters. + +.. code-block:: python + + from colorama import just_fix_windows_console + from termcolor import colored + + # use Colorama to make Termcolor work on Windows too + just_fix_windows_console() + + # then use Termcolor for all colored text output + print(colored('Hello, World!', 'green', 'on_red')) + +Available formatting constants are:: + + Fore: BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE, RESET. + Back: BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE, RESET. + Style: DIM, NORMAL, BRIGHT, RESET_ALL + +``Style.RESET_ALL`` resets foreground, background, and brightness. Colorama will +perform this reset automatically on program exit. + +These are fairly well supported, but not part of the standard:: + + Fore: LIGHTBLACK_EX, LIGHTRED_EX, LIGHTGREEN_EX, LIGHTYELLOW_EX, LIGHTBLUE_EX, LIGHTMAGENTA_EX, LIGHTCYAN_EX, LIGHTWHITE_EX + Back: LIGHTBLACK_EX, LIGHTRED_EX, LIGHTGREEN_EX, LIGHTYELLOW_EX, LIGHTBLUE_EX, LIGHTMAGENTA_EX, LIGHTCYAN_EX, LIGHTWHITE_EX + +Cursor Positioning +.................. + +ANSI codes to reposition the cursor are supported. See ``demos/demo06.py`` for +an example of how to generate them. + +Init Keyword Args +................. + +``init()`` accepts some ``**kwargs`` to override default behaviour. + +init(autoreset=False): + If you find yourself repeatedly sending reset sequences to turn off color + changes at the end of every print, then ``init(autoreset=True)`` will + automate that: + + .. code-block:: python + + from colorama import init + init(autoreset=True) + print(Fore.RED + 'some red text') + print('automatically back to default color again') + +init(strip=None): + Pass ``True`` or ``False`` to override whether ANSI codes should be + stripped from the output. The default behaviour is to strip if on Windows + or if output is redirected (not a tty). + +init(convert=None): + Pass ``True`` or ``False`` to override whether to convert ANSI codes in the + output into win32 calls. The default behaviour is to convert if on Windows + and output is to a tty (terminal). + +init(wrap=True): + On Windows, Colorama works by replacing ``sys.stdout`` and ``sys.stderr`` + with proxy objects, which override the ``.write()`` method to do their work. + If this wrapping causes you problems, then this can be disabled by passing + ``init(wrap=False)``. The default behaviour is to wrap if ``autoreset`` or + ``strip`` or ``convert`` are True. + + When wrapping is disabled, colored printing on non-Windows platforms will + continue to work as normal. To do cross-platform colored output, you can + use Colorama's ``AnsiToWin32`` proxy directly: + + .. code-block:: python + + import sys + from colorama import init, AnsiToWin32 + init(wrap=False) + stream = AnsiToWin32(sys.stderr).stream + + # Python 2 + print >>stream, Fore.BLUE + 'blue text on stderr' + + # Python 3 + print(Fore.BLUE + 'blue text on stderr', file=stream) + +Recognised ANSI Sequences +......................... + +ANSI sequences generally take the form:: + + ESC [ ; ... + +Where ```` is an integer, and ```` is a single letter. Zero or +more params are passed to a ````. If no params are passed, it is +generally synonymous with passing a single zero. No spaces exist in the +sequence; they have been inserted here simply to read more easily. + +The only ANSI sequences that Colorama converts into win32 calls are:: + + ESC [ 0 m # reset all (colors and brightness) + ESC [ 1 m # bright + ESC [ 2 m # dim (looks same as normal brightness) + ESC [ 22 m # normal brightness + + # FOREGROUND: + ESC [ 30 m # black + ESC [ 31 m # red + ESC [ 32 m # green + ESC [ 33 m # yellow + ESC [ 34 m # blue + ESC [ 35 m # magenta + ESC [ 36 m # cyan + ESC [ 37 m # white + ESC [ 39 m # reset + + # BACKGROUND + ESC [ 40 m # black + ESC [ 41 m # red + ESC [ 42 m # green + ESC [ 43 m # yellow + ESC [ 44 m # blue + ESC [ 45 m # magenta + ESC [ 46 m # cyan + ESC [ 47 m # white + ESC [ 49 m # reset + + # cursor positioning + ESC [ y;x H # position cursor at x across, y down + ESC [ y;x f # position cursor at x across, y down + ESC [ n A # move cursor n lines up + ESC [ n B # move cursor n lines down + ESC [ n C # move cursor n characters forward + ESC [ n D # move cursor n characters backward + + # clear the screen + ESC [ mode J # clear the screen + + # clear the line + ESC [ mode K # clear the line + +Multiple numeric params to the ``'m'`` command can be combined into a single +sequence:: + + ESC [ 36 ; 45 ; 1 m # bright cyan text on magenta background + +All other ANSI sequences of the form ``ESC [ ; ... `` +are silently stripped from the output on Windows. + +Any other form of ANSI sequence, such as single-character codes or alternative +initial characters, are not recognised or stripped. It would be cool to add +them though. Let me know if it would be useful for you, via the Issues on +GitHub. + +Status & Known Problems +----------------------- + +I've personally only tested it on Windows XP (CMD, Console2), Ubuntu +(gnome-terminal, xterm), and OS X. + +Some valid ANSI sequences aren't recognised. + +If you're hacking on the code, see `README-hacking.md`_. ESPECIALLY, see the +explanation there of why we do not want PRs that allow Colorama to generate new +types of ANSI codes. + +See outstanding issues and wish-list: +https://github.com/tartley/colorama/issues + +If anything doesn't work for you, or doesn't do what you expected or hoped for, +I'd love to hear about it on that issues list, would be delighted by patches, +and would be happy to grant commit access to anyone who submits a working patch +or two. + +.. _README-hacking.md: README-hacking.md + +License +------- + +Copyright Jonathan Hartley & Arnon Yaari, 2013-2020. BSD 3-Clause license; see +LICENSE file. + +Professional support +-------------------- + +.. |tideliftlogo| image:: https://cdn2.hubspot.net/hubfs/4008838/website/logos/logos_for_download/Tidelift_primary-shorthand-logo.png + :alt: Tidelift + :target: https://tidelift.com/subscription/pkg/pypi-colorama?utm_source=pypi-colorama&utm_medium=referral&utm_campaign=readme + +.. list-table:: + :widths: 10 100 + + * - |tideliftlogo| + - Professional support for colorama is available as part of the + `Tidelift Subscription`_. + Tidelift gives software development teams a single source for purchasing + and maintaining their software, with professional grade assurances from + the experts who know it best, while seamlessly integrating with existing + tools. + +.. _Tidelift Subscription: https://tidelift.com/subscription/pkg/pypi-colorama?utm_source=pypi-colorama&utm_medium=referral&utm_campaign=readme + +Thanks +------ + +See the CHANGELOG for more thanks! + +* Marc Schlaich (schlamar) for a ``setup.py`` fix for Python2.5. +* Marc Abramowitz, reported & fixed a crash on exit with closed ``stdout``, + providing a solution to issue #7's setuptools/distutils debate, + and other fixes. +* User 'eryksun', for guidance on correctly instantiating ``ctypes.windll``. +* Matthew McCormick for politely pointing out a longstanding crash on non-Win. +* Ben Hoyt, for a magnificent fix under 64-bit Windows. +* Jesse at Empty Square for submitting a fix for examples in the README. +* User 'jamessp', an observant documentation fix for cursor positioning. +* User 'vaal1239', Dave Mckee & Lackner Kristof for a tiny but much-needed Win7 + fix. +* Julien Stuyck, for wisely suggesting Python3 compatible updates to README. +* Daniel Griffith for multiple fabulous patches. +* Oscar Lesta for a valuable fix to stop ANSI chars being sent to non-tty + output. +* Roger Binns, for many suggestions, valuable feedback, & bug reports. +* Tim Golden for thought and much appreciated feedback on the initial idea. +* User 'Zearin' for updates to the README file. +* John Szakmeister for adding support for light colors +* Charles Merriam for adding documentation to demos +* Jurko for a fix on 64-bit Windows CPython2.5 w/o ctypes +* Florian Bruhin for a fix when stdout or stderr are None +* Thomas Weininger for fixing ValueError on Windows +* Remi Rampin for better Github integration and fixes to the README file +* Simeon Visser for closing a file handle using 'with' and updating classifiers + to include Python 3.3 and 3.4 +* Andy Neff for fixing RESET of LIGHT_EX colors. +* Jonathan Hartley for the initial idea and implementation. diff --git a/app/src/flask-server/venv/Lib/site-packages/colorama-0.4.6.dist-info/RECORD b/app/src/flask-server/venv/Lib/site-packages/colorama-0.4.6.dist-info/RECORD new file mode 100644 index 0000000..8c5f12d --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/colorama-0.4.6.dist-info/RECORD @@ -0,0 +1,31 @@ +colorama-0.4.6.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +colorama-0.4.6.dist-info/METADATA,sha256=e67SnrUMOym9sz_4TjF3vxvAV4T3aF7NyqRHHH3YEMw,17158 +colorama-0.4.6.dist-info/RECORD,, +colorama-0.4.6.dist-info/WHEEL,sha256=cdcF4Fbd0FPtw2EMIOwH-3rSOTUdTCeOSXRMD1iLUb8,105 +colorama-0.4.6.dist-info/licenses/LICENSE.txt,sha256=ysNcAmhuXQSlpxQL-zs25zrtSWZW6JEQLkKIhteTAxg,1491 +colorama/__init__.py,sha256=wePQA4U20tKgYARySLEC047ucNX-g8pRLpYBuiHlLb8,266 +colorama/__pycache__/__init__.cpython-310.pyc,, +colorama/__pycache__/ansi.cpython-310.pyc,, +colorama/__pycache__/ansitowin32.cpython-310.pyc,, +colorama/__pycache__/initialise.cpython-310.pyc,, +colorama/__pycache__/win32.cpython-310.pyc,, +colorama/__pycache__/winterm.cpython-310.pyc,, +colorama/ansi.py,sha256=Top4EeEuaQdBWdteKMEcGOTeKeF19Q-Wo_6_Cj5kOzQ,2522 +colorama/ansitowin32.py,sha256=vPNYa3OZbxjbuFyaVo0Tmhmy1FZ1lKMWCnT7odXpItk,11128 +colorama/initialise.py,sha256=-hIny86ClXo39ixh5iSCfUIa2f_h_bgKRDW7gqs-KLU,3325 +colorama/tests/__init__.py,sha256=MkgPAEzGQd-Rq0w0PZXSX2LadRWhUECcisJY8lSrm4Q,75 +colorama/tests/__pycache__/__init__.cpython-310.pyc,, +colorama/tests/__pycache__/ansi_test.cpython-310.pyc,, +colorama/tests/__pycache__/ansitowin32_test.cpython-310.pyc,, +colorama/tests/__pycache__/initialise_test.cpython-310.pyc,, +colorama/tests/__pycache__/isatty_test.cpython-310.pyc,, +colorama/tests/__pycache__/utils.cpython-310.pyc,, +colorama/tests/__pycache__/winterm_test.cpython-310.pyc,, +colorama/tests/ansi_test.py,sha256=FeViDrUINIZcr505PAxvU4AjXz1asEiALs9GXMhwRaE,2839 +colorama/tests/ansitowin32_test.py,sha256=RN7AIhMJ5EqDsYaCjVo-o4u8JzDD4ukJbmevWKS70rY,10678 +colorama/tests/initialise_test.py,sha256=BbPy-XfyHwJ6zKozuQOvNvQZzsx9vdb_0bYXn7hsBTc,6741 +colorama/tests/isatty_test.py,sha256=Pg26LRpv0yQDB5Ac-sxgVXG7hsA1NYvapFgApZfYzZg,1866 +colorama/tests/utils.py,sha256=1IIRylG39z5-dzq09R_ngufxyPZxgldNbrxKxUGwGKE,1079 +colorama/tests/winterm_test.py,sha256=qoWFPEjym5gm2RuMwpf3pOis3a5r_PJZFCzK254JL8A,3709 +colorama/win32.py,sha256=YQOKwMTwtGBbsY4dL5HYTvwTeP9wIQra5MvPNddpxZs,6181 +colorama/winterm.py,sha256=XCQFDHjPi6AHYNdZwy0tA02H-Jh48Jp-HvCjeLeLp3U,7134 diff --git a/app/src/flask-server/venv/Lib/site-packages/colorama-0.4.6.dist-info/WHEEL b/app/src/flask-server/venv/Lib/site-packages/colorama-0.4.6.dist-info/WHEEL new file mode 100644 index 0000000..d79189f --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/colorama-0.4.6.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: hatchling 1.11.1 +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any diff --git a/app/src/flask-server/venv/Lib/site-packages/colorama-0.4.6.dist-info/licenses/LICENSE.txt b/app/src/flask-server/venv/Lib/site-packages/colorama-0.4.6.dist-info/licenses/LICENSE.txt new file mode 100644 index 0000000..3105888 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/colorama-0.4.6.dist-info/licenses/LICENSE.txt @@ -0,0 +1,27 @@ +Copyright (c) 2010 Jonathan Hartley +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the copyright holders, nor those of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/app/src/flask-server/venv/Lib/site-packages/colorama/__init__.py b/app/src/flask-server/venv/Lib/site-packages/colorama/__init__.py new file mode 100644 index 0000000..383101c --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/colorama/__init__.py @@ -0,0 +1,7 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +from .initialise import init, deinit, reinit, colorama_text, just_fix_windows_console +from .ansi import Fore, Back, Style, Cursor +from .ansitowin32 import AnsiToWin32 + +__version__ = '0.4.6' + diff --git a/app/src/flask-server/venv/Lib/site-packages/colorama/__pycache__/__init__.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/colorama/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000..ab0e982 Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/colorama/__pycache__/__init__.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/colorama/__pycache__/ansi.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/colorama/__pycache__/ansi.cpython-310.pyc new file mode 100644 index 0000000..cdbee15 Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/colorama/__pycache__/ansi.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/colorama/__pycache__/ansitowin32.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/colorama/__pycache__/ansitowin32.cpython-310.pyc new file mode 100644 index 0000000..0a10a0f Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/colorama/__pycache__/ansitowin32.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/colorama/__pycache__/initialise.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/colorama/__pycache__/initialise.cpython-310.pyc new file mode 100644 index 0000000..2d92044 Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/colorama/__pycache__/initialise.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/colorama/__pycache__/win32.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/colorama/__pycache__/win32.cpython-310.pyc new file mode 100644 index 0000000..c7883d7 Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/colorama/__pycache__/win32.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/colorama/__pycache__/winterm.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/colorama/__pycache__/winterm.cpython-310.pyc new file mode 100644 index 0000000..ecf015a Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/colorama/__pycache__/winterm.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/colorama/ansi.py b/app/src/flask-server/venv/Lib/site-packages/colorama/ansi.py new file mode 100644 index 0000000..11ec695 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/colorama/ansi.py @@ -0,0 +1,102 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +''' +This module generates ANSI character codes to printing colors to terminals. +See: http://en.wikipedia.org/wiki/ANSI_escape_code +''' + +CSI = '\033[' +OSC = '\033]' +BEL = '\a' + + +def code_to_chars(code): + return CSI + str(code) + 'm' + +def set_title(title): + return OSC + '2;' + title + BEL + +def clear_screen(mode=2): + return CSI + str(mode) + 'J' + +def clear_line(mode=2): + return CSI + str(mode) + 'K' + + +class AnsiCodes(object): + def __init__(self): + # the subclasses declare class attributes which are numbers. + # Upon instantiation we define instance attributes, which are the same + # as the class attributes but wrapped with the ANSI escape sequence + for name in dir(self): + if not name.startswith('_'): + value = getattr(self, name) + setattr(self, name, code_to_chars(value)) + + +class AnsiCursor(object): + def UP(self, n=1): + return CSI + str(n) + 'A' + def DOWN(self, n=1): + return CSI + str(n) + 'B' + def FORWARD(self, n=1): + return CSI + str(n) + 'C' + def BACK(self, n=1): + return CSI + str(n) + 'D' + def POS(self, x=1, y=1): + return CSI + str(y) + ';' + str(x) + 'H' + + +class AnsiFore(AnsiCodes): + BLACK = 30 + RED = 31 + GREEN = 32 + YELLOW = 33 + BLUE = 34 + MAGENTA = 35 + CYAN = 36 + WHITE = 37 + RESET = 39 + + # These are fairly well supported, but not part of the standard. + LIGHTBLACK_EX = 90 + LIGHTRED_EX = 91 + LIGHTGREEN_EX = 92 + LIGHTYELLOW_EX = 93 + LIGHTBLUE_EX = 94 + LIGHTMAGENTA_EX = 95 + LIGHTCYAN_EX = 96 + LIGHTWHITE_EX = 97 + + +class AnsiBack(AnsiCodes): + BLACK = 40 + RED = 41 + GREEN = 42 + YELLOW = 43 + BLUE = 44 + MAGENTA = 45 + CYAN = 46 + WHITE = 47 + RESET = 49 + + # These are fairly well supported, but not part of the standard. + LIGHTBLACK_EX = 100 + LIGHTRED_EX = 101 + LIGHTGREEN_EX = 102 + LIGHTYELLOW_EX = 103 + LIGHTBLUE_EX = 104 + LIGHTMAGENTA_EX = 105 + LIGHTCYAN_EX = 106 + LIGHTWHITE_EX = 107 + + +class AnsiStyle(AnsiCodes): + BRIGHT = 1 + DIM = 2 + NORMAL = 22 + RESET_ALL = 0 + +Fore = AnsiFore() +Back = AnsiBack() +Style = AnsiStyle() +Cursor = AnsiCursor() diff --git a/app/src/flask-server/venv/Lib/site-packages/colorama/ansitowin32.py b/app/src/flask-server/venv/Lib/site-packages/colorama/ansitowin32.py new file mode 100644 index 0000000..abf209e --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/colorama/ansitowin32.py @@ -0,0 +1,277 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +import re +import sys +import os + +from .ansi import AnsiFore, AnsiBack, AnsiStyle, Style, BEL +from .winterm import enable_vt_processing, WinTerm, WinColor, WinStyle +from .win32 import windll, winapi_test + + +winterm = None +if windll is not None: + winterm = WinTerm() + + +class StreamWrapper(object): + ''' + Wraps a stream (such as stdout), acting as a transparent proxy for all + attribute access apart from method 'write()', which is delegated to our + Converter instance. + ''' + def __init__(self, wrapped, converter): + # double-underscore everything to prevent clashes with names of + # attributes on the wrapped stream object. + self.__wrapped = wrapped + self.__convertor = converter + + def __getattr__(self, name): + return getattr(self.__wrapped, name) + + def __enter__(self, *args, **kwargs): + # special method lookup bypasses __getattr__/__getattribute__, see + # https://stackoverflow.com/questions/12632894/why-doesnt-getattr-work-with-exit + # thus, contextlib magic methods are not proxied via __getattr__ + return self.__wrapped.__enter__(*args, **kwargs) + + def __exit__(self, *args, **kwargs): + return self.__wrapped.__exit__(*args, **kwargs) + + def __setstate__(self, state): + self.__dict__ = state + + def __getstate__(self): + return self.__dict__ + + def write(self, text): + self.__convertor.write(text) + + def isatty(self): + stream = self.__wrapped + if 'PYCHARM_HOSTED' in os.environ: + if stream is not None and (stream is sys.__stdout__ or stream is sys.__stderr__): + return True + try: + stream_isatty = stream.isatty + except AttributeError: + return False + else: + return stream_isatty() + + @property + def closed(self): + stream = self.__wrapped + try: + return stream.closed + # AttributeError in the case that the stream doesn't support being closed + # ValueError for the case that the stream has already been detached when atexit runs + except (AttributeError, ValueError): + return True + + +class AnsiToWin32(object): + ''' + Implements a 'write()' method which, on Windows, will strip ANSI character + sequences from the text, and if outputting to a tty, will convert them into + win32 function calls. + ''' + ANSI_CSI_RE = re.compile('\001?\033\\[((?:\\d|;)*)([a-zA-Z])\002?') # Control Sequence Introducer + ANSI_OSC_RE = re.compile('\001?\033\\]([^\a]*)(\a)\002?') # Operating System Command + + def __init__(self, wrapped, convert=None, strip=None, autoreset=False): + # The wrapped stream (normally sys.stdout or sys.stderr) + self.wrapped = wrapped + + # should we reset colors to defaults after every .write() + self.autoreset = autoreset + + # create the proxy wrapping our output stream + self.stream = StreamWrapper(wrapped, self) + + on_windows = os.name == 'nt' + # We test if the WinAPI works, because even if we are on Windows + # we may be using a terminal that doesn't support the WinAPI + # (e.g. Cygwin Terminal). In this case it's up to the terminal + # to support the ANSI codes. + conversion_supported = on_windows and winapi_test() + try: + fd = wrapped.fileno() + except Exception: + fd = -1 + system_has_native_ansi = not on_windows or enable_vt_processing(fd) + have_tty = not self.stream.closed and self.stream.isatty() + need_conversion = conversion_supported and not system_has_native_ansi + + # should we strip ANSI sequences from our output? + if strip is None: + strip = need_conversion or not have_tty + self.strip = strip + + # should we should convert ANSI sequences into win32 calls? + if convert is None: + convert = need_conversion and have_tty + self.convert = convert + + # dict of ansi codes to win32 functions and parameters + self.win32_calls = self.get_win32_calls() + + # are we wrapping stderr? + self.on_stderr = self.wrapped is sys.stderr + + def should_wrap(self): + ''' + True if this class is actually needed. If false, then the output + stream will not be affected, nor will win32 calls be issued, so + wrapping stdout is not actually required. This will generally be + False on non-Windows platforms, unless optional functionality like + autoreset has been requested using kwargs to init() + ''' + return self.convert or self.strip or self.autoreset + + def get_win32_calls(self): + if self.convert and winterm: + return { + AnsiStyle.RESET_ALL: (winterm.reset_all, ), + AnsiStyle.BRIGHT: (winterm.style, WinStyle.BRIGHT), + AnsiStyle.DIM: (winterm.style, WinStyle.NORMAL), + AnsiStyle.NORMAL: (winterm.style, WinStyle.NORMAL), + AnsiFore.BLACK: (winterm.fore, WinColor.BLACK), + AnsiFore.RED: (winterm.fore, WinColor.RED), + AnsiFore.GREEN: (winterm.fore, WinColor.GREEN), + AnsiFore.YELLOW: (winterm.fore, WinColor.YELLOW), + AnsiFore.BLUE: (winterm.fore, WinColor.BLUE), + AnsiFore.MAGENTA: (winterm.fore, WinColor.MAGENTA), + AnsiFore.CYAN: (winterm.fore, WinColor.CYAN), + AnsiFore.WHITE: (winterm.fore, WinColor.GREY), + AnsiFore.RESET: (winterm.fore, ), + AnsiFore.LIGHTBLACK_EX: (winterm.fore, WinColor.BLACK, True), + AnsiFore.LIGHTRED_EX: (winterm.fore, WinColor.RED, True), + AnsiFore.LIGHTGREEN_EX: (winterm.fore, WinColor.GREEN, True), + AnsiFore.LIGHTYELLOW_EX: (winterm.fore, WinColor.YELLOW, True), + AnsiFore.LIGHTBLUE_EX: (winterm.fore, WinColor.BLUE, True), + AnsiFore.LIGHTMAGENTA_EX: (winterm.fore, WinColor.MAGENTA, True), + AnsiFore.LIGHTCYAN_EX: (winterm.fore, WinColor.CYAN, True), + AnsiFore.LIGHTWHITE_EX: (winterm.fore, WinColor.GREY, True), + AnsiBack.BLACK: (winterm.back, WinColor.BLACK), + AnsiBack.RED: (winterm.back, WinColor.RED), + AnsiBack.GREEN: (winterm.back, WinColor.GREEN), + AnsiBack.YELLOW: (winterm.back, WinColor.YELLOW), + AnsiBack.BLUE: (winterm.back, WinColor.BLUE), + AnsiBack.MAGENTA: (winterm.back, WinColor.MAGENTA), + AnsiBack.CYAN: (winterm.back, WinColor.CYAN), + AnsiBack.WHITE: (winterm.back, WinColor.GREY), + AnsiBack.RESET: (winterm.back, ), + AnsiBack.LIGHTBLACK_EX: (winterm.back, WinColor.BLACK, True), + AnsiBack.LIGHTRED_EX: (winterm.back, WinColor.RED, True), + AnsiBack.LIGHTGREEN_EX: (winterm.back, WinColor.GREEN, True), + AnsiBack.LIGHTYELLOW_EX: (winterm.back, WinColor.YELLOW, True), + AnsiBack.LIGHTBLUE_EX: (winterm.back, WinColor.BLUE, True), + AnsiBack.LIGHTMAGENTA_EX: (winterm.back, WinColor.MAGENTA, True), + AnsiBack.LIGHTCYAN_EX: (winterm.back, WinColor.CYAN, True), + AnsiBack.LIGHTWHITE_EX: (winterm.back, WinColor.GREY, True), + } + return dict() + + def write(self, text): + if self.strip or self.convert: + self.write_and_convert(text) + else: + self.wrapped.write(text) + self.wrapped.flush() + if self.autoreset: + self.reset_all() + + + def reset_all(self): + if self.convert: + self.call_win32('m', (0,)) + elif not self.strip and not self.stream.closed: + self.wrapped.write(Style.RESET_ALL) + + + def write_and_convert(self, text): + ''' + Write the given text to our wrapped stream, stripping any ANSI + sequences from the text, and optionally converting them into win32 + calls. + ''' + cursor = 0 + text = self.convert_osc(text) + for match in self.ANSI_CSI_RE.finditer(text): + start, end = match.span() + self.write_plain_text(text, cursor, start) + self.convert_ansi(*match.groups()) + cursor = end + self.write_plain_text(text, cursor, len(text)) + + + def write_plain_text(self, text, start, end): + if start < end: + self.wrapped.write(text[start:end]) + self.wrapped.flush() + + + def convert_ansi(self, paramstring, command): + if self.convert: + params = self.extract_params(command, paramstring) + self.call_win32(command, params) + + + def extract_params(self, command, paramstring): + if command in 'Hf': + params = tuple(int(p) if len(p) != 0 else 1 for p in paramstring.split(';')) + while len(params) < 2: + # defaults: + params = params + (1,) + else: + params = tuple(int(p) for p in paramstring.split(';') if len(p) != 0) + if len(params) == 0: + # defaults: + if command in 'JKm': + params = (0,) + elif command in 'ABCD': + params = (1,) + + return params + + + def call_win32(self, command, params): + if command == 'm': + for param in params: + if param in self.win32_calls: + func_args = self.win32_calls[param] + func = func_args[0] + args = func_args[1:] + kwargs = dict(on_stderr=self.on_stderr) + func(*args, **kwargs) + elif command in 'J': + winterm.erase_screen(params[0], on_stderr=self.on_stderr) + elif command in 'K': + winterm.erase_line(params[0], on_stderr=self.on_stderr) + elif command in 'Hf': # cursor position - absolute + winterm.set_cursor_position(params, on_stderr=self.on_stderr) + elif command in 'ABCD': # cursor position - relative + n = params[0] + # A - up, B - down, C - forward, D - back + x, y = {'A': (0, -n), 'B': (0, n), 'C': (n, 0), 'D': (-n, 0)}[command] + winterm.cursor_adjust(x, y, on_stderr=self.on_stderr) + + + def convert_osc(self, text): + for match in self.ANSI_OSC_RE.finditer(text): + start, end = match.span() + text = text[:start] + text[end:] + paramstring, command = match.groups() + if command == BEL: + if paramstring.count(";") == 1: + params = paramstring.split(";") + # 0 - change title and icon (we will only change title) + # 1 - change icon (we don't support this) + # 2 - change title + if params[0] in '02': + winterm.set_title(params[1]) + return text + + + def flush(self): + self.wrapped.flush() diff --git a/app/src/flask-server/venv/Lib/site-packages/colorama/initialise.py b/app/src/flask-server/venv/Lib/site-packages/colorama/initialise.py new file mode 100644 index 0000000..d5fd4b7 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/colorama/initialise.py @@ -0,0 +1,121 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +import atexit +import contextlib +import sys + +from .ansitowin32 import AnsiToWin32 + + +def _wipe_internal_state_for_tests(): + global orig_stdout, orig_stderr + orig_stdout = None + orig_stderr = None + + global wrapped_stdout, wrapped_stderr + wrapped_stdout = None + wrapped_stderr = None + + global atexit_done + atexit_done = False + + global fixed_windows_console + fixed_windows_console = False + + try: + # no-op if it wasn't registered + atexit.unregister(reset_all) + except AttributeError: + # python 2: no atexit.unregister. Oh well, we did our best. + pass + + +def reset_all(): + if AnsiToWin32 is not None: # Issue #74: objects might become None at exit + AnsiToWin32(orig_stdout).reset_all() + + +def init(autoreset=False, convert=None, strip=None, wrap=True): + + if not wrap and any([autoreset, convert, strip]): + raise ValueError('wrap=False conflicts with any other arg=True') + + global wrapped_stdout, wrapped_stderr + global orig_stdout, orig_stderr + + orig_stdout = sys.stdout + orig_stderr = sys.stderr + + if sys.stdout is None: + wrapped_stdout = None + else: + sys.stdout = wrapped_stdout = \ + wrap_stream(orig_stdout, convert, strip, autoreset, wrap) + if sys.stderr is None: + wrapped_stderr = None + else: + sys.stderr = wrapped_stderr = \ + wrap_stream(orig_stderr, convert, strip, autoreset, wrap) + + global atexit_done + if not atexit_done: + atexit.register(reset_all) + atexit_done = True + + +def deinit(): + if orig_stdout is not None: + sys.stdout = orig_stdout + if orig_stderr is not None: + sys.stderr = orig_stderr + + +def just_fix_windows_console(): + global fixed_windows_console + + if sys.platform != "win32": + return + if fixed_windows_console: + return + if wrapped_stdout is not None or wrapped_stderr is not None: + # Someone already ran init() and it did stuff, so we won't second-guess them + return + + # On newer versions of Windows, AnsiToWin32.__init__ will implicitly enable the + # native ANSI support in the console as a side-effect. We only need to actually + # replace sys.stdout/stderr if we're in the old-style conversion mode. + new_stdout = AnsiToWin32(sys.stdout, convert=None, strip=None, autoreset=False) + if new_stdout.convert: + sys.stdout = new_stdout + new_stderr = AnsiToWin32(sys.stderr, convert=None, strip=None, autoreset=False) + if new_stderr.convert: + sys.stderr = new_stderr + + fixed_windows_console = True + +@contextlib.contextmanager +def colorama_text(*args, **kwargs): + init(*args, **kwargs) + try: + yield + finally: + deinit() + + +def reinit(): + if wrapped_stdout is not None: + sys.stdout = wrapped_stdout + if wrapped_stderr is not None: + sys.stderr = wrapped_stderr + + +def wrap_stream(stream, convert, strip, autoreset, wrap): + if wrap: + wrapper = AnsiToWin32(stream, + convert=convert, strip=strip, autoreset=autoreset) + if wrapper.should_wrap(): + stream = wrapper.stream + return stream + + +# Use this for initial setup as well, to reduce code duplication +_wipe_internal_state_for_tests() diff --git a/app/src/flask-server/venv/Lib/site-packages/colorama/tests/__init__.py b/app/src/flask-server/venv/Lib/site-packages/colorama/tests/__init__.py new file mode 100644 index 0000000..8c5661e --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/colorama/tests/__init__.py @@ -0,0 +1 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. diff --git a/app/src/flask-server/venv/Lib/site-packages/colorama/tests/__pycache__/__init__.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/colorama/tests/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000..e6d1198 Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/colorama/tests/__pycache__/__init__.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/colorama/tests/__pycache__/ansi_test.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/colorama/tests/__pycache__/ansi_test.cpython-310.pyc new file mode 100644 index 0000000..24ecdca Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/colorama/tests/__pycache__/ansi_test.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/colorama/tests/__pycache__/ansitowin32_test.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/colorama/tests/__pycache__/ansitowin32_test.cpython-310.pyc new file mode 100644 index 0000000..9cb5776 Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/colorama/tests/__pycache__/ansitowin32_test.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/colorama/tests/__pycache__/initialise_test.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/colorama/tests/__pycache__/initialise_test.cpython-310.pyc new file mode 100644 index 0000000..e822c68 Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/colorama/tests/__pycache__/initialise_test.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/colorama/tests/__pycache__/isatty_test.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/colorama/tests/__pycache__/isatty_test.cpython-310.pyc new file mode 100644 index 0000000..e321299 Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/colorama/tests/__pycache__/isatty_test.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/colorama/tests/__pycache__/utils.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/colorama/tests/__pycache__/utils.cpython-310.pyc new file mode 100644 index 0000000..5421772 Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/colorama/tests/__pycache__/utils.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/colorama/tests/__pycache__/winterm_test.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/colorama/tests/__pycache__/winterm_test.cpython-310.pyc new file mode 100644 index 0000000..aa529c2 Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/colorama/tests/__pycache__/winterm_test.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/colorama/tests/ansi_test.py b/app/src/flask-server/venv/Lib/site-packages/colorama/tests/ansi_test.py new file mode 100644 index 0000000..0a20c80 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/colorama/tests/ansi_test.py @@ -0,0 +1,76 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +import sys +from unittest import TestCase, main + +from ..ansi import Back, Fore, Style +from ..ansitowin32 import AnsiToWin32 + +stdout_orig = sys.stdout +stderr_orig = sys.stderr + + +class AnsiTest(TestCase): + + def setUp(self): + # sanity check: stdout should be a file or StringIO object. + # It will only be AnsiToWin32 if init() has previously wrapped it + self.assertNotEqual(type(sys.stdout), AnsiToWin32) + self.assertNotEqual(type(sys.stderr), AnsiToWin32) + + def tearDown(self): + sys.stdout = stdout_orig + sys.stderr = stderr_orig + + + def testForeAttributes(self): + self.assertEqual(Fore.BLACK, '\033[30m') + self.assertEqual(Fore.RED, '\033[31m') + self.assertEqual(Fore.GREEN, '\033[32m') + self.assertEqual(Fore.YELLOW, '\033[33m') + self.assertEqual(Fore.BLUE, '\033[34m') + self.assertEqual(Fore.MAGENTA, '\033[35m') + self.assertEqual(Fore.CYAN, '\033[36m') + self.assertEqual(Fore.WHITE, '\033[37m') + self.assertEqual(Fore.RESET, '\033[39m') + + # Check the light, extended versions. + self.assertEqual(Fore.LIGHTBLACK_EX, '\033[90m') + self.assertEqual(Fore.LIGHTRED_EX, '\033[91m') + self.assertEqual(Fore.LIGHTGREEN_EX, '\033[92m') + self.assertEqual(Fore.LIGHTYELLOW_EX, '\033[93m') + self.assertEqual(Fore.LIGHTBLUE_EX, '\033[94m') + self.assertEqual(Fore.LIGHTMAGENTA_EX, '\033[95m') + self.assertEqual(Fore.LIGHTCYAN_EX, '\033[96m') + self.assertEqual(Fore.LIGHTWHITE_EX, '\033[97m') + + + def testBackAttributes(self): + self.assertEqual(Back.BLACK, '\033[40m') + self.assertEqual(Back.RED, '\033[41m') + self.assertEqual(Back.GREEN, '\033[42m') + self.assertEqual(Back.YELLOW, '\033[43m') + self.assertEqual(Back.BLUE, '\033[44m') + self.assertEqual(Back.MAGENTA, '\033[45m') + self.assertEqual(Back.CYAN, '\033[46m') + self.assertEqual(Back.WHITE, '\033[47m') + self.assertEqual(Back.RESET, '\033[49m') + + # Check the light, extended versions. + self.assertEqual(Back.LIGHTBLACK_EX, '\033[100m') + self.assertEqual(Back.LIGHTRED_EX, '\033[101m') + self.assertEqual(Back.LIGHTGREEN_EX, '\033[102m') + self.assertEqual(Back.LIGHTYELLOW_EX, '\033[103m') + self.assertEqual(Back.LIGHTBLUE_EX, '\033[104m') + self.assertEqual(Back.LIGHTMAGENTA_EX, '\033[105m') + self.assertEqual(Back.LIGHTCYAN_EX, '\033[106m') + self.assertEqual(Back.LIGHTWHITE_EX, '\033[107m') + + + def testStyleAttributes(self): + self.assertEqual(Style.DIM, '\033[2m') + self.assertEqual(Style.NORMAL, '\033[22m') + self.assertEqual(Style.BRIGHT, '\033[1m') + + +if __name__ == '__main__': + main() diff --git a/app/src/flask-server/venv/Lib/site-packages/colorama/tests/ansitowin32_test.py b/app/src/flask-server/venv/Lib/site-packages/colorama/tests/ansitowin32_test.py new file mode 100644 index 0000000..91ca551 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/colorama/tests/ansitowin32_test.py @@ -0,0 +1,294 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +from io import StringIO, TextIOWrapper +from unittest import TestCase, main +try: + from contextlib import ExitStack +except ImportError: + # python 2 + from contextlib2 import ExitStack + +try: + from unittest.mock import MagicMock, Mock, patch +except ImportError: + from mock import MagicMock, Mock, patch + +from ..ansitowin32 import AnsiToWin32, StreamWrapper +from ..win32 import ENABLE_VIRTUAL_TERMINAL_PROCESSING +from .utils import osname + + +class StreamWrapperTest(TestCase): + + def testIsAProxy(self): + mockStream = Mock() + wrapper = StreamWrapper(mockStream, None) + self.assertTrue( wrapper.random_attr is mockStream.random_attr ) + + def testDelegatesWrite(self): + mockStream = Mock() + mockConverter = Mock() + wrapper = StreamWrapper(mockStream, mockConverter) + wrapper.write('hello') + self.assertTrue(mockConverter.write.call_args, (('hello',), {})) + + def testDelegatesContext(self): + mockConverter = Mock() + s = StringIO() + with StreamWrapper(s, mockConverter) as fp: + fp.write(u'hello') + self.assertTrue(s.closed) + + def testProxyNoContextManager(self): + mockStream = MagicMock() + mockStream.__enter__.side_effect = AttributeError() + mockConverter = Mock() + with self.assertRaises(AttributeError) as excinfo: + with StreamWrapper(mockStream, mockConverter) as wrapper: + wrapper.write('hello') + + def test_closed_shouldnt_raise_on_closed_stream(self): + stream = StringIO() + stream.close() + wrapper = StreamWrapper(stream, None) + self.assertEqual(wrapper.closed, True) + + def test_closed_shouldnt_raise_on_detached_stream(self): + stream = TextIOWrapper(StringIO()) + stream.detach() + wrapper = StreamWrapper(stream, None) + self.assertEqual(wrapper.closed, True) + +class AnsiToWin32Test(TestCase): + + def testInit(self): + mockStdout = Mock() + auto = Mock() + stream = AnsiToWin32(mockStdout, autoreset=auto) + self.assertEqual(stream.wrapped, mockStdout) + self.assertEqual(stream.autoreset, auto) + + @patch('colorama.ansitowin32.winterm', None) + @patch('colorama.ansitowin32.winapi_test', lambda *_: True) + def testStripIsTrueOnWindows(self): + with osname('nt'): + mockStdout = Mock() + stream = AnsiToWin32(mockStdout) + self.assertTrue(stream.strip) + + def testStripIsFalseOffWindows(self): + with osname('posix'): + mockStdout = Mock(closed=False) + stream = AnsiToWin32(mockStdout) + self.assertFalse(stream.strip) + + def testWriteStripsAnsi(self): + mockStdout = Mock() + stream = AnsiToWin32(mockStdout) + stream.wrapped = Mock() + stream.write_and_convert = Mock() + stream.strip = True + + stream.write('abc') + + self.assertFalse(stream.wrapped.write.called) + self.assertEqual(stream.write_and_convert.call_args, (('abc',), {})) + + def testWriteDoesNotStripAnsi(self): + mockStdout = Mock() + stream = AnsiToWin32(mockStdout) + stream.wrapped = Mock() + stream.write_and_convert = Mock() + stream.strip = False + stream.convert = False + + stream.write('abc') + + self.assertFalse(stream.write_and_convert.called) + self.assertEqual(stream.wrapped.write.call_args, (('abc',), {})) + + def assert_autoresets(self, convert, autoreset=True): + stream = AnsiToWin32(Mock()) + stream.convert = convert + stream.reset_all = Mock() + stream.autoreset = autoreset + stream.winterm = Mock() + + stream.write('abc') + + self.assertEqual(stream.reset_all.called, autoreset) + + def testWriteAutoresets(self): + self.assert_autoresets(convert=True) + self.assert_autoresets(convert=False) + self.assert_autoresets(convert=True, autoreset=False) + self.assert_autoresets(convert=False, autoreset=False) + + def testWriteAndConvertWritesPlainText(self): + stream = AnsiToWin32(Mock()) + stream.write_and_convert( 'abc' ) + self.assertEqual( stream.wrapped.write.call_args, (('abc',), {}) ) + + def testWriteAndConvertStripsAllValidAnsi(self): + stream = AnsiToWin32(Mock()) + stream.call_win32 = Mock() + data = [ + 'abc\033[mdef', + 'abc\033[0mdef', + 'abc\033[2mdef', + 'abc\033[02mdef', + 'abc\033[002mdef', + 'abc\033[40mdef', + 'abc\033[040mdef', + 'abc\033[0;1mdef', + 'abc\033[40;50mdef', + 'abc\033[50;30;40mdef', + 'abc\033[Adef', + 'abc\033[0Gdef', + 'abc\033[1;20;128Hdef', + ] + for datum in data: + stream.wrapped.write.reset_mock() + stream.write_and_convert( datum ) + self.assertEqual( + [args[0] for args in stream.wrapped.write.call_args_list], + [ ('abc',), ('def',) ] + ) + + def testWriteAndConvertSkipsEmptySnippets(self): + stream = AnsiToWin32(Mock()) + stream.call_win32 = Mock() + stream.write_and_convert( '\033[40m\033[41m' ) + self.assertFalse( stream.wrapped.write.called ) + + def testWriteAndConvertCallsWin32WithParamsAndCommand(self): + stream = AnsiToWin32(Mock()) + stream.convert = True + stream.call_win32 = Mock() + stream.extract_params = Mock(return_value='params') + data = { + 'abc\033[adef': ('a', 'params'), + 'abc\033[;;bdef': ('b', 'params'), + 'abc\033[0cdef': ('c', 'params'), + 'abc\033[;;0;;Gdef': ('G', 'params'), + 'abc\033[1;20;128Hdef': ('H', 'params'), + } + for datum, expected in data.items(): + stream.call_win32.reset_mock() + stream.write_and_convert( datum ) + self.assertEqual( stream.call_win32.call_args[0], expected ) + + def test_reset_all_shouldnt_raise_on_closed_orig_stdout(self): + stream = StringIO() + converter = AnsiToWin32(stream) + stream.close() + + converter.reset_all() + + def test_wrap_shouldnt_raise_on_closed_orig_stdout(self): + stream = StringIO() + stream.close() + with \ + patch("colorama.ansitowin32.os.name", "nt"), \ + patch("colorama.ansitowin32.winapi_test", lambda: True): + converter = AnsiToWin32(stream) + self.assertTrue(converter.strip) + self.assertFalse(converter.convert) + + def test_wrap_shouldnt_raise_on_missing_closed_attr(self): + with \ + patch("colorama.ansitowin32.os.name", "nt"), \ + patch("colorama.ansitowin32.winapi_test", lambda: True): + converter = AnsiToWin32(object()) + self.assertTrue(converter.strip) + self.assertFalse(converter.convert) + + def testExtractParams(self): + stream = AnsiToWin32(Mock()) + data = { + '': (0,), + ';;': (0,), + '2': (2,), + ';;002;;': (2,), + '0;1': (0, 1), + ';;003;;456;;': (3, 456), + '11;22;33;44;55': (11, 22, 33, 44, 55), + } + for datum, expected in data.items(): + self.assertEqual(stream.extract_params('m', datum), expected) + + def testCallWin32UsesLookup(self): + listener = Mock() + stream = AnsiToWin32(listener) + stream.win32_calls = { + 1: (lambda *_, **__: listener(11),), + 2: (lambda *_, **__: listener(22),), + 3: (lambda *_, **__: listener(33),), + } + stream.call_win32('m', (3, 1, 99, 2)) + self.assertEqual( + [a[0][0] for a in listener.call_args_list], + [33, 11, 22] ) + + def test_osc_codes(self): + mockStdout = Mock() + stream = AnsiToWin32(mockStdout, convert=True) + with patch('colorama.ansitowin32.winterm') as winterm: + data = [ + '\033]0\x07', # missing arguments + '\033]0;foo\x08', # wrong OSC command + '\033]0;colorama_test_title\x07', # should work + '\033]1;colorama_test_title\x07', # wrong set command + '\033]2;colorama_test_title\x07', # should work + '\033]' + ';' * 64 + '\x08', # see issue #247 + ] + for code in data: + stream.write(code) + self.assertEqual(winterm.set_title.call_count, 2) + + def test_native_windows_ansi(self): + with ExitStack() as stack: + def p(a, b): + stack.enter_context(patch(a, b, create=True)) + # Pretend to be on Windows + p("colorama.ansitowin32.os.name", "nt") + p("colorama.ansitowin32.winapi_test", lambda: True) + p("colorama.win32.winapi_test", lambda: True) + p("colorama.winterm.win32.windll", "non-None") + p("colorama.winterm.get_osfhandle", lambda _: 1234) + + # Pretend that our mock stream has native ANSI support + p( + "colorama.winterm.win32.GetConsoleMode", + lambda _: ENABLE_VIRTUAL_TERMINAL_PROCESSING, + ) + SetConsoleMode = Mock() + p("colorama.winterm.win32.SetConsoleMode", SetConsoleMode) + + stdout = Mock() + stdout.closed = False + stdout.isatty.return_value = True + stdout.fileno.return_value = 1 + + # Our fake console says it has native vt support, so AnsiToWin32 should + # enable that support and do nothing else. + stream = AnsiToWin32(stdout) + SetConsoleMode.assert_called_with(1234, ENABLE_VIRTUAL_TERMINAL_PROCESSING) + self.assertFalse(stream.strip) + self.assertFalse(stream.convert) + self.assertFalse(stream.should_wrap()) + + # Now let's pretend we're on an old Windows console, that doesn't have + # native ANSI support. + p("colorama.winterm.win32.GetConsoleMode", lambda _: 0) + SetConsoleMode = Mock() + p("colorama.winterm.win32.SetConsoleMode", SetConsoleMode) + + stream = AnsiToWin32(stdout) + SetConsoleMode.assert_called_with(1234, ENABLE_VIRTUAL_TERMINAL_PROCESSING) + self.assertTrue(stream.strip) + self.assertTrue(stream.convert) + self.assertTrue(stream.should_wrap()) + + +if __name__ == '__main__': + main() diff --git a/app/src/flask-server/venv/Lib/site-packages/colorama/tests/initialise_test.py b/app/src/flask-server/venv/Lib/site-packages/colorama/tests/initialise_test.py new file mode 100644 index 0000000..89f9b07 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/colorama/tests/initialise_test.py @@ -0,0 +1,189 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +import sys +from unittest import TestCase, main, skipUnless + +try: + from unittest.mock import patch, Mock +except ImportError: + from mock import patch, Mock + +from ..ansitowin32 import StreamWrapper +from ..initialise import init, just_fix_windows_console, _wipe_internal_state_for_tests +from .utils import osname, replace_by + +orig_stdout = sys.stdout +orig_stderr = sys.stderr + + +class InitTest(TestCase): + + @skipUnless(sys.stdout.isatty(), "sys.stdout is not a tty") + def setUp(self): + # sanity check + self.assertNotWrapped() + + def tearDown(self): + _wipe_internal_state_for_tests() + sys.stdout = orig_stdout + sys.stderr = orig_stderr + + def assertWrapped(self): + self.assertIsNot(sys.stdout, orig_stdout, 'stdout should be wrapped') + self.assertIsNot(sys.stderr, orig_stderr, 'stderr should be wrapped') + self.assertTrue(isinstance(sys.stdout, StreamWrapper), + 'bad stdout wrapper') + self.assertTrue(isinstance(sys.stderr, StreamWrapper), + 'bad stderr wrapper') + + def assertNotWrapped(self): + self.assertIs(sys.stdout, orig_stdout, 'stdout should not be wrapped') + self.assertIs(sys.stderr, orig_stderr, 'stderr should not be wrapped') + + @patch('colorama.initialise.reset_all') + @patch('colorama.ansitowin32.winapi_test', lambda *_: True) + @patch('colorama.ansitowin32.enable_vt_processing', lambda *_: False) + def testInitWrapsOnWindows(self, _): + with osname("nt"): + init() + self.assertWrapped() + + @patch('colorama.initialise.reset_all') + @patch('colorama.ansitowin32.winapi_test', lambda *_: False) + def testInitDoesntWrapOnEmulatedWindows(self, _): + with osname("nt"): + init() + self.assertNotWrapped() + + def testInitDoesntWrapOnNonWindows(self): + with osname("posix"): + init() + self.assertNotWrapped() + + def testInitDoesntWrapIfNone(self): + with replace_by(None): + init() + # We can't use assertNotWrapped here because replace_by(None) + # changes stdout/stderr already. + self.assertIsNone(sys.stdout) + self.assertIsNone(sys.stderr) + + def testInitAutoresetOnWrapsOnAllPlatforms(self): + with osname("posix"): + init(autoreset=True) + self.assertWrapped() + + def testInitWrapOffDoesntWrapOnWindows(self): + with osname("nt"): + init(wrap=False) + self.assertNotWrapped() + + def testInitWrapOffIncompatibleWithAutoresetOn(self): + self.assertRaises(ValueError, lambda: init(autoreset=True, wrap=False)) + + @patch('colorama.win32.SetConsoleTextAttribute') + @patch('colorama.initialise.AnsiToWin32') + def testAutoResetPassedOn(self, mockATW32, _): + with osname("nt"): + init(autoreset=True) + self.assertEqual(len(mockATW32.call_args_list), 2) + self.assertEqual(mockATW32.call_args_list[1][1]['autoreset'], True) + self.assertEqual(mockATW32.call_args_list[0][1]['autoreset'], True) + + @patch('colorama.initialise.AnsiToWin32') + def testAutoResetChangeable(self, mockATW32): + with osname("nt"): + init() + + init(autoreset=True) + self.assertEqual(len(mockATW32.call_args_list), 4) + self.assertEqual(mockATW32.call_args_list[2][1]['autoreset'], True) + self.assertEqual(mockATW32.call_args_list[3][1]['autoreset'], True) + + init() + self.assertEqual(len(mockATW32.call_args_list), 6) + self.assertEqual( + mockATW32.call_args_list[4][1]['autoreset'], False) + self.assertEqual( + mockATW32.call_args_list[5][1]['autoreset'], False) + + + @patch('colorama.initialise.atexit.register') + def testAtexitRegisteredOnlyOnce(self, mockRegister): + init() + self.assertTrue(mockRegister.called) + mockRegister.reset_mock() + init() + self.assertFalse(mockRegister.called) + + +class JustFixWindowsConsoleTest(TestCase): + def _reset(self): + _wipe_internal_state_for_tests() + sys.stdout = orig_stdout + sys.stderr = orig_stderr + + def tearDown(self): + self._reset() + + @patch("colorama.ansitowin32.winapi_test", lambda: True) + def testJustFixWindowsConsole(self): + if sys.platform != "win32": + # just_fix_windows_console should be a no-op + just_fix_windows_console() + self.assertIs(sys.stdout, orig_stdout) + self.assertIs(sys.stderr, orig_stderr) + else: + def fake_std(): + # Emulate stdout=not a tty, stderr=tty + # to check that we handle both cases correctly + stdout = Mock() + stdout.closed = False + stdout.isatty.return_value = False + stdout.fileno.return_value = 1 + sys.stdout = stdout + + stderr = Mock() + stderr.closed = False + stderr.isatty.return_value = True + stderr.fileno.return_value = 2 + sys.stderr = stderr + + for native_ansi in [False, True]: + with patch( + 'colorama.ansitowin32.enable_vt_processing', + lambda *_: native_ansi + ): + self._reset() + fake_std() + + # Regular single-call test + prev_stdout = sys.stdout + prev_stderr = sys.stderr + just_fix_windows_console() + self.assertIs(sys.stdout, prev_stdout) + if native_ansi: + self.assertIs(sys.stderr, prev_stderr) + else: + self.assertIsNot(sys.stderr, prev_stderr) + + # second call without resetting is always a no-op + prev_stdout = sys.stdout + prev_stderr = sys.stderr + just_fix_windows_console() + self.assertIs(sys.stdout, prev_stdout) + self.assertIs(sys.stderr, prev_stderr) + + self._reset() + fake_std() + + # If init() runs first, just_fix_windows_console should be a no-op + init() + prev_stdout = sys.stdout + prev_stderr = sys.stderr + just_fix_windows_console() + self.assertIs(prev_stdout, sys.stdout) + self.assertIs(prev_stderr, sys.stderr) + + +if __name__ == '__main__': + main() diff --git a/app/src/flask-server/venv/Lib/site-packages/colorama/tests/isatty_test.py b/app/src/flask-server/venv/Lib/site-packages/colorama/tests/isatty_test.py new file mode 100644 index 0000000..0f84e4b --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/colorama/tests/isatty_test.py @@ -0,0 +1,57 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +import sys +from unittest import TestCase, main + +from ..ansitowin32 import StreamWrapper, AnsiToWin32 +from .utils import pycharm, replace_by, replace_original_by, StreamTTY, StreamNonTTY + + +def is_a_tty(stream): + return StreamWrapper(stream, None).isatty() + +class IsattyTest(TestCase): + + def test_TTY(self): + tty = StreamTTY() + self.assertTrue(is_a_tty(tty)) + with pycharm(): + self.assertTrue(is_a_tty(tty)) + + def test_nonTTY(self): + non_tty = StreamNonTTY() + self.assertFalse(is_a_tty(non_tty)) + with pycharm(): + self.assertFalse(is_a_tty(non_tty)) + + def test_withPycharm(self): + with pycharm(): + self.assertTrue(is_a_tty(sys.stderr)) + self.assertTrue(is_a_tty(sys.stdout)) + + def test_withPycharmTTYOverride(self): + tty = StreamTTY() + with pycharm(), replace_by(tty): + self.assertTrue(is_a_tty(tty)) + + def test_withPycharmNonTTYOverride(self): + non_tty = StreamNonTTY() + with pycharm(), replace_by(non_tty): + self.assertFalse(is_a_tty(non_tty)) + + def test_withPycharmNoneOverride(self): + with pycharm(): + with replace_by(None), replace_original_by(None): + self.assertFalse(is_a_tty(None)) + self.assertFalse(is_a_tty(StreamNonTTY())) + self.assertTrue(is_a_tty(StreamTTY())) + + def test_withPycharmStreamWrapped(self): + with pycharm(): + self.assertTrue(AnsiToWin32(StreamTTY()).stream.isatty()) + self.assertFalse(AnsiToWin32(StreamNonTTY()).stream.isatty()) + self.assertTrue(AnsiToWin32(sys.stdout).stream.isatty()) + self.assertTrue(AnsiToWin32(sys.stderr).stream.isatty()) + + +if __name__ == '__main__': + main() diff --git a/app/src/flask-server/venv/Lib/site-packages/colorama/tests/utils.py b/app/src/flask-server/venv/Lib/site-packages/colorama/tests/utils.py new file mode 100644 index 0000000..472fafb --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/colorama/tests/utils.py @@ -0,0 +1,49 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +from contextlib import contextmanager +from io import StringIO +import sys +import os + + +class StreamTTY(StringIO): + def isatty(self): + return True + +class StreamNonTTY(StringIO): + def isatty(self): + return False + +@contextmanager +def osname(name): + orig = os.name + os.name = name + yield + os.name = orig + +@contextmanager +def replace_by(stream): + orig_stdout = sys.stdout + orig_stderr = sys.stderr + sys.stdout = stream + sys.stderr = stream + yield + sys.stdout = orig_stdout + sys.stderr = orig_stderr + +@contextmanager +def replace_original_by(stream): + orig_stdout = sys.__stdout__ + orig_stderr = sys.__stderr__ + sys.__stdout__ = stream + sys.__stderr__ = stream + yield + sys.__stdout__ = orig_stdout + sys.__stderr__ = orig_stderr + +@contextmanager +def pycharm(): + os.environ["PYCHARM_HOSTED"] = "1" + non_tty = StreamNonTTY() + with replace_by(non_tty), replace_original_by(non_tty): + yield + del os.environ["PYCHARM_HOSTED"] diff --git a/app/src/flask-server/venv/Lib/site-packages/colorama/tests/winterm_test.py b/app/src/flask-server/venv/Lib/site-packages/colorama/tests/winterm_test.py new file mode 100644 index 0000000..d0955f9 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/colorama/tests/winterm_test.py @@ -0,0 +1,131 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +import sys +from unittest import TestCase, main, skipUnless + +try: + from unittest.mock import Mock, patch +except ImportError: + from mock import Mock, patch + +from ..winterm import WinColor, WinStyle, WinTerm + + +class WinTermTest(TestCase): + + @patch('colorama.winterm.win32') + def testInit(self, mockWin32): + mockAttr = Mock() + mockAttr.wAttributes = 7 + 6 * 16 + 8 + mockWin32.GetConsoleScreenBufferInfo.return_value = mockAttr + term = WinTerm() + self.assertEqual(term._fore, 7) + self.assertEqual(term._back, 6) + self.assertEqual(term._style, 8) + + @skipUnless(sys.platform.startswith("win"), "requires Windows") + def testGetAttrs(self): + term = WinTerm() + + term._fore = 0 + term._back = 0 + term._style = 0 + self.assertEqual(term.get_attrs(), 0) + + term._fore = WinColor.YELLOW + self.assertEqual(term.get_attrs(), WinColor.YELLOW) + + term._back = WinColor.MAGENTA + self.assertEqual( + term.get_attrs(), + WinColor.YELLOW + WinColor.MAGENTA * 16) + + term._style = WinStyle.BRIGHT + self.assertEqual( + term.get_attrs(), + WinColor.YELLOW + WinColor.MAGENTA * 16 + WinStyle.BRIGHT) + + @patch('colorama.winterm.win32') + def testResetAll(self, mockWin32): + mockAttr = Mock() + mockAttr.wAttributes = 1 + 2 * 16 + 8 + mockWin32.GetConsoleScreenBufferInfo.return_value = mockAttr + term = WinTerm() + + term.set_console = Mock() + term._fore = -1 + term._back = -1 + term._style = -1 + + term.reset_all() + + self.assertEqual(term._fore, 1) + self.assertEqual(term._back, 2) + self.assertEqual(term._style, 8) + self.assertEqual(term.set_console.called, True) + + @skipUnless(sys.platform.startswith("win"), "requires Windows") + def testFore(self): + term = WinTerm() + term.set_console = Mock() + term._fore = 0 + + term.fore(5) + + self.assertEqual(term._fore, 5) + self.assertEqual(term.set_console.called, True) + + @skipUnless(sys.platform.startswith("win"), "requires Windows") + def testBack(self): + term = WinTerm() + term.set_console = Mock() + term._back = 0 + + term.back(5) + + self.assertEqual(term._back, 5) + self.assertEqual(term.set_console.called, True) + + @skipUnless(sys.platform.startswith("win"), "requires Windows") + def testStyle(self): + term = WinTerm() + term.set_console = Mock() + term._style = 0 + + term.style(22) + + self.assertEqual(term._style, 22) + self.assertEqual(term.set_console.called, True) + + @patch('colorama.winterm.win32') + def testSetConsole(self, mockWin32): + mockAttr = Mock() + mockAttr.wAttributes = 0 + mockWin32.GetConsoleScreenBufferInfo.return_value = mockAttr + term = WinTerm() + term.windll = Mock() + + term.set_console() + + self.assertEqual( + mockWin32.SetConsoleTextAttribute.call_args, + ((mockWin32.STDOUT, term.get_attrs()), {}) + ) + + @patch('colorama.winterm.win32') + def testSetConsoleOnStderr(self, mockWin32): + mockAttr = Mock() + mockAttr.wAttributes = 0 + mockWin32.GetConsoleScreenBufferInfo.return_value = mockAttr + term = WinTerm() + term.windll = Mock() + + term.set_console(on_stderr=True) + + self.assertEqual( + mockWin32.SetConsoleTextAttribute.call_args, + ((mockWin32.STDERR, term.get_attrs()), {}) + ) + + +if __name__ == '__main__': + main() diff --git a/app/src/flask-server/venv/Lib/site-packages/colorama/win32.py b/app/src/flask-server/venv/Lib/site-packages/colorama/win32.py new file mode 100644 index 0000000..841b0e2 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/colorama/win32.py @@ -0,0 +1,180 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. + +# from winbase.h +STDOUT = -11 +STDERR = -12 + +ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x0004 + +try: + import ctypes + from ctypes import LibraryLoader + windll = LibraryLoader(ctypes.WinDLL) + from ctypes import wintypes +except (AttributeError, ImportError): + windll = None + SetConsoleTextAttribute = lambda *_: None + winapi_test = lambda *_: None +else: + from ctypes import byref, Structure, c_char, POINTER + + COORD = wintypes._COORD + + class CONSOLE_SCREEN_BUFFER_INFO(Structure): + """struct in wincon.h.""" + _fields_ = [ + ("dwSize", COORD), + ("dwCursorPosition", COORD), + ("wAttributes", wintypes.WORD), + ("srWindow", wintypes.SMALL_RECT), + ("dwMaximumWindowSize", COORD), + ] + def __str__(self): + return '(%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d)' % ( + self.dwSize.Y, self.dwSize.X + , self.dwCursorPosition.Y, self.dwCursorPosition.X + , self.wAttributes + , self.srWindow.Top, self.srWindow.Left, self.srWindow.Bottom, self.srWindow.Right + , self.dwMaximumWindowSize.Y, self.dwMaximumWindowSize.X + ) + + _GetStdHandle = windll.kernel32.GetStdHandle + _GetStdHandle.argtypes = [ + wintypes.DWORD, + ] + _GetStdHandle.restype = wintypes.HANDLE + + _GetConsoleScreenBufferInfo = windll.kernel32.GetConsoleScreenBufferInfo + _GetConsoleScreenBufferInfo.argtypes = [ + wintypes.HANDLE, + POINTER(CONSOLE_SCREEN_BUFFER_INFO), + ] + _GetConsoleScreenBufferInfo.restype = wintypes.BOOL + + _SetConsoleTextAttribute = windll.kernel32.SetConsoleTextAttribute + _SetConsoleTextAttribute.argtypes = [ + wintypes.HANDLE, + wintypes.WORD, + ] + _SetConsoleTextAttribute.restype = wintypes.BOOL + + _SetConsoleCursorPosition = windll.kernel32.SetConsoleCursorPosition + _SetConsoleCursorPosition.argtypes = [ + wintypes.HANDLE, + COORD, + ] + _SetConsoleCursorPosition.restype = wintypes.BOOL + + _FillConsoleOutputCharacterA = windll.kernel32.FillConsoleOutputCharacterA + _FillConsoleOutputCharacterA.argtypes = [ + wintypes.HANDLE, + c_char, + wintypes.DWORD, + COORD, + POINTER(wintypes.DWORD), + ] + _FillConsoleOutputCharacterA.restype = wintypes.BOOL + + _FillConsoleOutputAttribute = windll.kernel32.FillConsoleOutputAttribute + _FillConsoleOutputAttribute.argtypes = [ + wintypes.HANDLE, + wintypes.WORD, + wintypes.DWORD, + COORD, + POINTER(wintypes.DWORD), + ] + _FillConsoleOutputAttribute.restype = wintypes.BOOL + + _SetConsoleTitleW = windll.kernel32.SetConsoleTitleW + _SetConsoleTitleW.argtypes = [ + wintypes.LPCWSTR + ] + _SetConsoleTitleW.restype = wintypes.BOOL + + _GetConsoleMode = windll.kernel32.GetConsoleMode + _GetConsoleMode.argtypes = [ + wintypes.HANDLE, + POINTER(wintypes.DWORD) + ] + _GetConsoleMode.restype = wintypes.BOOL + + _SetConsoleMode = windll.kernel32.SetConsoleMode + _SetConsoleMode.argtypes = [ + wintypes.HANDLE, + wintypes.DWORD + ] + _SetConsoleMode.restype = wintypes.BOOL + + def _winapi_test(handle): + csbi = CONSOLE_SCREEN_BUFFER_INFO() + success = _GetConsoleScreenBufferInfo( + handle, byref(csbi)) + return bool(success) + + def winapi_test(): + return any(_winapi_test(h) for h in + (_GetStdHandle(STDOUT), _GetStdHandle(STDERR))) + + def GetConsoleScreenBufferInfo(stream_id=STDOUT): + handle = _GetStdHandle(stream_id) + csbi = CONSOLE_SCREEN_BUFFER_INFO() + success = _GetConsoleScreenBufferInfo( + handle, byref(csbi)) + return csbi + + def SetConsoleTextAttribute(stream_id, attrs): + handle = _GetStdHandle(stream_id) + return _SetConsoleTextAttribute(handle, attrs) + + def SetConsoleCursorPosition(stream_id, position, adjust=True): + position = COORD(*position) + # If the position is out of range, do nothing. + if position.Y <= 0 or position.X <= 0: + return + # Adjust for Windows' SetConsoleCursorPosition: + # 1. being 0-based, while ANSI is 1-based. + # 2. expecting (x,y), while ANSI uses (y,x). + adjusted_position = COORD(position.Y - 1, position.X - 1) + if adjust: + # Adjust for viewport's scroll position + sr = GetConsoleScreenBufferInfo(STDOUT).srWindow + adjusted_position.Y += sr.Top + adjusted_position.X += sr.Left + # Resume normal processing + handle = _GetStdHandle(stream_id) + return _SetConsoleCursorPosition(handle, adjusted_position) + + def FillConsoleOutputCharacter(stream_id, char, length, start): + handle = _GetStdHandle(stream_id) + char = c_char(char.encode()) + length = wintypes.DWORD(length) + num_written = wintypes.DWORD(0) + # Note that this is hard-coded for ANSI (vs wide) bytes. + success = _FillConsoleOutputCharacterA( + handle, char, length, start, byref(num_written)) + return num_written.value + + def FillConsoleOutputAttribute(stream_id, attr, length, start): + ''' FillConsoleOutputAttribute( hConsole, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten )''' + handle = _GetStdHandle(stream_id) + attribute = wintypes.WORD(attr) + length = wintypes.DWORD(length) + num_written = wintypes.DWORD(0) + # Note that this is hard-coded for ANSI (vs wide) bytes. + return _FillConsoleOutputAttribute( + handle, attribute, length, start, byref(num_written)) + + def SetConsoleTitle(title): + return _SetConsoleTitleW(title) + + def GetConsoleMode(handle): + mode = wintypes.DWORD() + success = _GetConsoleMode(handle, byref(mode)) + if not success: + raise ctypes.WinError() + return mode.value + + def SetConsoleMode(handle, mode): + success = _SetConsoleMode(handle, mode) + if not success: + raise ctypes.WinError() diff --git a/app/src/flask-server/venv/Lib/site-packages/colorama/winterm.py b/app/src/flask-server/venv/Lib/site-packages/colorama/winterm.py new file mode 100644 index 0000000..aad867e --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/colorama/winterm.py @@ -0,0 +1,195 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +try: + from msvcrt import get_osfhandle +except ImportError: + def get_osfhandle(_): + raise OSError("This isn't windows!") + + +from . import win32 + +# from wincon.h +class WinColor(object): + BLACK = 0 + BLUE = 1 + GREEN = 2 + CYAN = 3 + RED = 4 + MAGENTA = 5 + YELLOW = 6 + GREY = 7 + +# from wincon.h +class WinStyle(object): + NORMAL = 0x00 # dim text, dim background + BRIGHT = 0x08 # bright text, dim background + BRIGHT_BACKGROUND = 0x80 # dim text, bright background + +class WinTerm(object): + + def __init__(self): + self._default = win32.GetConsoleScreenBufferInfo(win32.STDOUT).wAttributes + self.set_attrs(self._default) + self._default_fore = self._fore + self._default_back = self._back + self._default_style = self._style + # In order to emulate LIGHT_EX in windows, we borrow the BRIGHT style. + # So that LIGHT_EX colors and BRIGHT style do not clobber each other, + # we track them separately, since LIGHT_EX is overwritten by Fore/Back + # and BRIGHT is overwritten by Style codes. + self._light = 0 + + def get_attrs(self): + return self._fore + self._back * 16 + (self._style | self._light) + + def set_attrs(self, value): + self._fore = value & 7 + self._back = (value >> 4) & 7 + self._style = value & (WinStyle.BRIGHT | WinStyle.BRIGHT_BACKGROUND) + + def reset_all(self, on_stderr=None): + self.set_attrs(self._default) + self.set_console(attrs=self._default) + self._light = 0 + + def fore(self, fore=None, light=False, on_stderr=False): + if fore is None: + fore = self._default_fore + self._fore = fore + # Emulate LIGHT_EX with BRIGHT Style + if light: + self._light |= WinStyle.BRIGHT + else: + self._light &= ~WinStyle.BRIGHT + self.set_console(on_stderr=on_stderr) + + def back(self, back=None, light=False, on_stderr=False): + if back is None: + back = self._default_back + self._back = back + # Emulate LIGHT_EX with BRIGHT_BACKGROUND Style + if light: + self._light |= WinStyle.BRIGHT_BACKGROUND + else: + self._light &= ~WinStyle.BRIGHT_BACKGROUND + self.set_console(on_stderr=on_stderr) + + def style(self, style=None, on_stderr=False): + if style is None: + style = self._default_style + self._style = style + self.set_console(on_stderr=on_stderr) + + def set_console(self, attrs=None, on_stderr=False): + if attrs is None: + attrs = self.get_attrs() + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + win32.SetConsoleTextAttribute(handle, attrs) + + def get_position(self, handle): + position = win32.GetConsoleScreenBufferInfo(handle).dwCursorPosition + # Because Windows coordinates are 0-based, + # and win32.SetConsoleCursorPosition expects 1-based. + position.X += 1 + position.Y += 1 + return position + + def set_cursor_position(self, position=None, on_stderr=False): + if position is None: + # I'm not currently tracking the position, so there is no default. + # position = self.get_position() + return + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + win32.SetConsoleCursorPosition(handle, position) + + def cursor_adjust(self, x, y, on_stderr=False): + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + position = self.get_position(handle) + adjusted_position = (position.Y + y, position.X + x) + win32.SetConsoleCursorPosition(handle, adjusted_position, adjust=False) + + def erase_screen(self, mode=0, on_stderr=False): + # 0 should clear from the cursor to the end of the screen. + # 1 should clear from the cursor to the beginning of the screen. + # 2 should clear the entire screen, and move cursor to (1,1) + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + csbi = win32.GetConsoleScreenBufferInfo(handle) + # get the number of character cells in the current buffer + cells_in_screen = csbi.dwSize.X * csbi.dwSize.Y + # get number of character cells before current cursor position + cells_before_cursor = csbi.dwSize.X * csbi.dwCursorPosition.Y + csbi.dwCursorPosition.X + if mode == 0: + from_coord = csbi.dwCursorPosition + cells_to_erase = cells_in_screen - cells_before_cursor + elif mode == 1: + from_coord = win32.COORD(0, 0) + cells_to_erase = cells_before_cursor + elif mode == 2: + from_coord = win32.COORD(0, 0) + cells_to_erase = cells_in_screen + else: + # invalid mode + return + # fill the entire screen with blanks + win32.FillConsoleOutputCharacter(handle, ' ', cells_to_erase, from_coord) + # now set the buffer's attributes accordingly + win32.FillConsoleOutputAttribute(handle, self.get_attrs(), cells_to_erase, from_coord) + if mode == 2: + # put the cursor where needed + win32.SetConsoleCursorPosition(handle, (1, 1)) + + def erase_line(self, mode=0, on_stderr=False): + # 0 should clear from the cursor to the end of the line. + # 1 should clear from the cursor to the beginning of the line. + # 2 should clear the entire line. + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + csbi = win32.GetConsoleScreenBufferInfo(handle) + if mode == 0: + from_coord = csbi.dwCursorPosition + cells_to_erase = csbi.dwSize.X - csbi.dwCursorPosition.X + elif mode == 1: + from_coord = win32.COORD(0, csbi.dwCursorPosition.Y) + cells_to_erase = csbi.dwCursorPosition.X + elif mode == 2: + from_coord = win32.COORD(0, csbi.dwCursorPosition.Y) + cells_to_erase = csbi.dwSize.X + else: + # invalid mode + return + # fill the entire screen with blanks + win32.FillConsoleOutputCharacter(handle, ' ', cells_to_erase, from_coord) + # now set the buffer's attributes accordingly + win32.FillConsoleOutputAttribute(handle, self.get_attrs(), cells_to_erase, from_coord) + + def set_title(self, title): + win32.SetConsoleTitle(title) + + +def enable_vt_processing(fd): + if win32.windll is None or not win32.winapi_test(): + return False + + try: + handle = get_osfhandle(fd) + mode = win32.GetConsoleMode(handle) + win32.SetConsoleMode( + handle, + mode | win32.ENABLE_VIRTUAL_TERMINAL_PROCESSING, + ) + + mode = win32.GetConsoleMode(handle) + if mode & win32.ENABLE_VIRTUAL_TERMINAL_PROCESSING: + return True + # Can get TypeError in testsuite where 'fd' is a Mock() + except (OSError, TypeError): + return False diff --git a/app/src/flask-server/venv/Lib/site-packages/distutils-precedence.pth b/app/src/flask-server/venv/Lib/site-packages/distutils-precedence.pth new file mode 100644 index 0000000..7f009fe --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/distutils-precedence.pth @@ -0,0 +1 @@ +import os; var = 'SETUPTOOLS_USE_DISTUTILS'; enabled = os.environ.get(var, 'local') == 'local'; enabled and __import__('_distutils_hack').add_shim(); diff --git a/app/src/flask-server/venv/Lib/site-packages/flask-3.0.0.dist-info/INSTALLER b/app/src/flask-server/venv/Lib/site-packages/flask-3.0.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/flask-3.0.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/app/src/flask-server/venv/Lib/site-packages/flask-3.0.0.dist-info/LICENSE.rst b/app/src/flask-server/venv/Lib/site-packages/flask-3.0.0.dist-info/LICENSE.rst new file mode 100644 index 0000000..9d227a0 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/flask-3.0.0.dist-info/LICENSE.rst @@ -0,0 +1,28 @@ +Copyright 2010 Pallets + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/app/src/flask-server/venv/Lib/site-packages/flask-3.0.0.dist-info/METADATA b/app/src/flask-server/venv/Lib/site-packages/flask-3.0.0.dist-info/METADATA new file mode 100644 index 0000000..b802e93 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/flask-3.0.0.dist-info/METADATA @@ -0,0 +1,116 @@ +Metadata-Version: 2.1 +Name: Flask +Version: 3.0.0 +Summary: A simple framework for building complex web applications. +Maintainer-email: Pallets +Requires-Python: >=3.8 +Description-Content-Type: text/x-rst +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Framework :: Flask +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Internet :: WWW/HTTP :: WSGI +Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application +Classifier: Topic :: Software Development :: Libraries :: Application Frameworks +Requires-Dist: Werkzeug>=3.0.0 +Requires-Dist: Jinja2>=3.1.2 +Requires-Dist: itsdangerous>=2.1.2 +Requires-Dist: click>=8.1.3 +Requires-Dist: blinker>=1.6.2 +Requires-Dist: importlib-metadata>=3.6.0; python_version < '3.10' +Requires-Dist: asgiref>=3.2 ; extra == "async" +Requires-Dist: python-dotenv ; extra == "dotenv" +Project-URL: Changes, https://flask.palletsprojects.com/changes/ +Project-URL: Chat, https://discord.gg/pallets +Project-URL: Documentation, https://flask.palletsprojects.com/ +Project-URL: Donate, https://palletsprojects.com/donate +Project-URL: Issue Tracker, https://github.com/pallets/flask/issues/ +Project-URL: Source Code, https://github.com/pallets/flask/ +Provides-Extra: async +Provides-Extra: dotenv + +Flask +===== + +Flask is a lightweight `WSGI`_ web application framework. It is designed +to make getting started quick and easy, with the ability to scale up to +complex applications. It began as a simple wrapper around `Werkzeug`_ +and `Jinja`_ and has become one of the most popular Python web +application frameworks. + +Flask offers suggestions, but doesn't enforce any dependencies or +project layout. It is up to the developer to choose the tools and +libraries they want to use. There are many extensions provided by the +community that make adding new functionality easy. + +.. _WSGI: https://wsgi.readthedocs.io/ +.. _Werkzeug: https://werkzeug.palletsprojects.com/ +.. _Jinja: https://jinja.palletsprojects.com/ + + +Installing +---------- + +Install and update using `pip`_: + +.. code-block:: text + + $ pip install -U Flask + +.. _pip: https://pip.pypa.io/en/stable/getting-started/ + + +A Simple Example +---------------- + +.. code-block:: python + + # save this as app.py + from flask import Flask + + app = Flask(__name__) + + @app.route("/") + def hello(): + return "Hello, World!" + +.. code-block:: text + + $ flask run + * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) + + +Contributing +------------ + +For guidance on setting up a development environment and how to make a +contribution to Flask, see the `contributing guidelines`_. + +.. _contributing guidelines: https://github.com/pallets/flask/blob/main/CONTRIBUTING.rst + + +Donate +------ + +The Pallets organization develops and supports Flask and the libraries +it uses. In order to grow the community of contributors and users, and +allow the maintainers to devote more time to the projects, `please +donate today`_. + +.. _please donate today: https://palletsprojects.com/donate + + +Links +----- + +- Documentation: https://flask.palletsprojects.com/ +- Changes: https://flask.palletsprojects.com/changes/ +- PyPI Releases: https://pypi.org/project/Flask/ +- Source Code: https://github.com/pallets/flask/ +- Issue Tracker: https://github.com/pallets/flask/issues/ +- Chat: https://discord.gg/pallets + diff --git a/app/src/flask-server/venv/Lib/site-packages/flask-3.0.0.dist-info/RECORD b/app/src/flask-server/venv/Lib/site-packages/flask-3.0.0.dist-info/RECORD new file mode 100644 index 0000000..0661fd0 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/flask-3.0.0.dist-info/RECORD @@ -0,0 +1,58 @@ +../../Scripts/flask.exe,sha256=9oY0_xgFYx7jGyDS0BEvdySLfaOSpQJqrNdmqAklt1A,108420 +flask-3.0.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +flask-3.0.0.dist-info/LICENSE.rst,sha256=SJqOEQhQntmKN7uYPhHg9-HTHwvY-Zp5yESOf_N9B-o,1475 +flask-3.0.0.dist-info/METADATA,sha256=02XP69VTiwn5blcRgHcyuSQ2cLTuJFV8FXw2x4QnxKo,3588 +flask-3.0.0.dist-info/RECORD,, +flask-3.0.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +flask-3.0.0.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81 +flask-3.0.0.dist-info/entry_points.txt,sha256=bBP7hTOS5fz9zLtC7sPofBZAlMkEvBxu7KqS6l5lvc4,40 +flask/__init__.py,sha256=6xMqdVA0FIQ2U1KVaGX3lzNCdXPzoHPaa0hvQCNcfSk,2625 +flask/__main__.py,sha256=bYt9eEaoRQWdejEHFD8REx9jxVEdZptECFsV7F49Ink,30 +flask/__pycache__/__init__.cpython-310.pyc,, +flask/__pycache__/__main__.cpython-310.pyc,, +flask/__pycache__/app.cpython-310.pyc,, +flask/__pycache__/blueprints.cpython-310.pyc,, +flask/__pycache__/cli.cpython-310.pyc,, +flask/__pycache__/config.cpython-310.pyc,, +flask/__pycache__/ctx.cpython-310.pyc,, +flask/__pycache__/debughelpers.cpython-310.pyc,, +flask/__pycache__/globals.cpython-310.pyc,, +flask/__pycache__/helpers.cpython-310.pyc,, +flask/__pycache__/logging.cpython-310.pyc,, +flask/__pycache__/sessions.cpython-310.pyc,, +flask/__pycache__/signals.cpython-310.pyc,, +flask/__pycache__/templating.cpython-310.pyc,, +flask/__pycache__/testing.cpython-310.pyc,, +flask/__pycache__/typing.cpython-310.pyc,, +flask/__pycache__/views.cpython-310.pyc,, +flask/__pycache__/wrappers.cpython-310.pyc,, +flask/app.py,sha256=voUkc9xk9B039AhVrU21GDpsQ6wqrr-NobqLx8fURfQ,59201 +flask/blueprints.py,sha256=zO8bLO9Xy1aVD92bDmzihutjVEXf8xdDaVfiy7c--Ck,3129 +flask/cli.py,sha256=PDwZCfPagi5GUzb-D6dEN7y20gWiVAg3ejRnxBKNHPA,33821 +flask/config.py,sha256=YZSZ-xpFj1iW1B1Kj1iDhpc5s7pHncloiRLqXhsU7Hs,12856 +flask/ctx.py,sha256=x2kGzUXtPzVyi2YSKrU_PV1AvtxTmh2iRdriJRTSPGM,14841 +flask/debughelpers.py,sha256=WKzD2FNTSimNSwCJVLr9_fFo1f2VlTWB5EZ6lmR5bwE,5548 +flask/globals.py,sha256=XdQZmStBmPIs8t93tjx6pO7Bm3gobAaONWkFcUHaGas,1713 +flask/helpers.py,sha256=ynEoMB7fdF5Y1P-ngxMjZDZWfrJ4St-9OGZZsTcUwx8,22992 +flask/json/__init__.py,sha256=pdtpoK2b0b1u7Sxbx3feM7VWhsI20l1yGAvbYWxaxvc,5572 +flask/json/__pycache__/__init__.cpython-310.pyc,, +flask/json/__pycache__/provider.cpython-310.pyc,, +flask/json/__pycache__/tag.cpython-310.pyc,, +flask/json/provider.py,sha256=VBKSK75t3OsTvZ3N10B3Fsu7-NdpfrGYcl41goQJ3q8,7640 +flask/json/tag.py,sha256=ihb7QWrNEr0YC3KD4TolZbftgSPCuLk7FAvK49huYC0,8871 +flask/logging.py,sha256=VcdJgW4Axm5l_-7vXLQjRTL0eckaMks7Ya_HaoDm0wg,2330 +flask/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +flask/sansio/README.md,sha256=-0X1tECnilmz1cogx-YhNw5d7guK7GKrq_DEV2OzlU0,228 +flask/sansio/__pycache__/app.cpython-310.pyc,, +flask/sansio/__pycache__/blueprints.cpython-310.pyc,, +flask/sansio/__pycache__/scaffold.cpython-310.pyc,, +flask/sansio/app.py,sha256=nZWCFMOW8qK95Ck9UvDzxvswQr-coLJhIFaa_OVobCc,37977 +flask/sansio/blueprints.py,sha256=caskVI1Zf3mM5msevK5-tWy3VqX_A8mlB0KGNyRx5_0,24319 +flask/sansio/scaffold.py,sha256=-Cus0cVS4PmLof4qLvfjSQzk4AKsLqPR6LBpv6ALw3Y,30580 +flask/sessions.py,sha256=rFH2QKXG24dEazkKGxAHqUpAUh_30hDHrddhVYgAcY0,14169 +flask/signals.py,sha256=V7lMUww7CqgJ2ThUBn1PiatZtQanOyt7OZpu2GZI-34,750 +flask/templating.py,sha256=EtL8CE5z2aefdR1I-TWYVNg0cSuXBqz_lvOGKeggktk,7538 +flask/testing.py,sha256=h7AinggrMgGzKlDN66VfB0JjWW4Z1U_OD6FyjqBNiYM,10017 +flask/typing.py,sha256=2pGlhSaZqJVJOoh-QdH-20QVzl2r-zLXyP8otXfCCs4,3156 +flask/views.py,sha256=V5hOGZLx0Bn99QGcM6mh5x_uM-MypVT0-RysEFU84jc,6789 +flask/wrappers.py,sha256=PhMp3teK3SnEmIdog59cO_DHiZ9Btn0qI1EifrTdwP8,5709 diff --git a/app/src/flask-server/venv/Lib/site-packages/flask-3.0.0.dist-info/REQUESTED b/app/src/flask-server/venv/Lib/site-packages/flask-3.0.0.dist-info/REQUESTED new file mode 100644 index 0000000..e69de29 diff --git a/app/src/flask-server/venv/Lib/site-packages/flask-3.0.0.dist-info/WHEEL b/app/src/flask-server/venv/Lib/site-packages/flask-3.0.0.dist-info/WHEEL new file mode 100644 index 0000000..3b5e64b --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/flask-3.0.0.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: flit 3.9.0 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/app/src/flask-server/venv/Lib/site-packages/flask-3.0.0.dist-info/entry_points.txt b/app/src/flask-server/venv/Lib/site-packages/flask-3.0.0.dist-info/entry_points.txt new file mode 100644 index 0000000..eec6733 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/flask-3.0.0.dist-info/entry_points.txt @@ -0,0 +1,3 @@ +[console_scripts] +flask=flask.cli:main + diff --git a/app/src/flask-server/venv/Lib/site-packages/flask/__init__.py b/app/src/flask-server/venv/Lib/site-packages/flask/__init__.py new file mode 100644 index 0000000..e86eb43 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/flask/__init__.py @@ -0,0 +1,60 @@ +from __future__ import annotations + +import typing as t + +from . import json as json +from .app import Flask as Flask +from .blueprints import Blueprint as Blueprint +from .config import Config as Config +from .ctx import after_this_request as after_this_request +from .ctx import copy_current_request_context as copy_current_request_context +from .ctx import has_app_context as has_app_context +from .ctx import has_request_context as has_request_context +from .globals import current_app as current_app +from .globals import g as g +from .globals import request as request +from .globals import session as session +from .helpers import abort as abort +from .helpers import flash as flash +from .helpers import get_flashed_messages as get_flashed_messages +from .helpers import get_template_attribute as get_template_attribute +from .helpers import make_response as make_response +from .helpers import redirect as redirect +from .helpers import send_file as send_file +from .helpers import send_from_directory as send_from_directory +from .helpers import stream_with_context as stream_with_context +from .helpers import url_for as url_for +from .json import jsonify as jsonify +from .signals import appcontext_popped as appcontext_popped +from .signals import appcontext_pushed as appcontext_pushed +from .signals import appcontext_tearing_down as appcontext_tearing_down +from .signals import before_render_template as before_render_template +from .signals import got_request_exception as got_request_exception +from .signals import message_flashed as message_flashed +from .signals import request_finished as request_finished +from .signals import request_started as request_started +from .signals import request_tearing_down as request_tearing_down +from .signals import template_rendered as template_rendered +from .templating import render_template as render_template +from .templating import render_template_string as render_template_string +from .templating import stream_template as stream_template +from .templating import stream_template_string as stream_template_string +from .wrappers import Request as Request +from .wrappers import Response as Response + + +def __getattr__(name: str) -> t.Any: + if name == "__version__": + import importlib.metadata + import warnings + + warnings.warn( + "The '__version__' attribute is deprecated and will be removed in" + " Flask 3.1. Use feature detection or" + " 'importlib.metadata.version(\"flask\")' instead.", + DeprecationWarning, + stacklevel=2, + ) + return importlib.metadata.version("flask") + + raise AttributeError(name) diff --git a/app/src/flask-server/venv/Lib/site-packages/flask/__main__.py b/app/src/flask-server/venv/Lib/site-packages/flask/__main__.py new file mode 100644 index 0000000..4e28416 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/flask/__main__.py @@ -0,0 +1,3 @@ +from .cli import main + +main() diff --git a/app/src/flask-server/venv/Lib/site-packages/flask/__pycache__/__init__.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/flask/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000..fa81193 Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/flask/__pycache__/__init__.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/flask/__pycache__/__main__.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/flask/__pycache__/__main__.cpython-310.pyc new file mode 100644 index 0000000..61eb450 Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/flask/__pycache__/__main__.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/flask/__pycache__/app.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/flask/__pycache__/app.cpython-310.pyc new file mode 100644 index 0000000..97e0648 Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/flask/__pycache__/app.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/flask/__pycache__/blueprints.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/flask/__pycache__/blueprints.cpython-310.pyc new file mode 100644 index 0000000..23a4272 Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/flask/__pycache__/blueprints.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/flask/__pycache__/cli.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/flask/__pycache__/cli.cpython-310.pyc new file mode 100644 index 0000000..1a663fb Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/flask/__pycache__/cli.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/flask/__pycache__/config.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/flask/__pycache__/config.cpython-310.pyc new file mode 100644 index 0000000..e66159d Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/flask/__pycache__/config.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/flask/__pycache__/ctx.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/flask/__pycache__/ctx.cpython-310.pyc new file mode 100644 index 0000000..79517bb Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/flask/__pycache__/ctx.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/flask/__pycache__/debughelpers.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/flask/__pycache__/debughelpers.cpython-310.pyc new file mode 100644 index 0000000..643f9eb Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/flask/__pycache__/debughelpers.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/flask/__pycache__/globals.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/flask/__pycache__/globals.cpython-310.pyc new file mode 100644 index 0000000..0cc7b3e Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/flask/__pycache__/globals.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/flask/__pycache__/helpers.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/flask/__pycache__/helpers.cpython-310.pyc new file mode 100644 index 0000000..a345e70 Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/flask/__pycache__/helpers.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/flask/__pycache__/logging.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/flask/__pycache__/logging.cpython-310.pyc new file mode 100644 index 0000000..fda35fb Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/flask/__pycache__/logging.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/flask/__pycache__/sessions.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/flask/__pycache__/sessions.cpython-310.pyc new file mode 100644 index 0000000..43e9add Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/flask/__pycache__/sessions.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/flask/__pycache__/signals.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/flask/__pycache__/signals.cpython-310.pyc new file mode 100644 index 0000000..dda0d6a Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/flask/__pycache__/signals.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/flask/__pycache__/templating.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/flask/__pycache__/templating.cpython-310.pyc new file mode 100644 index 0000000..2bc78c0 Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/flask/__pycache__/templating.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/flask/__pycache__/testing.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/flask/__pycache__/testing.cpython-310.pyc new file mode 100644 index 0000000..1643773 Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/flask/__pycache__/testing.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/flask/__pycache__/typing.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/flask/__pycache__/typing.cpython-310.pyc new file mode 100644 index 0000000..9884e2a Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/flask/__pycache__/typing.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/flask/__pycache__/views.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/flask/__pycache__/views.cpython-310.pyc new file mode 100644 index 0000000..fc62e30 Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/flask/__pycache__/views.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/flask/__pycache__/wrappers.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/flask/__pycache__/wrappers.cpython-310.pyc new file mode 100644 index 0000000..b0d19d0 Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/flask/__pycache__/wrappers.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/flask/app.py b/app/src/flask-server/venv/Lib/site-packages/flask/app.py new file mode 100644 index 0000000..d710cb9 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/flask/app.py @@ -0,0 +1,1478 @@ +from __future__ import annotations + +import os +import sys +import typing as t +import weakref +from collections.abc import Iterator as _abc_Iterator +from datetime import timedelta +from inspect import iscoroutinefunction +from itertools import chain +from types import TracebackType +from urllib.parse import quote as _url_quote + +import click +from werkzeug.datastructures import Headers +from werkzeug.datastructures import ImmutableDict +from werkzeug.exceptions import BadRequestKeyError +from werkzeug.exceptions import HTTPException +from werkzeug.exceptions import InternalServerError +from werkzeug.routing import BuildError +from werkzeug.routing import MapAdapter +from werkzeug.routing import RequestRedirect +from werkzeug.routing import RoutingException +from werkzeug.routing import Rule +from werkzeug.serving import is_running_from_reloader +from werkzeug.wrappers import Response as BaseResponse + +from . import cli +from . import typing as ft +from .ctx import AppContext +from .ctx import RequestContext +from .globals import _cv_app +from .globals import _cv_request +from .globals import current_app +from .globals import g +from .globals import request +from .globals import request_ctx +from .globals import session +from .helpers import get_debug_flag +from .helpers import get_flashed_messages +from .helpers import get_load_dotenv +from .helpers import send_from_directory +from .sansio.app import App +from .sansio.scaffold import _sentinel +from .sessions import SecureCookieSessionInterface +from .sessions import SessionInterface +from .signals import appcontext_tearing_down +from .signals import got_request_exception +from .signals import request_finished +from .signals import request_started +from .signals import request_tearing_down +from .templating import Environment +from .wrappers import Request +from .wrappers import Response + +if t.TYPE_CHECKING: # pragma: no cover + from .testing import FlaskClient + from .testing import FlaskCliRunner + +T_shell_context_processor = t.TypeVar( + "T_shell_context_processor", bound=ft.ShellContextProcessorCallable +) +T_teardown = t.TypeVar("T_teardown", bound=ft.TeardownCallable) +T_template_filter = t.TypeVar("T_template_filter", bound=ft.TemplateFilterCallable) +T_template_global = t.TypeVar("T_template_global", bound=ft.TemplateGlobalCallable) +T_template_test = t.TypeVar("T_template_test", bound=ft.TemplateTestCallable) + + +def _make_timedelta(value: timedelta | int | None) -> timedelta | None: + if value is None or isinstance(value, timedelta): + return value + + return timedelta(seconds=value) + + +class Flask(App): + """The flask object implements a WSGI application and acts as the central + object. It is passed the name of the module or package of the + application. Once it is created it will act as a central registry for + the view functions, the URL rules, template configuration and much more. + + The name of the package is used to resolve resources from inside the + package or the folder the module is contained in depending on if the + package parameter resolves to an actual python package (a folder with + an :file:`__init__.py` file inside) or a standard module (just a ``.py`` file). + + For more information about resource loading, see :func:`open_resource`. + + Usually you create a :class:`Flask` instance in your main module or + in the :file:`__init__.py` file of your package like this:: + + from flask import Flask + app = Flask(__name__) + + .. admonition:: About the First Parameter + + The idea of the first parameter is to give Flask an idea of what + belongs to your application. This name is used to find resources + on the filesystem, can be used by extensions to improve debugging + information and a lot more. + + So it's important what you provide there. If you are using a single + module, `__name__` is always the correct value. If you however are + using a package, it's usually recommended to hardcode the name of + your package there. + + For example if your application is defined in :file:`yourapplication/app.py` + you should create it with one of the two versions below:: + + app = Flask('yourapplication') + app = Flask(__name__.split('.')[0]) + + Why is that? The application will work even with `__name__`, thanks + to how resources are looked up. However it will make debugging more + painful. Certain extensions can make assumptions based on the + import name of your application. For example the Flask-SQLAlchemy + extension will look for the code in your application that triggered + an SQL query in debug mode. If the import name is not properly set + up, that debugging information is lost. (For example it would only + pick up SQL queries in `yourapplication.app` and not + `yourapplication.views.frontend`) + + .. versionadded:: 0.7 + The `static_url_path`, `static_folder`, and `template_folder` + parameters were added. + + .. versionadded:: 0.8 + The `instance_path` and `instance_relative_config` parameters were + added. + + .. versionadded:: 0.11 + The `root_path` parameter was added. + + .. versionadded:: 1.0 + The ``host_matching`` and ``static_host`` parameters were added. + + .. versionadded:: 1.0 + The ``subdomain_matching`` parameter was added. Subdomain + matching needs to be enabled manually now. Setting + :data:`SERVER_NAME` does not implicitly enable it. + + :param import_name: the name of the application package + :param static_url_path: can be used to specify a different path for the + static files on the web. Defaults to the name + of the `static_folder` folder. + :param static_folder: The folder with static files that is served at + ``static_url_path``. Relative to the application ``root_path`` + or an absolute path. Defaults to ``'static'``. + :param static_host: the host to use when adding the static route. + Defaults to None. Required when using ``host_matching=True`` + with a ``static_folder`` configured. + :param host_matching: set ``url_map.host_matching`` attribute. + Defaults to False. + :param subdomain_matching: consider the subdomain relative to + :data:`SERVER_NAME` when matching routes. Defaults to False. + :param template_folder: the folder that contains the templates that should + be used by the application. Defaults to + ``'templates'`` folder in the root path of the + application. + :param instance_path: An alternative instance path for the application. + By default the folder ``'instance'`` next to the + package or module is assumed to be the instance + path. + :param instance_relative_config: if set to ``True`` relative filenames + for loading the config are assumed to + be relative to the instance path instead + of the application root. + :param root_path: The path to the root of the application files. + This should only be set manually when it can't be detected + automatically, such as for namespace packages. + """ + + default_config = ImmutableDict( + { + "DEBUG": None, + "TESTING": False, + "PROPAGATE_EXCEPTIONS": None, + "SECRET_KEY": None, + "PERMANENT_SESSION_LIFETIME": timedelta(days=31), + "USE_X_SENDFILE": False, + "SERVER_NAME": None, + "APPLICATION_ROOT": "/", + "SESSION_COOKIE_NAME": "session", + "SESSION_COOKIE_DOMAIN": None, + "SESSION_COOKIE_PATH": None, + "SESSION_COOKIE_HTTPONLY": True, + "SESSION_COOKIE_SECURE": False, + "SESSION_COOKIE_SAMESITE": None, + "SESSION_REFRESH_EACH_REQUEST": True, + "MAX_CONTENT_LENGTH": None, + "SEND_FILE_MAX_AGE_DEFAULT": None, + "TRAP_BAD_REQUEST_ERRORS": None, + "TRAP_HTTP_EXCEPTIONS": False, + "EXPLAIN_TEMPLATE_LOADING": False, + "PREFERRED_URL_SCHEME": "http", + "TEMPLATES_AUTO_RELOAD": None, + "MAX_COOKIE_SIZE": 4093, + } + ) + + #: The class that is used for request objects. See :class:`~flask.Request` + #: for more information. + request_class = Request + + #: The class that is used for response objects. See + #: :class:`~flask.Response` for more information. + response_class = Response + + #: the session interface to use. By default an instance of + #: :class:`~flask.sessions.SecureCookieSessionInterface` is used here. + #: + #: .. versionadded:: 0.8 + session_interface: SessionInterface = SecureCookieSessionInterface() + + def __init__( + self, + import_name: str, + static_url_path: str | None = None, + static_folder: str | os.PathLike | None = "static", + static_host: str | None = None, + host_matching: bool = False, + subdomain_matching: bool = False, + template_folder: str | os.PathLike | None = "templates", + instance_path: str | None = None, + instance_relative_config: bool = False, + root_path: str | None = None, + ): + super().__init__( + import_name=import_name, + static_url_path=static_url_path, + static_folder=static_folder, + static_host=static_host, + host_matching=host_matching, + subdomain_matching=subdomain_matching, + template_folder=template_folder, + instance_path=instance_path, + instance_relative_config=instance_relative_config, + root_path=root_path, + ) + + # Add a static route using the provided static_url_path, static_host, + # and static_folder if there is a configured static_folder. + # Note we do this without checking if static_folder exists. + # For one, it might be created while the server is running (e.g. during + # development). Also, Google App Engine stores static files somewhere + if self.has_static_folder: + assert ( + bool(static_host) == host_matching + ), "Invalid static_host/host_matching combination" + # Use a weakref to avoid creating a reference cycle between the app + # and the view function (see #3761). + self_ref = weakref.ref(self) + self.add_url_rule( + f"{self.static_url_path}/", + endpoint="static", + host=static_host, + view_func=lambda **kw: self_ref().send_static_file(**kw), # type: ignore # noqa: B950 + ) + + def get_send_file_max_age(self, filename: str | None) -> int | None: + """Used by :func:`send_file` to determine the ``max_age`` cache + value for a given file path if it wasn't passed. + + By default, this returns :data:`SEND_FILE_MAX_AGE_DEFAULT` from + the configuration of :data:`~flask.current_app`. This defaults + to ``None``, which tells the browser to use conditional requests + instead of a timed cache, which is usually preferable. + + Note this is a duplicate of the same method in the Flask + class. + + .. versionchanged:: 2.0 + The default configuration is ``None`` instead of 12 hours. + + .. versionadded:: 0.9 + """ + value = current_app.config["SEND_FILE_MAX_AGE_DEFAULT"] + + if value is None: + return None + + if isinstance(value, timedelta): + return int(value.total_seconds()) + + return value + + def send_static_file(self, filename: str) -> Response: + """The view function used to serve files from + :attr:`static_folder`. A route is automatically registered for + this view at :attr:`static_url_path` if :attr:`static_folder` is + set. + + Note this is a duplicate of the same method in the Flask + class. + + .. versionadded:: 0.5 + + """ + if not self.has_static_folder: + raise RuntimeError("'static_folder' must be set to serve static_files.") + + # send_file only knows to call get_send_file_max_age on the app, + # call it here so it works for blueprints too. + max_age = self.get_send_file_max_age(filename) + return send_from_directory( + t.cast(str, self.static_folder), filename, max_age=max_age + ) + + def open_resource(self, resource: str, mode: str = "rb") -> t.IO[t.AnyStr]: + """Open a resource file relative to :attr:`root_path` for + reading. + + For example, if the file ``schema.sql`` is next to the file + ``app.py`` where the ``Flask`` app is defined, it can be opened + with: + + .. code-block:: python + + with app.open_resource("schema.sql") as f: + conn.executescript(f.read()) + + :param resource: Path to the resource relative to + :attr:`root_path`. + :param mode: Open the file in this mode. Only reading is + supported, valid values are "r" (or "rt") and "rb". + + Note this is a duplicate of the same method in the Flask + class. + + """ + if mode not in {"r", "rt", "rb"}: + raise ValueError("Resources can only be opened for reading.") + + return open(os.path.join(self.root_path, resource), mode) + + def open_instance_resource(self, resource: str, mode: str = "rb") -> t.IO[t.AnyStr]: + """Opens a resource from the application's instance folder + (:attr:`instance_path`). Otherwise works like + :meth:`open_resource`. Instance resources can also be opened for + writing. + + :param resource: the name of the resource. To access resources within + subfolders use forward slashes as separator. + :param mode: resource file opening mode, default is 'rb'. + """ + return open(os.path.join(self.instance_path, resource), mode) + + def create_jinja_environment(self) -> Environment: + """Create the Jinja environment based on :attr:`jinja_options` + and the various Jinja-related methods of the app. Changing + :attr:`jinja_options` after this will have no effect. Also adds + Flask-related globals and filters to the environment. + + .. versionchanged:: 0.11 + ``Environment.auto_reload`` set in accordance with + ``TEMPLATES_AUTO_RELOAD`` configuration option. + + .. versionadded:: 0.5 + """ + options = dict(self.jinja_options) + + if "autoescape" not in options: + options["autoescape"] = self.select_jinja_autoescape + + if "auto_reload" not in options: + auto_reload = self.config["TEMPLATES_AUTO_RELOAD"] + + if auto_reload is None: + auto_reload = self.debug + + options["auto_reload"] = auto_reload + + rv = self.jinja_environment(self, **options) + rv.globals.update( + url_for=self.url_for, + get_flashed_messages=get_flashed_messages, + config=self.config, + # request, session and g are normally added with the + # context processor for efficiency reasons but for imported + # templates we also want the proxies in there. + request=request, + session=session, + g=g, + ) + rv.policies["json.dumps_function"] = self.json.dumps + return rv + + def create_url_adapter(self, request: Request | None) -> MapAdapter | None: + """Creates a URL adapter for the given request. The URL adapter + is created at a point where the request context is not yet set + up so the request is passed explicitly. + + .. versionadded:: 0.6 + + .. versionchanged:: 0.9 + This can now also be called without a request object when the + URL adapter is created for the application context. + + .. versionchanged:: 1.0 + :data:`SERVER_NAME` no longer implicitly enables subdomain + matching. Use :attr:`subdomain_matching` instead. + """ + if request is not None: + # If subdomain matching is disabled (the default), use the + # default subdomain in all cases. This should be the default + # in Werkzeug but it currently does not have that feature. + if not self.subdomain_matching: + subdomain = self.url_map.default_subdomain or None + else: + subdomain = None + + return self.url_map.bind_to_environ( + request.environ, + server_name=self.config["SERVER_NAME"], + subdomain=subdomain, + ) + # We need at the very least the server name to be set for this + # to work. + if self.config["SERVER_NAME"] is not None: + return self.url_map.bind( + self.config["SERVER_NAME"], + script_name=self.config["APPLICATION_ROOT"], + url_scheme=self.config["PREFERRED_URL_SCHEME"], + ) + + return None + + def raise_routing_exception(self, request: Request) -> t.NoReturn: + """Intercept routing exceptions and possibly do something else. + + In debug mode, intercept a routing redirect and replace it with + an error if the body will be discarded. + + With modern Werkzeug this shouldn't occur, since it now uses a + 308 status which tells the browser to resend the method and + body. + + .. versionchanged:: 2.1 + Don't intercept 307 and 308 redirects. + + :meta private: + :internal: + """ + if ( + not self.debug + or not isinstance(request.routing_exception, RequestRedirect) + or request.routing_exception.code in {307, 308} + or request.method in {"GET", "HEAD", "OPTIONS"} + ): + raise request.routing_exception # type: ignore + + from .debughelpers import FormDataRoutingRedirect + + raise FormDataRoutingRedirect(request) + + def update_template_context(self, context: dict) -> None: + """Update the template context with some commonly used variables. + This injects request, session, config and g into the template + context as well as everything template context processors want + to inject. Note that the as of Flask 0.6, the original values + in the context will not be overridden if a context processor + decides to return a value with the same key. + + :param context: the context as a dictionary that is updated in place + to add extra variables. + """ + names: t.Iterable[str | None] = (None,) + + # A template may be rendered outside a request context. + if request: + names = chain(names, reversed(request.blueprints)) + + # The values passed to render_template take precedence. Keep a + # copy to re-apply after all context functions. + orig_ctx = context.copy() + + for name in names: + if name in self.template_context_processors: + for func in self.template_context_processors[name]: + context.update(self.ensure_sync(func)()) + + context.update(orig_ctx) + + def make_shell_context(self) -> dict: + """Returns the shell context for an interactive shell for this + application. This runs all the registered shell context + processors. + + .. versionadded:: 0.11 + """ + rv = {"app": self, "g": g} + for processor in self.shell_context_processors: + rv.update(processor()) + return rv + + def run( + self, + host: str | None = None, + port: int | None = None, + debug: bool | None = None, + load_dotenv: bool = True, + **options: t.Any, + ) -> None: + """Runs the application on a local development server. + + Do not use ``run()`` in a production setting. It is not intended to + meet security and performance requirements for a production server. + Instead, see :doc:`/deploying/index` for WSGI server recommendations. + + If the :attr:`debug` flag is set the server will automatically reload + for code changes and show a debugger in case an exception happened. + + If you want to run the application in debug mode, but disable the + code execution on the interactive debugger, you can pass + ``use_evalex=False`` as parameter. This will keep the debugger's + traceback screen active, but disable code execution. + + It is not recommended to use this function for development with + automatic reloading as this is badly supported. Instead you should + be using the :command:`flask` command line script's ``run`` support. + + .. admonition:: Keep in Mind + + Flask will suppress any server error with a generic error page + unless it is in debug mode. As such to enable just the + interactive debugger without the code reloading, you have to + invoke :meth:`run` with ``debug=True`` and ``use_reloader=False``. + Setting ``use_debugger`` to ``True`` without being in debug mode + won't catch any exceptions because there won't be any to + catch. + + :param host: the hostname to listen on. Set this to ``'0.0.0.0'`` to + have the server available externally as well. Defaults to + ``'127.0.0.1'`` or the host in the ``SERVER_NAME`` config variable + if present. + :param port: the port of the webserver. Defaults to ``5000`` or the + port defined in the ``SERVER_NAME`` config variable if present. + :param debug: if given, enable or disable debug mode. See + :attr:`debug`. + :param load_dotenv: Load the nearest :file:`.env` and :file:`.flaskenv` + files to set environment variables. Will also change the working + directory to the directory containing the first file found. + :param options: the options to be forwarded to the underlying Werkzeug + server. See :func:`werkzeug.serving.run_simple` for more + information. + + .. versionchanged:: 1.0 + If installed, python-dotenv will be used to load environment + variables from :file:`.env` and :file:`.flaskenv` files. + + The :envvar:`FLASK_DEBUG` environment variable will override :attr:`debug`. + + Threaded mode is enabled by default. + + .. versionchanged:: 0.10 + The default port is now picked from the ``SERVER_NAME`` + variable. + """ + # Ignore this call so that it doesn't start another server if + # the 'flask run' command is used. + if os.environ.get("FLASK_RUN_FROM_CLI") == "true": + if not is_running_from_reloader(): + click.secho( + " * Ignoring a call to 'app.run()' that would block" + " the current 'flask' CLI command.\n" + " Only call 'app.run()' in an 'if __name__ ==" + ' "__main__"\' guard.', + fg="red", + ) + + return + + if get_load_dotenv(load_dotenv): + cli.load_dotenv() + + # if set, env var overrides existing value + if "FLASK_DEBUG" in os.environ: + self.debug = get_debug_flag() + + # debug passed to method overrides all other sources + if debug is not None: + self.debug = bool(debug) + + server_name = self.config.get("SERVER_NAME") + sn_host = sn_port = None + + if server_name: + sn_host, _, sn_port = server_name.partition(":") + + if not host: + if sn_host: + host = sn_host + else: + host = "127.0.0.1" + + if port or port == 0: + port = int(port) + elif sn_port: + port = int(sn_port) + else: + port = 5000 + + options.setdefault("use_reloader", self.debug) + options.setdefault("use_debugger", self.debug) + options.setdefault("threaded", True) + + cli.show_server_banner(self.debug, self.name) + + from werkzeug.serving import run_simple + + try: + run_simple(t.cast(str, host), port, self, **options) + finally: + # reset the first request information if the development server + # reset normally. This makes it possible to restart the server + # without reloader and that stuff from an interactive shell. + self._got_first_request = False + + def test_client(self, use_cookies: bool = True, **kwargs: t.Any) -> FlaskClient: + """Creates a test client for this application. For information + about unit testing head over to :doc:`/testing`. + + Note that if you are testing for assertions or exceptions in your + application code, you must set ``app.testing = True`` in order for the + exceptions to propagate to the test client. Otherwise, the exception + will be handled by the application (not visible to the test client) and + the only indication of an AssertionError or other exception will be a + 500 status code response to the test client. See the :attr:`testing` + attribute. For example:: + + app.testing = True + client = app.test_client() + + The test client can be used in a ``with`` block to defer the closing down + of the context until the end of the ``with`` block. This is useful if + you want to access the context locals for testing:: + + with app.test_client() as c: + rv = c.get('/?vodka=42') + assert request.args['vodka'] == '42' + + Additionally, you may pass optional keyword arguments that will then + be passed to the application's :attr:`test_client_class` constructor. + For example:: + + from flask.testing import FlaskClient + + class CustomClient(FlaskClient): + def __init__(self, *args, **kwargs): + self._authentication = kwargs.pop("authentication") + super(CustomClient,self).__init__( *args, **kwargs) + + app.test_client_class = CustomClient + client = app.test_client(authentication='Basic ....') + + See :class:`~flask.testing.FlaskClient` for more information. + + .. versionchanged:: 0.4 + added support for ``with`` block usage for the client. + + .. versionadded:: 0.7 + The `use_cookies` parameter was added as well as the ability + to override the client to be used by setting the + :attr:`test_client_class` attribute. + + .. versionchanged:: 0.11 + Added `**kwargs` to support passing additional keyword arguments to + the constructor of :attr:`test_client_class`. + """ + cls = self.test_client_class + if cls is None: + from .testing import FlaskClient as cls + return cls( # type: ignore + self, self.response_class, use_cookies=use_cookies, **kwargs + ) + + def test_cli_runner(self, **kwargs: t.Any) -> FlaskCliRunner: + """Create a CLI runner for testing CLI commands. + See :ref:`testing-cli`. + + Returns an instance of :attr:`test_cli_runner_class`, by default + :class:`~flask.testing.FlaskCliRunner`. The Flask app object is + passed as the first argument. + + .. versionadded:: 1.0 + """ + cls = self.test_cli_runner_class + + if cls is None: + from .testing import FlaskCliRunner as cls + + return cls(self, **kwargs) # type: ignore + + def handle_http_exception( + self, e: HTTPException + ) -> HTTPException | ft.ResponseReturnValue: + """Handles an HTTP exception. By default this will invoke the + registered error handlers and fall back to returning the + exception as response. + + .. versionchanged:: 1.0.3 + ``RoutingException``, used internally for actions such as + slash redirects during routing, is not passed to error + handlers. + + .. versionchanged:: 1.0 + Exceptions are looked up by code *and* by MRO, so + ``HTTPException`` subclasses can be handled with a catch-all + handler for the base ``HTTPException``. + + .. versionadded:: 0.3 + """ + # Proxy exceptions don't have error codes. We want to always return + # those unchanged as errors + if e.code is None: + return e + + # RoutingExceptions are used internally to trigger routing + # actions, such as slash redirects raising RequestRedirect. They + # are not raised or handled in user code. + if isinstance(e, RoutingException): + return e + + handler = self._find_error_handler(e, request.blueprints) + if handler is None: + return e + return self.ensure_sync(handler)(e) + + def handle_user_exception( + self, e: Exception + ) -> HTTPException | ft.ResponseReturnValue: + """This method is called whenever an exception occurs that + should be handled. A special case is :class:`~werkzeug + .exceptions.HTTPException` which is forwarded to the + :meth:`handle_http_exception` method. This function will either + return a response value or reraise the exception with the same + traceback. + + .. versionchanged:: 1.0 + Key errors raised from request data like ``form`` show the + bad key in debug mode rather than a generic bad request + message. + + .. versionadded:: 0.7 + """ + if isinstance(e, BadRequestKeyError) and ( + self.debug or self.config["TRAP_BAD_REQUEST_ERRORS"] + ): + e.show_exception = True + + if isinstance(e, HTTPException) and not self.trap_http_exception(e): + return self.handle_http_exception(e) + + handler = self._find_error_handler(e, request.blueprints) + + if handler is None: + raise + + return self.ensure_sync(handler)(e) + + def handle_exception(self, e: Exception) -> Response: + """Handle an exception that did not have an error handler + associated with it, or that was raised from an error handler. + This always causes a 500 ``InternalServerError``. + + Always sends the :data:`got_request_exception` signal. + + If :data:`PROPAGATE_EXCEPTIONS` is ``True``, such as in debug + mode, the error will be re-raised so that the debugger can + display it. Otherwise, the original exception is logged, and + an :exc:`~werkzeug.exceptions.InternalServerError` is returned. + + If an error handler is registered for ``InternalServerError`` or + ``500``, it will be used. For consistency, the handler will + always receive the ``InternalServerError``. The original + unhandled exception is available as ``e.original_exception``. + + .. versionchanged:: 1.1.0 + Always passes the ``InternalServerError`` instance to the + handler, setting ``original_exception`` to the unhandled + error. + + .. versionchanged:: 1.1.0 + ``after_request`` functions and other finalization is done + even for the default 500 response when there is no handler. + + .. versionadded:: 0.3 + """ + exc_info = sys.exc_info() + got_request_exception.send(self, _async_wrapper=self.ensure_sync, exception=e) + propagate = self.config["PROPAGATE_EXCEPTIONS"] + + if propagate is None: + propagate = self.testing or self.debug + + if propagate: + # Re-raise if called with an active exception, otherwise + # raise the passed in exception. + if exc_info[1] is e: + raise + + raise e + + self.log_exception(exc_info) + server_error: InternalServerError | ft.ResponseReturnValue + server_error = InternalServerError(original_exception=e) + handler = self._find_error_handler(server_error, request.blueprints) + + if handler is not None: + server_error = self.ensure_sync(handler)(server_error) + + return self.finalize_request(server_error, from_error_handler=True) + + def log_exception( + self, + exc_info: (tuple[type, BaseException, TracebackType] | tuple[None, None, None]), + ) -> None: + """Logs an exception. This is called by :meth:`handle_exception` + if debugging is disabled and right before the handler is called. + The default implementation logs the exception as error on the + :attr:`logger`. + + .. versionadded:: 0.8 + """ + self.logger.error( + f"Exception on {request.path} [{request.method}]", exc_info=exc_info + ) + + def dispatch_request(self) -> ft.ResponseReturnValue: + """Does the request dispatching. Matches the URL and returns the + return value of the view or error handler. This does not have to + be a response object. In order to convert the return value to a + proper response object, call :func:`make_response`. + + .. versionchanged:: 0.7 + This no longer does the exception handling, this code was + moved to the new :meth:`full_dispatch_request`. + """ + req = request_ctx.request + if req.routing_exception is not None: + self.raise_routing_exception(req) + rule: Rule = req.url_rule # type: ignore[assignment] + # if we provide automatic options for this URL and the + # request came with the OPTIONS method, reply automatically + if ( + getattr(rule, "provide_automatic_options", False) + and req.method == "OPTIONS" + ): + return self.make_default_options_response() + # otherwise dispatch to the handler for that endpoint + view_args: dict[str, t.Any] = req.view_args # type: ignore[assignment] + return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) + + def full_dispatch_request(self) -> Response: + """Dispatches the request and on top of that performs request + pre and postprocessing as well as HTTP exception catching and + error handling. + + .. versionadded:: 0.7 + """ + self._got_first_request = True + + try: + request_started.send(self, _async_wrapper=self.ensure_sync) + rv = self.preprocess_request() + if rv is None: + rv = self.dispatch_request() + except Exception as e: + rv = self.handle_user_exception(e) + return self.finalize_request(rv) + + def finalize_request( + self, + rv: ft.ResponseReturnValue | HTTPException, + from_error_handler: bool = False, + ) -> Response: + """Given the return value from a view function this finalizes + the request by converting it into a response and invoking the + postprocessing functions. This is invoked for both normal + request dispatching as well as error handlers. + + Because this means that it might be called as a result of a + failure a special safe mode is available which can be enabled + with the `from_error_handler` flag. If enabled, failures in + response processing will be logged and otherwise ignored. + + :internal: + """ + response = self.make_response(rv) + try: + response = self.process_response(response) + request_finished.send( + self, _async_wrapper=self.ensure_sync, response=response + ) + except Exception: + if not from_error_handler: + raise + self.logger.exception( + "Request finalizing failed with an error while handling an error" + ) + return response + + def make_default_options_response(self) -> Response: + """This method is called to create the default ``OPTIONS`` response. + This can be changed through subclassing to change the default + behavior of ``OPTIONS`` responses. + + .. versionadded:: 0.7 + """ + adapter = request_ctx.url_adapter + methods = adapter.allowed_methods() # type: ignore[union-attr] + rv = self.response_class() + rv.allow.update(methods) + return rv + + def ensure_sync(self, func: t.Callable) -> t.Callable: + """Ensure that the function is synchronous for WSGI workers. + Plain ``def`` functions are returned as-is. ``async def`` + functions are wrapped to run and wait for the response. + + Override this method to change how the app runs async views. + + .. versionadded:: 2.0 + """ + if iscoroutinefunction(func): + return self.async_to_sync(func) + + return func + + def async_to_sync( + self, func: t.Callable[..., t.Coroutine] + ) -> t.Callable[..., t.Any]: + """Return a sync function that will run the coroutine function. + + .. code-block:: python + + result = app.async_to_sync(func)(*args, **kwargs) + + Override this method to change how the app converts async code + to be synchronously callable. + + .. versionadded:: 2.0 + """ + try: + from asgiref.sync import async_to_sync as asgiref_async_to_sync + except ImportError: + raise RuntimeError( + "Install Flask with the 'async' extra in order to use async views." + ) from None + + return asgiref_async_to_sync(func) + + def url_for( + self, + /, + endpoint: str, + *, + _anchor: str | None = None, + _method: str | None = None, + _scheme: str | None = None, + _external: bool | None = None, + **values: t.Any, + ) -> str: + """Generate a URL to the given endpoint with the given values. + + This is called by :func:`flask.url_for`, and can be called + directly as well. + + An *endpoint* is the name of a URL rule, usually added with + :meth:`@app.route() `, and usually the same name as the + view function. A route defined in a :class:`~flask.Blueprint` + will prepend the blueprint's name separated by a ``.`` to the + endpoint. + + In some cases, such as email messages, you want URLs to include + the scheme and domain, like ``https://example.com/hello``. When + not in an active request, URLs will be external by default, but + this requires setting :data:`SERVER_NAME` so Flask knows what + domain to use. :data:`APPLICATION_ROOT` and + :data:`PREFERRED_URL_SCHEME` should also be configured as + needed. This config is only used when not in an active request. + + Functions can be decorated with :meth:`url_defaults` to modify + keyword arguments before the URL is built. + + If building fails for some reason, such as an unknown endpoint + or incorrect values, the app's :meth:`handle_url_build_error` + method is called. If that returns a string, that is returned, + otherwise a :exc:`~werkzeug.routing.BuildError` is raised. + + :param endpoint: The endpoint name associated with the URL to + generate. If this starts with a ``.``, the current blueprint + name (if any) will be used. + :param _anchor: If given, append this as ``#anchor`` to the URL. + :param _method: If given, generate the URL associated with this + method for the endpoint. + :param _scheme: If given, the URL will have this scheme if it + is external. + :param _external: If given, prefer the URL to be internal + (False) or require it to be external (True). External URLs + include the scheme and domain. When not in an active + request, URLs are external by default. + :param values: Values to use for the variable parts of the URL + rule. Unknown keys are appended as query string arguments, + like ``?a=b&c=d``. + + .. versionadded:: 2.2 + Moved from ``flask.url_for``, which calls this method. + """ + req_ctx = _cv_request.get(None) + + if req_ctx is not None: + url_adapter = req_ctx.url_adapter + blueprint_name = req_ctx.request.blueprint + + # If the endpoint starts with "." and the request matches a + # blueprint, the endpoint is relative to the blueprint. + if endpoint[:1] == ".": + if blueprint_name is not None: + endpoint = f"{blueprint_name}{endpoint}" + else: + endpoint = endpoint[1:] + + # When in a request, generate a URL without scheme and + # domain by default, unless a scheme is given. + if _external is None: + _external = _scheme is not None + else: + app_ctx = _cv_app.get(None) + + # If called by helpers.url_for, an app context is active, + # use its url_adapter. Otherwise, app.url_for was called + # directly, build an adapter. + if app_ctx is not None: + url_adapter = app_ctx.url_adapter + else: + url_adapter = self.create_url_adapter(None) + + if url_adapter is None: + raise RuntimeError( + "Unable to build URLs outside an active request" + " without 'SERVER_NAME' configured. Also configure" + " 'APPLICATION_ROOT' and 'PREFERRED_URL_SCHEME' as" + " needed." + ) + + # When outside a request, generate a URL with scheme and + # domain by default. + if _external is None: + _external = True + + # It is an error to set _scheme when _external=False, in order + # to avoid accidental insecure URLs. + if _scheme is not None and not _external: + raise ValueError("When specifying '_scheme', '_external' must be True.") + + self.inject_url_defaults(endpoint, values) + + try: + rv = url_adapter.build( # type: ignore[union-attr] + endpoint, + values, + method=_method, + url_scheme=_scheme, + force_external=_external, + ) + except BuildError as error: + values.update( + _anchor=_anchor, _method=_method, _scheme=_scheme, _external=_external + ) + return self.handle_url_build_error(error, endpoint, values) + + if _anchor is not None: + _anchor = _url_quote(_anchor, safe="%!#$&'()*+,/:;=?@") + rv = f"{rv}#{_anchor}" + + return rv + + def make_response(self, rv: ft.ResponseReturnValue) -> Response: + """Convert the return value from a view function to an instance of + :attr:`response_class`. + + :param rv: the return value from the view function. The view function + must return a response. Returning ``None``, or the view ending + without returning, is not allowed. The following types are allowed + for ``view_rv``: + + ``str`` + A response object is created with the string encoded to UTF-8 + as the body. + + ``bytes`` + A response object is created with the bytes as the body. + + ``dict`` + A dictionary that will be jsonify'd before being returned. + + ``list`` + A list that will be jsonify'd before being returned. + + ``generator`` or ``iterator`` + A generator that returns ``str`` or ``bytes`` to be + streamed as the response. + + ``tuple`` + Either ``(body, status, headers)``, ``(body, status)``, or + ``(body, headers)``, where ``body`` is any of the other types + allowed here, ``status`` is a string or an integer, and + ``headers`` is a dictionary or a list of ``(key, value)`` + tuples. If ``body`` is a :attr:`response_class` instance, + ``status`` overwrites the exiting value and ``headers`` are + extended. + + :attr:`response_class` + The object is returned unchanged. + + other :class:`~werkzeug.wrappers.Response` class + The object is coerced to :attr:`response_class`. + + :func:`callable` + The function is called as a WSGI application. The result is + used to create a response object. + + .. versionchanged:: 2.2 + A generator will be converted to a streaming response. + A list will be converted to a JSON response. + + .. versionchanged:: 1.1 + A dict will be converted to a JSON response. + + .. versionchanged:: 0.9 + Previously a tuple was interpreted as the arguments for the + response object. + """ + + status = headers = None + + # unpack tuple returns + if isinstance(rv, tuple): + len_rv = len(rv) + + # a 3-tuple is unpacked directly + if len_rv == 3: + rv, status, headers = rv # type: ignore[misc] + # decide if a 2-tuple has status or headers + elif len_rv == 2: + if isinstance(rv[1], (Headers, dict, tuple, list)): + rv, headers = rv + else: + rv, status = rv # type: ignore[assignment,misc] + # other sized tuples are not allowed + else: + raise TypeError( + "The view function did not return a valid response tuple." + " The tuple must have the form (body, status, headers)," + " (body, status), or (body, headers)." + ) + + # the body must not be None + if rv is None: + raise TypeError( + f"The view function for {request.endpoint!r} did not" + " return a valid response. The function either returned" + " None or ended without a return statement." + ) + + # make sure the body is an instance of the response class + if not isinstance(rv, self.response_class): + if isinstance(rv, (str, bytes, bytearray)) or isinstance(rv, _abc_Iterator): + # let the response class set the status and headers instead of + # waiting to do it manually, so that the class can handle any + # special logic + rv = self.response_class( + rv, + status=status, + headers=headers, # type: ignore[arg-type] + ) + status = headers = None + elif isinstance(rv, (dict, list)): + rv = self.json.response(rv) + elif isinstance(rv, BaseResponse) or callable(rv): + # evaluate a WSGI callable, or coerce a different response + # class to the correct type + try: + rv = self.response_class.force_type( + rv, request.environ # type: ignore[arg-type] + ) + except TypeError as e: + raise TypeError( + f"{e}\nThe view function did not return a valid" + " response. The return type must be a string," + " dict, list, tuple with headers or status," + " Response instance, or WSGI callable, but it" + f" was a {type(rv).__name__}." + ).with_traceback(sys.exc_info()[2]) from None + else: + raise TypeError( + "The view function did not return a valid" + " response. The return type must be a string," + " dict, list, tuple with headers or status," + " Response instance, or WSGI callable, but it was a" + f" {type(rv).__name__}." + ) + + rv = t.cast(Response, rv) + # prefer the status if it was provided + if status is not None: + if isinstance(status, (str, bytes, bytearray)): + rv.status = status + else: + rv.status_code = status + + # extend existing headers with provided headers + if headers: + rv.headers.update(headers) # type: ignore[arg-type] + + return rv + + def preprocess_request(self) -> ft.ResponseReturnValue | None: + """Called before the request is dispatched. Calls + :attr:`url_value_preprocessors` registered with the app and the + current blueprint (if any). Then calls :attr:`before_request_funcs` + registered with the app and the blueprint. + + If any :meth:`before_request` handler returns a non-None value, the + value is handled as if it was the return value from the view, and + further request handling is stopped. + """ + names = (None, *reversed(request.blueprints)) + + for name in names: + if name in self.url_value_preprocessors: + for url_func in self.url_value_preprocessors[name]: + url_func(request.endpoint, request.view_args) + + for name in names: + if name in self.before_request_funcs: + for before_func in self.before_request_funcs[name]: + rv = self.ensure_sync(before_func)() + + if rv is not None: + return rv + + return None + + def process_response(self, response: Response) -> Response: + """Can be overridden in order to modify the response object + before it's sent to the WSGI server. By default this will + call all the :meth:`after_request` decorated functions. + + .. versionchanged:: 0.5 + As of Flask 0.5 the functions registered for after request + execution are called in reverse order of registration. + + :param response: a :attr:`response_class` object. + :return: a new response object or the same, has to be an + instance of :attr:`response_class`. + """ + ctx = request_ctx._get_current_object() # type: ignore[attr-defined] + + for func in ctx._after_request_functions: + response = self.ensure_sync(func)(response) + + for name in chain(request.blueprints, (None,)): + if name in self.after_request_funcs: + for func in reversed(self.after_request_funcs[name]): + response = self.ensure_sync(func)(response) + + if not self.session_interface.is_null_session(ctx.session): + self.session_interface.save_session(self, ctx.session, response) + + return response + + def do_teardown_request( + self, exc: BaseException | None = _sentinel # type: ignore + ) -> None: + """Called after the request is dispatched and the response is + returned, right before the request context is popped. + + This calls all functions decorated with + :meth:`teardown_request`, and :meth:`Blueprint.teardown_request` + if a blueprint handled the request. Finally, the + :data:`request_tearing_down` signal is sent. + + This is called by + :meth:`RequestContext.pop() `, + which may be delayed during testing to maintain access to + resources. + + :param exc: An unhandled exception raised while dispatching the + request. Detected from the current exception information if + not passed. Passed to each teardown function. + + .. versionchanged:: 0.9 + Added the ``exc`` argument. + """ + if exc is _sentinel: + exc = sys.exc_info()[1] + + for name in chain(request.blueprints, (None,)): + if name in self.teardown_request_funcs: + for func in reversed(self.teardown_request_funcs[name]): + self.ensure_sync(func)(exc) + + request_tearing_down.send(self, _async_wrapper=self.ensure_sync, exc=exc) + + def do_teardown_appcontext( + self, exc: BaseException | None = _sentinel # type: ignore + ) -> None: + """Called right before the application context is popped. + + When handling a request, the application context is popped + after the request context. See :meth:`do_teardown_request`. + + This calls all functions decorated with + :meth:`teardown_appcontext`. Then the + :data:`appcontext_tearing_down` signal is sent. + + This is called by + :meth:`AppContext.pop() `. + + .. versionadded:: 0.9 + """ + if exc is _sentinel: + exc = sys.exc_info()[1] + + for func in reversed(self.teardown_appcontext_funcs): + self.ensure_sync(func)(exc) + + appcontext_tearing_down.send(self, _async_wrapper=self.ensure_sync, exc=exc) + + def app_context(self) -> AppContext: + """Create an :class:`~flask.ctx.AppContext`. Use as a ``with`` + block to push the context, which will make :data:`current_app` + point at this application. + + An application context is automatically pushed by + :meth:`RequestContext.push() ` + when handling a request, and when running a CLI command. Use + this to manually create a context outside of these situations. + + :: + + with app.app_context(): + init_db() + + See :doc:`/appcontext`. + + .. versionadded:: 0.9 + """ + return AppContext(self) + + def request_context(self, environ: dict) -> RequestContext: + """Create a :class:`~flask.ctx.RequestContext` representing a + WSGI environment. Use a ``with`` block to push the context, + which will make :data:`request` point at this request. + + See :doc:`/reqcontext`. + + Typically you should not call this from your own code. A request + context is automatically pushed by the :meth:`wsgi_app` when + handling a request. Use :meth:`test_request_context` to create + an environment and context instead of this method. + + :param environ: a WSGI environment + """ + return RequestContext(self, environ) + + def test_request_context(self, *args: t.Any, **kwargs: t.Any) -> RequestContext: + """Create a :class:`~flask.ctx.RequestContext` for a WSGI + environment created from the given values. This is mostly useful + during testing, where you may want to run a function that uses + request data without dispatching a full request. + + See :doc:`/reqcontext`. + + Use a ``with`` block to push the context, which will make + :data:`request` point at the request for the created + environment. :: + + with app.test_request_context(...): + generate_report() + + When using the shell, it may be easier to push and pop the + context manually to avoid indentation. :: + + ctx = app.test_request_context(...) + ctx.push() + ... + ctx.pop() + + Takes the same arguments as Werkzeug's + :class:`~werkzeug.test.EnvironBuilder`, with some defaults from + the application. See the linked Werkzeug docs for most of the + available arguments. Flask-specific behavior is listed here. + + :param path: URL path being requested. + :param base_url: Base URL where the app is being served, which + ``path`` is relative to. If not given, built from + :data:`PREFERRED_URL_SCHEME`, ``subdomain``, + :data:`SERVER_NAME`, and :data:`APPLICATION_ROOT`. + :param subdomain: Subdomain name to append to + :data:`SERVER_NAME`. + :param url_scheme: Scheme to use instead of + :data:`PREFERRED_URL_SCHEME`. + :param data: The request body, either as a string or a dict of + form keys and values. + :param json: If given, this is serialized as JSON and passed as + ``data``. Also defaults ``content_type`` to + ``application/json``. + :param args: other positional arguments passed to + :class:`~werkzeug.test.EnvironBuilder`. + :param kwargs: other keyword arguments passed to + :class:`~werkzeug.test.EnvironBuilder`. + """ + from .testing import EnvironBuilder + + builder = EnvironBuilder(self, *args, **kwargs) + + try: + return self.request_context(builder.get_environ()) + finally: + builder.close() + + def wsgi_app(self, environ: dict, start_response: t.Callable) -> t.Any: + """The actual WSGI application. This is not implemented in + :meth:`__call__` so that middlewares can be applied without + losing a reference to the app object. Instead of doing this:: + + app = MyMiddleware(app) + + It's a better idea to do this instead:: + + app.wsgi_app = MyMiddleware(app.wsgi_app) + + Then you still have the original application object around and + can continue to call methods on it. + + .. versionchanged:: 0.7 + Teardown events for the request and app contexts are called + even if an unhandled error occurs. Other events may not be + called depending on when an error occurs during dispatch. + See :ref:`callbacks-and-errors`. + + :param environ: A WSGI environment. + :param start_response: A callable accepting a status code, + a list of headers, and an optional exception context to + start the response. + """ + ctx = self.request_context(environ) + error: BaseException | None = None + try: + try: + ctx.push() + response = self.full_dispatch_request() + except Exception as e: + error = e + response = self.handle_exception(e) + except: # noqa: B001 + error = sys.exc_info()[1] + raise + return response(environ, start_response) + finally: + if "werkzeug.debug.preserve_context" in environ: + environ["werkzeug.debug.preserve_context"](_cv_app.get()) + environ["werkzeug.debug.preserve_context"](_cv_request.get()) + + if error is not None and self.should_ignore_error(error): + error = None + + ctx.pop(error) + + def __call__(self, environ: dict, start_response: t.Callable) -> t.Any: + """The WSGI server calls the Flask application object as the + WSGI application. This calls :meth:`wsgi_app`, which can be + wrapped to apply middleware. + """ + return self.wsgi_app(environ, start_response) diff --git a/app/src/flask-server/venv/Lib/site-packages/flask/blueprints.py b/app/src/flask-server/venv/Lib/site-packages/flask/blueprints.py new file mode 100644 index 0000000..3a37a2c --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/flask/blueprints.py @@ -0,0 +1,91 @@ +from __future__ import annotations + +import os +import typing as t +from datetime import timedelta + +from .globals import current_app +from .helpers import send_from_directory +from .sansio.blueprints import Blueprint as SansioBlueprint +from .sansio.blueprints import BlueprintSetupState as BlueprintSetupState # noqa + +if t.TYPE_CHECKING: # pragma: no cover + from .wrappers import Response + + +class Blueprint(SansioBlueprint): + def get_send_file_max_age(self, filename: str | None) -> int | None: + """Used by :func:`send_file` to determine the ``max_age`` cache + value for a given file path if it wasn't passed. + + By default, this returns :data:`SEND_FILE_MAX_AGE_DEFAULT` from + the configuration of :data:`~flask.current_app`. This defaults + to ``None``, which tells the browser to use conditional requests + instead of a timed cache, which is usually preferable. + + Note this is a duplicate of the same method in the Flask + class. + + .. versionchanged:: 2.0 + The default configuration is ``None`` instead of 12 hours. + + .. versionadded:: 0.9 + """ + value = current_app.config["SEND_FILE_MAX_AGE_DEFAULT"] + + if value is None: + return None + + if isinstance(value, timedelta): + return int(value.total_seconds()) + + return value + + def send_static_file(self, filename: str) -> Response: + """The view function used to serve files from + :attr:`static_folder`. A route is automatically registered for + this view at :attr:`static_url_path` if :attr:`static_folder` is + set. + + Note this is a duplicate of the same method in the Flask + class. + + .. versionadded:: 0.5 + + """ + if not self.has_static_folder: + raise RuntimeError("'static_folder' must be set to serve static_files.") + + # send_file only knows to call get_send_file_max_age on the app, + # call it here so it works for blueprints too. + max_age = self.get_send_file_max_age(filename) + return send_from_directory( + t.cast(str, self.static_folder), filename, max_age=max_age + ) + + def open_resource(self, resource: str, mode: str = "rb") -> t.IO[t.AnyStr]: + """Open a resource file relative to :attr:`root_path` for + reading. + + For example, if the file ``schema.sql`` is next to the file + ``app.py`` where the ``Flask`` app is defined, it can be opened + with: + + .. code-block:: python + + with app.open_resource("schema.sql") as f: + conn.executescript(f.read()) + + :param resource: Path to the resource relative to + :attr:`root_path`. + :param mode: Open the file in this mode. Only reading is + supported, valid values are "r" (or "rt") and "rb". + + Note this is a duplicate of the same method in the Flask + class. + + """ + if mode not in {"r", "rt", "rb"}: + raise ValueError("Resources can only be opened for reading.") + + return open(os.path.join(self.root_path, resource), mode) diff --git a/app/src/flask-server/venv/Lib/site-packages/flask/cli.py b/app/src/flask-server/venv/Lib/site-packages/flask/cli.py new file mode 100644 index 0000000..dda266b --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/flask/cli.py @@ -0,0 +1,1068 @@ +from __future__ import annotations + +import ast +import importlib.metadata +import inspect +import os +import platform +import re +import sys +import traceback +import typing as t +from functools import update_wrapper +from operator import itemgetter + +import click +from click.core import ParameterSource +from werkzeug import run_simple +from werkzeug.serving import is_running_from_reloader +from werkzeug.utils import import_string + +from .globals import current_app +from .helpers import get_debug_flag +from .helpers import get_load_dotenv + +if t.TYPE_CHECKING: + from .app import Flask + + +class NoAppException(click.UsageError): + """Raised if an application cannot be found or loaded.""" + + +def find_best_app(module): + """Given a module instance this tries to find the best possible + application in the module or raises an exception. + """ + from . import Flask + + # Search for the most common names first. + for attr_name in ("app", "application"): + app = getattr(module, attr_name, None) + + if isinstance(app, Flask): + return app + + # Otherwise find the only object that is a Flask instance. + matches = [v for v in module.__dict__.values() if isinstance(v, Flask)] + + if len(matches) == 1: + return matches[0] + elif len(matches) > 1: + raise NoAppException( + "Detected multiple Flask applications in module" + f" '{module.__name__}'. Use '{module.__name__}:name'" + " to specify the correct one." + ) + + # Search for app factory functions. + for attr_name in ("create_app", "make_app"): + app_factory = getattr(module, attr_name, None) + + if inspect.isfunction(app_factory): + try: + app = app_factory() + + if isinstance(app, Flask): + return app + except TypeError as e: + if not _called_with_wrong_args(app_factory): + raise + + raise NoAppException( + f"Detected factory '{attr_name}' in module '{module.__name__}'," + " but could not call it without arguments. Use" + f" '{module.__name__}:{attr_name}(args)'" + " to specify arguments." + ) from e + + raise NoAppException( + "Failed to find Flask application or factory in module" + f" '{module.__name__}'. Use '{module.__name__}:name'" + " to specify one." + ) + + +def _called_with_wrong_args(f): + """Check whether calling a function raised a ``TypeError`` because + the call failed or because something in the factory raised the + error. + + :param f: The function that was called. + :return: ``True`` if the call failed. + """ + tb = sys.exc_info()[2] + + try: + while tb is not None: + if tb.tb_frame.f_code is f.__code__: + # In the function, it was called successfully. + return False + + tb = tb.tb_next + + # Didn't reach the function. + return True + finally: + # Delete tb to break a circular reference. + # https://docs.python.org/2/library/sys.html#sys.exc_info + del tb + + +def find_app_by_string(module, app_name): + """Check if the given string is a variable name or a function. Call + a function to get the app instance, or return the variable directly. + """ + from . import Flask + + # Parse app_name as a single expression to determine if it's a valid + # attribute name or function call. + try: + expr = ast.parse(app_name.strip(), mode="eval").body + except SyntaxError: + raise NoAppException( + f"Failed to parse {app_name!r} as an attribute name or function call." + ) from None + + if isinstance(expr, ast.Name): + name = expr.id + args = [] + kwargs = {} + elif isinstance(expr, ast.Call): + # Ensure the function name is an attribute name only. + if not isinstance(expr.func, ast.Name): + raise NoAppException( + f"Function reference must be a simple name: {app_name!r}." + ) + + name = expr.func.id + + # Parse the positional and keyword arguments as literals. + try: + args = [ast.literal_eval(arg) for arg in expr.args] + kwargs = {kw.arg: ast.literal_eval(kw.value) for kw in expr.keywords} + except ValueError: + # literal_eval gives cryptic error messages, show a generic + # message with the full expression instead. + raise NoAppException( + f"Failed to parse arguments as literal values: {app_name!r}." + ) from None + else: + raise NoAppException( + f"Failed to parse {app_name!r} as an attribute name or function call." + ) + + try: + attr = getattr(module, name) + except AttributeError as e: + raise NoAppException( + f"Failed to find attribute {name!r} in {module.__name__!r}." + ) from e + + # If the attribute is a function, call it with any args and kwargs + # to get the real application. + if inspect.isfunction(attr): + try: + app = attr(*args, **kwargs) + except TypeError as e: + if not _called_with_wrong_args(attr): + raise + + raise NoAppException( + f"The factory {app_name!r} in module" + f" {module.__name__!r} could not be called with the" + " specified arguments." + ) from e + else: + app = attr + + if isinstance(app, Flask): + return app + + raise NoAppException( + "A valid Flask application was not obtained from" + f" '{module.__name__}:{app_name}'." + ) + + +def prepare_import(path): + """Given a filename this will try to calculate the python path, add it + to the search path and return the actual module name that is expected. + """ + path = os.path.realpath(path) + + fname, ext = os.path.splitext(path) + if ext == ".py": + path = fname + + if os.path.basename(path) == "__init__": + path = os.path.dirname(path) + + module_name = [] + + # move up until outside package structure (no __init__.py) + while True: + path, name = os.path.split(path) + module_name.append(name) + + if not os.path.exists(os.path.join(path, "__init__.py")): + break + + if sys.path[0] != path: + sys.path.insert(0, path) + + return ".".join(module_name[::-1]) + + +def locate_app(module_name, app_name, raise_if_not_found=True): + try: + __import__(module_name) + except ImportError: + # Reraise the ImportError if it occurred within the imported module. + # Determine this by checking whether the trace has a depth > 1. + if sys.exc_info()[2].tb_next: + raise NoAppException( + f"While importing {module_name!r}, an ImportError was" + f" raised:\n\n{traceback.format_exc()}" + ) from None + elif raise_if_not_found: + raise NoAppException(f"Could not import {module_name!r}.") from None + else: + return + + module = sys.modules[module_name] + + if app_name is None: + return find_best_app(module) + else: + return find_app_by_string(module, app_name) + + +def get_version(ctx, param, value): + if not value or ctx.resilient_parsing: + return + + flask_version = importlib.metadata.version("flask") + werkzeug_version = importlib.metadata.version("werkzeug") + + click.echo( + f"Python {platform.python_version()}\n" + f"Flask {flask_version}\n" + f"Werkzeug {werkzeug_version}", + color=ctx.color, + ) + ctx.exit() + + +version_option = click.Option( + ["--version"], + help="Show the Flask version.", + expose_value=False, + callback=get_version, + is_flag=True, + is_eager=True, +) + + +class ScriptInfo: + """Helper object to deal with Flask applications. This is usually not + necessary to interface with as it's used internally in the dispatching + to click. In future versions of Flask this object will most likely play + a bigger role. Typically it's created automatically by the + :class:`FlaskGroup` but you can also manually create it and pass it + onwards as click object. + """ + + def __init__( + self, + app_import_path: str | None = None, + create_app: t.Callable[..., Flask] | None = None, + set_debug_flag: bool = True, + ) -> None: + #: Optionally the import path for the Flask application. + self.app_import_path = app_import_path + #: Optionally a function that is passed the script info to create + #: the instance of the application. + self.create_app = create_app + #: A dictionary with arbitrary data that can be associated with + #: this script info. + self.data: dict[t.Any, t.Any] = {} + self.set_debug_flag = set_debug_flag + self._loaded_app: Flask | None = None + + def load_app(self) -> Flask: + """Loads the Flask app (if not yet loaded) and returns it. Calling + this multiple times will just result in the already loaded app to + be returned. + """ + if self._loaded_app is not None: + return self._loaded_app + + if self.create_app is not None: + app = self.create_app() + else: + if self.app_import_path: + path, name = ( + re.split(r":(?![\\/])", self.app_import_path, maxsplit=1) + [None] + )[:2] + import_name = prepare_import(path) + app = locate_app(import_name, name) + else: + for path in ("wsgi.py", "app.py"): + import_name = prepare_import(path) + app = locate_app(import_name, None, raise_if_not_found=False) + + if app: + break + + if not app: + raise NoAppException( + "Could not locate a Flask application. Use the" + " 'flask --app' option, 'FLASK_APP' environment" + " variable, or a 'wsgi.py' or 'app.py' file in the" + " current directory." + ) + + if self.set_debug_flag: + # Update the app's debug flag through the descriptor so that + # other values repopulate as well. + app.debug = get_debug_flag() + + self._loaded_app = app + return app + + +pass_script_info = click.make_pass_decorator(ScriptInfo, ensure=True) + + +def with_appcontext(f): + """Wraps a callback so that it's guaranteed to be executed with the + script's application context. + + Custom commands (and their options) registered under ``app.cli`` or + ``blueprint.cli`` will always have an app context available, this + decorator is not required in that case. + + .. versionchanged:: 2.2 + The app context is active for subcommands as well as the + decorated callback. The app context is always available to + ``app.cli`` command and parameter callbacks. + """ + + @click.pass_context + def decorator(__ctx, *args, **kwargs): + if not current_app: + app = __ctx.ensure_object(ScriptInfo).load_app() + __ctx.with_resource(app.app_context()) + + return __ctx.invoke(f, *args, **kwargs) + + return update_wrapper(decorator, f) + + +class AppGroup(click.Group): + """This works similar to a regular click :class:`~click.Group` but it + changes the behavior of the :meth:`command` decorator so that it + automatically wraps the functions in :func:`with_appcontext`. + + Not to be confused with :class:`FlaskGroup`. + """ + + def command(self, *args, **kwargs): + """This works exactly like the method of the same name on a regular + :class:`click.Group` but it wraps callbacks in :func:`with_appcontext` + unless it's disabled by passing ``with_appcontext=False``. + """ + wrap_for_ctx = kwargs.pop("with_appcontext", True) + + def decorator(f): + if wrap_for_ctx: + f = with_appcontext(f) + return click.Group.command(self, *args, **kwargs)(f) + + return decorator + + def group(self, *args, **kwargs): + """This works exactly like the method of the same name on a regular + :class:`click.Group` but it defaults the group class to + :class:`AppGroup`. + """ + kwargs.setdefault("cls", AppGroup) + return click.Group.group(self, *args, **kwargs) + + +def _set_app(ctx: click.Context, param: click.Option, value: str | None) -> str | None: + if value is None: + return None + + info = ctx.ensure_object(ScriptInfo) + info.app_import_path = value + return value + + +# This option is eager so the app will be available if --help is given. +# --help is also eager, so --app must be before it in the param list. +# no_args_is_help bypasses eager processing, so this option must be +# processed manually in that case to ensure FLASK_APP gets picked up. +_app_option = click.Option( + ["-A", "--app"], + metavar="IMPORT", + help=( + "The Flask application or factory function to load, in the form 'module:name'." + " Module can be a dotted import or file path. Name is not required if it is" + " 'app', 'application', 'create_app', or 'make_app', and can be 'name(args)' to" + " pass arguments." + ), + is_eager=True, + expose_value=False, + callback=_set_app, +) + + +def _set_debug(ctx: click.Context, param: click.Option, value: bool) -> bool | None: + # If the flag isn't provided, it will default to False. Don't use + # that, let debug be set by env in that case. + source = ctx.get_parameter_source(param.name) # type: ignore[arg-type] + + if source is not None and source in ( + ParameterSource.DEFAULT, + ParameterSource.DEFAULT_MAP, + ): + return None + + # Set with env var instead of ScriptInfo.load so that it can be + # accessed early during a factory function. + os.environ["FLASK_DEBUG"] = "1" if value else "0" + return value + + +_debug_option = click.Option( + ["--debug/--no-debug"], + help="Set debug mode.", + expose_value=False, + callback=_set_debug, +) + + +def _env_file_callback( + ctx: click.Context, param: click.Option, value: str | None +) -> str | None: + if value is None: + return None + + import importlib + + try: + importlib.import_module("dotenv") + except ImportError: + raise click.BadParameter( + "python-dotenv must be installed to load an env file.", + ctx=ctx, + param=param, + ) from None + + # Don't check FLASK_SKIP_DOTENV, that only disables automatically + # loading .env and .flaskenv files. + load_dotenv(value) + return value + + +# This option is eager so env vars are loaded as early as possible to be +# used by other options. +_env_file_option = click.Option( + ["-e", "--env-file"], + type=click.Path(exists=True, dir_okay=False), + help="Load environment variables from this file. python-dotenv must be installed.", + is_eager=True, + expose_value=False, + callback=_env_file_callback, +) + + +class FlaskGroup(AppGroup): + """Special subclass of the :class:`AppGroup` group that supports + loading more commands from the configured Flask app. Normally a + developer does not have to interface with this class but there are + some very advanced use cases for which it makes sense to create an + instance of this. see :ref:`custom-scripts`. + + :param add_default_commands: if this is True then the default run and + shell commands will be added. + :param add_version_option: adds the ``--version`` option. + :param create_app: an optional callback that is passed the script info and + returns the loaded app. + :param load_dotenv: Load the nearest :file:`.env` and :file:`.flaskenv` + files to set environment variables. Will also change the working + directory to the directory containing the first file found. + :param set_debug_flag: Set the app's debug flag. + + .. versionchanged:: 2.2 + Added the ``-A/--app``, ``--debug/--no-debug``, ``-e/--env-file`` options. + + .. versionchanged:: 2.2 + An app context is pushed when running ``app.cli`` commands, so + ``@with_appcontext`` is no longer required for those commands. + + .. versionchanged:: 1.0 + If installed, python-dotenv will be used to load environment variables + from :file:`.env` and :file:`.flaskenv` files. + """ + + def __init__( + self, + add_default_commands: bool = True, + create_app: t.Callable[..., Flask] | None = None, + add_version_option: bool = True, + load_dotenv: bool = True, + set_debug_flag: bool = True, + **extra: t.Any, + ) -> None: + params = list(extra.pop("params", None) or ()) + # Processing is done with option callbacks instead of a group + # callback. This allows users to make a custom group callback + # without losing the behavior. --env-file must come first so + # that it is eagerly evaluated before --app. + params.extend((_env_file_option, _app_option, _debug_option)) + + if add_version_option: + params.append(version_option) + + if "context_settings" not in extra: + extra["context_settings"] = {} + + extra["context_settings"].setdefault("auto_envvar_prefix", "FLASK") + + super().__init__(params=params, **extra) + + self.create_app = create_app + self.load_dotenv = load_dotenv + self.set_debug_flag = set_debug_flag + + if add_default_commands: + self.add_command(run_command) + self.add_command(shell_command) + self.add_command(routes_command) + + self._loaded_plugin_commands = False + + def _load_plugin_commands(self): + if self._loaded_plugin_commands: + return + + if sys.version_info >= (3, 10): + from importlib import metadata + else: + # Use a backport on Python < 3.10. We technically have + # importlib.metadata on 3.8+, but the API changed in 3.10, + # so use the backport for consistency. + import importlib_metadata as metadata + + for ep in metadata.entry_points(group="flask.commands"): + self.add_command(ep.load(), ep.name) + + self._loaded_plugin_commands = True + + def get_command(self, ctx, name): + self._load_plugin_commands() + # Look up built-in and plugin commands, which should be + # available even if the app fails to load. + rv = super().get_command(ctx, name) + + if rv is not None: + return rv + + info = ctx.ensure_object(ScriptInfo) + + # Look up commands provided by the app, showing an error and + # continuing if the app couldn't be loaded. + try: + app = info.load_app() + except NoAppException as e: + click.secho(f"Error: {e.format_message()}\n", err=True, fg="red") + return None + + # Push an app context for the loaded app unless it is already + # active somehow. This makes the context available to parameter + # and command callbacks without needing @with_appcontext. + if not current_app or current_app._get_current_object() is not app: + ctx.with_resource(app.app_context()) + + return app.cli.get_command(ctx, name) + + def list_commands(self, ctx): + self._load_plugin_commands() + # Start with the built-in and plugin commands. + rv = set(super().list_commands(ctx)) + info = ctx.ensure_object(ScriptInfo) + + # Add commands provided by the app, showing an error and + # continuing if the app couldn't be loaded. + try: + rv.update(info.load_app().cli.list_commands(ctx)) + except NoAppException as e: + # When an app couldn't be loaded, show the error message + # without the traceback. + click.secho(f"Error: {e.format_message()}\n", err=True, fg="red") + except Exception: + # When any other errors occurred during loading, show the + # full traceback. + click.secho(f"{traceback.format_exc()}\n", err=True, fg="red") + + return sorted(rv) + + def make_context( + self, + info_name: str | None, + args: list[str], + parent: click.Context | None = None, + **extra: t.Any, + ) -> click.Context: + # Set a flag to tell app.run to become a no-op. If app.run was + # not in a __name__ == __main__ guard, it would start the server + # when importing, blocking whatever command is being called. + os.environ["FLASK_RUN_FROM_CLI"] = "true" + + # Attempt to load .env and .flask env files. The --env-file + # option can cause another file to be loaded. + if get_load_dotenv(self.load_dotenv): + load_dotenv() + + if "obj" not in extra and "obj" not in self.context_settings: + extra["obj"] = ScriptInfo( + create_app=self.create_app, set_debug_flag=self.set_debug_flag + ) + + return super().make_context(info_name, args, parent=parent, **extra) + + def parse_args(self, ctx: click.Context, args: list[str]) -> list[str]: + if not args and self.no_args_is_help: + # Attempt to load --env-file and --app early in case they + # were given as env vars. Otherwise no_args_is_help will not + # see commands from app.cli. + _env_file_option.handle_parse_result(ctx, {}, []) + _app_option.handle_parse_result(ctx, {}, []) + + return super().parse_args(ctx, args) + + +def _path_is_ancestor(path, other): + """Take ``other`` and remove the length of ``path`` from it. Then join it + to ``path``. If it is the original value, ``path`` is an ancestor of + ``other``.""" + return os.path.join(path, other[len(path) :].lstrip(os.sep)) == other + + +def load_dotenv(path: str | os.PathLike | None = None) -> bool: + """Load "dotenv" files in order of precedence to set environment variables. + + If an env var is already set it is not overwritten, so earlier files in the + list are preferred over later files. + + This is a no-op if `python-dotenv`_ is not installed. + + .. _python-dotenv: https://github.com/theskumar/python-dotenv#readme + + :param path: Load the file at this location instead of searching. + :return: ``True`` if a file was loaded. + + .. versionchanged:: 2.0 + The current directory is not changed to the location of the + loaded file. + + .. versionchanged:: 2.0 + When loading the env files, set the default encoding to UTF-8. + + .. versionchanged:: 1.1.0 + Returns ``False`` when python-dotenv is not installed, or when + the given path isn't a file. + + .. versionadded:: 1.0 + """ + try: + import dotenv + except ImportError: + if path or os.path.isfile(".env") or os.path.isfile(".flaskenv"): + click.secho( + " * Tip: There are .env or .flaskenv files present." + ' Do "pip install python-dotenv" to use them.', + fg="yellow", + err=True, + ) + + return False + + # Always return after attempting to load a given path, don't load + # the default files. + if path is not None: + if os.path.isfile(path): + return dotenv.load_dotenv(path, encoding="utf-8") + + return False + + loaded = False + + for name in (".env", ".flaskenv"): + path = dotenv.find_dotenv(name, usecwd=True) + + if not path: + continue + + dotenv.load_dotenv(path, encoding="utf-8") + loaded = True + + return loaded # True if at least one file was located and loaded. + + +def show_server_banner(debug, app_import_path): + """Show extra startup messages the first time the server is run, + ignoring the reloader. + """ + if is_running_from_reloader(): + return + + if app_import_path is not None: + click.echo(f" * Serving Flask app '{app_import_path}'") + + if debug is not None: + click.echo(f" * Debug mode: {'on' if debug else 'off'}") + + +class CertParamType(click.ParamType): + """Click option type for the ``--cert`` option. Allows either an + existing file, the string ``'adhoc'``, or an import for a + :class:`~ssl.SSLContext` object. + """ + + name = "path" + + def __init__(self): + self.path_type = click.Path(exists=True, dir_okay=False, resolve_path=True) + + def convert(self, value, param, ctx): + try: + import ssl + except ImportError: + raise click.BadParameter( + 'Using "--cert" requires Python to be compiled with SSL support.', + ctx, + param, + ) from None + + try: + return self.path_type(value, param, ctx) + except click.BadParameter: + value = click.STRING(value, param, ctx).lower() + + if value == "adhoc": + try: + import cryptography # noqa: F401 + except ImportError: + raise click.BadParameter( + "Using ad-hoc certificates requires the cryptography library.", + ctx, + param, + ) from None + + return value + + obj = import_string(value, silent=True) + + if isinstance(obj, ssl.SSLContext): + return obj + + raise + + +def _validate_key(ctx, param, value): + """The ``--key`` option must be specified when ``--cert`` is a file. + Modifies the ``cert`` param to be a ``(cert, key)`` pair if needed. + """ + cert = ctx.params.get("cert") + is_adhoc = cert == "adhoc" + + try: + import ssl + except ImportError: + is_context = False + else: + is_context = isinstance(cert, ssl.SSLContext) + + if value is not None: + if is_adhoc: + raise click.BadParameter( + 'When "--cert" is "adhoc", "--key" is not used.', ctx, param + ) + + if is_context: + raise click.BadParameter( + 'When "--cert" is an SSLContext object, "--key is not used.', ctx, param + ) + + if not cert: + raise click.BadParameter('"--cert" must also be specified.', ctx, param) + + ctx.params["cert"] = cert, value + + else: + if cert and not (is_adhoc or is_context): + raise click.BadParameter('Required when using "--cert".', ctx, param) + + return value + + +class SeparatedPathType(click.Path): + """Click option type that accepts a list of values separated by the + OS's path separator (``:``, ``;`` on Windows). Each value is + validated as a :class:`click.Path` type. + """ + + def convert(self, value, param, ctx): + items = self.split_envvar_value(value) + super_convert = super().convert + return [super_convert(item, param, ctx) for item in items] + + +@click.command("run", short_help="Run a development server.") +@click.option("--host", "-h", default="127.0.0.1", help="The interface to bind to.") +@click.option("--port", "-p", default=5000, help="The port to bind to.") +@click.option( + "--cert", + type=CertParamType(), + help="Specify a certificate file to use HTTPS.", + is_eager=True, +) +@click.option( + "--key", + type=click.Path(exists=True, dir_okay=False, resolve_path=True), + callback=_validate_key, + expose_value=False, + help="The key file to use when specifying a certificate.", +) +@click.option( + "--reload/--no-reload", + default=None, + help="Enable or disable the reloader. By default the reloader " + "is active if debug is enabled.", +) +@click.option( + "--debugger/--no-debugger", + default=None, + help="Enable or disable the debugger. By default the debugger " + "is active if debug is enabled.", +) +@click.option( + "--with-threads/--without-threads", + default=True, + help="Enable or disable multithreading.", +) +@click.option( + "--extra-files", + default=None, + type=SeparatedPathType(), + help=( + "Extra files that trigger a reload on change. Multiple paths" + f" are separated by {os.path.pathsep!r}." + ), +) +@click.option( + "--exclude-patterns", + default=None, + type=SeparatedPathType(), + help=( + "Files matching these fnmatch patterns will not trigger a reload" + " on change. Multiple patterns are separated by" + f" {os.path.pathsep!r}." + ), +) +@pass_script_info +def run_command( + info, + host, + port, + reload, + debugger, + with_threads, + cert, + extra_files, + exclude_patterns, +): + """Run a local development server. + + This server is for development purposes only. It does not provide + the stability, security, or performance of production WSGI servers. + + The reloader and debugger are enabled by default with the '--debug' + option. + """ + try: + app = info.load_app() + except Exception as e: + if is_running_from_reloader(): + # When reloading, print out the error immediately, but raise + # it later so the debugger or server can handle it. + traceback.print_exc() + err = e + + def app(environ, start_response): + raise err from None + + else: + # When not reloading, raise the error immediately so the + # command fails. + raise e from None + + debug = get_debug_flag() + + if reload is None: + reload = debug + + if debugger is None: + debugger = debug + + show_server_banner(debug, info.app_import_path) + + run_simple( + host, + port, + app, + use_reloader=reload, + use_debugger=debugger, + threaded=with_threads, + ssl_context=cert, + extra_files=extra_files, + exclude_patterns=exclude_patterns, + ) + + +run_command.params.insert(0, _debug_option) + + +@click.command("shell", short_help="Run a shell in the app context.") +@with_appcontext +def shell_command() -> None: + """Run an interactive Python shell in the context of a given + Flask application. The application will populate the default + namespace of this shell according to its configuration. + + This is useful for executing small snippets of management code + without having to manually configure the application. + """ + import code + + banner = ( + f"Python {sys.version} on {sys.platform}\n" + f"App: {current_app.import_name}\n" + f"Instance: {current_app.instance_path}" + ) + ctx: dict = {} + + # Support the regular Python interpreter startup script if someone + # is using it. + startup = os.environ.get("PYTHONSTARTUP") + if startup and os.path.isfile(startup): + with open(startup) as f: + eval(compile(f.read(), startup, "exec"), ctx) + + ctx.update(current_app.make_shell_context()) + + # Site, customize, or startup script can set a hook to call when + # entering interactive mode. The default one sets up readline with + # tab and history completion. + interactive_hook = getattr(sys, "__interactivehook__", None) + + if interactive_hook is not None: + try: + import readline + from rlcompleter import Completer + except ImportError: + pass + else: + # rlcompleter uses __main__.__dict__ by default, which is + # flask.__main__. Use the shell context instead. + readline.set_completer(Completer(ctx).complete) + + interactive_hook() + + code.interact(banner=banner, local=ctx) + + +@click.command("routes", short_help="Show the routes for the app.") +@click.option( + "--sort", + "-s", + type=click.Choice(("endpoint", "methods", "domain", "rule", "match")), + default="endpoint", + help=( + "Method to sort routes by. 'match' is the order that Flask will match routes" + " when dispatching a request." + ), +) +@click.option("--all-methods", is_flag=True, help="Show HEAD and OPTIONS methods.") +@with_appcontext +def routes_command(sort: str, all_methods: bool) -> None: + """Show all registered routes with endpoints and methods.""" + rules = list(current_app.url_map.iter_rules()) + + if not rules: + click.echo("No routes were registered.") + return + + ignored_methods = set() if all_methods else {"HEAD", "OPTIONS"} + host_matching = current_app.url_map.host_matching + has_domain = any(rule.host if host_matching else rule.subdomain for rule in rules) + rows = [] + + for rule in rules: + row = [ + rule.endpoint, + ", ".join(sorted((rule.methods or set()) - ignored_methods)), + ] + + if has_domain: + row.append((rule.host if host_matching else rule.subdomain) or "") + + row.append(rule.rule) + rows.append(row) + + headers = ["Endpoint", "Methods"] + sorts = ["endpoint", "methods"] + + if has_domain: + headers.append("Host" if host_matching else "Subdomain") + sorts.append("domain") + + headers.append("Rule") + sorts.append("rule") + + try: + rows.sort(key=itemgetter(sorts.index(sort))) + except ValueError: + pass + + rows.insert(0, headers) + widths = [max(len(row[i]) for row in rows) for i in range(len(headers))] + rows.insert(1, ["-" * w for w in widths]) + template = " ".join(f"{{{i}:<{w}}}" for i, w in enumerate(widths)) + + for row in rows: + click.echo(template.format(*row)) + + +cli = FlaskGroup( + name="flask", + help="""\ +A general utility script for Flask applications. + +An application to load must be given with the '--app' option, +'FLASK_APP' environment variable, or with a 'wsgi.py' or 'app.py' file +in the current directory. +""", +) + + +def main() -> None: + cli.main() + + +if __name__ == "__main__": + main() diff --git a/app/src/flask-server/venv/Lib/site-packages/flask/config.py b/app/src/flask-server/venv/Lib/site-packages/flask/config.py new file mode 100644 index 0000000..5f921b4 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/flask/config.py @@ -0,0 +1,347 @@ +from __future__ import annotations + +import errno +import json +import os +import types +import typing as t + +from werkzeug.utils import import_string + + +class ConfigAttribute: + """Makes an attribute forward to the config""" + + def __init__(self, name: str, get_converter: t.Callable | None = None) -> None: + self.__name__ = name + self.get_converter = get_converter + + def __get__(self, obj: t.Any, owner: t.Any = None) -> t.Any: + if obj is None: + return self + rv = obj.config[self.__name__] + if self.get_converter is not None: + rv = self.get_converter(rv) + return rv + + def __set__(self, obj: t.Any, value: t.Any) -> None: + obj.config[self.__name__] = value + + +class Config(dict): + """Works exactly like a dict but provides ways to fill it from files + or special dictionaries. There are two common patterns to populate the + config. + + Either you can fill the config from a config file:: + + app.config.from_pyfile('yourconfig.cfg') + + Or alternatively you can define the configuration options in the + module that calls :meth:`from_object` or provide an import path to + a module that should be loaded. It is also possible to tell it to + use the same module and with that provide the configuration values + just before the call:: + + DEBUG = True + SECRET_KEY = 'development key' + app.config.from_object(__name__) + + In both cases (loading from any Python file or loading from modules), + only uppercase keys are added to the config. This makes it possible to use + lowercase values in the config file for temporary values that are not added + to the config or to define the config keys in the same file that implements + the application. + + Probably the most interesting way to load configurations is from an + environment variable pointing to a file:: + + app.config.from_envvar('YOURAPPLICATION_SETTINGS') + + In this case before launching the application you have to set this + environment variable to the file you want to use. On Linux and OS X + use the export statement:: + + export YOURAPPLICATION_SETTINGS='/path/to/config/file' + + On windows use `set` instead. + + :param root_path: path to which files are read relative from. When the + config object is created by the application, this is + the application's :attr:`~flask.Flask.root_path`. + :param defaults: an optional dictionary of default values + """ + + def __init__( + self, root_path: str | os.PathLike, defaults: dict | None = None + ) -> None: + super().__init__(defaults or {}) + self.root_path = root_path + + def from_envvar(self, variable_name: str, silent: bool = False) -> bool: + """Loads a configuration from an environment variable pointing to + a configuration file. This is basically just a shortcut with nicer + error messages for this line of code:: + + app.config.from_pyfile(os.environ['YOURAPPLICATION_SETTINGS']) + + :param variable_name: name of the environment variable + :param silent: set to ``True`` if you want silent failure for missing + files. + :return: ``True`` if the file was loaded successfully. + """ + rv = os.environ.get(variable_name) + if not rv: + if silent: + return False + raise RuntimeError( + f"The environment variable {variable_name!r} is not set" + " and as such configuration could not be loaded. Set" + " this variable and make it point to a configuration" + " file" + ) + return self.from_pyfile(rv, silent=silent) + + def from_prefixed_env( + self, prefix: str = "FLASK", *, loads: t.Callable[[str], t.Any] = json.loads + ) -> bool: + """Load any environment variables that start with ``FLASK_``, + dropping the prefix from the env key for the config key. Values + are passed through a loading function to attempt to convert them + to more specific types than strings. + + Keys are loaded in :func:`sorted` order. + + The default loading function attempts to parse values as any + valid JSON type, including dicts and lists. + + Specific items in nested dicts can be set by separating the + keys with double underscores (``__``). If an intermediate key + doesn't exist, it will be initialized to an empty dict. + + :param prefix: Load env vars that start with this prefix, + separated with an underscore (``_``). + :param loads: Pass each string value to this function and use + the returned value as the config value. If any error is + raised it is ignored and the value remains a string. The + default is :func:`json.loads`. + + .. versionadded:: 2.1 + """ + prefix = f"{prefix}_" + len_prefix = len(prefix) + + for key in sorted(os.environ): + if not key.startswith(prefix): + continue + + value = os.environ[key] + + try: + value = loads(value) + except Exception: + # Keep the value as a string if loading failed. + pass + + # Change to key.removeprefix(prefix) on Python >= 3.9. + key = key[len_prefix:] + + if "__" not in key: + # A non-nested key, set directly. + self[key] = value + continue + + # Traverse nested dictionaries with keys separated by "__". + current = self + *parts, tail = key.split("__") + + for part in parts: + # If an intermediate dict does not exist, create it. + if part not in current: + current[part] = {} + + current = current[part] + + current[tail] = value + + return True + + def from_pyfile(self, filename: str | os.PathLike, silent: bool = False) -> bool: + """Updates the values in the config from a Python file. This function + behaves as if the file was imported as module with the + :meth:`from_object` function. + + :param filename: the filename of the config. This can either be an + absolute filename or a filename relative to the + root path. + :param silent: set to ``True`` if you want silent failure for missing + files. + :return: ``True`` if the file was loaded successfully. + + .. versionadded:: 0.7 + `silent` parameter. + """ + filename = os.path.join(self.root_path, filename) + d = types.ModuleType("config") + d.__file__ = filename + try: + with open(filename, mode="rb") as config_file: + exec(compile(config_file.read(), filename, "exec"), d.__dict__) + except OSError as e: + if silent and e.errno in (errno.ENOENT, errno.EISDIR, errno.ENOTDIR): + return False + e.strerror = f"Unable to load configuration file ({e.strerror})" + raise + self.from_object(d) + return True + + def from_object(self, obj: object | str) -> None: + """Updates the values from the given object. An object can be of one + of the following two types: + + - a string: in this case the object with that name will be imported + - an actual object reference: that object is used directly + + Objects are usually either modules or classes. :meth:`from_object` + loads only the uppercase attributes of the module/class. A ``dict`` + object will not work with :meth:`from_object` because the keys of a + ``dict`` are not attributes of the ``dict`` class. + + Example of module-based configuration:: + + app.config.from_object('yourapplication.default_config') + from yourapplication import default_config + app.config.from_object(default_config) + + Nothing is done to the object before loading. If the object is a + class and has ``@property`` attributes, it needs to be + instantiated before being passed to this method. + + You should not use this function to load the actual configuration but + rather configuration defaults. The actual config should be loaded + with :meth:`from_pyfile` and ideally from a location not within the + package because the package might be installed system wide. + + See :ref:`config-dev-prod` for an example of class-based configuration + using :meth:`from_object`. + + :param obj: an import name or object + """ + if isinstance(obj, str): + obj = import_string(obj) + for key in dir(obj): + if key.isupper(): + self[key] = getattr(obj, key) + + def from_file( + self, + filename: str | os.PathLike, + load: t.Callable[[t.IO[t.Any]], t.Mapping], + silent: bool = False, + text: bool = True, + ) -> bool: + """Update the values in the config from a file that is loaded + using the ``load`` parameter. The loaded data is passed to the + :meth:`from_mapping` method. + + .. code-block:: python + + import json + app.config.from_file("config.json", load=json.load) + + import tomllib + app.config.from_file("config.toml", load=tomllib.load, text=False) + + :param filename: The path to the data file. This can be an + absolute path or relative to the config root path. + :param load: A callable that takes a file handle and returns a + mapping of loaded data from the file. + :type load: ``Callable[[Reader], Mapping]`` where ``Reader`` + implements a ``read`` method. + :param silent: Ignore the file if it doesn't exist. + :param text: Open the file in text or binary mode. + :return: ``True`` if the file was loaded successfully. + + .. versionchanged:: 2.3 + The ``text`` parameter was added. + + .. versionadded:: 2.0 + """ + filename = os.path.join(self.root_path, filename) + + try: + with open(filename, "r" if text else "rb") as f: + obj = load(f) + except OSError as e: + if silent and e.errno in (errno.ENOENT, errno.EISDIR): + return False + + e.strerror = f"Unable to load configuration file ({e.strerror})" + raise + + return self.from_mapping(obj) + + def from_mapping( + self, mapping: t.Mapping[str, t.Any] | None = None, **kwargs: t.Any + ) -> bool: + """Updates the config like :meth:`update` ignoring items with + non-upper keys. + + :return: Always returns ``True``. + + .. versionadded:: 0.11 + """ + mappings: dict[str, t.Any] = {} + if mapping is not None: + mappings.update(mapping) + mappings.update(kwargs) + for key, value in mappings.items(): + if key.isupper(): + self[key] = value + return True + + def get_namespace( + self, namespace: str, lowercase: bool = True, trim_namespace: bool = True + ) -> dict[str, t.Any]: + """Returns a dictionary containing a subset of configuration options + that match the specified namespace/prefix. Example usage:: + + app.config['IMAGE_STORE_TYPE'] = 'fs' + app.config['IMAGE_STORE_PATH'] = '/var/app/images' + app.config['IMAGE_STORE_BASE_URL'] = 'http://img.website.com' + image_store_config = app.config.get_namespace('IMAGE_STORE_') + + The resulting dictionary `image_store_config` would look like:: + + { + 'type': 'fs', + 'path': '/var/app/images', + 'base_url': 'http://img.website.com' + } + + This is often useful when configuration options map directly to + keyword arguments in functions or class constructors. + + :param namespace: a configuration namespace + :param lowercase: a flag indicating if the keys of the resulting + dictionary should be lowercase + :param trim_namespace: a flag indicating if the keys of the resulting + dictionary should not include the namespace + + .. versionadded:: 0.11 + """ + rv = {} + for k, v in self.items(): + if not k.startswith(namespace): + continue + if trim_namespace: + key = k[len(namespace) :] + else: + key = k + if lowercase: + key = key.lower() + rv[key] = v + return rv + + def __repr__(self) -> str: + return f"<{type(self).__name__} {dict.__repr__(self)}>" diff --git a/app/src/flask-server/venv/Lib/site-packages/flask/ctx.py b/app/src/flask-server/venv/Lib/site-packages/flask/ctx.py new file mode 100644 index 0000000..b37e4e0 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/flask/ctx.py @@ -0,0 +1,440 @@ +from __future__ import annotations + +import contextvars +import sys +import typing as t +from functools import update_wrapper +from types import TracebackType + +from werkzeug.exceptions import HTTPException + +from . import typing as ft +from .globals import _cv_app +from .globals import _cv_request +from .signals import appcontext_popped +from .signals import appcontext_pushed + +if t.TYPE_CHECKING: # pragma: no cover + from .app import Flask + from .sessions import SessionMixin + from .wrappers import Request + + +# a singleton sentinel value for parameter defaults +_sentinel = object() + + +class _AppCtxGlobals: + """A plain object. Used as a namespace for storing data during an + application context. + + Creating an app context automatically creates this object, which is + made available as the :data:`g` proxy. + + .. describe:: 'key' in g + + Check whether an attribute is present. + + .. versionadded:: 0.10 + + .. describe:: iter(g) + + Return an iterator over the attribute names. + + .. versionadded:: 0.10 + """ + + # Define attr methods to let mypy know this is a namespace object + # that has arbitrary attributes. + + def __getattr__(self, name: str) -> t.Any: + try: + return self.__dict__[name] + except KeyError: + raise AttributeError(name) from None + + def __setattr__(self, name: str, value: t.Any) -> None: + self.__dict__[name] = value + + def __delattr__(self, name: str) -> None: + try: + del self.__dict__[name] + except KeyError: + raise AttributeError(name) from None + + def get(self, name: str, default: t.Any | None = None) -> t.Any: + """Get an attribute by name, or a default value. Like + :meth:`dict.get`. + + :param name: Name of attribute to get. + :param default: Value to return if the attribute is not present. + + .. versionadded:: 0.10 + """ + return self.__dict__.get(name, default) + + def pop(self, name: str, default: t.Any = _sentinel) -> t.Any: + """Get and remove an attribute by name. Like :meth:`dict.pop`. + + :param name: Name of attribute to pop. + :param default: Value to return if the attribute is not present, + instead of raising a ``KeyError``. + + .. versionadded:: 0.11 + """ + if default is _sentinel: + return self.__dict__.pop(name) + else: + return self.__dict__.pop(name, default) + + def setdefault(self, name: str, default: t.Any = None) -> t.Any: + """Get the value of an attribute if it is present, otherwise + set and return a default value. Like :meth:`dict.setdefault`. + + :param name: Name of attribute to get. + :param default: Value to set and return if the attribute is not + present. + + .. versionadded:: 0.11 + """ + return self.__dict__.setdefault(name, default) + + def __contains__(self, item: str) -> bool: + return item in self.__dict__ + + def __iter__(self) -> t.Iterator[str]: + return iter(self.__dict__) + + def __repr__(self) -> str: + ctx = _cv_app.get(None) + if ctx is not None: + return f"" + return object.__repr__(self) + + +def after_this_request(f: ft.AfterRequestCallable) -> ft.AfterRequestCallable: + """Executes a function after this request. This is useful to modify + response objects. The function is passed the response object and has + to return the same or a new one. + + Example:: + + @app.route('/') + def index(): + @after_this_request + def add_header(response): + response.headers['X-Foo'] = 'Parachute' + return response + return 'Hello World!' + + This is more useful if a function other than the view function wants to + modify a response. For instance think of a decorator that wants to add + some headers without converting the return value into a response object. + + .. versionadded:: 0.9 + """ + ctx = _cv_request.get(None) + + if ctx is None: + raise RuntimeError( + "'after_this_request' can only be used when a request" + " context is active, such as in a view function." + ) + + ctx._after_request_functions.append(f) + return f + + +def copy_current_request_context(f: t.Callable) -> t.Callable: + """A helper function that decorates a function to retain the current + request context. This is useful when working with greenlets. The moment + the function is decorated a copy of the request context is created and + then pushed when the function is called. The current session is also + included in the copied request context. + + Example:: + + import gevent + from flask import copy_current_request_context + + @app.route('/') + def index(): + @copy_current_request_context + def do_some_work(): + # do some work here, it can access flask.request or + # flask.session like you would otherwise in the view function. + ... + gevent.spawn(do_some_work) + return 'Regular response' + + .. versionadded:: 0.10 + """ + ctx = _cv_request.get(None) + + if ctx is None: + raise RuntimeError( + "'copy_current_request_context' can only be used when a" + " request context is active, such as in a view function." + ) + + ctx = ctx.copy() + + def wrapper(*args, **kwargs): + with ctx: + return ctx.app.ensure_sync(f)(*args, **kwargs) + + return update_wrapper(wrapper, f) + + +def has_request_context() -> bool: + """If you have code that wants to test if a request context is there or + not this function can be used. For instance, you may want to take advantage + of request information if the request object is available, but fail + silently if it is unavailable. + + :: + + class User(db.Model): + + def __init__(self, username, remote_addr=None): + self.username = username + if remote_addr is None and has_request_context(): + remote_addr = request.remote_addr + self.remote_addr = remote_addr + + Alternatively you can also just test any of the context bound objects + (such as :class:`request` or :class:`g`) for truthness:: + + class User(db.Model): + + def __init__(self, username, remote_addr=None): + self.username = username + if remote_addr is None and request: + remote_addr = request.remote_addr + self.remote_addr = remote_addr + + .. versionadded:: 0.7 + """ + return _cv_request.get(None) is not None + + +def has_app_context() -> bool: + """Works like :func:`has_request_context` but for the application + context. You can also just do a boolean check on the + :data:`current_app` object instead. + + .. versionadded:: 0.9 + """ + return _cv_app.get(None) is not None + + +class AppContext: + """The app context contains application-specific information. An app + context is created and pushed at the beginning of each request if + one is not already active. An app context is also pushed when + running CLI commands. + """ + + def __init__(self, app: Flask) -> None: + self.app = app + self.url_adapter = app.create_url_adapter(None) + self.g: _AppCtxGlobals = app.app_ctx_globals_class() + self._cv_tokens: list[contextvars.Token] = [] + + def push(self) -> None: + """Binds the app context to the current context.""" + self._cv_tokens.append(_cv_app.set(self)) + appcontext_pushed.send(self.app, _async_wrapper=self.app.ensure_sync) + + def pop(self, exc: BaseException | None = _sentinel) -> None: # type: ignore + """Pops the app context.""" + try: + if len(self._cv_tokens) == 1: + if exc is _sentinel: + exc = sys.exc_info()[1] + self.app.do_teardown_appcontext(exc) + finally: + ctx = _cv_app.get() + _cv_app.reset(self._cv_tokens.pop()) + + if ctx is not self: + raise AssertionError( + f"Popped wrong app context. ({ctx!r} instead of {self!r})" + ) + + appcontext_popped.send(self.app, _async_wrapper=self.app.ensure_sync) + + def __enter__(self) -> AppContext: + self.push() + return self + + def __exit__( + self, + exc_type: type | None, + exc_value: BaseException | None, + tb: TracebackType | None, + ) -> None: + self.pop(exc_value) + + +class RequestContext: + """The request context contains per-request information. The Flask + app creates and pushes it at the beginning of the request, then pops + it at the end of the request. It will create the URL adapter and + request object for the WSGI environment provided. + + Do not attempt to use this class directly, instead use + :meth:`~flask.Flask.test_request_context` and + :meth:`~flask.Flask.request_context` to create this object. + + When the request context is popped, it will evaluate all the + functions registered on the application for teardown execution + (:meth:`~flask.Flask.teardown_request`). + + The request context is automatically popped at the end of the + request. When using the interactive debugger, the context will be + restored so ``request`` is still accessible. Similarly, the test + client can preserve the context after the request ends. However, + teardown functions may already have closed some resources such as + database connections. + """ + + def __init__( + self, + app: Flask, + environ: dict, + request: Request | None = None, + session: SessionMixin | None = None, + ) -> None: + self.app = app + if request is None: + request = app.request_class(environ) + request.json_module = app.json + self.request: Request = request + self.url_adapter = None + try: + self.url_adapter = app.create_url_adapter(self.request) + except HTTPException as e: + self.request.routing_exception = e + self.flashes: list[tuple[str, str]] | None = None + self.session: SessionMixin | None = session + # Functions that should be executed after the request on the response + # object. These will be called before the regular "after_request" + # functions. + self._after_request_functions: list[ft.AfterRequestCallable] = [] + + self._cv_tokens: list[tuple[contextvars.Token, AppContext | None]] = [] + + def copy(self) -> RequestContext: + """Creates a copy of this request context with the same request object. + This can be used to move a request context to a different greenlet. + Because the actual request object is the same this cannot be used to + move a request context to a different thread unless access to the + request object is locked. + + .. versionadded:: 0.10 + + .. versionchanged:: 1.1 + The current session object is used instead of reloading the original + data. This prevents `flask.session` pointing to an out-of-date object. + """ + return self.__class__( + self.app, + environ=self.request.environ, + request=self.request, + session=self.session, + ) + + def match_request(self) -> None: + """Can be overridden by a subclass to hook into the matching + of the request. + """ + try: + result = self.url_adapter.match(return_rule=True) # type: ignore + self.request.url_rule, self.request.view_args = result # type: ignore + except HTTPException as e: + self.request.routing_exception = e + + def push(self) -> None: + # Before we push the request context we have to ensure that there + # is an application context. + app_ctx = _cv_app.get(None) + + if app_ctx is None or app_ctx.app is not self.app: + app_ctx = self.app.app_context() + app_ctx.push() + else: + app_ctx = None + + self._cv_tokens.append((_cv_request.set(self), app_ctx)) + + # Open the session at the moment that the request context is available. + # This allows a custom open_session method to use the request context. + # Only open a new session if this is the first time the request was + # pushed, otherwise stream_with_context loses the session. + if self.session is None: + session_interface = self.app.session_interface + self.session = session_interface.open_session(self.app, self.request) + + if self.session is None: + self.session = session_interface.make_null_session(self.app) + + # Match the request URL after loading the session, so that the + # session is available in custom URL converters. + if self.url_adapter is not None: + self.match_request() + + def pop(self, exc: BaseException | None = _sentinel) -> None: # type: ignore + """Pops the request context and unbinds it by doing that. This will + also trigger the execution of functions registered by the + :meth:`~flask.Flask.teardown_request` decorator. + + .. versionchanged:: 0.9 + Added the `exc` argument. + """ + clear_request = len(self._cv_tokens) == 1 + + try: + if clear_request: + if exc is _sentinel: + exc = sys.exc_info()[1] + self.app.do_teardown_request(exc) + + request_close = getattr(self.request, "close", None) + if request_close is not None: + request_close() + finally: + ctx = _cv_request.get() + token, app_ctx = self._cv_tokens.pop() + _cv_request.reset(token) + + # get rid of circular dependencies at the end of the request + # so that we don't require the GC to be active. + if clear_request: + ctx.request.environ["werkzeug.request"] = None + + if app_ctx is not None: + app_ctx.pop(exc) + + if ctx is not self: + raise AssertionError( + f"Popped wrong request context. ({ctx!r} instead of {self!r})" + ) + + def __enter__(self) -> RequestContext: + self.push() + return self + + def __exit__( + self, + exc_type: type | None, + exc_value: BaseException | None, + tb: TracebackType | None, + ) -> None: + self.pop(exc_value) + + def __repr__(self) -> str: + return ( + f"<{type(self).__name__} {self.request.url!r}" + f" [{self.request.method}] of {self.app.name}>" + ) diff --git a/app/src/flask-server/venv/Lib/site-packages/flask/debughelpers.py b/app/src/flask-server/venv/Lib/site-packages/flask/debughelpers.py new file mode 100644 index 0000000..e836004 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/flask/debughelpers.py @@ -0,0 +1,160 @@ +from __future__ import annotations + +import typing as t + +from .blueprints import Blueprint +from .globals import request_ctx +from .sansio.app import App + + +class UnexpectedUnicodeError(AssertionError, UnicodeError): + """Raised in places where we want some better error reporting for + unexpected unicode or binary data. + """ + + +class DebugFilesKeyError(KeyError, AssertionError): + """Raised from request.files during debugging. The idea is that it can + provide a better error message than just a generic KeyError/BadRequest. + """ + + def __init__(self, request, key): + form_matches = request.form.getlist(key) + buf = [ + f"You tried to access the file {key!r} in the request.files" + " dictionary but it does not exist. The mimetype for the" + f" request is {request.mimetype!r} instead of" + " 'multipart/form-data' which means that no file contents" + " were transmitted. To fix this error you should provide" + ' enctype="multipart/form-data" in your form.' + ] + if form_matches: + names = ", ".join(repr(x) for x in form_matches) + buf.append( + "\n\nThe browser instead transmitted some file names. " + f"This was submitted: {names}" + ) + self.msg = "".join(buf) + + def __str__(self): + return self.msg + + +class FormDataRoutingRedirect(AssertionError): + """This exception is raised in debug mode if a routing redirect + would cause the browser to drop the method or body. This happens + when method is not GET, HEAD or OPTIONS and the status code is not + 307 or 308. + """ + + def __init__(self, request): + exc = request.routing_exception + buf = [ + f"A request was sent to '{request.url}', but routing issued" + f" a redirect to the canonical URL '{exc.new_url}'." + ] + + if f"{request.base_url}/" == exc.new_url.partition("?")[0]: + buf.append( + " The URL was defined with a trailing slash. Flask" + " will redirect to the URL with a trailing slash if it" + " was accessed without one." + ) + + buf.append( + " Send requests to the canonical URL, or use 307 or 308 for" + " routing redirects. Otherwise, browsers will drop form" + " data.\n\n" + "This exception is only raised in debug mode." + ) + super().__init__("".join(buf)) + + +def attach_enctype_error_multidict(request): + """Patch ``request.files.__getitem__`` to raise a descriptive error + about ``enctype=multipart/form-data``. + + :param request: The request to patch. + :meta private: + """ + oldcls = request.files.__class__ + + class newcls(oldcls): + def __getitem__(self, key): + try: + return super().__getitem__(key) + except KeyError as e: + if key not in request.form: + raise + + raise DebugFilesKeyError(request, key).with_traceback( + e.__traceback__ + ) from None + + newcls.__name__ = oldcls.__name__ + newcls.__module__ = oldcls.__module__ + request.files.__class__ = newcls + + +def _dump_loader_info(loader) -> t.Generator: + yield f"class: {type(loader).__module__}.{type(loader).__name__}" + for key, value in sorted(loader.__dict__.items()): + if key.startswith("_"): + continue + if isinstance(value, (tuple, list)): + if not all(isinstance(x, str) for x in value): + continue + yield f"{key}:" + for item in value: + yield f" - {item}" + continue + elif not isinstance(value, (str, int, float, bool)): + continue + yield f"{key}: {value!r}" + + +def explain_template_loading_attempts(app: App, template, attempts) -> None: + """This should help developers understand what failed""" + info = [f"Locating template {template!r}:"] + total_found = 0 + blueprint = None + if request_ctx and request_ctx.request.blueprint is not None: + blueprint = request_ctx.request.blueprint + + for idx, (loader, srcobj, triple) in enumerate(attempts): + if isinstance(srcobj, App): + src_info = f"application {srcobj.import_name!r}" + elif isinstance(srcobj, Blueprint): + src_info = f"blueprint {srcobj.name!r} ({srcobj.import_name})" + else: + src_info = repr(srcobj) + + info.append(f"{idx + 1:5}: trying loader of {src_info}") + + for line in _dump_loader_info(loader): + info.append(f" {line}") + + if triple is None: + detail = "no match" + else: + detail = f"found ({triple[1] or ''!r})" + total_found += 1 + info.append(f" -> {detail}") + + seems_fishy = False + if total_found == 0: + info.append("Error: the template could not be found.") + seems_fishy = True + elif total_found > 1: + info.append("Warning: multiple loaders returned a match for the template.") + seems_fishy = True + + if blueprint is not None and seems_fishy: + info.append( + " The template was looked up from an endpoint that belongs" + f" to the blueprint {blueprint!r}." + ) + info.append(" Maybe you did not place a template in the right folder?") + info.append(" See https://flask.palletsprojects.com/blueprints/#templates") + + app.logger.info("\n".join(info)) diff --git a/app/src/flask-server/venv/Lib/site-packages/flask/globals.py b/app/src/flask-server/venv/Lib/site-packages/flask/globals.py new file mode 100644 index 0000000..e2c410c --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/flask/globals.py @@ -0,0 +1,51 @@ +from __future__ import annotations + +import typing as t +from contextvars import ContextVar + +from werkzeug.local import LocalProxy + +if t.TYPE_CHECKING: # pragma: no cover + from .app import Flask + from .ctx import _AppCtxGlobals + from .ctx import AppContext + from .ctx import RequestContext + from .sessions import SessionMixin + from .wrappers import Request + + +_no_app_msg = """\ +Working outside of application context. + +This typically means that you attempted to use functionality that needed +the current application. To solve this, set up an application context +with app.app_context(). See the documentation for more information.\ +""" +_cv_app: ContextVar[AppContext] = ContextVar("flask.app_ctx") +app_ctx: AppContext = LocalProxy( # type: ignore[assignment] + _cv_app, unbound_message=_no_app_msg +) +current_app: Flask = LocalProxy( # type: ignore[assignment] + _cv_app, "app", unbound_message=_no_app_msg +) +g: _AppCtxGlobals = LocalProxy( # type: ignore[assignment] + _cv_app, "g", unbound_message=_no_app_msg +) + +_no_req_msg = """\ +Working outside of request context. + +This typically means that you attempted to use functionality that needed +an active HTTP request. Consult the documentation on testing for +information about how to avoid this problem.\ +""" +_cv_request: ContextVar[RequestContext] = ContextVar("flask.request_ctx") +request_ctx: RequestContext = LocalProxy( # type: ignore[assignment] + _cv_request, unbound_message=_no_req_msg +) +request: Request = LocalProxy( # type: ignore[assignment] + _cv_request, "request", unbound_message=_no_req_msg +) +session: SessionMixin = LocalProxy( # type: ignore[assignment] + _cv_request, "session", unbound_message=_no_req_msg +) diff --git a/app/src/flask-server/venv/Lib/site-packages/flask/helpers.py b/app/src/flask-server/venv/Lib/site-packages/flask/helpers.py new file mode 100644 index 0000000..13a5aa2 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/flask/helpers.py @@ -0,0 +1,623 @@ +from __future__ import annotations + +import importlib.util +import os +import sys +import typing as t +from datetime import datetime +from functools import lru_cache +from functools import update_wrapper + +import werkzeug.utils +from werkzeug.exceptions import abort as _wz_abort +from werkzeug.utils import redirect as _wz_redirect + +from .globals import _cv_request +from .globals import current_app +from .globals import request +from .globals import request_ctx +from .globals import session +from .signals import message_flashed + +if t.TYPE_CHECKING: # pragma: no cover + from werkzeug.wrappers import Response as BaseResponse + from .wrappers import Response + + +def get_debug_flag() -> bool: + """Get whether debug mode should be enabled for the app, indicated by the + :envvar:`FLASK_DEBUG` environment variable. The default is ``False``. + """ + val = os.environ.get("FLASK_DEBUG") + return bool(val and val.lower() not in {"0", "false", "no"}) + + +def get_load_dotenv(default: bool = True) -> bool: + """Get whether the user has disabled loading default dotenv files by + setting :envvar:`FLASK_SKIP_DOTENV`. The default is ``True``, load + the files. + + :param default: What to return if the env var isn't set. + """ + val = os.environ.get("FLASK_SKIP_DOTENV") + + if not val: + return default + + return val.lower() in ("0", "false", "no") + + +def stream_with_context( + generator_or_function: ( + t.Iterator[t.AnyStr] | t.Callable[..., t.Iterator[t.AnyStr]] + ) +) -> t.Iterator[t.AnyStr]: + """Request contexts disappear when the response is started on the server. + This is done for efficiency reasons and to make it less likely to encounter + memory leaks with badly written WSGI middlewares. The downside is that if + you are using streamed responses, the generator cannot access request bound + information any more. + + This function however can help you keep the context around for longer:: + + from flask import stream_with_context, request, Response + + @app.route('/stream') + def streamed_response(): + @stream_with_context + def generate(): + yield 'Hello ' + yield request.args['name'] + yield '!' + return Response(generate()) + + Alternatively it can also be used around a specific generator:: + + from flask import stream_with_context, request, Response + + @app.route('/stream') + def streamed_response(): + def generate(): + yield 'Hello ' + yield request.args['name'] + yield '!' + return Response(stream_with_context(generate())) + + .. versionadded:: 0.9 + """ + try: + gen = iter(generator_or_function) # type: ignore + except TypeError: + + def decorator(*args: t.Any, **kwargs: t.Any) -> t.Any: + gen = generator_or_function(*args, **kwargs) # type: ignore + return stream_with_context(gen) + + return update_wrapper(decorator, generator_or_function) # type: ignore + + def generator() -> t.Generator: + ctx = _cv_request.get(None) + if ctx is None: + raise RuntimeError( + "'stream_with_context' can only be used when a request" + " context is active, such as in a view function." + ) + with ctx: + # Dummy sentinel. Has to be inside the context block or we're + # not actually keeping the context around. + yield None + + # The try/finally is here so that if someone passes a WSGI level + # iterator in we're still running the cleanup logic. Generators + # don't need that because they are closed on their destruction + # automatically. + try: + yield from gen + finally: + if hasattr(gen, "close"): + gen.close() + + # The trick is to start the generator. Then the code execution runs until + # the first dummy None is yielded at which point the context was already + # pushed. This item is discarded. Then when the iteration continues the + # real generator is executed. + wrapped_g = generator() + next(wrapped_g) + return wrapped_g + + +def make_response(*args: t.Any) -> Response: + """Sometimes it is necessary to set additional headers in a view. Because + views do not have to return response objects but can return a value that + is converted into a response object by Flask itself, it becomes tricky to + add headers to it. This function can be called instead of using a return + and you will get a response object which you can use to attach headers. + + If view looked like this and you want to add a new header:: + + def index(): + return render_template('index.html', foo=42) + + You can now do something like this:: + + def index(): + response = make_response(render_template('index.html', foo=42)) + response.headers['X-Parachutes'] = 'parachutes are cool' + return response + + This function accepts the very same arguments you can return from a + view function. This for example creates a response with a 404 error + code:: + + response = make_response(render_template('not_found.html'), 404) + + The other use case of this function is to force the return value of a + view function into a response which is helpful with view + decorators:: + + response = make_response(view_function()) + response.headers['X-Parachutes'] = 'parachutes are cool' + + Internally this function does the following things: + + - if no arguments are passed, it creates a new response argument + - if one argument is passed, :meth:`flask.Flask.make_response` + is invoked with it. + - if more than one argument is passed, the arguments are passed + to the :meth:`flask.Flask.make_response` function as tuple. + + .. versionadded:: 0.6 + """ + if not args: + return current_app.response_class() + if len(args) == 1: + args = args[0] + return current_app.make_response(args) # type: ignore + + +def url_for( + endpoint: str, + *, + _anchor: str | None = None, + _method: str | None = None, + _scheme: str | None = None, + _external: bool | None = None, + **values: t.Any, +) -> str: + """Generate a URL to the given endpoint with the given values. + + This requires an active request or application context, and calls + :meth:`current_app.url_for() `. See that method + for full documentation. + + :param endpoint: The endpoint name associated with the URL to + generate. If this starts with a ``.``, the current blueprint + name (if any) will be used. + :param _anchor: If given, append this as ``#anchor`` to the URL. + :param _method: If given, generate the URL associated with this + method for the endpoint. + :param _scheme: If given, the URL will have this scheme if it is + external. + :param _external: If given, prefer the URL to be internal (False) or + require it to be external (True). External URLs include the + scheme and domain. When not in an active request, URLs are + external by default. + :param values: Values to use for the variable parts of the URL rule. + Unknown keys are appended as query string arguments, like + ``?a=b&c=d``. + + .. versionchanged:: 2.2 + Calls ``current_app.url_for``, allowing an app to override the + behavior. + + .. versionchanged:: 0.10 + The ``_scheme`` parameter was added. + + .. versionchanged:: 0.9 + The ``_anchor`` and ``_method`` parameters were added. + + .. versionchanged:: 0.9 + Calls ``app.handle_url_build_error`` on build errors. + """ + return current_app.url_for( + endpoint, + _anchor=_anchor, + _method=_method, + _scheme=_scheme, + _external=_external, + **values, + ) + + +def redirect( + location: str, code: int = 302, Response: type[BaseResponse] | None = None +) -> BaseResponse: + """Create a redirect response object. + + If :data:`~flask.current_app` is available, it will use its + :meth:`~flask.Flask.redirect` method, otherwise it will use + :func:`werkzeug.utils.redirect`. + + :param location: The URL to redirect to. + :param code: The status code for the redirect. + :param Response: The response class to use. Not used when + ``current_app`` is active, which uses ``app.response_class``. + + .. versionadded:: 2.2 + Calls ``current_app.redirect`` if available instead of always + using Werkzeug's default ``redirect``. + """ + if current_app: + return current_app.redirect(location, code=code) + + return _wz_redirect(location, code=code, Response=Response) + + +def abort(code: int | BaseResponse, *args: t.Any, **kwargs: t.Any) -> t.NoReturn: + """Raise an :exc:`~werkzeug.exceptions.HTTPException` for the given + status code. + + If :data:`~flask.current_app` is available, it will call its + :attr:`~flask.Flask.aborter` object, otherwise it will use + :func:`werkzeug.exceptions.abort`. + + :param code: The status code for the exception, which must be + registered in ``app.aborter``. + :param args: Passed to the exception. + :param kwargs: Passed to the exception. + + .. versionadded:: 2.2 + Calls ``current_app.aborter`` if available instead of always + using Werkzeug's default ``abort``. + """ + if current_app: + current_app.aborter(code, *args, **kwargs) + + _wz_abort(code, *args, **kwargs) + + +def get_template_attribute(template_name: str, attribute: str) -> t.Any: + """Loads a macro (or variable) a template exports. This can be used to + invoke a macro from within Python code. If you for example have a + template named :file:`_cider.html` with the following contents: + + .. sourcecode:: html+jinja + + {% macro hello(name) %}Hello {{ name }}!{% endmacro %} + + You can access this from Python code like this:: + + hello = get_template_attribute('_cider.html', 'hello') + return hello('World') + + .. versionadded:: 0.2 + + :param template_name: the name of the template + :param attribute: the name of the variable of macro to access + """ + return getattr(current_app.jinja_env.get_template(template_name).module, attribute) + + +def flash(message: str, category: str = "message") -> None: + """Flashes a message to the next request. In order to remove the + flashed message from the session and to display it to the user, + the template has to call :func:`get_flashed_messages`. + + .. versionchanged:: 0.3 + `category` parameter added. + + :param message: the message to be flashed. + :param category: the category for the message. The following values + are recommended: ``'message'`` for any kind of message, + ``'error'`` for errors, ``'info'`` for information + messages and ``'warning'`` for warnings. However any + kind of string can be used as category. + """ + # Original implementation: + # + # session.setdefault('_flashes', []).append((category, message)) + # + # This assumed that changes made to mutable structures in the session are + # always in sync with the session object, which is not true for session + # implementations that use external storage for keeping their keys/values. + flashes = session.get("_flashes", []) + flashes.append((category, message)) + session["_flashes"] = flashes + app = current_app._get_current_object() # type: ignore + message_flashed.send( + app, + _async_wrapper=app.ensure_sync, + message=message, + category=category, + ) + + +def get_flashed_messages( + with_categories: bool = False, category_filter: t.Iterable[str] = () +) -> list[str] | list[tuple[str, str]]: + """Pulls all flashed messages from the session and returns them. + Further calls in the same request to the function will return + the same messages. By default just the messages are returned, + but when `with_categories` is set to ``True``, the return value will + be a list of tuples in the form ``(category, message)`` instead. + + Filter the flashed messages to one or more categories by providing those + categories in `category_filter`. This allows rendering categories in + separate html blocks. The `with_categories` and `category_filter` + arguments are distinct: + + * `with_categories` controls whether categories are returned with message + text (``True`` gives a tuple, where ``False`` gives just the message text). + * `category_filter` filters the messages down to only those matching the + provided categories. + + See :doc:`/patterns/flashing` for examples. + + .. versionchanged:: 0.3 + `with_categories` parameter added. + + .. versionchanged:: 0.9 + `category_filter` parameter added. + + :param with_categories: set to ``True`` to also receive categories. + :param category_filter: filter of categories to limit return values. Only + categories in the list will be returned. + """ + flashes = request_ctx.flashes + if flashes is None: + flashes = session.pop("_flashes") if "_flashes" in session else [] + request_ctx.flashes = flashes + if category_filter: + flashes = list(filter(lambda f: f[0] in category_filter, flashes)) + if not with_categories: + return [x[1] for x in flashes] + return flashes + + +def _prepare_send_file_kwargs(**kwargs: t.Any) -> dict[str, t.Any]: + if kwargs.get("max_age") is None: + kwargs["max_age"] = current_app.get_send_file_max_age + + kwargs.update( + environ=request.environ, + use_x_sendfile=current_app.config["USE_X_SENDFILE"], + response_class=current_app.response_class, + _root_path=current_app.root_path, # type: ignore + ) + return kwargs + + +def send_file( + path_or_file: os.PathLike | str | t.BinaryIO, + mimetype: str | None = None, + as_attachment: bool = False, + download_name: str | None = None, + conditional: bool = True, + etag: bool | str = True, + last_modified: datetime | int | float | None = None, + max_age: None | (int | t.Callable[[str | None], int | None]) = None, +) -> Response: + """Send the contents of a file to the client. + + The first argument can be a file path or a file-like object. Paths + are preferred in most cases because Werkzeug can manage the file and + get extra information from the path. Passing a file-like object + requires that the file is opened in binary mode, and is mostly + useful when building a file in memory with :class:`io.BytesIO`. + + Never pass file paths provided by a user. The path is assumed to be + trusted, so a user could craft a path to access a file you didn't + intend. Use :func:`send_from_directory` to safely serve + user-requested paths from within a directory. + + If the WSGI server sets a ``file_wrapper`` in ``environ``, it is + used, otherwise Werkzeug's built-in wrapper is used. Alternatively, + if the HTTP server supports ``X-Sendfile``, configuring Flask with + ``USE_X_SENDFILE = True`` will tell the server to send the given + path, which is much more efficient than reading it in Python. + + :param path_or_file: The path to the file to send, relative to the + current working directory if a relative path is given. + Alternatively, a file-like object opened in binary mode. Make + sure the file pointer is seeked to the start of the data. + :param mimetype: The MIME type to send for the file. If not + provided, it will try to detect it from the file name. + :param as_attachment: Indicate to a browser that it should offer to + save the file instead of displaying it. + :param download_name: The default name browsers will use when saving + the file. Defaults to the passed file name. + :param conditional: Enable conditional and range responses based on + request headers. Requires passing a file path and ``environ``. + :param etag: Calculate an ETag for the file, which requires passing + a file path. Can also be a string to use instead. + :param last_modified: The last modified time to send for the file, + in seconds. If not provided, it will try to detect it from the + file path. + :param max_age: How long the client should cache the file, in + seconds. If set, ``Cache-Control`` will be ``public``, otherwise + it will be ``no-cache`` to prefer conditional caching. + + .. versionchanged:: 2.0 + ``download_name`` replaces the ``attachment_filename`` + parameter. If ``as_attachment=False``, it is passed with + ``Content-Disposition: inline`` instead. + + .. versionchanged:: 2.0 + ``max_age`` replaces the ``cache_timeout`` parameter. + ``conditional`` is enabled and ``max_age`` is not set by + default. + + .. versionchanged:: 2.0 + ``etag`` replaces the ``add_etags`` parameter. It can be a + string to use instead of generating one. + + .. versionchanged:: 2.0 + Passing a file-like object that inherits from + :class:`~io.TextIOBase` will raise a :exc:`ValueError` rather + than sending an empty file. + + .. versionadded:: 2.0 + Moved the implementation to Werkzeug. This is now a wrapper to + pass some Flask-specific arguments. + + .. versionchanged:: 1.1 + ``filename`` may be a :class:`~os.PathLike` object. + + .. versionchanged:: 1.1 + Passing a :class:`~io.BytesIO` object supports range requests. + + .. versionchanged:: 1.0.3 + Filenames are encoded with ASCII instead of Latin-1 for broader + compatibility with WSGI servers. + + .. versionchanged:: 1.0 + UTF-8 filenames as specified in :rfc:`2231` are supported. + + .. versionchanged:: 0.12 + The filename is no longer automatically inferred from file + objects. If you want to use automatic MIME and etag support, + pass a filename via ``filename_or_fp`` or + ``attachment_filename``. + + .. versionchanged:: 0.12 + ``attachment_filename`` is preferred over ``filename`` for MIME + detection. + + .. versionchanged:: 0.9 + ``cache_timeout`` defaults to + :meth:`Flask.get_send_file_max_age`. + + .. versionchanged:: 0.7 + MIME guessing and etag support for file-like objects was + removed because it was unreliable. Pass a filename if you are + able to, otherwise attach an etag yourself. + + .. versionchanged:: 0.5 + The ``add_etags``, ``cache_timeout`` and ``conditional`` + parameters were added. The default behavior is to add etags. + + .. versionadded:: 0.2 + """ + return werkzeug.utils.send_file( # type: ignore[return-value] + **_prepare_send_file_kwargs( + path_or_file=path_or_file, + environ=request.environ, + mimetype=mimetype, + as_attachment=as_attachment, + download_name=download_name, + conditional=conditional, + etag=etag, + last_modified=last_modified, + max_age=max_age, + ) + ) + + +def send_from_directory( + directory: os.PathLike | str, + path: os.PathLike | str, + **kwargs: t.Any, +) -> Response: + """Send a file from within a directory using :func:`send_file`. + + .. code-block:: python + + @app.route("/uploads/") + def download_file(name): + return send_from_directory( + app.config['UPLOAD_FOLDER'], name, as_attachment=True + ) + + This is a secure way to serve files from a folder, such as static + files or uploads. Uses :func:`~werkzeug.security.safe_join` to + ensure the path coming from the client is not maliciously crafted to + point outside the specified directory. + + If the final path does not point to an existing regular file, + raises a 404 :exc:`~werkzeug.exceptions.NotFound` error. + + :param directory: The directory that ``path`` must be located under, + relative to the current application's root path. + :param path: The path to the file to send, relative to + ``directory``. + :param kwargs: Arguments to pass to :func:`send_file`. + + .. versionchanged:: 2.0 + ``path`` replaces the ``filename`` parameter. + + .. versionadded:: 2.0 + Moved the implementation to Werkzeug. This is now a wrapper to + pass some Flask-specific arguments. + + .. versionadded:: 0.5 + """ + return werkzeug.utils.send_from_directory( # type: ignore[return-value] + directory, path, **_prepare_send_file_kwargs(**kwargs) + ) + + +def get_root_path(import_name: str) -> str: + """Find the root path of a package, or the path that contains a + module. If it cannot be found, returns the current working + directory. + + Not to be confused with the value returned by :func:`find_package`. + + :meta private: + """ + # Module already imported and has a file attribute. Use that first. + mod = sys.modules.get(import_name) + + if mod is not None and hasattr(mod, "__file__") and mod.__file__ is not None: + return os.path.dirname(os.path.abspath(mod.__file__)) + + # Next attempt: check the loader. + try: + spec = importlib.util.find_spec(import_name) + + if spec is None: + raise ValueError + except (ImportError, ValueError): + loader = None + else: + loader = spec.loader + + # Loader does not exist or we're referring to an unloaded main + # module or a main module without path (interactive sessions), go + # with the current working directory. + if loader is None: + return os.getcwd() + + if hasattr(loader, "get_filename"): + filepath = loader.get_filename(import_name) + else: + # Fall back to imports. + __import__(import_name) + mod = sys.modules[import_name] + filepath = getattr(mod, "__file__", None) + + # If we don't have a file path it might be because it is a + # namespace package. In this case pick the root path from the + # first module that is contained in the package. + if filepath is None: + raise RuntimeError( + "No root path can be found for the provided module" + f" {import_name!r}. This can happen because the module" + " came from an import hook that does not provide file" + " name information or because it's a namespace package." + " In this case the root path needs to be explicitly" + " provided." + ) + + # filepath is import_name.py for a module, or __init__.py for a package. + return os.path.dirname(os.path.abspath(filepath)) + + +@lru_cache(maxsize=None) +def _split_blueprint_path(name: str) -> list[str]: + out: list[str] = [name] + + if "." in name: + out.extend(_split_blueprint_path(name.rpartition(".")[0])) + + return out diff --git a/app/src/flask-server/venv/Lib/site-packages/flask/json/__init__.py b/app/src/flask-server/venv/Lib/site-packages/flask/json/__init__.py new file mode 100644 index 0000000..f15296f --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/flask/json/__init__.py @@ -0,0 +1,170 @@ +from __future__ import annotations + +import json as _json +import typing as t + +from ..globals import current_app +from .provider import _default + +if t.TYPE_CHECKING: # pragma: no cover + from ..wrappers import Response + + +def dumps(obj: t.Any, **kwargs: t.Any) -> str: + """Serialize data as JSON. + + If :data:`~flask.current_app` is available, it will use its + :meth:`app.json.dumps() ` + method, otherwise it will use :func:`json.dumps`. + + :param obj: The data to serialize. + :param kwargs: Arguments passed to the ``dumps`` implementation. + + .. versionchanged:: 2.3 + The ``app`` parameter was removed. + + .. versionchanged:: 2.2 + Calls ``current_app.json.dumps``, allowing an app to override + the behavior. + + .. versionchanged:: 2.0.2 + :class:`decimal.Decimal` is supported by converting to a string. + + .. versionchanged:: 2.0 + ``encoding`` will be removed in Flask 2.1. + + .. versionchanged:: 1.0.3 + ``app`` can be passed directly, rather than requiring an app + context for configuration. + """ + if current_app: + return current_app.json.dumps(obj, **kwargs) + + kwargs.setdefault("default", _default) + return _json.dumps(obj, **kwargs) + + +def dump(obj: t.Any, fp: t.IO[str], **kwargs: t.Any) -> None: + """Serialize data as JSON and write to a file. + + If :data:`~flask.current_app` is available, it will use its + :meth:`app.json.dump() ` + method, otherwise it will use :func:`json.dump`. + + :param obj: The data to serialize. + :param fp: A file opened for writing text. Should use the UTF-8 + encoding to be valid JSON. + :param kwargs: Arguments passed to the ``dump`` implementation. + + .. versionchanged:: 2.3 + The ``app`` parameter was removed. + + .. versionchanged:: 2.2 + Calls ``current_app.json.dump``, allowing an app to override + the behavior. + + .. versionchanged:: 2.0 + Writing to a binary file, and the ``encoding`` argument, will be + removed in Flask 2.1. + """ + if current_app: + current_app.json.dump(obj, fp, **kwargs) + else: + kwargs.setdefault("default", _default) + _json.dump(obj, fp, **kwargs) + + +def loads(s: str | bytes, **kwargs: t.Any) -> t.Any: + """Deserialize data as JSON. + + If :data:`~flask.current_app` is available, it will use its + :meth:`app.json.loads() ` + method, otherwise it will use :func:`json.loads`. + + :param s: Text or UTF-8 bytes. + :param kwargs: Arguments passed to the ``loads`` implementation. + + .. versionchanged:: 2.3 + The ``app`` parameter was removed. + + .. versionchanged:: 2.2 + Calls ``current_app.json.loads``, allowing an app to override + the behavior. + + .. versionchanged:: 2.0 + ``encoding`` will be removed in Flask 2.1. The data must be a + string or UTF-8 bytes. + + .. versionchanged:: 1.0.3 + ``app`` can be passed directly, rather than requiring an app + context for configuration. + """ + if current_app: + return current_app.json.loads(s, **kwargs) + + return _json.loads(s, **kwargs) + + +def load(fp: t.IO[t.AnyStr], **kwargs: t.Any) -> t.Any: + """Deserialize data as JSON read from a file. + + If :data:`~flask.current_app` is available, it will use its + :meth:`app.json.load() ` + method, otherwise it will use :func:`json.load`. + + :param fp: A file opened for reading text or UTF-8 bytes. + :param kwargs: Arguments passed to the ``load`` implementation. + + .. versionchanged:: 2.3 + The ``app`` parameter was removed. + + .. versionchanged:: 2.2 + Calls ``current_app.json.load``, allowing an app to override + the behavior. + + .. versionchanged:: 2.2 + The ``app`` parameter will be removed in Flask 2.3. + + .. versionchanged:: 2.0 + ``encoding`` will be removed in Flask 2.1. The file must be text + mode, or binary mode with UTF-8 bytes. + """ + if current_app: + return current_app.json.load(fp, **kwargs) + + return _json.load(fp, **kwargs) + + +def jsonify(*args: t.Any, **kwargs: t.Any) -> Response: + """Serialize the given arguments as JSON, and return a + :class:`~flask.Response` object with the ``application/json`` + mimetype. A dict or list returned from a view will be converted to a + JSON response automatically without needing to call this. + + This requires an active request or application context, and calls + :meth:`app.json.response() `. + + In debug mode, the output is formatted with indentation to make it + easier to read. This may also be controlled by the provider. + + Either positional or keyword arguments can be given, not both. + If no arguments are given, ``None`` is serialized. + + :param args: A single value to serialize, or multiple values to + treat as a list to serialize. + :param kwargs: Treat as a dict to serialize. + + .. versionchanged:: 2.2 + Calls ``current_app.json.response``, allowing an app to override + the behavior. + + .. versionchanged:: 2.0.2 + :class:`decimal.Decimal` is supported by converting to a string. + + .. versionchanged:: 0.11 + Added support for serializing top-level arrays. This was a + security risk in ancient browsers. See :ref:`security-json`. + + .. versionadded:: 0.2 + """ + return current_app.json.response(*args, **kwargs) diff --git a/app/src/flask-server/venv/Lib/site-packages/flask/json/__pycache__/__init__.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/flask/json/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000..dc01c57 Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/flask/json/__pycache__/__init__.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/flask/json/__pycache__/provider.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/flask/json/__pycache__/provider.cpython-310.pyc new file mode 100644 index 0000000..a3878b6 Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/flask/json/__pycache__/provider.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/flask/json/__pycache__/tag.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/flask/json/__pycache__/tag.cpython-310.pyc new file mode 100644 index 0000000..2e170d5 Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/flask/json/__pycache__/tag.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/flask/json/provider.py b/app/src/flask-server/venv/Lib/site-packages/flask/json/provider.py new file mode 100644 index 0000000..3c22bc8 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/flask/json/provider.py @@ -0,0 +1,216 @@ +from __future__ import annotations + +import dataclasses +import decimal +import json +import typing as t +import uuid +import weakref +from datetime import date + +from werkzeug.http import http_date + +if t.TYPE_CHECKING: # pragma: no cover + from ..sansio.app import App + from ..wrappers import Response + + +class JSONProvider: + """A standard set of JSON operations for an application. Subclasses + of this can be used to customize JSON behavior or use different + JSON libraries. + + To implement a provider for a specific library, subclass this base + class and implement at least :meth:`dumps` and :meth:`loads`. All + other methods have default implementations. + + To use a different provider, either subclass ``Flask`` and set + :attr:`~flask.Flask.json_provider_class` to a provider class, or set + :attr:`app.json ` to an instance of the class. + + :param app: An application instance. This will be stored as a + :class:`weakref.proxy` on the :attr:`_app` attribute. + + .. versionadded:: 2.2 + """ + + def __init__(self, app: App) -> None: + self._app = weakref.proxy(app) + + def dumps(self, obj: t.Any, **kwargs: t.Any) -> str: + """Serialize data as JSON. + + :param obj: The data to serialize. + :param kwargs: May be passed to the underlying JSON library. + """ + raise NotImplementedError + + def dump(self, obj: t.Any, fp: t.IO[str], **kwargs: t.Any) -> None: + """Serialize data as JSON and write to a file. + + :param obj: The data to serialize. + :param fp: A file opened for writing text. Should use the UTF-8 + encoding to be valid JSON. + :param kwargs: May be passed to the underlying JSON library. + """ + fp.write(self.dumps(obj, **kwargs)) + + def loads(self, s: str | bytes, **kwargs: t.Any) -> t.Any: + """Deserialize data as JSON. + + :param s: Text or UTF-8 bytes. + :param kwargs: May be passed to the underlying JSON library. + """ + raise NotImplementedError + + def load(self, fp: t.IO[t.AnyStr], **kwargs: t.Any) -> t.Any: + """Deserialize data as JSON read from a file. + + :param fp: A file opened for reading text or UTF-8 bytes. + :param kwargs: May be passed to the underlying JSON library. + """ + return self.loads(fp.read(), **kwargs) + + def _prepare_response_obj( + self, args: tuple[t.Any, ...], kwargs: dict[str, t.Any] + ) -> t.Any: + if args and kwargs: + raise TypeError("app.json.response() takes either args or kwargs, not both") + + if not args and not kwargs: + return None + + if len(args) == 1: + return args[0] + + return args or kwargs + + def response(self, *args: t.Any, **kwargs: t.Any) -> Response: + """Serialize the given arguments as JSON, and return a + :class:`~flask.Response` object with the ``application/json`` + mimetype. + + The :func:`~flask.json.jsonify` function calls this method for + the current application. + + Either positional or keyword arguments can be given, not both. + If no arguments are given, ``None`` is serialized. + + :param args: A single value to serialize, or multiple values to + treat as a list to serialize. + :param kwargs: Treat as a dict to serialize. + """ + obj = self._prepare_response_obj(args, kwargs) + return self._app.response_class(self.dumps(obj), mimetype="application/json") + + +def _default(o: t.Any) -> t.Any: + if isinstance(o, date): + return http_date(o) + + if isinstance(o, (decimal.Decimal, uuid.UUID)): + return str(o) + + if dataclasses and dataclasses.is_dataclass(o): + return dataclasses.asdict(o) + + if hasattr(o, "__html__"): + return str(o.__html__()) + + raise TypeError(f"Object of type {type(o).__name__} is not JSON serializable") + + +class DefaultJSONProvider(JSONProvider): + """Provide JSON operations using Python's built-in :mod:`json` + library. Serializes the following additional data types: + + - :class:`datetime.datetime` and :class:`datetime.date` are + serialized to :rfc:`822` strings. This is the same as the HTTP + date format. + - :class:`uuid.UUID` is serialized to a string. + - :class:`dataclasses.dataclass` is passed to + :func:`dataclasses.asdict`. + - :class:`~markupsafe.Markup` (or any object with a ``__html__`` + method) will call the ``__html__`` method to get a string. + """ + + default: t.Callable[[t.Any], t.Any] = staticmethod( + _default + ) # type: ignore[assignment] + """Apply this function to any object that :meth:`json.dumps` does + not know how to serialize. It should return a valid JSON type or + raise a ``TypeError``. + """ + + ensure_ascii = True + """Replace non-ASCII characters with escape sequences. This may be + more compatible with some clients, but can be disabled for better + performance and size. + """ + + sort_keys = True + """Sort the keys in any serialized dicts. This may be useful for + some caching situations, but can be disabled for better performance. + When enabled, keys must all be strings, they are not converted + before sorting. + """ + + compact: bool | None = None + """If ``True``, or ``None`` out of debug mode, the :meth:`response` + output will not add indentation, newlines, or spaces. If ``False``, + or ``None`` in debug mode, it will use a non-compact representation. + """ + + mimetype = "application/json" + """The mimetype set in :meth:`response`.""" + + def dumps(self, obj: t.Any, **kwargs: t.Any) -> str: + """Serialize data as JSON to a string. + + Keyword arguments are passed to :func:`json.dumps`. Sets some + parameter defaults from the :attr:`default`, + :attr:`ensure_ascii`, and :attr:`sort_keys` attributes. + + :param obj: The data to serialize. + :param kwargs: Passed to :func:`json.dumps`. + """ + kwargs.setdefault("default", self.default) + kwargs.setdefault("ensure_ascii", self.ensure_ascii) + kwargs.setdefault("sort_keys", self.sort_keys) + return json.dumps(obj, **kwargs) + + def loads(self, s: str | bytes, **kwargs: t.Any) -> t.Any: + """Deserialize data as JSON from a string or bytes. + + :param s: Text or UTF-8 bytes. + :param kwargs: Passed to :func:`json.loads`. + """ + return json.loads(s, **kwargs) + + def response(self, *args: t.Any, **kwargs: t.Any) -> Response: + """Serialize the given arguments as JSON, and return a + :class:`~flask.Response` object with it. The response mimetype + will be "application/json" and can be changed with + :attr:`mimetype`. + + If :attr:`compact` is ``False`` or debug mode is enabled, the + output will be formatted to be easier to read. + + Either positional or keyword arguments can be given, not both. + If no arguments are given, ``None`` is serialized. + + :param args: A single value to serialize, or multiple values to + treat as a list to serialize. + :param kwargs: Treat as a dict to serialize. + """ + obj = self._prepare_response_obj(args, kwargs) + dump_args: dict[str, t.Any] = {} + + if (self.compact is None and self._app.debug) or self.compact is False: + dump_args.setdefault("indent", 2) + else: + dump_args.setdefault("separators", (",", ":")) + + return self._app.response_class( + f"{self.dumps(obj, **dump_args)}\n", mimetype=self.mimetype + ) diff --git a/app/src/flask-server/venv/Lib/site-packages/flask/json/tag.py b/app/src/flask-server/venv/Lib/site-packages/flask/json/tag.py new file mode 100644 index 0000000..91cc441 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/flask/json/tag.py @@ -0,0 +1,314 @@ +""" +Tagged JSON +~~~~~~~~~~~ + +A compact representation for lossless serialization of non-standard JSON +types. :class:`~flask.sessions.SecureCookieSessionInterface` uses this +to serialize the session data, but it may be useful in other places. It +can be extended to support other types. + +.. autoclass:: TaggedJSONSerializer + :members: + +.. autoclass:: JSONTag + :members: + +Let's see an example that adds support for +:class:`~collections.OrderedDict`. Dicts don't have an order in JSON, so +to handle this we will dump the items as a list of ``[key, value]`` +pairs. Subclass :class:`JSONTag` and give it the new key ``' od'`` to +identify the type. The session serializer processes dicts first, so +insert the new tag at the front of the order since ``OrderedDict`` must +be processed before ``dict``. + +.. code-block:: python + + from flask.json.tag import JSONTag + + class TagOrderedDict(JSONTag): + __slots__ = ('serializer',) + key = ' od' + + def check(self, value): + return isinstance(value, OrderedDict) + + def to_json(self, value): + return [[k, self.serializer.tag(v)] for k, v in iteritems(value)] + + def to_python(self, value): + return OrderedDict(value) + + app.session_interface.serializer.register(TagOrderedDict, index=0) +""" +from __future__ import annotations + +import typing as t +from base64 import b64decode +from base64 import b64encode +from datetime import datetime +from uuid import UUID + +from markupsafe import Markup +from werkzeug.http import http_date +from werkzeug.http import parse_date + +from ..json import dumps +from ..json import loads + + +class JSONTag: + """Base class for defining type tags for :class:`TaggedJSONSerializer`.""" + + __slots__ = ("serializer",) + + #: The tag to mark the serialized object with. If ``None``, this tag is + #: only used as an intermediate step during tagging. + key: str | None = None + + def __init__(self, serializer: TaggedJSONSerializer) -> None: + """Create a tagger for the given serializer.""" + self.serializer = serializer + + def check(self, value: t.Any) -> bool: + """Check if the given value should be tagged by this tag.""" + raise NotImplementedError + + def to_json(self, value: t.Any) -> t.Any: + """Convert the Python object to an object that is a valid JSON type. + The tag will be added later.""" + raise NotImplementedError + + def to_python(self, value: t.Any) -> t.Any: + """Convert the JSON representation back to the correct type. The tag + will already be removed.""" + raise NotImplementedError + + def tag(self, value: t.Any) -> t.Any: + """Convert the value to a valid JSON type and add the tag structure + around it.""" + return {self.key: self.to_json(value)} + + +class TagDict(JSONTag): + """Tag for 1-item dicts whose only key matches a registered tag. + + Internally, the dict key is suffixed with `__`, and the suffix is removed + when deserializing. + """ + + __slots__ = () + key = " di" + + def check(self, value: t.Any) -> bool: + return ( + isinstance(value, dict) + and len(value) == 1 + and next(iter(value)) in self.serializer.tags + ) + + def to_json(self, value: t.Any) -> t.Any: + key = next(iter(value)) + return {f"{key}__": self.serializer.tag(value[key])} + + def to_python(self, value: t.Any) -> t.Any: + key = next(iter(value)) + return {key[:-2]: value[key]} + + +class PassDict(JSONTag): + __slots__ = () + + def check(self, value: t.Any) -> bool: + return isinstance(value, dict) + + def to_json(self, value: t.Any) -> t.Any: + # JSON objects may only have string keys, so don't bother tagging the + # key here. + return {k: self.serializer.tag(v) for k, v in value.items()} + + tag = to_json + + +class TagTuple(JSONTag): + __slots__ = () + key = " t" + + def check(self, value: t.Any) -> bool: + return isinstance(value, tuple) + + def to_json(self, value: t.Any) -> t.Any: + return [self.serializer.tag(item) for item in value] + + def to_python(self, value: t.Any) -> t.Any: + return tuple(value) + + +class PassList(JSONTag): + __slots__ = () + + def check(self, value: t.Any) -> bool: + return isinstance(value, list) + + def to_json(self, value: t.Any) -> t.Any: + return [self.serializer.tag(item) for item in value] + + tag = to_json + + +class TagBytes(JSONTag): + __slots__ = () + key = " b" + + def check(self, value: t.Any) -> bool: + return isinstance(value, bytes) + + def to_json(self, value: t.Any) -> t.Any: + return b64encode(value).decode("ascii") + + def to_python(self, value: t.Any) -> t.Any: + return b64decode(value) + + +class TagMarkup(JSONTag): + """Serialize anything matching the :class:`~markupsafe.Markup` API by + having a ``__html__`` method to the result of that method. Always + deserializes to an instance of :class:`~markupsafe.Markup`.""" + + __slots__ = () + key = " m" + + def check(self, value: t.Any) -> bool: + return callable(getattr(value, "__html__", None)) + + def to_json(self, value: t.Any) -> t.Any: + return str(value.__html__()) + + def to_python(self, value: t.Any) -> t.Any: + return Markup(value) + + +class TagUUID(JSONTag): + __slots__ = () + key = " u" + + def check(self, value: t.Any) -> bool: + return isinstance(value, UUID) + + def to_json(self, value: t.Any) -> t.Any: + return value.hex + + def to_python(self, value: t.Any) -> t.Any: + return UUID(value) + + +class TagDateTime(JSONTag): + __slots__ = () + key = " d" + + def check(self, value: t.Any) -> bool: + return isinstance(value, datetime) + + def to_json(self, value: t.Any) -> t.Any: + return http_date(value) + + def to_python(self, value: t.Any) -> t.Any: + return parse_date(value) + + +class TaggedJSONSerializer: + """Serializer that uses a tag system to compactly represent objects that + are not JSON types. Passed as the intermediate serializer to + :class:`itsdangerous.Serializer`. + + The following extra types are supported: + + * :class:`dict` + * :class:`tuple` + * :class:`bytes` + * :class:`~markupsafe.Markup` + * :class:`~uuid.UUID` + * :class:`~datetime.datetime` + """ + + __slots__ = ("tags", "order") + + #: Tag classes to bind when creating the serializer. Other tags can be + #: added later using :meth:`~register`. + default_tags = [ + TagDict, + PassDict, + TagTuple, + PassList, + TagBytes, + TagMarkup, + TagUUID, + TagDateTime, + ] + + def __init__(self) -> None: + self.tags: dict[str, JSONTag] = {} + self.order: list[JSONTag] = [] + + for cls in self.default_tags: + self.register(cls) + + def register( + self, + tag_class: type[JSONTag], + force: bool = False, + index: int | None = None, + ) -> None: + """Register a new tag with this serializer. + + :param tag_class: tag class to register. Will be instantiated with this + serializer instance. + :param force: overwrite an existing tag. If false (default), a + :exc:`KeyError` is raised. + :param index: index to insert the new tag in the tag order. Useful when + the new tag is a special case of an existing tag. If ``None`` + (default), the tag is appended to the end of the order. + + :raise KeyError: if the tag key is already registered and ``force`` is + not true. + """ + tag = tag_class(self) + key = tag.key + + if key is not None: + if not force and key in self.tags: + raise KeyError(f"Tag '{key}' is already registered.") + + self.tags[key] = tag + + if index is None: + self.order.append(tag) + else: + self.order.insert(index, tag) + + def tag(self, value: t.Any) -> dict[str, t.Any]: + """Convert a value to a tagged representation if necessary.""" + for tag in self.order: + if tag.check(value): + return tag.tag(value) + + return value + + def untag(self, value: dict[str, t.Any]) -> t.Any: + """Convert a tagged representation back to the original type.""" + if len(value) != 1: + return value + + key = next(iter(value)) + + if key not in self.tags: + return value + + return self.tags[key].to_python(value[key]) + + def dumps(self, value: t.Any) -> str: + """Tag the value and dump it to a compact JSON string.""" + return dumps(self.tag(value), separators=(",", ":")) + + def loads(self, value: str) -> t.Any: + """Load data from a JSON string and deserialized any tagged objects.""" + return loads(value, object_hook=self.untag) diff --git a/app/src/flask-server/venv/Lib/site-packages/flask/logging.py b/app/src/flask-server/venv/Lib/site-packages/flask/logging.py new file mode 100644 index 0000000..b452f71 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/flask/logging.py @@ -0,0 +1,76 @@ +from __future__ import annotations + +import logging +import sys +import typing as t + +from werkzeug.local import LocalProxy + +from .globals import request + +if t.TYPE_CHECKING: # pragma: no cover + from .sansio.app import App + + +@LocalProxy +def wsgi_errors_stream() -> t.TextIO: + """Find the most appropriate error stream for the application. If a request + is active, log to ``wsgi.errors``, otherwise use ``sys.stderr``. + + If you configure your own :class:`logging.StreamHandler`, you may want to + use this for the stream. If you are using file or dict configuration and + can't import this directly, you can refer to it as + ``ext://flask.logging.wsgi_errors_stream``. + """ + return request.environ["wsgi.errors"] if request else sys.stderr + + +def has_level_handler(logger: logging.Logger) -> bool: + """Check if there is a handler in the logging chain that will handle the + given logger's :meth:`effective level <~logging.Logger.getEffectiveLevel>`. + """ + level = logger.getEffectiveLevel() + current = logger + + while current: + if any(handler.level <= level for handler in current.handlers): + return True + + if not current.propagate: + break + + current = current.parent # type: ignore + + return False + + +#: Log messages to :func:`~flask.logging.wsgi_errors_stream` with the format +#: ``[%(asctime)s] %(levelname)s in %(module)s: %(message)s``. +default_handler = logging.StreamHandler(wsgi_errors_stream) # type: ignore +default_handler.setFormatter( + logging.Formatter("[%(asctime)s] %(levelname)s in %(module)s: %(message)s") +) + + +def create_logger(app: App) -> logging.Logger: + """Get the Flask app's logger and configure it if needed. + + The logger name will be the same as + :attr:`app.import_name `. + + When :attr:`~flask.Flask.debug` is enabled, set the logger level to + :data:`logging.DEBUG` if it is not set. + + If there is no handler for the logger's effective level, add a + :class:`~logging.StreamHandler` for + :func:`~flask.logging.wsgi_errors_stream` with a basic format. + """ + logger = logging.getLogger(app.name) + + if app.debug and not logger.level: + logger.setLevel(logging.DEBUG) + + if not has_level_handler(logger): + logger.addHandler(default_handler) + + return logger diff --git a/app/src/flask-server/venv/Lib/site-packages/flask/py.typed b/app/src/flask-server/venv/Lib/site-packages/flask/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/app/src/flask-server/venv/Lib/site-packages/flask/sansio/README.md b/app/src/flask-server/venv/Lib/site-packages/flask/sansio/README.md new file mode 100644 index 0000000..623ac19 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/flask/sansio/README.md @@ -0,0 +1,6 @@ +# Sansio + +This folder contains code that can be used by alternative Flask +implementations, for example Quart. The code therefore cannot do any +IO, nor be part of a likely IO path. Finally this code cannot use the +Flask globals. diff --git a/app/src/flask-server/venv/Lib/site-packages/flask/sansio/__pycache__/app.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/flask/sansio/__pycache__/app.cpython-310.pyc new file mode 100644 index 0000000..119ea41 Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/flask/sansio/__pycache__/app.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/flask/sansio/__pycache__/blueprints.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/flask/sansio/__pycache__/blueprints.cpython-310.pyc new file mode 100644 index 0000000..f826969 Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/flask/sansio/__pycache__/blueprints.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/flask/sansio/__pycache__/scaffold.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/flask/sansio/__pycache__/scaffold.cpython-310.pyc new file mode 100644 index 0000000..e43ff88 Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/flask/sansio/__pycache__/scaffold.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/flask/sansio/app.py b/app/src/flask-server/venv/Lib/site-packages/flask/sansio/app.py new file mode 100644 index 0000000..0f7d2cb --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/flask/sansio/app.py @@ -0,0 +1,964 @@ +from __future__ import annotations + +import logging +import os +import sys +import typing as t +from datetime import timedelta +from itertools import chain + +from werkzeug.exceptions import Aborter +from werkzeug.exceptions import BadRequest +from werkzeug.exceptions import BadRequestKeyError +from werkzeug.routing import BuildError +from werkzeug.routing import Map +from werkzeug.routing import Rule +from werkzeug.sansio.response import Response +from werkzeug.utils import cached_property +from werkzeug.utils import redirect as _wz_redirect + +from .. import typing as ft +from ..config import Config +from ..config import ConfigAttribute +from ..ctx import _AppCtxGlobals +from ..helpers import _split_blueprint_path +from ..helpers import get_debug_flag +from ..json.provider import DefaultJSONProvider +from ..json.provider import JSONProvider +from ..logging import create_logger +from ..templating import DispatchingJinjaLoader +from ..templating import Environment +from .scaffold import _endpoint_from_view_func +from .scaffold import find_package +from .scaffold import Scaffold +from .scaffold import setupmethod + +if t.TYPE_CHECKING: # pragma: no cover + from werkzeug.wrappers import Response as BaseResponse + from .blueprints import Blueprint + from ..testing import FlaskClient + from ..testing import FlaskCliRunner + +T_shell_context_processor = t.TypeVar( + "T_shell_context_processor", bound=ft.ShellContextProcessorCallable +) +T_teardown = t.TypeVar("T_teardown", bound=ft.TeardownCallable) +T_template_filter = t.TypeVar("T_template_filter", bound=ft.TemplateFilterCallable) +T_template_global = t.TypeVar("T_template_global", bound=ft.TemplateGlobalCallable) +T_template_test = t.TypeVar("T_template_test", bound=ft.TemplateTestCallable) + + +def _make_timedelta(value: timedelta | int | None) -> timedelta | None: + if value is None or isinstance(value, timedelta): + return value + + return timedelta(seconds=value) + + +class App(Scaffold): + """The flask object implements a WSGI application and acts as the central + object. It is passed the name of the module or package of the + application. Once it is created it will act as a central registry for + the view functions, the URL rules, template configuration and much more. + + The name of the package is used to resolve resources from inside the + package or the folder the module is contained in depending on if the + package parameter resolves to an actual python package (a folder with + an :file:`__init__.py` file inside) or a standard module (just a ``.py`` file). + + For more information about resource loading, see :func:`open_resource`. + + Usually you create a :class:`Flask` instance in your main module or + in the :file:`__init__.py` file of your package like this:: + + from flask import Flask + app = Flask(__name__) + + .. admonition:: About the First Parameter + + The idea of the first parameter is to give Flask an idea of what + belongs to your application. This name is used to find resources + on the filesystem, can be used by extensions to improve debugging + information and a lot more. + + So it's important what you provide there. If you are using a single + module, `__name__` is always the correct value. If you however are + using a package, it's usually recommended to hardcode the name of + your package there. + + For example if your application is defined in :file:`yourapplication/app.py` + you should create it with one of the two versions below:: + + app = Flask('yourapplication') + app = Flask(__name__.split('.')[0]) + + Why is that? The application will work even with `__name__`, thanks + to how resources are looked up. However it will make debugging more + painful. Certain extensions can make assumptions based on the + import name of your application. For example the Flask-SQLAlchemy + extension will look for the code in your application that triggered + an SQL query in debug mode. If the import name is not properly set + up, that debugging information is lost. (For example it would only + pick up SQL queries in `yourapplication.app` and not + `yourapplication.views.frontend`) + + .. versionadded:: 0.7 + The `static_url_path`, `static_folder`, and `template_folder` + parameters were added. + + .. versionadded:: 0.8 + The `instance_path` and `instance_relative_config` parameters were + added. + + .. versionadded:: 0.11 + The `root_path` parameter was added. + + .. versionadded:: 1.0 + The ``host_matching`` and ``static_host`` parameters were added. + + .. versionadded:: 1.0 + The ``subdomain_matching`` parameter was added. Subdomain + matching needs to be enabled manually now. Setting + :data:`SERVER_NAME` does not implicitly enable it. + + :param import_name: the name of the application package + :param static_url_path: can be used to specify a different path for the + static files on the web. Defaults to the name + of the `static_folder` folder. + :param static_folder: The folder with static files that is served at + ``static_url_path``. Relative to the application ``root_path`` + or an absolute path. Defaults to ``'static'``. + :param static_host: the host to use when adding the static route. + Defaults to None. Required when using ``host_matching=True`` + with a ``static_folder`` configured. + :param host_matching: set ``url_map.host_matching`` attribute. + Defaults to False. + :param subdomain_matching: consider the subdomain relative to + :data:`SERVER_NAME` when matching routes. Defaults to False. + :param template_folder: the folder that contains the templates that should + be used by the application. Defaults to + ``'templates'`` folder in the root path of the + application. + :param instance_path: An alternative instance path for the application. + By default the folder ``'instance'`` next to the + package or module is assumed to be the instance + path. + :param instance_relative_config: if set to ``True`` relative filenames + for loading the config are assumed to + be relative to the instance path instead + of the application root. + :param root_path: The path to the root of the application files. + This should only be set manually when it can't be detected + automatically, such as for namespace packages. + """ + + #: The class of the object assigned to :attr:`aborter`, created by + #: :meth:`create_aborter`. That object is called by + #: :func:`flask.abort` to raise HTTP errors, and can be + #: called directly as well. + #: + #: Defaults to :class:`werkzeug.exceptions.Aborter`. + #: + #: .. versionadded:: 2.2 + aborter_class = Aborter + + #: The class that is used for the Jinja environment. + #: + #: .. versionadded:: 0.11 + jinja_environment = Environment + + #: The class that is used for the :data:`~flask.g` instance. + #: + #: Example use cases for a custom class: + #: + #: 1. Store arbitrary attributes on flask.g. + #: 2. Add a property for lazy per-request database connectors. + #: 3. Return None instead of AttributeError on unexpected attributes. + #: 4. Raise exception if an unexpected attr is set, a "controlled" flask.g. + #: + #: In Flask 0.9 this property was called `request_globals_class` but it + #: was changed in 0.10 to :attr:`app_ctx_globals_class` because the + #: flask.g object is now application context scoped. + #: + #: .. versionadded:: 0.10 + app_ctx_globals_class = _AppCtxGlobals + + #: The class that is used for the ``config`` attribute of this app. + #: Defaults to :class:`~flask.Config`. + #: + #: Example use cases for a custom class: + #: + #: 1. Default values for certain config options. + #: 2. Access to config values through attributes in addition to keys. + #: + #: .. versionadded:: 0.11 + config_class = Config + + #: The testing flag. Set this to ``True`` to enable the test mode of + #: Flask extensions (and in the future probably also Flask itself). + #: For example this might activate test helpers that have an + #: additional runtime cost which should not be enabled by default. + #: + #: If this is enabled and PROPAGATE_EXCEPTIONS is not changed from the + #: default it's implicitly enabled. + #: + #: This attribute can also be configured from the config with the + #: ``TESTING`` configuration key. Defaults to ``False``. + testing = ConfigAttribute("TESTING") + + #: If a secret key is set, cryptographic components can use this to + #: sign cookies and other things. Set this to a complex random value + #: when you want to use the secure cookie for instance. + #: + #: This attribute can also be configured from the config with the + #: :data:`SECRET_KEY` configuration key. Defaults to ``None``. + secret_key = ConfigAttribute("SECRET_KEY") + + #: A :class:`~datetime.timedelta` which is used to set the expiration + #: date of a permanent session. The default is 31 days which makes a + #: permanent session survive for roughly one month. + #: + #: This attribute can also be configured from the config with the + #: ``PERMANENT_SESSION_LIFETIME`` configuration key. Defaults to + #: ``timedelta(days=31)`` + permanent_session_lifetime = ConfigAttribute( + "PERMANENT_SESSION_LIFETIME", get_converter=_make_timedelta + ) + + json_provider_class: type[JSONProvider] = DefaultJSONProvider + """A subclass of :class:`~flask.json.provider.JSONProvider`. An + instance is created and assigned to :attr:`app.json` when creating + the app. + + The default, :class:`~flask.json.provider.DefaultJSONProvider`, uses + Python's built-in :mod:`json` library. A different provider can use + a different JSON library. + + .. versionadded:: 2.2 + """ + + #: Options that are passed to the Jinja environment in + #: :meth:`create_jinja_environment`. Changing these options after + #: the environment is created (accessing :attr:`jinja_env`) will + #: have no effect. + #: + #: .. versionchanged:: 1.1.0 + #: This is a ``dict`` instead of an ``ImmutableDict`` to allow + #: easier configuration. + #: + jinja_options: dict = {} + + #: The rule object to use for URL rules created. This is used by + #: :meth:`add_url_rule`. Defaults to :class:`werkzeug.routing.Rule`. + #: + #: .. versionadded:: 0.7 + url_rule_class = Rule + + #: The map object to use for storing the URL rules and routing + #: configuration parameters. Defaults to :class:`werkzeug.routing.Map`. + #: + #: .. versionadded:: 1.1.0 + url_map_class = Map + + #: The :meth:`test_client` method creates an instance of this test + #: client class. Defaults to :class:`~flask.testing.FlaskClient`. + #: + #: .. versionadded:: 0.7 + test_client_class: type[FlaskClient] | None = None + + #: The :class:`~click.testing.CliRunner` subclass, by default + #: :class:`~flask.testing.FlaskCliRunner` that is used by + #: :meth:`test_cli_runner`. Its ``__init__`` method should take a + #: Flask app object as the first argument. + #: + #: .. versionadded:: 1.0 + test_cli_runner_class: type[FlaskCliRunner] | None = None + + default_config: dict + response_class: type[Response] + + def __init__( + self, + import_name: str, + static_url_path: str | None = None, + static_folder: str | os.PathLike | None = "static", + static_host: str | None = None, + host_matching: bool = False, + subdomain_matching: bool = False, + template_folder: str | os.PathLike | None = "templates", + instance_path: str | None = None, + instance_relative_config: bool = False, + root_path: str | None = None, + ): + super().__init__( + import_name=import_name, + static_folder=static_folder, + static_url_path=static_url_path, + template_folder=template_folder, + root_path=root_path, + ) + + if instance_path is None: + instance_path = self.auto_find_instance_path() + elif not os.path.isabs(instance_path): + raise ValueError( + "If an instance path is provided it must be absolute." + " A relative path was given instead." + ) + + #: Holds the path to the instance folder. + #: + #: .. versionadded:: 0.8 + self.instance_path = instance_path + + #: The configuration dictionary as :class:`Config`. This behaves + #: exactly like a regular dictionary but supports additional methods + #: to load a config from files. + self.config = self.make_config(instance_relative_config) + + #: An instance of :attr:`aborter_class` created by + #: :meth:`make_aborter`. This is called by :func:`flask.abort` + #: to raise HTTP errors, and can be called directly as well. + #: + #: .. versionadded:: 2.2 + #: Moved from ``flask.abort``, which calls this object. + self.aborter = self.make_aborter() + + self.json: JSONProvider = self.json_provider_class(self) + """Provides access to JSON methods. Functions in ``flask.json`` + will call methods on this provider when the application context + is active. Used for handling JSON requests and responses. + + An instance of :attr:`json_provider_class`. Can be customized by + changing that attribute on a subclass, or by assigning to this + attribute afterwards. + + The default, :class:`~flask.json.provider.DefaultJSONProvider`, + uses Python's built-in :mod:`json` library. A different provider + can use a different JSON library. + + .. versionadded:: 2.2 + """ + + #: A list of functions that are called by + #: :meth:`handle_url_build_error` when :meth:`.url_for` raises a + #: :exc:`~werkzeug.routing.BuildError`. Each function is called + #: with ``error``, ``endpoint`` and ``values``. If a function + #: returns ``None`` or raises a ``BuildError``, it is skipped. + #: Otherwise, its return value is returned by ``url_for``. + #: + #: .. versionadded:: 0.9 + self.url_build_error_handlers: list[ + t.Callable[[Exception, str, dict[str, t.Any]], str] + ] = [] + + #: A list of functions that are called when the application context + #: is destroyed. Since the application context is also torn down + #: if the request ends this is the place to store code that disconnects + #: from databases. + #: + #: .. versionadded:: 0.9 + self.teardown_appcontext_funcs: list[ft.TeardownCallable] = [] + + #: A list of shell context processor functions that should be run + #: when a shell context is created. + #: + #: .. versionadded:: 0.11 + self.shell_context_processors: list[ft.ShellContextProcessorCallable] = [] + + #: Maps registered blueprint names to blueprint objects. The + #: dict retains the order the blueprints were registered in. + #: Blueprints can be registered multiple times, this dict does + #: not track how often they were attached. + #: + #: .. versionadded:: 0.7 + self.blueprints: dict[str, Blueprint] = {} + + #: a place where extensions can store application specific state. For + #: example this is where an extension could store database engines and + #: similar things. + #: + #: The key must match the name of the extension module. For example in + #: case of a "Flask-Foo" extension in `flask_foo`, the key would be + #: ``'foo'``. + #: + #: .. versionadded:: 0.7 + self.extensions: dict = {} + + #: The :class:`~werkzeug.routing.Map` for this instance. You can use + #: this to change the routing converters after the class was created + #: but before any routes are connected. Example:: + #: + #: from werkzeug.routing import BaseConverter + #: + #: class ListConverter(BaseConverter): + #: def to_python(self, value): + #: return value.split(',') + #: def to_url(self, values): + #: return ','.join(super(ListConverter, self).to_url(value) + #: for value in values) + #: + #: app = Flask(__name__) + #: app.url_map.converters['list'] = ListConverter + self.url_map = self.url_map_class(host_matching=host_matching) + + self.subdomain_matching = subdomain_matching + + # tracks internally if the application already handled at least one + # request. + self._got_first_request = False + + # Set the name of the Click group in case someone wants to add + # the app's commands to another CLI tool. + self.cli.name = self.name + + def _check_setup_finished(self, f_name: str) -> None: + if self._got_first_request: + raise AssertionError( + f"The setup method '{f_name}' can no longer be called" + " on the application. It has already handled its first" + " request, any changes will not be applied" + " consistently.\n" + "Make sure all imports, decorators, functions, etc." + " needed to set up the application are done before" + " running it." + ) + + @cached_property + def name(self) -> str: # type: ignore + """The name of the application. This is usually the import name + with the difference that it's guessed from the run file if the + import name is main. This name is used as a display name when + Flask needs the name of the application. It can be set and overridden + to change the value. + + .. versionadded:: 0.8 + """ + if self.import_name == "__main__": + fn = getattr(sys.modules["__main__"], "__file__", None) + if fn is None: + return "__main__" + return os.path.splitext(os.path.basename(fn))[0] + return self.import_name + + @cached_property + def logger(self) -> logging.Logger: + """A standard Python :class:`~logging.Logger` for the app, with + the same name as :attr:`name`. + + In debug mode, the logger's :attr:`~logging.Logger.level` will + be set to :data:`~logging.DEBUG`. + + If there are no handlers configured, a default handler will be + added. See :doc:`/logging` for more information. + + .. versionchanged:: 1.1.0 + The logger takes the same name as :attr:`name` rather than + hard-coding ``"flask.app"``. + + .. versionchanged:: 1.0.0 + Behavior was simplified. The logger is always named + ``"flask.app"``. The level is only set during configuration, + it doesn't check ``app.debug`` each time. Only one format is + used, not different ones depending on ``app.debug``. No + handlers are removed, and a handler is only added if no + handlers are already configured. + + .. versionadded:: 0.3 + """ + return create_logger(self) + + @cached_property + def jinja_env(self) -> Environment: + """The Jinja environment used to load templates. + + The environment is created the first time this property is + accessed. Changing :attr:`jinja_options` after that will have no + effect. + """ + return self.create_jinja_environment() + + def create_jinja_environment(self) -> Environment: + raise NotImplementedError() + + def make_config(self, instance_relative: bool = False) -> Config: + """Used to create the config attribute by the Flask constructor. + The `instance_relative` parameter is passed in from the constructor + of Flask (there named `instance_relative_config`) and indicates if + the config should be relative to the instance path or the root path + of the application. + + .. versionadded:: 0.8 + """ + root_path = self.root_path + if instance_relative: + root_path = self.instance_path + defaults = dict(self.default_config) + defaults["DEBUG"] = get_debug_flag() + return self.config_class(root_path, defaults) + + def make_aborter(self) -> Aborter: + """Create the object to assign to :attr:`aborter`. That object + is called by :func:`flask.abort` to raise HTTP errors, and can + be called directly as well. + + By default, this creates an instance of :attr:`aborter_class`, + which defaults to :class:`werkzeug.exceptions.Aborter`. + + .. versionadded:: 2.2 + """ + return self.aborter_class() + + def auto_find_instance_path(self) -> str: + """Tries to locate the instance path if it was not provided to the + constructor of the application class. It will basically calculate + the path to a folder named ``instance`` next to your main file or + the package. + + .. versionadded:: 0.8 + """ + prefix, package_path = find_package(self.import_name) + if prefix is None: + return os.path.join(package_path, "instance") + return os.path.join(prefix, "var", f"{self.name}-instance") + + def create_global_jinja_loader(self) -> DispatchingJinjaLoader: + """Creates the loader for the Jinja2 environment. Can be used to + override just the loader and keeping the rest unchanged. It's + discouraged to override this function. Instead one should override + the :meth:`jinja_loader` function instead. + + The global loader dispatches between the loaders of the application + and the individual blueprints. + + .. versionadded:: 0.7 + """ + return DispatchingJinjaLoader(self) + + def select_jinja_autoescape(self, filename: str) -> bool: + """Returns ``True`` if autoescaping should be active for the given + template name. If no template name is given, returns `True`. + + .. versionchanged:: 2.2 + Autoescaping is now enabled by default for ``.svg`` files. + + .. versionadded:: 0.5 + """ + if filename is None: + return True + return filename.endswith((".html", ".htm", ".xml", ".xhtml", ".svg")) + + @property + def debug(self) -> bool: + """Whether debug mode is enabled. When using ``flask run`` to start the + development server, an interactive debugger will be shown for unhandled + exceptions, and the server will be reloaded when code changes. This maps to the + :data:`DEBUG` config key. It may not behave as expected if set late. + + **Do not enable debug mode when deploying in production.** + + Default: ``False`` + """ + return self.config["DEBUG"] + + @debug.setter + def debug(self, value: bool) -> None: + self.config["DEBUG"] = value + + if self.config["TEMPLATES_AUTO_RELOAD"] is None: + self.jinja_env.auto_reload = value + + @setupmethod + def register_blueprint(self, blueprint: Blueprint, **options: t.Any) -> None: + """Register a :class:`~flask.Blueprint` on the application. Keyword + arguments passed to this method will override the defaults set on the + blueprint. + + Calls the blueprint's :meth:`~flask.Blueprint.register` method after + recording the blueprint in the application's :attr:`blueprints`. + + :param blueprint: The blueprint to register. + :param url_prefix: Blueprint routes will be prefixed with this. + :param subdomain: Blueprint routes will match on this subdomain. + :param url_defaults: Blueprint routes will use these default values for + view arguments. + :param options: Additional keyword arguments are passed to + :class:`~flask.blueprints.BlueprintSetupState`. They can be + accessed in :meth:`~flask.Blueprint.record` callbacks. + + .. versionchanged:: 2.0.1 + The ``name`` option can be used to change the (pre-dotted) + name the blueprint is registered with. This allows the same + blueprint to be registered multiple times with unique names + for ``url_for``. + + .. versionadded:: 0.7 + """ + blueprint.register(self, options) + + def iter_blueprints(self) -> t.ValuesView[Blueprint]: + """Iterates over all blueprints by the order they were registered. + + .. versionadded:: 0.11 + """ + return self.blueprints.values() + + @setupmethod + def add_url_rule( + self, + rule: str, + endpoint: str | None = None, + view_func: ft.RouteCallable | None = None, + provide_automatic_options: bool | None = None, + **options: t.Any, + ) -> None: + if endpoint is None: + endpoint = _endpoint_from_view_func(view_func) # type: ignore + options["endpoint"] = endpoint + methods = options.pop("methods", None) + + # if the methods are not given and the view_func object knows its + # methods we can use that instead. If neither exists, we go with + # a tuple of only ``GET`` as default. + if methods is None: + methods = getattr(view_func, "methods", None) or ("GET",) + if isinstance(methods, str): + raise TypeError( + "Allowed methods must be a list of strings, for" + ' example: @app.route(..., methods=["POST"])' + ) + methods = {item.upper() for item in methods} + + # Methods that should always be added + required_methods = set(getattr(view_func, "required_methods", ())) + + # starting with Flask 0.8 the view_func object can disable and + # force-enable the automatic options handling. + if provide_automatic_options is None: + provide_automatic_options = getattr( + view_func, "provide_automatic_options", None + ) + + if provide_automatic_options is None: + if "OPTIONS" not in methods: + provide_automatic_options = True + required_methods.add("OPTIONS") + else: + provide_automatic_options = False + + # Add the required methods now. + methods |= required_methods + + rule = self.url_rule_class(rule, methods=methods, **options) + rule.provide_automatic_options = provide_automatic_options # type: ignore + + self.url_map.add(rule) + if view_func is not None: + old_func = self.view_functions.get(endpoint) + if old_func is not None and old_func != view_func: + raise AssertionError( + "View function mapping is overwriting an existing" + f" endpoint function: {endpoint}" + ) + self.view_functions[endpoint] = view_func + + @setupmethod + def template_filter( + self, name: str | None = None + ) -> t.Callable[[T_template_filter], T_template_filter]: + """A decorator that is used to register custom template filter. + You can specify a name for the filter, otherwise the function + name will be used. Example:: + + @app.template_filter() + def reverse(s): + return s[::-1] + + :param name: the optional name of the filter, otherwise the + function name will be used. + """ + + def decorator(f: T_template_filter) -> T_template_filter: + self.add_template_filter(f, name=name) + return f + + return decorator + + @setupmethod + def add_template_filter( + self, f: ft.TemplateFilterCallable, name: str | None = None + ) -> None: + """Register a custom template filter. Works exactly like the + :meth:`template_filter` decorator. + + :param name: the optional name of the filter, otherwise the + function name will be used. + """ + self.jinja_env.filters[name or f.__name__] = f + + @setupmethod + def template_test( + self, name: str | None = None + ) -> t.Callable[[T_template_test], T_template_test]: + """A decorator that is used to register custom template test. + You can specify a name for the test, otherwise the function + name will be used. Example:: + + @app.template_test() + def is_prime(n): + if n == 2: + return True + for i in range(2, int(math.ceil(math.sqrt(n))) + 1): + if n % i == 0: + return False + return True + + .. versionadded:: 0.10 + + :param name: the optional name of the test, otherwise the + function name will be used. + """ + + def decorator(f: T_template_test) -> T_template_test: + self.add_template_test(f, name=name) + return f + + return decorator + + @setupmethod + def add_template_test( + self, f: ft.TemplateTestCallable, name: str | None = None + ) -> None: + """Register a custom template test. Works exactly like the + :meth:`template_test` decorator. + + .. versionadded:: 0.10 + + :param name: the optional name of the test, otherwise the + function name will be used. + """ + self.jinja_env.tests[name or f.__name__] = f + + @setupmethod + def template_global( + self, name: str | None = None + ) -> t.Callable[[T_template_global], T_template_global]: + """A decorator that is used to register a custom template global function. + You can specify a name for the global function, otherwise the function + name will be used. Example:: + + @app.template_global() + def double(n): + return 2 * n + + .. versionadded:: 0.10 + + :param name: the optional name of the global function, otherwise the + function name will be used. + """ + + def decorator(f: T_template_global) -> T_template_global: + self.add_template_global(f, name=name) + return f + + return decorator + + @setupmethod + def add_template_global( + self, f: ft.TemplateGlobalCallable, name: str | None = None + ) -> None: + """Register a custom template global function. Works exactly like the + :meth:`template_global` decorator. + + .. versionadded:: 0.10 + + :param name: the optional name of the global function, otherwise the + function name will be used. + """ + self.jinja_env.globals[name or f.__name__] = f + + @setupmethod + def teardown_appcontext(self, f: T_teardown) -> T_teardown: + """Registers a function to be called when the application + context is popped. The application context is typically popped + after the request context for each request, at the end of CLI + commands, or after a manually pushed context ends. + + .. code-block:: python + + with app.app_context(): + ... + + When the ``with`` block exits (or ``ctx.pop()`` is called), the + teardown functions are called just before the app context is + made inactive. Since a request context typically also manages an + application context it would also be called when you pop a + request context. + + When a teardown function was called because of an unhandled + exception it will be passed an error object. If an + :meth:`errorhandler` is registered, it will handle the exception + and the teardown will not receive it. + + Teardown functions must avoid raising exceptions. If they + execute code that might fail they must surround that code with a + ``try``/``except`` block and log any errors. + + The return values of teardown functions are ignored. + + .. versionadded:: 0.9 + """ + self.teardown_appcontext_funcs.append(f) + return f + + @setupmethod + def shell_context_processor( + self, f: T_shell_context_processor + ) -> T_shell_context_processor: + """Registers a shell context processor function. + + .. versionadded:: 0.11 + """ + self.shell_context_processors.append(f) + return f + + def _find_error_handler( + self, e: Exception, blueprints: list[str] + ) -> ft.ErrorHandlerCallable | None: + """Return a registered error handler for an exception in this order: + blueprint handler for a specific code, app handler for a specific code, + blueprint handler for an exception class, app handler for an exception + class, or ``None`` if a suitable handler is not found. + """ + exc_class, code = self._get_exc_class_and_code(type(e)) + names = (*blueprints, None) + + for c in (code, None) if code is not None else (None,): + for name in names: + handler_map = self.error_handler_spec[name][c] + + if not handler_map: + continue + + for cls in exc_class.__mro__: + handler = handler_map.get(cls) + + if handler is not None: + return handler + return None + + def trap_http_exception(self, e: Exception) -> bool: + """Checks if an HTTP exception should be trapped or not. By default + this will return ``False`` for all exceptions except for a bad request + key error if ``TRAP_BAD_REQUEST_ERRORS`` is set to ``True``. It + also returns ``True`` if ``TRAP_HTTP_EXCEPTIONS`` is set to ``True``. + + This is called for all HTTP exceptions raised by a view function. + If it returns ``True`` for any exception the error handler for this + exception is not called and it shows up as regular exception in the + traceback. This is helpful for debugging implicitly raised HTTP + exceptions. + + .. versionchanged:: 1.0 + Bad request errors are not trapped by default in debug mode. + + .. versionadded:: 0.8 + """ + if self.config["TRAP_HTTP_EXCEPTIONS"]: + return True + + trap_bad_request = self.config["TRAP_BAD_REQUEST_ERRORS"] + + # if unset, trap key errors in debug mode + if ( + trap_bad_request is None + and self.debug + and isinstance(e, BadRequestKeyError) + ): + return True + + if trap_bad_request: + return isinstance(e, BadRequest) + + return False + + def should_ignore_error(self, error: BaseException | None) -> bool: + """This is called to figure out if an error should be ignored + or not as far as the teardown system is concerned. If this + function returns ``True`` then the teardown handlers will not be + passed the error. + + .. versionadded:: 0.10 + """ + return False + + def redirect(self, location: str, code: int = 302) -> BaseResponse: + """Create a redirect response object. + + This is called by :func:`flask.redirect`, and can be called + directly as well. + + :param location: The URL to redirect to. + :param code: The status code for the redirect. + + .. versionadded:: 2.2 + Moved from ``flask.redirect``, which calls this method. + """ + return _wz_redirect( + location, code=code, Response=self.response_class # type: ignore[arg-type] + ) + + def inject_url_defaults(self, endpoint: str, values: dict) -> None: + """Injects the URL defaults for the given endpoint directly into + the values dictionary passed. This is used internally and + automatically called on URL building. + + .. versionadded:: 0.7 + """ + names: t.Iterable[str | None] = (None,) + + # url_for may be called outside a request context, parse the + # passed endpoint instead of using request.blueprints. + if "." in endpoint: + names = chain( + names, reversed(_split_blueprint_path(endpoint.rpartition(".")[0])) + ) + + for name in names: + if name in self.url_default_functions: + for func in self.url_default_functions[name]: + func(endpoint, values) + + def handle_url_build_error( + self, error: BuildError, endpoint: str, values: dict[str, t.Any] + ) -> str: + """Called by :meth:`.url_for` if a + :exc:`~werkzeug.routing.BuildError` was raised. If this returns + a value, it will be returned by ``url_for``, otherwise the error + will be re-raised. + + Each function in :attr:`url_build_error_handlers` is called with + ``error``, ``endpoint`` and ``values``. If a function returns + ``None`` or raises a ``BuildError``, it is skipped. Otherwise, + its return value is returned by ``url_for``. + + :param error: The active ``BuildError`` being handled. + :param endpoint: The endpoint being built. + :param values: The keyword arguments passed to ``url_for``. + """ + for handler in self.url_build_error_handlers: + try: + rv = handler(error, endpoint, values) + except BuildError as e: + # make error available outside except block + error = e + else: + if rv is not None: + return rv + + # Re-raise if called with an active exception, otherwise raise + # the passed in exception. + if error is sys.exc_info()[1]: + raise + + raise error diff --git a/app/src/flask-server/venv/Lib/site-packages/flask/sansio/blueprints.py b/app/src/flask-server/venv/Lib/site-packages/flask/sansio/blueprints.py new file mode 100644 index 0000000..38c92f4 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/flask/sansio/blueprints.py @@ -0,0 +1,626 @@ +from __future__ import annotations + +import os +import typing as t +from collections import defaultdict +from functools import update_wrapper + +from .. import typing as ft +from .scaffold import _endpoint_from_view_func +from .scaffold import _sentinel +from .scaffold import Scaffold +from .scaffold import setupmethod + +if t.TYPE_CHECKING: # pragma: no cover + from .app import App + +DeferredSetupFunction = t.Callable[["BlueprintSetupState"], t.Callable] +T_after_request = t.TypeVar("T_after_request", bound=ft.AfterRequestCallable) +T_before_request = t.TypeVar("T_before_request", bound=ft.BeforeRequestCallable) +T_error_handler = t.TypeVar("T_error_handler", bound=ft.ErrorHandlerCallable) +T_teardown = t.TypeVar("T_teardown", bound=ft.TeardownCallable) +T_template_context_processor = t.TypeVar( + "T_template_context_processor", bound=ft.TemplateContextProcessorCallable +) +T_template_filter = t.TypeVar("T_template_filter", bound=ft.TemplateFilterCallable) +T_template_global = t.TypeVar("T_template_global", bound=ft.TemplateGlobalCallable) +T_template_test = t.TypeVar("T_template_test", bound=ft.TemplateTestCallable) +T_url_defaults = t.TypeVar("T_url_defaults", bound=ft.URLDefaultCallable) +T_url_value_preprocessor = t.TypeVar( + "T_url_value_preprocessor", bound=ft.URLValuePreprocessorCallable +) + + +class BlueprintSetupState: + """Temporary holder object for registering a blueprint with the + application. An instance of this class is created by the + :meth:`~flask.Blueprint.make_setup_state` method and later passed + to all register callback functions. + """ + + def __init__( + self, + blueprint: Blueprint, + app: App, + options: t.Any, + first_registration: bool, + ) -> None: + #: a reference to the current application + self.app = app + + #: a reference to the blueprint that created this setup state. + self.blueprint = blueprint + + #: a dictionary with all options that were passed to the + #: :meth:`~flask.Flask.register_blueprint` method. + self.options = options + + #: as blueprints can be registered multiple times with the + #: application and not everything wants to be registered + #: multiple times on it, this attribute can be used to figure + #: out if the blueprint was registered in the past already. + self.first_registration = first_registration + + subdomain = self.options.get("subdomain") + if subdomain is None: + subdomain = self.blueprint.subdomain + + #: The subdomain that the blueprint should be active for, ``None`` + #: otherwise. + self.subdomain = subdomain + + url_prefix = self.options.get("url_prefix") + if url_prefix is None: + url_prefix = self.blueprint.url_prefix + #: The prefix that should be used for all URLs defined on the + #: blueprint. + self.url_prefix = url_prefix + + self.name = self.options.get("name", blueprint.name) + self.name_prefix = self.options.get("name_prefix", "") + + #: A dictionary with URL defaults that is added to each and every + #: URL that was defined with the blueprint. + self.url_defaults = dict(self.blueprint.url_values_defaults) + self.url_defaults.update(self.options.get("url_defaults", ())) + + def add_url_rule( + self, + rule: str, + endpoint: str | None = None, + view_func: t.Callable | None = None, + **options: t.Any, + ) -> None: + """A helper method to register a rule (and optionally a view function) + to the application. The endpoint is automatically prefixed with the + blueprint's name. + """ + if self.url_prefix is not None: + if rule: + rule = "/".join((self.url_prefix.rstrip("/"), rule.lstrip("/"))) + else: + rule = self.url_prefix + options.setdefault("subdomain", self.subdomain) + if endpoint is None: + endpoint = _endpoint_from_view_func(view_func) # type: ignore + defaults = self.url_defaults + if "defaults" in options: + defaults = dict(defaults, **options.pop("defaults")) + + self.app.add_url_rule( + rule, + f"{self.name_prefix}.{self.name}.{endpoint}".lstrip("."), + view_func, + defaults=defaults, + **options, + ) + + +class Blueprint(Scaffold): + """Represents a blueprint, a collection of routes and other + app-related functions that can be registered on a real application + later. + + A blueprint is an object that allows defining application functions + without requiring an application object ahead of time. It uses the + same decorators as :class:`~flask.Flask`, but defers the need for an + application by recording them for later registration. + + Decorating a function with a blueprint creates a deferred function + that is called with :class:`~flask.blueprints.BlueprintSetupState` + when the blueprint is registered on an application. + + See :doc:`/blueprints` for more information. + + :param name: The name of the blueprint. Will be prepended to each + endpoint name. + :param import_name: The name of the blueprint package, usually + ``__name__``. This helps locate the ``root_path`` for the + blueprint. + :param static_folder: A folder with static files that should be + served by the blueprint's static route. The path is relative to + the blueprint's root path. Blueprint static files are disabled + by default. + :param static_url_path: The url to serve static files from. + Defaults to ``static_folder``. If the blueprint does not have + a ``url_prefix``, the app's static route will take precedence, + and the blueprint's static files won't be accessible. + :param template_folder: A folder with templates that should be added + to the app's template search path. The path is relative to the + blueprint's root path. Blueprint templates are disabled by + default. Blueprint templates have a lower precedence than those + in the app's templates folder. + :param url_prefix: A path to prepend to all of the blueprint's URLs, + to make them distinct from the rest of the app's routes. + :param subdomain: A subdomain that blueprint routes will match on by + default. + :param url_defaults: A dict of default values that blueprint routes + will receive by default. + :param root_path: By default, the blueprint will automatically set + this based on ``import_name``. In certain situations this + automatic detection can fail, so the path can be specified + manually instead. + + .. versionchanged:: 1.1.0 + Blueprints have a ``cli`` group to register nested CLI commands. + The ``cli_group`` parameter controls the name of the group under + the ``flask`` command. + + .. versionadded:: 0.7 + """ + + _got_registered_once = False + + def __init__( + self, + name: str, + import_name: str, + static_folder: str | os.PathLike | None = None, + static_url_path: str | None = None, + template_folder: str | os.PathLike | None = None, + url_prefix: str | None = None, + subdomain: str | None = None, + url_defaults: dict | None = None, + root_path: str | None = None, + cli_group: str | None = _sentinel, # type: ignore + ): + super().__init__( + import_name=import_name, + static_folder=static_folder, + static_url_path=static_url_path, + template_folder=template_folder, + root_path=root_path, + ) + + if not name: + raise ValueError("'name' may not be empty.") + + if "." in name: + raise ValueError("'name' may not contain a dot '.' character.") + + self.name = name + self.url_prefix = url_prefix + self.subdomain = subdomain + self.deferred_functions: list[DeferredSetupFunction] = [] + + if url_defaults is None: + url_defaults = {} + + self.url_values_defaults = url_defaults + self.cli_group = cli_group + self._blueprints: list[tuple[Blueprint, dict]] = [] + + def _check_setup_finished(self, f_name: str) -> None: + if self._got_registered_once: + raise AssertionError( + f"The setup method '{f_name}' can no longer be called on the blueprint" + f" '{self.name}'. It has already been registered at least once, any" + " changes will not be applied consistently.\n" + "Make sure all imports, decorators, functions, etc. needed to set up" + " the blueprint are done before registering it." + ) + + @setupmethod + def record(self, func: t.Callable) -> None: + """Registers a function that is called when the blueprint is + registered on the application. This function is called with the + state as argument as returned by the :meth:`make_setup_state` + method. + """ + self.deferred_functions.append(func) + + @setupmethod + def record_once(self, func: t.Callable) -> None: + """Works like :meth:`record` but wraps the function in another + function that will ensure the function is only called once. If the + blueprint is registered a second time on the application, the + function passed is not called. + """ + + def wrapper(state: BlueprintSetupState) -> None: + if state.first_registration: + func(state) + + self.record(update_wrapper(wrapper, func)) + + def make_setup_state( + self, app: App, options: dict, first_registration: bool = False + ) -> BlueprintSetupState: + """Creates an instance of :meth:`~flask.blueprints.BlueprintSetupState` + object that is later passed to the register callback functions. + Subclasses can override this to return a subclass of the setup state. + """ + return BlueprintSetupState(self, app, options, first_registration) + + @setupmethod + def register_blueprint(self, blueprint: Blueprint, **options: t.Any) -> None: + """Register a :class:`~flask.Blueprint` on this blueprint. Keyword + arguments passed to this method will override the defaults set + on the blueprint. + + .. versionchanged:: 2.0.1 + The ``name`` option can be used to change the (pre-dotted) + name the blueprint is registered with. This allows the same + blueprint to be registered multiple times with unique names + for ``url_for``. + + .. versionadded:: 2.0 + """ + if blueprint is self: + raise ValueError("Cannot register a blueprint on itself") + self._blueprints.append((blueprint, options)) + + def register(self, app: App, options: dict) -> None: + """Called by :meth:`Flask.register_blueprint` to register all + views and callbacks registered on the blueprint with the + application. Creates a :class:`.BlueprintSetupState` and calls + each :meth:`record` callback with it. + + :param app: The application this blueprint is being registered + with. + :param options: Keyword arguments forwarded from + :meth:`~Flask.register_blueprint`. + + .. versionchanged:: 2.3 + Nested blueprints now correctly apply subdomains. + + .. versionchanged:: 2.1 + Registering the same blueprint with the same name multiple + times is an error. + + .. versionchanged:: 2.0.1 + Nested blueprints are registered with their dotted name. + This allows different blueprints with the same name to be + nested at different locations. + + .. versionchanged:: 2.0.1 + The ``name`` option can be used to change the (pre-dotted) + name the blueprint is registered with. This allows the same + blueprint to be registered multiple times with unique names + for ``url_for``. + """ + name_prefix = options.get("name_prefix", "") + self_name = options.get("name", self.name) + name = f"{name_prefix}.{self_name}".lstrip(".") + + if name in app.blueprints: + bp_desc = "this" if app.blueprints[name] is self else "a different" + existing_at = f" '{name}'" if self_name != name else "" + + raise ValueError( + f"The name '{self_name}' is already registered for" + f" {bp_desc} blueprint{existing_at}. Use 'name=' to" + f" provide a unique name." + ) + + first_bp_registration = not any(bp is self for bp in app.blueprints.values()) + first_name_registration = name not in app.blueprints + + app.blueprints[name] = self + self._got_registered_once = True + state = self.make_setup_state(app, options, first_bp_registration) + + if self.has_static_folder: + state.add_url_rule( + f"{self.static_url_path}/", + view_func=self.send_static_file, # type: ignore[attr-defined] + endpoint="static", + ) + + # Merge blueprint data into parent. + if first_bp_registration or first_name_registration: + self._merge_blueprint_funcs(app, name) + + for deferred in self.deferred_functions: + deferred(state) + + cli_resolved_group = options.get("cli_group", self.cli_group) + + if self.cli.commands: + if cli_resolved_group is None: + app.cli.commands.update(self.cli.commands) + elif cli_resolved_group is _sentinel: + self.cli.name = name + app.cli.add_command(self.cli) + else: + self.cli.name = cli_resolved_group + app.cli.add_command(self.cli) + + for blueprint, bp_options in self._blueprints: + bp_options = bp_options.copy() + bp_url_prefix = bp_options.get("url_prefix") + bp_subdomain = bp_options.get("subdomain") + + if bp_subdomain is None: + bp_subdomain = blueprint.subdomain + + if state.subdomain is not None and bp_subdomain is not None: + bp_options["subdomain"] = bp_subdomain + "." + state.subdomain + elif bp_subdomain is not None: + bp_options["subdomain"] = bp_subdomain + elif state.subdomain is not None: + bp_options["subdomain"] = state.subdomain + + if bp_url_prefix is None: + bp_url_prefix = blueprint.url_prefix + + if state.url_prefix is not None and bp_url_prefix is not None: + bp_options["url_prefix"] = ( + state.url_prefix.rstrip("/") + "/" + bp_url_prefix.lstrip("/") + ) + elif bp_url_prefix is not None: + bp_options["url_prefix"] = bp_url_prefix + elif state.url_prefix is not None: + bp_options["url_prefix"] = state.url_prefix + + bp_options["name_prefix"] = name + blueprint.register(app, bp_options) + + def _merge_blueprint_funcs(self, app: App, name: str) -> None: + def extend(bp_dict, parent_dict): + for key, values in bp_dict.items(): + key = name if key is None else f"{name}.{key}" + parent_dict[key].extend(values) + + for key, value in self.error_handler_spec.items(): + key = name if key is None else f"{name}.{key}" + value = defaultdict( + dict, + { + code: {exc_class: func for exc_class, func in code_values.items()} + for code, code_values in value.items() + }, + ) + app.error_handler_spec[key] = value + + for endpoint, func in self.view_functions.items(): + app.view_functions[endpoint] = func + + extend(self.before_request_funcs, app.before_request_funcs) + extend(self.after_request_funcs, app.after_request_funcs) + extend( + self.teardown_request_funcs, + app.teardown_request_funcs, + ) + extend(self.url_default_functions, app.url_default_functions) + extend(self.url_value_preprocessors, app.url_value_preprocessors) + extend(self.template_context_processors, app.template_context_processors) + + @setupmethod + def add_url_rule( + self, + rule: str, + endpoint: str | None = None, + view_func: ft.RouteCallable | None = None, + provide_automatic_options: bool | None = None, + **options: t.Any, + ) -> None: + """Register a URL rule with the blueprint. See :meth:`.Flask.add_url_rule` for + full documentation. + + The URL rule is prefixed with the blueprint's URL prefix. The endpoint name, + used with :func:`url_for`, is prefixed with the blueprint's name. + """ + if endpoint and "." in endpoint: + raise ValueError("'endpoint' may not contain a dot '.' character.") + + if view_func and hasattr(view_func, "__name__") and "." in view_func.__name__: + raise ValueError("'view_func' name may not contain a dot '.' character.") + + self.record( + lambda s: s.add_url_rule( + rule, + endpoint, + view_func, + provide_automatic_options=provide_automatic_options, + **options, + ) + ) + + @setupmethod + def app_template_filter( + self, name: str | None = None + ) -> t.Callable[[T_template_filter], T_template_filter]: + """Register a template filter, available in any template rendered by the + application. Equivalent to :meth:`.Flask.template_filter`. + + :param name: the optional name of the filter, otherwise the + function name will be used. + """ + + def decorator(f: T_template_filter) -> T_template_filter: + self.add_app_template_filter(f, name=name) + return f + + return decorator + + @setupmethod + def add_app_template_filter( + self, f: ft.TemplateFilterCallable, name: str | None = None + ) -> None: + """Register a template filter, available in any template rendered by the + application. Works like the :meth:`app_template_filter` decorator. Equivalent to + :meth:`.Flask.add_template_filter`. + + :param name: the optional name of the filter, otherwise the + function name will be used. + """ + + def register_template(state: BlueprintSetupState) -> None: + state.app.jinja_env.filters[name or f.__name__] = f + + self.record_once(register_template) + + @setupmethod + def app_template_test( + self, name: str | None = None + ) -> t.Callable[[T_template_test], T_template_test]: + """Register a template test, available in any template rendered by the + application. Equivalent to :meth:`.Flask.template_test`. + + .. versionadded:: 0.10 + + :param name: the optional name of the test, otherwise the + function name will be used. + """ + + def decorator(f: T_template_test) -> T_template_test: + self.add_app_template_test(f, name=name) + return f + + return decorator + + @setupmethod + def add_app_template_test( + self, f: ft.TemplateTestCallable, name: str | None = None + ) -> None: + """Register a template test, available in any template rendered by the + application. Works like the :meth:`app_template_test` decorator. Equivalent to + :meth:`.Flask.add_template_test`. + + .. versionadded:: 0.10 + + :param name: the optional name of the test, otherwise the + function name will be used. + """ + + def register_template(state: BlueprintSetupState) -> None: + state.app.jinja_env.tests[name or f.__name__] = f + + self.record_once(register_template) + + @setupmethod + def app_template_global( + self, name: str | None = None + ) -> t.Callable[[T_template_global], T_template_global]: + """Register a template global, available in any template rendered by the + application. Equivalent to :meth:`.Flask.template_global`. + + .. versionadded:: 0.10 + + :param name: the optional name of the global, otherwise the + function name will be used. + """ + + def decorator(f: T_template_global) -> T_template_global: + self.add_app_template_global(f, name=name) + return f + + return decorator + + @setupmethod + def add_app_template_global( + self, f: ft.TemplateGlobalCallable, name: str | None = None + ) -> None: + """Register a template global, available in any template rendered by the + application. Works like the :meth:`app_template_global` decorator. Equivalent to + :meth:`.Flask.add_template_global`. + + .. versionadded:: 0.10 + + :param name: the optional name of the global, otherwise the + function name will be used. + """ + + def register_template(state: BlueprintSetupState) -> None: + state.app.jinja_env.globals[name or f.__name__] = f + + self.record_once(register_template) + + @setupmethod + def before_app_request(self, f: T_before_request) -> T_before_request: + """Like :meth:`before_request`, but before every request, not only those handled + by the blueprint. Equivalent to :meth:`.Flask.before_request`. + """ + self.record_once( + lambda s: s.app.before_request_funcs.setdefault(None, []).append(f) + ) + return f + + @setupmethod + def after_app_request(self, f: T_after_request) -> T_after_request: + """Like :meth:`after_request`, but after every request, not only those handled + by the blueprint. Equivalent to :meth:`.Flask.after_request`. + """ + self.record_once( + lambda s: s.app.after_request_funcs.setdefault(None, []).append(f) + ) + return f + + @setupmethod + def teardown_app_request(self, f: T_teardown) -> T_teardown: + """Like :meth:`teardown_request`, but after every request, not only those + handled by the blueprint. Equivalent to :meth:`.Flask.teardown_request`. + """ + self.record_once( + lambda s: s.app.teardown_request_funcs.setdefault(None, []).append(f) + ) + return f + + @setupmethod + def app_context_processor( + self, f: T_template_context_processor + ) -> T_template_context_processor: + """Like :meth:`context_processor`, but for templates rendered by every view, not + only by the blueprint. Equivalent to :meth:`.Flask.context_processor`. + """ + self.record_once( + lambda s: s.app.template_context_processors.setdefault(None, []).append(f) + ) + return f + + @setupmethod + def app_errorhandler( + self, code: type[Exception] | int + ) -> t.Callable[[T_error_handler], T_error_handler]: + """Like :meth:`errorhandler`, but for every request, not only those handled by + the blueprint. Equivalent to :meth:`.Flask.errorhandler`. + """ + + def decorator(f: T_error_handler) -> T_error_handler: + self.record_once(lambda s: s.app.errorhandler(code)(f)) + return f + + return decorator + + @setupmethod + def app_url_value_preprocessor( + self, f: T_url_value_preprocessor + ) -> T_url_value_preprocessor: + """Like :meth:`url_value_preprocessor`, but for every request, not only those + handled by the blueprint. Equivalent to :meth:`.Flask.url_value_preprocessor`. + """ + self.record_once( + lambda s: s.app.url_value_preprocessors.setdefault(None, []).append(f) + ) + return f + + @setupmethod + def app_url_defaults(self, f: T_url_defaults) -> T_url_defaults: + """Like :meth:`url_defaults`, but for every request, not only those handled by + the blueprint. Equivalent to :meth:`.Flask.url_defaults`. + """ + self.record_once( + lambda s: s.app.url_default_functions.setdefault(None, []).append(f) + ) + return f diff --git a/app/src/flask-server/venv/Lib/site-packages/flask/sansio/scaffold.py b/app/src/flask-server/venv/Lib/site-packages/flask/sansio/scaffold.py new file mode 100644 index 0000000..a43f6fd --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/flask/sansio/scaffold.py @@ -0,0 +1,802 @@ +from __future__ import annotations + +import importlib.util +import os +import pathlib +import sys +import typing as t +from collections import defaultdict +from functools import update_wrapper + +from jinja2 import FileSystemLoader +from werkzeug.exceptions import default_exceptions +from werkzeug.exceptions import HTTPException +from werkzeug.utils import cached_property + +from .. import typing as ft +from ..cli import AppGroup +from ..helpers import get_root_path +from ..templating import _default_template_ctx_processor + +# a singleton sentinel value for parameter defaults +_sentinel = object() + +F = t.TypeVar("F", bound=t.Callable[..., t.Any]) +T_after_request = t.TypeVar("T_after_request", bound=ft.AfterRequestCallable) +T_before_request = t.TypeVar("T_before_request", bound=ft.BeforeRequestCallable) +T_error_handler = t.TypeVar("T_error_handler", bound=ft.ErrorHandlerCallable) +T_teardown = t.TypeVar("T_teardown", bound=ft.TeardownCallable) +T_template_context_processor = t.TypeVar( + "T_template_context_processor", bound=ft.TemplateContextProcessorCallable +) +T_url_defaults = t.TypeVar("T_url_defaults", bound=ft.URLDefaultCallable) +T_url_value_preprocessor = t.TypeVar( + "T_url_value_preprocessor", bound=ft.URLValuePreprocessorCallable +) +T_route = t.TypeVar("T_route", bound=ft.RouteCallable) + + +def setupmethod(f: F) -> F: + f_name = f.__name__ + + def wrapper_func(self, *args: t.Any, **kwargs: t.Any) -> t.Any: + self._check_setup_finished(f_name) + return f(self, *args, **kwargs) + + return t.cast(F, update_wrapper(wrapper_func, f)) + + +class Scaffold: + """Common behavior shared between :class:`~flask.Flask` and + :class:`~flask.blueprints.Blueprint`. + + :param import_name: The import name of the module where this object + is defined. Usually :attr:`__name__` should be used. + :param static_folder: Path to a folder of static files to serve. + If this is set, a static route will be added. + :param static_url_path: URL prefix for the static route. + :param template_folder: Path to a folder containing template files. + for rendering. If this is set, a Jinja loader will be added. + :param root_path: The path that static, template, and resource files + are relative to. Typically not set, it is discovered based on + the ``import_name``. + + .. versionadded:: 2.0 + """ + + name: str + _static_folder: str | None = None + _static_url_path: str | None = None + + def __init__( + self, + import_name: str, + static_folder: str | os.PathLike | None = None, + static_url_path: str | None = None, + template_folder: str | os.PathLike | None = None, + root_path: str | None = None, + ): + #: The name of the package or module that this object belongs + #: to. Do not change this once it is set by the constructor. + self.import_name = import_name + + self.static_folder = static_folder # type: ignore + self.static_url_path = static_url_path + + #: The path to the templates folder, relative to + #: :attr:`root_path`, to add to the template loader. ``None`` if + #: templates should not be added. + self.template_folder = template_folder + + if root_path is None: + root_path = get_root_path(self.import_name) + + #: Absolute path to the package on the filesystem. Used to look + #: up resources contained in the package. + self.root_path = root_path + + #: The Click command group for registering CLI commands for this + #: object. The commands are available from the ``flask`` command + #: once the application has been discovered and blueprints have + #: been registered. + self.cli = AppGroup() + + #: A dictionary mapping endpoint names to view functions. + #: + #: To register a view function, use the :meth:`route` decorator. + #: + #: This data structure is internal. It should not be modified + #: directly and its format may change at any time. + self.view_functions: dict[str, t.Callable] = {} + + #: A data structure of registered error handlers, in the format + #: ``{scope: {code: {class: handler}}}``. The ``scope`` key is + #: the name of a blueprint the handlers are active for, or + #: ``None`` for all requests. The ``code`` key is the HTTP + #: status code for ``HTTPException``, or ``None`` for + #: other exceptions. The innermost dictionary maps exception + #: classes to handler functions. + #: + #: To register an error handler, use the :meth:`errorhandler` + #: decorator. + #: + #: This data structure is internal. It should not be modified + #: directly and its format may change at any time. + self.error_handler_spec: dict[ + ft.AppOrBlueprintKey, + dict[int | None, dict[type[Exception], ft.ErrorHandlerCallable]], + ] = defaultdict(lambda: defaultdict(dict)) + + #: A data structure of functions to call at the beginning of + #: each request, in the format ``{scope: [functions]}``. The + #: ``scope`` key is the name of a blueprint the functions are + #: active for, or ``None`` for all requests. + #: + #: To register a function, use the :meth:`before_request` + #: decorator. + #: + #: This data structure is internal. It should not be modified + #: directly and its format may change at any time. + self.before_request_funcs: dict[ + ft.AppOrBlueprintKey, list[ft.BeforeRequestCallable] + ] = defaultdict(list) + + #: A data structure of functions to call at the end of each + #: request, in the format ``{scope: [functions]}``. The + #: ``scope`` key is the name of a blueprint the functions are + #: active for, or ``None`` for all requests. + #: + #: To register a function, use the :meth:`after_request` + #: decorator. + #: + #: This data structure is internal. It should not be modified + #: directly and its format may change at any time. + self.after_request_funcs: dict[ + ft.AppOrBlueprintKey, list[ft.AfterRequestCallable] + ] = defaultdict(list) + + #: A data structure of functions to call at the end of each + #: request even if an exception is raised, in the format + #: ``{scope: [functions]}``. The ``scope`` key is the name of a + #: blueprint the functions are active for, or ``None`` for all + #: requests. + #: + #: To register a function, use the :meth:`teardown_request` + #: decorator. + #: + #: This data structure is internal. It should not be modified + #: directly and its format may change at any time. + self.teardown_request_funcs: dict[ + ft.AppOrBlueprintKey, list[ft.TeardownCallable] + ] = defaultdict(list) + + #: A data structure of functions to call to pass extra context + #: values when rendering templates, in the format + #: ``{scope: [functions]}``. The ``scope`` key is the name of a + #: blueprint the functions are active for, or ``None`` for all + #: requests. + #: + #: To register a function, use the :meth:`context_processor` + #: decorator. + #: + #: This data structure is internal. It should not be modified + #: directly and its format may change at any time. + self.template_context_processors: dict[ + ft.AppOrBlueprintKey, list[ft.TemplateContextProcessorCallable] + ] = defaultdict(list, {None: [_default_template_ctx_processor]}) + + #: A data structure of functions to call to modify the keyword + #: arguments passed to the view function, in the format + #: ``{scope: [functions]}``. The ``scope`` key is the name of a + #: blueprint the functions are active for, or ``None`` for all + #: requests. + #: + #: To register a function, use the + #: :meth:`url_value_preprocessor` decorator. + #: + #: This data structure is internal. It should not be modified + #: directly and its format may change at any time. + self.url_value_preprocessors: dict[ + ft.AppOrBlueprintKey, + list[ft.URLValuePreprocessorCallable], + ] = defaultdict(list) + + #: A data structure of functions to call to modify the keyword + #: arguments when generating URLs, in the format + #: ``{scope: [functions]}``. The ``scope`` key is the name of a + #: blueprint the functions are active for, or ``None`` for all + #: requests. + #: + #: To register a function, use the :meth:`url_defaults` + #: decorator. + #: + #: This data structure is internal. It should not be modified + #: directly and its format may change at any time. + self.url_default_functions: dict[ + ft.AppOrBlueprintKey, list[ft.URLDefaultCallable] + ] = defaultdict(list) + + def __repr__(self) -> str: + return f"<{type(self).__name__} {self.name!r}>" + + def _check_setup_finished(self, f_name: str) -> None: + raise NotImplementedError + + @property + def static_folder(self) -> str | None: + """The absolute path to the configured static folder. ``None`` + if no static folder is set. + """ + if self._static_folder is not None: + return os.path.join(self.root_path, self._static_folder) + else: + return None + + @static_folder.setter + def static_folder(self, value: str | os.PathLike | None) -> None: + if value is not None: + value = os.fspath(value).rstrip(r"\/") + + self._static_folder = value + + @property + def has_static_folder(self) -> bool: + """``True`` if :attr:`static_folder` is set. + + .. versionadded:: 0.5 + """ + return self.static_folder is not None + + @property + def static_url_path(self) -> str | None: + """The URL prefix that the static route will be accessible from. + + If it was not configured during init, it is derived from + :attr:`static_folder`. + """ + if self._static_url_path is not None: + return self._static_url_path + + if self.static_folder is not None: + basename = os.path.basename(self.static_folder) + return f"/{basename}".rstrip("/") + + return None + + @static_url_path.setter + def static_url_path(self, value: str | None) -> None: + if value is not None: + value = value.rstrip("/") + + self._static_url_path = value + + @cached_property + def jinja_loader(self) -> FileSystemLoader | None: + """The Jinja loader for this object's templates. By default this + is a class :class:`jinja2.loaders.FileSystemLoader` to + :attr:`template_folder` if it is set. + + .. versionadded:: 0.5 + """ + if self.template_folder is not None: + return FileSystemLoader(os.path.join(self.root_path, self.template_folder)) + else: + return None + + def _method_route( + self, + method: str, + rule: str, + options: dict, + ) -> t.Callable[[T_route], T_route]: + if "methods" in options: + raise TypeError("Use the 'route' decorator to use the 'methods' argument.") + + return self.route(rule, methods=[method], **options) + + @setupmethod + def get(self, rule: str, **options: t.Any) -> t.Callable[[T_route], T_route]: + """Shortcut for :meth:`route` with ``methods=["GET"]``. + + .. versionadded:: 2.0 + """ + return self._method_route("GET", rule, options) + + @setupmethod + def post(self, rule: str, **options: t.Any) -> t.Callable[[T_route], T_route]: + """Shortcut for :meth:`route` with ``methods=["POST"]``. + + .. versionadded:: 2.0 + """ + return self._method_route("POST", rule, options) + + @setupmethod + def put(self, rule: str, **options: t.Any) -> t.Callable[[T_route], T_route]: + """Shortcut for :meth:`route` with ``methods=["PUT"]``. + + .. versionadded:: 2.0 + """ + return self._method_route("PUT", rule, options) + + @setupmethod + def delete(self, rule: str, **options: t.Any) -> t.Callable[[T_route], T_route]: + """Shortcut for :meth:`route` with ``methods=["DELETE"]``. + + .. versionadded:: 2.0 + """ + return self._method_route("DELETE", rule, options) + + @setupmethod + def patch(self, rule: str, **options: t.Any) -> t.Callable[[T_route], T_route]: + """Shortcut for :meth:`route` with ``methods=["PATCH"]``. + + .. versionadded:: 2.0 + """ + return self._method_route("PATCH", rule, options) + + @setupmethod + def route(self, rule: str, **options: t.Any) -> t.Callable[[T_route], T_route]: + """Decorate a view function to register it with the given URL + rule and options. Calls :meth:`add_url_rule`, which has more + details about the implementation. + + .. code-block:: python + + @app.route("/") + def index(): + return "Hello, World!" + + See :ref:`url-route-registrations`. + + The endpoint name for the route defaults to the name of the view + function if the ``endpoint`` parameter isn't passed. + + The ``methods`` parameter defaults to ``["GET"]``. ``HEAD`` and + ``OPTIONS`` are added automatically. + + :param rule: The URL rule string. + :param options: Extra options passed to the + :class:`~werkzeug.routing.Rule` object. + """ + + def decorator(f: T_route) -> T_route: + endpoint = options.pop("endpoint", None) + self.add_url_rule(rule, endpoint, f, **options) + return f + + return decorator + + @setupmethod + def add_url_rule( + self, + rule: str, + endpoint: str | None = None, + view_func: ft.RouteCallable | None = None, + provide_automatic_options: bool | None = None, + **options: t.Any, + ) -> None: + """Register a rule for routing incoming requests and building + URLs. The :meth:`route` decorator is a shortcut to call this + with the ``view_func`` argument. These are equivalent: + + .. code-block:: python + + @app.route("/") + def index(): + ... + + .. code-block:: python + + def index(): + ... + + app.add_url_rule("/", view_func=index) + + See :ref:`url-route-registrations`. + + The endpoint name for the route defaults to the name of the view + function if the ``endpoint`` parameter isn't passed. An error + will be raised if a function has already been registered for the + endpoint. + + The ``methods`` parameter defaults to ``["GET"]``. ``HEAD`` is + always added automatically, and ``OPTIONS`` is added + automatically by default. + + ``view_func`` does not necessarily need to be passed, but if the + rule should participate in routing an endpoint name must be + associated with a view function at some point with the + :meth:`endpoint` decorator. + + .. code-block:: python + + app.add_url_rule("/", endpoint="index") + + @app.endpoint("index") + def index(): + ... + + If ``view_func`` has a ``required_methods`` attribute, those + methods are added to the passed and automatic methods. If it + has a ``provide_automatic_methods`` attribute, it is used as the + default if the parameter is not passed. + + :param rule: The URL rule string. + :param endpoint: The endpoint name to associate with the rule + and view function. Used when routing and building URLs. + Defaults to ``view_func.__name__``. + :param view_func: The view function to associate with the + endpoint name. + :param provide_automatic_options: Add the ``OPTIONS`` method and + respond to ``OPTIONS`` requests automatically. + :param options: Extra options passed to the + :class:`~werkzeug.routing.Rule` object. + """ + raise NotImplementedError + + @setupmethod + def endpoint(self, endpoint: str) -> t.Callable[[F], F]: + """Decorate a view function to register it for the given + endpoint. Used if a rule is added without a ``view_func`` with + :meth:`add_url_rule`. + + .. code-block:: python + + app.add_url_rule("/ex", endpoint="example") + + @app.endpoint("example") + def example(): + ... + + :param endpoint: The endpoint name to associate with the view + function. + """ + + def decorator(f: F) -> F: + self.view_functions[endpoint] = f + return f + + return decorator + + @setupmethod + def before_request(self, f: T_before_request) -> T_before_request: + """Register a function to run before each request. + + For example, this can be used to open a database connection, or + to load the logged in user from the session. + + .. code-block:: python + + @app.before_request + def load_user(): + if "user_id" in session: + g.user = db.session.get(session["user_id"]) + + The function will be called without any arguments. If it returns + a non-``None`` value, the value is handled as if it was the + return value from the view, and further request handling is + stopped. + + This is available on both app and blueprint objects. When used on an app, this + executes before every request. When used on a blueprint, this executes before + every request that the blueprint handles. To register with a blueprint and + execute before every request, use :meth:`.Blueprint.before_app_request`. + """ + self.before_request_funcs.setdefault(None, []).append(f) + return f + + @setupmethod + def after_request(self, f: T_after_request) -> T_after_request: + """Register a function to run after each request to this object. + + The function is called with the response object, and must return + a response object. This allows the functions to modify or + replace the response before it is sent. + + If a function raises an exception, any remaining + ``after_request`` functions will not be called. Therefore, this + should not be used for actions that must execute, such as to + close resources. Use :meth:`teardown_request` for that. + + This is available on both app and blueprint objects. When used on an app, this + executes after every request. When used on a blueprint, this executes after + every request that the blueprint handles. To register with a blueprint and + execute after every request, use :meth:`.Blueprint.after_app_request`. + """ + self.after_request_funcs.setdefault(None, []).append(f) + return f + + @setupmethod + def teardown_request(self, f: T_teardown) -> T_teardown: + """Register a function to be called when the request context is + popped. Typically this happens at the end of each request, but + contexts may be pushed manually as well during testing. + + .. code-block:: python + + with app.test_request_context(): + ... + + When the ``with`` block exits (or ``ctx.pop()`` is called), the + teardown functions are called just before the request context is + made inactive. + + When a teardown function was called because of an unhandled + exception it will be passed an error object. If an + :meth:`errorhandler` is registered, it will handle the exception + and the teardown will not receive it. + + Teardown functions must avoid raising exceptions. If they + execute code that might fail they must surround that code with a + ``try``/``except`` block and log any errors. + + The return values of teardown functions are ignored. + + This is available on both app and blueprint objects. When used on an app, this + executes after every request. When used on a blueprint, this executes after + every request that the blueprint handles. To register with a blueprint and + execute after every request, use :meth:`.Blueprint.teardown_app_request`. + """ + self.teardown_request_funcs.setdefault(None, []).append(f) + return f + + @setupmethod + def context_processor( + self, + f: T_template_context_processor, + ) -> T_template_context_processor: + """Registers a template context processor function. These functions run before + rendering a template. The keys of the returned dict are added as variables + available in the template. + + This is available on both app and blueprint objects. When used on an app, this + is called for every rendered template. When used on a blueprint, this is called + for templates rendered from the blueprint's views. To register with a blueprint + and affect every template, use :meth:`.Blueprint.app_context_processor`. + """ + self.template_context_processors[None].append(f) + return f + + @setupmethod + def url_value_preprocessor( + self, + f: T_url_value_preprocessor, + ) -> T_url_value_preprocessor: + """Register a URL value preprocessor function for all view + functions in the application. These functions will be called before the + :meth:`before_request` functions. + + The function can modify the values captured from the matched url before + they are passed to the view. For example, this can be used to pop a + common language code value and place it in ``g`` rather than pass it to + every view. + + The function is passed the endpoint name and values dict. The return + value is ignored. + + This is available on both app and blueprint objects. When used on an app, this + is called for every request. When used on a blueprint, this is called for + requests that the blueprint handles. To register with a blueprint and affect + every request, use :meth:`.Blueprint.app_url_value_preprocessor`. + """ + self.url_value_preprocessors[None].append(f) + return f + + @setupmethod + def url_defaults(self, f: T_url_defaults) -> T_url_defaults: + """Callback function for URL defaults for all view functions of the + application. It's called with the endpoint and values and should + update the values passed in place. + + This is available on both app and blueprint objects. When used on an app, this + is called for every request. When used on a blueprint, this is called for + requests that the blueprint handles. To register with a blueprint and affect + every request, use :meth:`.Blueprint.app_url_defaults`. + """ + self.url_default_functions[None].append(f) + return f + + @setupmethod + def errorhandler( + self, code_or_exception: type[Exception] | int + ) -> t.Callable[[T_error_handler], T_error_handler]: + """Register a function to handle errors by code or exception class. + + A decorator that is used to register a function given an + error code. Example:: + + @app.errorhandler(404) + def page_not_found(error): + return 'This page does not exist', 404 + + You can also register handlers for arbitrary exceptions:: + + @app.errorhandler(DatabaseError) + def special_exception_handler(error): + return 'Database connection failed', 500 + + This is available on both app and blueprint objects. When used on an app, this + can handle errors from every request. When used on a blueprint, this can handle + errors from requests that the blueprint handles. To register with a blueprint + and affect every request, use :meth:`.Blueprint.app_errorhandler`. + + .. versionadded:: 0.7 + Use :meth:`register_error_handler` instead of modifying + :attr:`error_handler_spec` directly, for application wide error + handlers. + + .. versionadded:: 0.7 + One can now additionally also register custom exception types + that do not necessarily have to be a subclass of the + :class:`~werkzeug.exceptions.HTTPException` class. + + :param code_or_exception: the code as integer for the handler, or + an arbitrary exception + """ + + def decorator(f: T_error_handler) -> T_error_handler: + self.register_error_handler(code_or_exception, f) + return f + + return decorator + + @setupmethod + def register_error_handler( + self, + code_or_exception: type[Exception] | int, + f: ft.ErrorHandlerCallable, + ) -> None: + """Alternative error attach function to the :meth:`errorhandler` + decorator that is more straightforward to use for non decorator + usage. + + .. versionadded:: 0.7 + """ + exc_class, code = self._get_exc_class_and_code(code_or_exception) + self.error_handler_spec[None][code][exc_class] = f + + @staticmethod + def _get_exc_class_and_code( + exc_class_or_code: type[Exception] | int, + ) -> tuple[type[Exception], int | None]: + """Get the exception class being handled. For HTTP status codes + or ``HTTPException`` subclasses, return both the exception and + status code. + + :param exc_class_or_code: Any exception class, or an HTTP status + code as an integer. + """ + exc_class: type[Exception] + + if isinstance(exc_class_or_code, int): + try: + exc_class = default_exceptions[exc_class_or_code] + except KeyError: + raise ValueError( + f"'{exc_class_or_code}' is not a recognized HTTP" + " error code. Use a subclass of HTTPException with" + " that code instead." + ) from None + else: + exc_class = exc_class_or_code + + if isinstance(exc_class, Exception): + raise TypeError( + f"{exc_class!r} is an instance, not a class. Handlers" + " can only be registered for Exception classes or HTTP" + " error codes." + ) + + if not issubclass(exc_class, Exception): + raise ValueError( + f"'{exc_class.__name__}' is not a subclass of Exception." + " Handlers can only be registered for Exception classes" + " or HTTP error codes." + ) + + if issubclass(exc_class, HTTPException): + return exc_class, exc_class.code + else: + return exc_class, None + + +def _endpoint_from_view_func(view_func: t.Callable) -> str: + """Internal helper that returns the default endpoint for a given + function. This always is the function name. + """ + assert view_func is not None, "expected view func if endpoint is not provided." + return view_func.__name__ + + +def _path_is_relative_to(path: pathlib.PurePath, base: str) -> bool: + # Path.is_relative_to doesn't exist until Python 3.9 + try: + path.relative_to(base) + return True + except ValueError: + return False + + +def _find_package_path(import_name): + """Find the path that contains the package or module.""" + root_mod_name, _, _ = import_name.partition(".") + + try: + root_spec = importlib.util.find_spec(root_mod_name) + + if root_spec is None: + raise ValueError("not found") + except (ImportError, ValueError): + # ImportError: the machinery told us it does not exist + # ValueError: + # - the module name was invalid + # - the module name is __main__ + # - we raised `ValueError` due to `root_spec` being `None` + return os.getcwd() + + if root_spec.origin in {"namespace", None}: + # namespace package + package_spec = importlib.util.find_spec(import_name) + + if package_spec is not None and package_spec.submodule_search_locations: + # Pick the path in the namespace that contains the submodule. + package_path = pathlib.Path( + os.path.commonpath(package_spec.submodule_search_locations) + ) + search_location = next( + location + for location in root_spec.submodule_search_locations + if _path_is_relative_to(package_path, location) + ) + else: + # Pick the first path. + search_location = root_spec.submodule_search_locations[0] + + return os.path.dirname(search_location) + elif root_spec.submodule_search_locations: + # package with __init__.py + return os.path.dirname(os.path.dirname(root_spec.origin)) + else: + # module + return os.path.dirname(root_spec.origin) + + +def find_package(import_name: str): + """Find the prefix that a package is installed under, and the path + that it would be imported from. + + The prefix is the directory containing the standard directory + hierarchy (lib, bin, etc.). If the package is not installed to the + system (:attr:`sys.prefix`) or a virtualenv (``site-packages``), + ``None`` is returned. + + The path is the entry in :attr:`sys.path` that contains the package + for import. If the package is not installed, it's assumed that the + package was imported from the current working directory. + """ + package_path = _find_package_path(import_name) + py_prefix = os.path.abspath(sys.prefix) + + # installed to the system + if _path_is_relative_to(pathlib.PurePath(package_path), py_prefix): + return py_prefix, package_path + + site_parent, site_folder = os.path.split(package_path) + + # installed to a virtualenv + if site_folder.lower() == "site-packages": + parent, folder = os.path.split(site_parent) + + # Windows (prefix/lib/site-packages) + if folder.lower() == "lib": + return parent, package_path + + # Unix (prefix/lib/pythonX.Y/site-packages) + if os.path.basename(parent).lower() == "lib": + return os.path.dirname(parent), package_path + + # something else (prefix/site-packages) + return site_parent, package_path + + # not installed + return None, package_path diff --git a/app/src/flask-server/venv/Lib/site-packages/flask/sessions.py b/app/src/flask-server/venv/Lib/site-packages/flask/sessions.py new file mode 100644 index 0000000..e5650d6 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/flask/sessions.py @@ -0,0 +1,367 @@ +from __future__ import annotations + +import hashlib +import typing as t +from collections.abc import MutableMapping +from datetime import datetime +from datetime import timezone + +from itsdangerous import BadSignature +from itsdangerous import URLSafeTimedSerializer +from werkzeug.datastructures import CallbackDict + +from .json.tag import TaggedJSONSerializer + +if t.TYPE_CHECKING: # pragma: no cover + from .app import Flask + from .wrappers import Request, Response + + +class SessionMixin(MutableMapping): + """Expands a basic dictionary with session attributes.""" + + @property + def permanent(self) -> bool: + """This reflects the ``'_permanent'`` key in the dict.""" + return self.get("_permanent", False) + + @permanent.setter + def permanent(self, value: bool) -> None: + self["_permanent"] = bool(value) + + #: Some implementations can detect whether a session is newly + #: created, but that is not guaranteed. Use with caution. The mixin + # default is hard-coded ``False``. + new = False + + #: Some implementations can detect changes to the session and set + #: this when that happens. The mixin default is hard coded to + #: ``True``. + modified = True + + #: Some implementations can detect when session data is read or + #: written and set this when that happens. The mixin default is hard + #: coded to ``True``. + accessed = True + + +class SecureCookieSession(CallbackDict, SessionMixin): + """Base class for sessions based on signed cookies. + + This session backend will set the :attr:`modified` and + :attr:`accessed` attributes. It cannot reliably track whether a + session is new (vs. empty), so :attr:`new` remains hard coded to + ``False``. + """ + + #: When data is changed, this is set to ``True``. Only the session + #: dictionary itself is tracked; if the session contains mutable + #: data (for example a nested dict) then this must be set to + #: ``True`` manually when modifying that data. The session cookie + #: will only be written to the response if this is ``True``. + modified = False + + #: When data is read or written, this is set to ``True``. Used by + # :class:`.SecureCookieSessionInterface` to add a ``Vary: Cookie`` + #: header, which allows caching proxies to cache different pages for + #: different users. + accessed = False + + def __init__(self, initial: t.Any = None) -> None: + def on_update(self) -> None: + self.modified = True + self.accessed = True + + super().__init__(initial, on_update) + + def __getitem__(self, key: str) -> t.Any: + self.accessed = True + return super().__getitem__(key) + + def get(self, key: str, default: t.Any = None) -> t.Any: + self.accessed = True + return super().get(key, default) + + def setdefault(self, key: str, default: t.Any = None) -> t.Any: + self.accessed = True + return super().setdefault(key, default) + + +class NullSession(SecureCookieSession): + """Class used to generate nicer error messages if sessions are not + available. Will still allow read-only access to the empty session + but fail on setting. + """ + + def _fail(self, *args: t.Any, **kwargs: t.Any) -> t.NoReturn: + raise RuntimeError( + "The session is unavailable because no secret " + "key was set. Set the secret_key on the " + "application to something unique and secret." + ) + + __setitem__ = __delitem__ = clear = pop = popitem = update = setdefault = _fail # type: ignore # noqa: B950 + del _fail + + +class SessionInterface: + """The basic interface you have to implement in order to replace the + default session interface which uses werkzeug's securecookie + implementation. The only methods you have to implement are + :meth:`open_session` and :meth:`save_session`, the others have + useful defaults which you don't need to change. + + The session object returned by the :meth:`open_session` method has to + provide a dictionary like interface plus the properties and methods + from the :class:`SessionMixin`. We recommend just subclassing a dict + and adding that mixin:: + + class Session(dict, SessionMixin): + pass + + If :meth:`open_session` returns ``None`` Flask will call into + :meth:`make_null_session` to create a session that acts as replacement + if the session support cannot work because some requirement is not + fulfilled. The default :class:`NullSession` class that is created + will complain that the secret key was not set. + + To replace the session interface on an application all you have to do + is to assign :attr:`flask.Flask.session_interface`:: + + app = Flask(__name__) + app.session_interface = MySessionInterface() + + Multiple requests with the same session may be sent and handled + concurrently. When implementing a new session interface, consider + whether reads or writes to the backing store must be synchronized. + There is no guarantee on the order in which the session for each + request is opened or saved, it will occur in the order that requests + begin and end processing. + + .. versionadded:: 0.8 + """ + + #: :meth:`make_null_session` will look here for the class that should + #: be created when a null session is requested. Likewise the + #: :meth:`is_null_session` method will perform a typecheck against + #: this type. + null_session_class = NullSession + + #: A flag that indicates if the session interface is pickle based. + #: This can be used by Flask extensions to make a decision in regards + #: to how to deal with the session object. + #: + #: .. versionadded:: 0.10 + pickle_based = False + + def make_null_session(self, app: Flask) -> NullSession: + """Creates a null session which acts as a replacement object if the + real session support could not be loaded due to a configuration + error. This mainly aids the user experience because the job of the + null session is to still support lookup without complaining but + modifications are answered with a helpful error message of what + failed. + + This creates an instance of :attr:`null_session_class` by default. + """ + return self.null_session_class() + + def is_null_session(self, obj: object) -> bool: + """Checks if a given object is a null session. Null sessions are + not asked to be saved. + + This checks if the object is an instance of :attr:`null_session_class` + by default. + """ + return isinstance(obj, self.null_session_class) + + def get_cookie_name(self, app: Flask) -> str: + """The name of the session cookie. Uses``app.config["SESSION_COOKIE_NAME"]``.""" + return app.config["SESSION_COOKIE_NAME"] + + def get_cookie_domain(self, app: Flask) -> str | None: + """The value of the ``Domain`` parameter on the session cookie. If not set, + browsers will only send the cookie to the exact domain it was set from. + Otherwise, they will send it to any subdomain of the given value as well. + + Uses the :data:`SESSION_COOKIE_DOMAIN` config. + + .. versionchanged:: 2.3 + Not set by default, does not fall back to ``SERVER_NAME``. + """ + rv = app.config["SESSION_COOKIE_DOMAIN"] + return rv if rv else None + + def get_cookie_path(self, app: Flask) -> str: + """Returns the path for which the cookie should be valid. The + default implementation uses the value from the ``SESSION_COOKIE_PATH`` + config var if it's set, and falls back to ``APPLICATION_ROOT`` or + uses ``/`` if it's ``None``. + """ + return app.config["SESSION_COOKIE_PATH"] or app.config["APPLICATION_ROOT"] + + def get_cookie_httponly(self, app: Flask) -> bool: + """Returns True if the session cookie should be httponly. This + currently just returns the value of the ``SESSION_COOKIE_HTTPONLY`` + config var. + """ + return app.config["SESSION_COOKIE_HTTPONLY"] + + def get_cookie_secure(self, app: Flask) -> bool: + """Returns True if the cookie should be secure. This currently + just returns the value of the ``SESSION_COOKIE_SECURE`` setting. + """ + return app.config["SESSION_COOKIE_SECURE"] + + def get_cookie_samesite(self, app: Flask) -> str: + """Return ``'Strict'`` or ``'Lax'`` if the cookie should use the + ``SameSite`` attribute. This currently just returns the value of + the :data:`SESSION_COOKIE_SAMESITE` setting. + """ + return app.config["SESSION_COOKIE_SAMESITE"] + + def get_expiration_time(self, app: Flask, session: SessionMixin) -> datetime | None: + """A helper method that returns an expiration date for the session + or ``None`` if the session is linked to the browser session. The + default implementation returns now + the permanent session + lifetime configured on the application. + """ + if session.permanent: + return datetime.now(timezone.utc) + app.permanent_session_lifetime + return None + + def should_set_cookie(self, app: Flask, session: SessionMixin) -> bool: + """Used by session backends to determine if a ``Set-Cookie`` header + should be set for this session cookie for this response. If the session + has been modified, the cookie is set. If the session is permanent and + the ``SESSION_REFRESH_EACH_REQUEST`` config is true, the cookie is + always set. + + This check is usually skipped if the session was deleted. + + .. versionadded:: 0.11 + """ + + return session.modified or ( + session.permanent and app.config["SESSION_REFRESH_EACH_REQUEST"] + ) + + def open_session(self, app: Flask, request: Request) -> SessionMixin | None: + """This is called at the beginning of each request, after + pushing the request context, before matching the URL. + + This must return an object which implements a dictionary-like + interface as well as the :class:`SessionMixin` interface. + + This will return ``None`` to indicate that loading failed in + some way that is not immediately an error. The request + context will fall back to using :meth:`make_null_session` + in this case. + """ + raise NotImplementedError() + + def save_session( + self, app: Flask, session: SessionMixin, response: Response + ) -> None: + """This is called at the end of each request, after generating + a response, before removing the request context. It is skipped + if :meth:`is_null_session` returns ``True``. + """ + raise NotImplementedError() + + +session_json_serializer = TaggedJSONSerializer() + + +class SecureCookieSessionInterface(SessionInterface): + """The default session interface that stores sessions in signed cookies + through the :mod:`itsdangerous` module. + """ + + #: the salt that should be applied on top of the secret key for the + #: signing of cookie based sessions. + salt = "cookie-session" + #: the hash function to use for the signature. The default is sha1 + digest_method = staticmethod(hashlib.sha1) + #: the name of the itsdangerous supported key derivation. The default + #: is hmac. + key_derivation = "hmac" + #: A python serializer for the payload. The default is a compact + #: JSON derived serializer with support for some extra Python types + #: such as datetime objects or tuples. + serializer = session_json_serializer + session_class = SecureCookieSession + + def get_signing_serializer(self, app: Flask) -> URLSafeTimedSerializer | None: + if not app.secret_key: + return None + signer_kwargs = dict( + key_derivation=self.key_derivation, digest_method=self.digest_method + ) + return URLSafeTimedSerializer( + app.secret_key, + salt=self.salt, + serializer=self.serializer, + signer_kwargs=signer_kwargs, + ) + + def open_session(self, app: Flask, request: Request) -> SecureCookieSession | None: + s = self.get_signing_serializer(app) + if s is None: + return None + val = request.cookies.get(self.get_cookie_name(app)) + if not val: + return self.session_class() + max_age = int(app.permanent_session_lifetime.total_seconds()) + try: + data = s.loads(val, max_age=max_age) + return self.session_class(data) + except BadSignature: + return self.session_class() + + def save_session( + self, app: Flask, session: SessionMixin, response: Response + ) -> None: + name = self.get_cookie_name(app) + domain = self.get_cookie_domain(app) + path = self.get_cookie_path(app) + secure = self.get_cookie_secure(app) + samesite = self.get_cookie_samesite(app) + httponly = self.get_cookie_httponly(app) + + # Add a "Vary: Cookie" header if the session was accessed at all. + if session.accessed: + response.vary.add("Cookie") + + # If the session is modified to be empty, remove the cookie. + # If the session is empty, return without setting the cookie. + if not session: + if session.modified: + response.delete_cookie( + name, + domain=domain, + path=path, + secure=secure, + samesite=samesite, + httponly=httponly, + ) + response.vary.add("Cookie") + + return + + if not self.should_set_cookie(app, session): + return + + expires = self.get_expiration_time(app, session) + val = self.get_signing_serializer(app).dumps(dict(session)) # type: ignore + response.set_cookie( + name, + val, # type: ignore + expires=expires, + httponly=httponly, + domain=domain, + path=path, + secure=secure, + samesite=samesite, + ) + response.vary.add("Cookie") diff --git a/app/src/flask-server/venv/Lib/site-packages/flask/signals.py b/app/src/flask-server/venv/Lib/site-packages/flask/signals.py new file mode 100644 index 0000000..444fda9 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/flask/signals.py @@ -0,0 +1,17 @@ +from __future__ import annotations + +from blinker import Namespace + +# This namespace is only for signals provided by Flask itself. +_signals = Namespace() + +template_rendered = _signals.signal("template-rendered") +before_render_template = _signals.signal("before-render-template") +request_started = _signals.signal("request-started") +request_finished = _signals.signal("request-finished") +request_tearing_down = _signals.signal("request-tearing-down") +got_request_exception = _signals.signal("got-request-exception") +appcontext_tearing_down = _signals.signal("appcontext-tearing-down") +appcontext_pushed = _signals.signal("appcontext-pushed") +appcontext_popped = _signals.signal("appcontext-popped") +message_flashed = _signals.signal("message-flashed") diff --git a/app/src/flask-server/venv/Lib/site-packages/flask/templating.py b/app/src/flask-server/venv/Lib/site-packages/flask/templating.py new file mode 100644 index 0000000..8dff8ba --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/flask/templating.py @@ -0,0 +1,221 @@ +from __future__ import annotations + +import typing as t + +from jinja2 import BaseLoader +from jinja2 import Environment as BaseEnvironment +from jinja2 import Template +from jinja2 import TemplateNotFound + +from .globals import _cv_app +from .globals import _cv_request +from .globals import current_app +from .globals import request +from .helpers import stream_with_context +from .signals import before_render_template +from .signals import template_rendered + +if t.TYPE_CHECKING: # pragma: no cover + from .app import Flask + from .sansio.app import App + from .sansio.scaffold import Scaffold + + +def _default_template_ctx_processor() -> dict[str, t.Any]: + """Default template context processor. Injects `request`, + `session` and `g`. + """ + appctx = _cv_app.get(None) + reqctx = _cv_request.get(None) + rv: dict[str, t.Any] = {} + if appctx is not None: + rv["g"] = appctx.g + if reqctx is not None: + rv["request"] = reqctx.request + rv["session"] = reqctx.session + return rv + + +class Environment(BaseEnvironment): + """Works like a regular Jinja2 environment but has some additional + knowledge of how Flask's blueprint works so that it can prepend the + name of the blueprint to referenced templates if necessary. + """ + + def __init__(self, app: App, **options: t.Any) -> None: + if "loader" not in options: + options["loader"] = app.create_global_jinja_loader() + BaseEnvironment.__init__(self, **options) + self.app = app + + +class DispatchingJinjaLoader(BaseLoader): + """A loader that looks for templates in the application and all + the blueprint folders. + """ + + def __init__(self, app: App) -> None: + self.app = app + + def get_source( # type: ignore + self, environment: Environment, template: str + ) -> tuple[str, str | None, t.Callable | None]: + if self.app.config["EXPLAIN_TEMPLATE_LOADING"]: + return self._get_source_explained(environment, template) + return self._get_source_fast(environment, template) + + def _get_source_explained( + self, environment: Environment, template: str + ) -> tuple[str, str | None, t.Callable | None]: + attempts = [] + rv: tuple[str, str | None, t.Callable[[], bool] | None] | None + trv: None | (tuple[str, str | None, t.Callable[[], bool] | None]) = None + + for srcobj, loader in self._iter_loaders(template): + try: + rv = loader.get_source(environment, template) + if trv is None: + trv = rv + except TemplateNotFound: + rv = None + attempts.append((loader, srcobj, rv)) + + from .debughelpers import explain_template_loading_attempts + + explain_template_loading_attempts(self.app, template, attempts) + + if trv is not None: + return trv + raise TemplateNotFound(template) + + def _get_source_fast( + self, environment: Environment, template: str + ) -> tuple[str, str | None, t.Callable | None]: + for _srcobj, loader in self._iter_loaders(template): + try: + return loader.get_source(environment, template) + except TemplateNotFound: + continue + raise TemplateNotFound(template) + + def _iter_loaders( + self, template: str + ) -> t.Generator[tuple[Scaffold, BaseLoader], None, None]: + loader = self.app.jinja_loader + if loader is not None: + yield self.app, loader + + for blueprint in self.app.iter_blueprints(): + loader = blueprint.jinja_loader + if loader is not None: + yield blueprint, loader + + def list_templates(self) -> list[str]: + result = set() + loader = self.app.jinja_loader + if loader is not None: + result.update(loader.list_templates()) + + for blueprint in self.app.iter_blueprints(): + loader = blueprint.jinja_loader + if loader is not None: + for template in loader.list_templates(): + result.add(template) + + return list(result) + + +def _render(app: Flask, template: Template, context: dict[str, t.Any]) -> str: + app.update_template_context(context) + before_render_template.send( + app, _async_wrapper=app.ensure_sync, template=template, context=context + ) + rv = template.render(context) + template_rendered.send( + app, _async_wrapper=app.ensure_sync, template=template, context=context + ) + return rv + + +def render_template( + template_name_or_list: str | Template | list[str | Template], + **context: t.Any, +) -> str: + """Render a template by name with the given context. + + :param template_name_or_list: The name of the template to render. If + a list is given, the first name to exist will be rendered. + :param context: The variables to make available in the template. + """ + app = current_app._get_current_object() # type: ignore[attr-defined] + template = app.jinja_env.get_or_select_template(template_name_or_list) + return _render(app, template, context) + + +def render_template_string(source: str, **context: t.Any) -> str: + """Render a template from the given source string with the given + context. + + :param source: The source code of the template to render. + :param context: The variables to make available in the template. + """ + app = current_app._get_current_object() # type: ignore[attr-defined] + template = app.jinja_env.from_string(source) + return _render(app, template, context) + + +def _stream( + app: Flask, template: Template, context: dict[str, t.Any] +) -> t.Iterator[str]: + app.update_template_context(context) + before_render_template.send( + app, _async_wrapper=app.ensure_sync, template=template, context=context + ) + + def generate() -> t.Iterator[str]: + yield from template.generate(context) + template_rendered.send( + app, _async_wrapper=app.ensure_sync, template=template, context=context + ) + + rv = generate() + + # If a request context is active, keep it while generating. + if request: + rv = stream_with_context(rv) + + return rv + + +def stream_template( + template_name_or_list: str | Template | list[str | Template], + **context: t.Any, +) -> t.Iterator[str]: + """Render a template by name with the given context as a stream. + This returns an iterator of strings, which can be used as a + streaming response from a view. + + :param template_name_or_list: The name of the template to render. If + a list is given, the first name to exist will be rendered. + :param context: The variables to make available in the template. + + .. versionadded:: 2.2 + """ + app = current_app._get_current_object() # type: ignore[attr-defined] + template = app.jinja_env.get_or_select_template(template_name_or_list) + return _stream(app, template, context) + + +def stream_template_string(source: str, **context: t.Any) -> t.Iterator[str]: + """Render a template from the given source string with the given + context as a stream. This returns an iterator of strings, which can + be used as a streaming response from a view. + + :param source: The source code of the template to render. + :param context: The variables to make available in the template. + + .. versionadded:: 2.2 + """ + app = current_app._get_current_object() # type: ignore[attr-defined] + template = app.jinja_env.from_string(source) + return _stream(app, template, context) diff --git a/app/src/flask-server/venv/Lib/site-packages/flask/testing.py b/app/src/flask-server/venv/Lib/site-packages/flask/testing.py new file mode 100644 index 0000000..69aa785 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/flask/testing.py @@ -0,0 +1,295 @@ +from __future__ import annotations + +import importlib.metadata +import typing as t +from contextlib import contextmanager +from contextlib import ExitStack +from copy import copy +from types import TracebackType +from urllib.parse import urlsplit + +import werkzeug.test +from click.testing import CliRunner +from werkzeug.test import Client +from werkzeug.wrappers import Request as BaseRequest + +from .cli import ScriptInfo +from .sessions import SessionMixin + +if t.TYPE_CHECKING: # pragma: no cover + from werkzeug.test import TestResponse + + from .app import Flask + + +class EnvironBuilder(werkzeug.test.EnvironBuilder): + """An :class:`~werkzeug.test.EnvironBuilder`, that takes defaults from the + application. + + :param app: The Flask application to configure the environment from. + :param path: URL path being requested. + :param base_url: Base URL where the app is being served, which + ``path`` is relative to. If not given, built from + :data:`PREFERRED_URL_SCHEME`, ``subdomain``, + :data:`SERVER_NAME`, and :data:`APPLICATION_ROOT`. + :param subdomain: Subdomain name to append to :data:`SERVER_NAME`. + :param url_scheme: Scheme to use instead of + :data:`PREFERRED_URL_SCHEME`. + :param json: If given, this is serialized as JSON and passed as + ``data``. Also defaults ``content_type`` to + ``application/json``. + :param args: other positional arguments passed to + :class:`~werkzeug.test.EnvironBuilder`. + :param kwargs: other keyword arguments passed to + :class:`~werkzeug.test.EnvironBuilder`. + """ + + def __init__( + self, + app: Flask, + path: str = "/", + base_url: str | None = None, + subdomain: str | None = None, + url_scheme: str | None = None, + *args: t.Any, + **kwargs: t.Any, + ) -> None: + assert not (base_url or subdomain or url_scheme) or ( + base_url is not None + ) != bool( + subdomain or url_scheme + ), 'Cannot pass "subdomain" or "url_scheme" with "base_url".' + + if base_url is None: + http_host = app.config.get("SERVER_NAME") or "localhost" + app_root = app.config["APPLICATION_ROOT"] + + if subdomain: + http_host = f"{subdomain}.{http_host}" + + if url_scheme is None: + url_scheme = app.config["PREFERRED_URL_SCHEME"] + + url = urlsplit(path) + base_url = ( + f"{url.scheme or url_scheme}://{url.netloc or http_host}" + f"/{app_root.lstrip('/')}" + ) + path = url.path + + if url.query: + sep = b"?" if isinstance(url.query, bytes) else "?" + path += sep + url.query + + self.app = app + super().__init__(path, base_url, *args, **kwargs) + + def json_dumps(self, obj: t.Any, **kwargs: t.Any) -> str: # type: ignore + """Serialize ``obj`` to a JSON-formatted string. + + The serialization will be configured according to the config associated + with this EnvironBuilder's ``app``. + """ + return self.app.json.dumps(obj, **kwargs) + + +_werkzeug_version = "" + + +def _get_werkzeug_version() -> str: + global _werkzeug_version + + if not _werkzeug_version: + _werkzeug_version = importlib.metadata.version("werkzeug") + + return _werkzeug_version + + +class FlaskClient(Client): + """Works like a regular Werkzeug test client but has knowledge about + Flask's contexts to defer the cleanup of the request context until + the end of a ``with`` block. For general information about how to + use this class refer to :class:`werkzeug.test.Client`. + + .. versionchanged:: 0.12 + `app.test_client()` includes preset default environment, which can be + set after instantiation of the `app.test_client()` object in + `client.environ_base`. + + Basic usage is outlined in the :doc:`/testing` chapter. + """ + + application: Flask + + def __init__(self, *args: t.Any, **kwargs: t.Any) -> None: + super().__init__(*args, **kwargs) + self.preserve_context = False + self._new_contexts: list[t.ContextManager[t.Any]] = [] + self._context_stack = ExitStack() + self.environ_base = { + "REMOTE_ADDR": "127.0.0.1", + "HTTP_USER_AGENT": f"Werkzeug/{_get_werkzeug_version()}", + } + + @contextmanager + def session_transaction( + self, *args: t.Any, **kwargs: t.Any + ) -> t.Generator[SessionMixin, None, None]: + """When used in combination with a ``with`` statement this opens a + session transaction. This can be used to modify the session that + the test client uses. Once the ``with`` block is left the session is + stored back. + + :: + + with client.session_transaction() as session: + session['value'] = 42 + + Internally this is implemented by going through a temporary test + request context and since session handling could depend on + request variables this function accepts the same arguments as + :meth:`~flask.Flask.test_request_context` which are directly + passed through. + """ + if self._cookies is None: + raise TypeError( + "Cookies are disabled. Create a client with 'use_cookies=True'." + ) + + app = self.application + ctx = app.test_request_context(*args, **kwargs) + self._add_cookies_to_wsgi(ctx.request.environ) + + with ctx: + sess = app.session_interface.open_session(app, ctx.request) + + if sess is None: + raise RuntimeError("Session backend did not open a session.") + + yield sess + resp = app.response_class() + + if app.session_interface.is_null_session(sess): + return + + with ctx: + app.session_interface.save_session(app, sess, resp) + + self._update_cookies_from_response( + ctx.request.host.partition(":")[0], + ctx.request.path, + resp.headers.getlist("Set-Cookie"), + ) + + def _copy_environ(self, other): + out = {**self.environ_base, **other} + + if self.preserve_context: + out["werkzeug.debug.preserve_context"] = self._new_contexts.append + + return out + + def _request_from_builder_args(self, args, kwargs): + kwargs["environ_base"] = self._copy_environ(kwargs.get("environ_base", {})) + builder = EnvironBuilder(self.application, *args, **kwargs) + + try: + return builder.get_request() + finally: + builder.close() + + def open( + self, + *args: t.Any, + buffered: bool = False, + follow_redirects: bool = False, + **kwargs: t.Any, + ) -> TestResponse: + if args and isinstance( + args[0], (werkzeug.test.EnvironBuilder, dict, BaseRequest) + ): + if isinstance(args[0], werkzeug.test.EnvironBuilder): + builder = copy(args[0]) + builder.environ_base = self._copy_environ(builder.environ_base or {}) + request = builder.get_request() + elif isinstance(args[0], dict): + request = EnvironBuilder.from_environ( + args[0], app=self.application, environ_base=self._copy_environ({}) + ).get_request() + else: + # isinstance(args[0], BaseRequest) + request = copy(args[0]) + request.environ = self._copy_environ(request.environ) + else: + # request is None + request = self._request_from_builder_args(args, kwargs) + + # Pop any previously preserved contexts. This prevents contexts + # from being preserved across redirects or multiple requests + # within a single block. + self._context_stack.close() + + response = super().open( + request, + buffered=buffered, + follow_redirects=follow_redirects, + ) + response.json_module = self.application.json # type: ignore[assignment] + + # Re-push contexts that were preserved during the request. + while self._new_contexts: + cm = self._new_contexts.pop() + self._context_stack.enter_context(cm) + + return response + + def __enter__(self) -> FlaskClient: + if self.preserve_context: + raise RuntimeError("Cannot nest client invocations") + self.preserve_context = True + return self + + def __exit__( + self, + exc_type: type | None, + exc_value: BaseException | None, + tb: TracebackType | None, + ) -> None: + self.preserve_context = False + self._context_stack.close() + + +class FlaskCliRunner(CliRunner): + """A :class:`~click.testing.CliRunner` for testing a Flask app's + CLI commands. Typically created using + :meth:`~flask.Flask.test_cli_runner`. See :ref:`testing-cli`. + """ + + def __init__(self, app: Flask, **kwargs: t.Any) -> None: + self.app = app + super().__init__(**kwargs) + + def invoke( # type: ignore + self, cli: t.Any = None, args: t.Any = None, **kwargs: t.Any + ) -> t.Any: + """Invokes a CLI command in an isolated environment. See + :meth:`CliRunner.invoke ` for + full method documentation. See :ref:`testing-cli` for examples. + + If the ``obj`` argument is not given, passes an instance of + :class:`~flask.cli.ScriptInfo` that knows how to load the Flask + app being tested. + + :param cli: Command object to invoke. Default is the app's + :attr:`~flask.app.Flask.cli` group. + :param args: List of strings to invoke the command with. + + :return: a :class:`~click.testing.Result` object. + """ + if cli is None: + cli = self.app.cli # type: ignore + + if "obj" not in kwargs: + kwargs["obj"] = ScriptInfo(create_app=lambda: self.app) + + return super().invoke(cli, args, **kwargs) diff --git a/app/src/flask-server/venv/Lib/site-packages/flask/typing.py b/app/src/flask-server/venv/Lib/site-packages/flask/typing.py new file mode 100644 index 0000000..a8c9ba0 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/flask/typing.py @@ -0,0 +1,88 @@ +from __future__ import annotations + +import typing as t + +if t.TYPE_CHECKING: # pragma: no cover + from _typeshed.wsgi import WSGIApplication # noqa: F401 + from werkzeug.datastructures import Headers # noqa: F401 + from werkzeug.sansio.response import Response # noqa: F401 + +# The possible types that are directly convertible or are a Response object. +ResponseValue = t.Union[ + "Response", + str, + bytes, + t.List[t.Any], + # Only dict is actually accepted, but Mapping allows for TypedDict. + t.Mapping[str, t.Any], + t.Iterator[str], + t.Iterator[bytes], +] + +# the possible types for an individual HTTP header +# This should be a Union, but mypy doesn't pass unless it's a TypeVar. +HeaderValue = t.Union[str, t.List[str], t.Tuple[str, ...]] + +# the possible types for HTTP headers +HeadersValue = t.Union[ + "Headers", + t.Mapping[str, HeaderValue], + t.Sequence[t.Tuple[str, HeaderValue]], +] + +# The possible types returned by a route function. +ResponseReturnValue = t.Union[ + ResponseValue, + t.Tuple[ResponseValue, HeadersValue], + t.Tuple[ResponseValue, int], + t.Tuple[ResponseValue, int, HeadersValue], + "WSGIApplication", +] + +# Allow any subclass of werkzeug.Response, such as the one from Flask, +# as a callback argument. Using werkzeug.Response directly makes a +# callback annotated with flask.Response fail type checking. +ResponseClass = t.TypeVar("ResponseClass", bound="Response") + +AppOrBlueprintKey = t.Optional[str] # The App key is None, whereas blueprints are named +AfterRequestCallable = t.Union[ + t.Callable[[ResponseClass], ResponseClass], + t.Callable[[ResponseClass], t.Awaitable[ResponseClass]], +] +BeforeFirstRequestCallable = t.Union[ + t.Callable[[], None], t.Callable[[], t.Awaitable[None]] +] +BeforeRequestCallable = t.Union[ + t.Callable[[], t.Optional[ResponseReturnValue]], + t.Callable[[], t.Awaitable[t.Optional[ResponseReturnValue]]], +] +ShellContextProcessorCallable = t.Callable[[], t.Dict[str, t.Any]] +TeardownCallable = t.Union[ + t.Callable[[t.Optional[BaseException]], None], + t.Callable[[t.Optional[BaseException]], t.Awaitable[None]], +] +TemplateContextProcessorCallable = t.Union[ + t.Callable[[], t.Dict[str, t.Any]], + t.Callable[[], t.Awaitable[t.Dict[str, t.Any]]], +] +TemplateFilterCallable = t.Callable[..., t.Any] +TemplateGlobalCallable = t.Callable[..., t.Any] +TemplateTestCallable = t.Callable[..., bool] +URLDefaultCallable = t.Callable[[str, dict], None] +URLValuePreprocessorCallable = t.Callable[[t.Optional[str], t.Optional[dict]], None] + +# This should take Exception, but that either breaks typing the argument +# with a specific exception, or decorating multiple times with different +# exceptions (and using a union type on the argument). +# https://github.com/pallets/flask/issues/4095 +# https://github.com/pallets/flask/issues/4295 +# https://github.com/pallets/flask/issues/4297 +ErrorHandlerCallable = t.Union[ + t.Callable[[t.Any], ResponseReturnValue], + t.Callable[[t.Any], t.Awaitable[ResponseReturnValue]], +] + +RouteCallable = t.Union[ + t.Callable[..., ResponseReturnValue], + t.Callable[..., t.Awaitable[ResponseReturnValue]], +] diff --git a/app/src/flask-server/venv/Lib/site-packages/flask/views.py b/app/src/flask-server/venv/Lib/site-packages/flask/views.py new file mode 100644 index 0000000..c7a2b62 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/flask/views.py @@ -0,0 +1,190 @@ +from __future__ import annotations + +import typing as t + +from . import typing as ft +from .globals import current_app +from .globals import request + + +http_method_funcs = frozenset( + ["get", "post", "head", "options", "delete", "put", "trace", "patch"] +) + + +class View: + """Subclass this class and override :meth:`dispatch_request` to + create a generic class-based view. Call :meth:`as_view` to create a + view function that creates an instance of the class with the given + arguments and calls its ``dispatch_request`` method with any URL + variables. + + See :doc:`views` for a detailed guide. + + .. code-block:: python + + class Hello(View): + init_every_request = False + + def dispatch_request(self, name): + return f"Hello, {name}!" + + app.add_url_rule( + "/hello/", view_func=Hello.as_view("hello") + ) + + Set :attr:`methods` on the class to change what methods the view + accepts. + + Set :attr:`decorators` on the class to apply a list of decorators to + the generated view function. Decorators applied to the class itself + will not be applied to the generated view function! + + Set :attr:`init_every_request` to ``False`` for efficiency, unless + you need to store request-global data on ``self``. + """ + + #: The methods this view is registered for. Uses the same default + #: (``["GET", "HEAD", "OPTIONS"]``) as ``route`` and + #: ``add_url_rule`` by default. + methods: t.ClassVar[t.Collection[str] | None] = None + + #: Control whether the ``OPTIONS`` method is handled automatically. + #: Uses the same default (``True``) as ``route`` and + #: ``add_url_rule`` by default. + provide_automatic_options: t.ClassVar[bool | None] = None + + #: A list of decorators to apply, in order, to the generated view + #: function. Remember that ``@decorator`` syntax is applied bottom + #: to top, so the first decorator in the list would be the bottom + #: decorator. + #: + #: .. versionadded:: 0.8 + decorators: t.ClassVar[list[t.Callable]] = [] + + #: Create a new instance of this view class for every request by + #: default. If a view subclass sets this to ``False``, the same + #: instance is used for every request. + #: + #: A single instance is more efficient, especially if complex setup + #: is done during init. However, storing data on ``self`` is no + #: longer safe across requests, and :data:`~flask.g` should be used + #: instead. + #: + #: .. versionadded:: 2.2 + init_every_request: t.ClassVar[bool] = True + + def dispatch_request(self) -> ft.ResponseReturnValue: + """The actual view function behavior. Subclasses must override + this and return a valid response. Any variables from the URL + rule are passed as keyword arguments. + """ + raise NotImplementedError() + + @classmethod + def as_view( + cls, name: str, *class_args: t.Any, **class_kwargs: t.Any + ) -> ft.RouteCallable: + """Convert the class into a view function that can be registered + for a route. + + By default, the generated view will create a new instance of the + view class for every request and call its + :meth:`dispatch_request` method. If the view class sets + :attr:`init_every_request` to ``False``, the same instance will + be used for every request. + + Except for ``name``, all other arguments passed to this method + are forwarded to the view class ``__init__`` method. + + .. versionchanged:: 2.2 + Added the ``init_every_request`` class attribute. + """ + if cls.init_every_request: + + def view(**kwargs: t.Any) -> ft.ResponseReturnValue: + self = view.view_class( # type: ignore[attr-defined] + *class_args, **class_kwargs + ) + return current_app.ensure_sync(self.dispatch_request)(**kwargs) + + else: + self = cls(*class_args, **class_kwargs) + + def view(**kwargs: t.Any) -> ft.ResponseReturnValue: + return current_app.ensure_sync(self.dispatch_request)(**kwargs) + + if cls.decorators: + view.__name__ = name + view.__module__ = cls.__module__ + for decorator in cls.decorators: + view = decorator(view) + + # We attach the view class to the view function for two reasons: + # first of all it allows us to easily figure out what class-based + # view this thing came from, secondly it's also used for instantiating + # the view class so you can actually replace it with something else + # for testing purposes and debugging. + view.view_class = cls # type: ignore + view.__name__ = name + view.__doc__ = cls.__doc__ + view.__module__ = cls.__module__ + view.methods = cls.methods # type: ignore + view.provide_automatic_options = cls.provide_automatic_options # type: ignore + return view + + +class MethodView(View): + """Dispatches request methods to the corresponding instance methods. + For example, if you implement a ``get`` method, it will be used to + handle ``GET`` requests. + + This can be useful for defining a REST API. + + :attr:`methods` is automatically set based on the methods defined on + the class. + + See :doc:`views` for a detailed guide. + + .. code-block:: python + + class CounterAPI(MethodView): + def get(self): + return str(session.get("counter", 0)) + + def post(self): + session["counter"] = session.get("counter", 0) + 1 + return redirect(url_for("counter")) + + app.add_url_rule( + "/counter", view_func=CounterAPI.as_view("counter") + ) + """ + + def __init_subclass__(cls, **kwargs: t.Any) -> None: + super().__init_subclass__(**kwargs) + + if "methods" not in cls.__dict__: + methods = set() + + for base in cls.__bases__: + if getattr(base, "methods", None): + methods.update(base.methods) # type: ignore[attr-defined] + + for key in http_method_funcs: + if hasattr(cls, key): + methods.add(key.upper()) + + if methods: + cls.methods = methods + + def dispatch_request(self, **kwargs: t.Any) -> ft.ResponseReturnValue: + meth = getattr(self, request.method.lower(), None) + + # If the request method is HEAD and we don't have a handler for it + # retry with GET. + if meth is None and request.method == "HEAD": + meth = getattr(self, "get", None) + + assert meth is not None, f"Unimplemented method {request.method!r}" + return current_app.ensure_sync(meth)(**kwargs) diff --git a/app/src/flask-server/venv/Lib/site-packages/flask/wrappers.py b/app/src/flask-server/venv/Lib/site-packages/flask/wrappers.py new file mode 100644 index 0000000..ef7aa38 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/flask/wrappers.py @@ -0,0 +1,173 @@ +from __future__ import annotations + +import typing as t + +from werkzeug.exceptions import BadRequest +from werkzeug.wrappers import Request as RequestBase +from werkzeug.wrappers import Response as ResponseBase + +from . import json +from .globals import current_app +from .helpers import _split_blueprint_path + +if t.TYPE_CHECKING: # pragma: no cover + from werkzeug.routing import Rule + + +class Request(RequestBase): + """The request object used by default in Flask. Remembers the + matched endpoint and view arguments. + + It is what ends up as :class:`~flask.request`. If you want to replace + the request object used you can subclass this and set + :attr:`~flask.Flask.request_class` to your subclass. + + The request object is a :class:`~werkzeug.wrappers.Request` subclass and + provides all of the attributes Werkzeug defines plus a few Flask + specific ones. + """ + + json_module: t.Any = json + + #: The internal URL rule that matched the request. This can be + #: useful to inspect which methods are allowed for the URL from + #: a before/after handler (``request.url_rule.methods``) etc. + #: Though if the request's method was invalid for the URL rule, + #: the valid list is available in ``routing_exception.valid_methods`` + #: instead (an attribute of the Werkzeug exception + #: :exc:`~werkzeug.exceptions.MethodNotAllowed`) + #: because the request was never internally bound. + #: + #: .. versionadded:: 0.6 + url_rule: Rule | None = None + + #: A dict of view arguments that matched the request. If an exception + #: happened when matching, this will be ``None``. + view_args: dict[str, t.Any] | None = None + + #: If matching the URL failed, this is the exception that will be + #: raised / was raised as part of the request handling. This is + #: usually a :exc:`~werkzeug.exceptions.NotFound` exception or + #: something similar. + routing_exception: Exception | None = None + + @property + def max_content_length(self) -> int | None: # type: ignore + """Read-only view of the ``MAX_CONTENT_LENGTH`` config key.""" + if current_app: + return current_app.config["MAX_CONTENT_LENGTH"] + else: + return None + + @property + def endpoint(self) -> str | None: + """The endpoint that matched the request URL. + + This will be ``None`` if matching failed or has not been + performed yet. + + This in combination with :attr:`view_args` can be used to + reconstruct the same URL or a modified URL. + """ + if self.url_rule is not None: + return self.url_rule.endpoint + + return None + + @property + def blueprint(self) -> str | None: + """The registered name of the current blueprint. + + This will be ``None`` if the endpoint is not part of a + blueprint, or if URL matching failed or has not been performed + yet. + + This does not necessarily match the name the blueprint was + created with. It may have been nested, or registered with a + different name. + """ + endpoint = self.endpoint + + if endpoint is not None and "." in endpoint: + return endpoint.rpartition(".")[0] + + return None + + @property + def blueprints(self) -> list[str]: + """The registered names of the current blueprint upwards through + parent blueprints. + + This will be an empty list if there is no current blueprint, or + if URL matching failed. + + .. versionadded:: 2.0.1 + """ + name = self.blueprint + + if name is None: + return [] + + return _split_blueprint_path(name) + + def _load_form_data(self) -> None: + super()._load_form_data() + + # In debug mode we're replacing the files multidict with an ad-hoc + # subclass that raises a different error for key errors. + if ( + current_app + and current_app.debug + and self.mimetype != "multipart/form-data" + and not self.files + ): + from .debughelpers import attach_enctype_error_multidict + + attach_enctype_error_multidict(self) + + def on_json_loading_failed(self, e: ValueError | None) -> t.Any: + try: + return super().on_json_loading_failed(e) + except BadRequest as e: + if current_app and current_app.debug: + raise + + raise BadRequest() from e + + +class Response(ResponseBase): + """The response object that is used by default in Flask. Works like the + response object from Werkzeug but is set to have an HTML mimetype by + default. Quite often you don't have to create this object yourself because + :meth:`~flask.Flask.make_response` will take care of that for you. + + If you want to replace the response object used you can subclass this and + set :attr:`~flask.Flask.response_class` to your subclass. + + .. versionchanged:: 1.0 + JSON support is added to the response, like the request. This is useful + when testing to get the test client response data as JSON. + + .. versionchanged:: 1.0 + + Added :attr:`max_cookie_size`. + """ + + default_mimetype: str | None = "text/html" + + json_module = json + + autocorrect_location_header = False + + @property + def max_cookie_size(self) -> int: # type: ignore + """Read-only view of the :data:`MAX_COOKIE_SIZE` config key. + + See :attr:`~werkzeug.wrappers.Response.max_cookie_size` in + Werkzeug's docs. + """ + if current_app: + return current_app.config["MAX_COOKIE_SIZE"] + + # return Werkzeug's default when not in an app context + return super().max_cookie_size diff --git a/app/src/flask-server/venv/Lib/site-packages/itsdangerous-2.1.2.dist-info/INSTALLER b/app/src/flask-server/venv/Lib/site-packages/itsdangerous-2.1.2.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/itsdangerous-2.1.2.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/app/src/flask-server/venv/Lib/site-packages/itsdangerous-2.1.2.dist-info/LICENSE.rst b/app/src/flask-server/venv/Lib/site-packages/itsdangerous-2.1.2.dist-info/LICENSE.rst new file mode 100644 index 0000000..7b190ca --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/itsdangerous-2.1.2.dist-info/LICENSE.rst @@ -0,0 +1,28 @@ +Copyright 2011 Pallets + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/app/src/flask-server/venv/Lib/site-packages/itsdangerous-2.1.2.dist-info/METADATA b/app/src/flask-server/venv/Lib/site-packages/itsdangerous-2.1.2.dist-info/METADATA new file mode 100644 index 0000000..1d935ed --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/itsdangerous-2.1.2.dist-info/METADATA @@ -0,0 +1,97 @@ +Metadata-Version: 2.1 +Name: itsdangerous +Version: 2.1.2 +Summary: Safely pass data to untrusted environments and back. +Home-page: https://palletsprojects.com/p/itsdangerous/ +Author: Armin Ronacher +Author-email: armin.ronacher@active-4.com +Maintainer: Pallets +Maintainer-email: contact@palletsprojects.com +License: BSD-3-Clause +Project-URL: Donate, https://palletsprojects.com/donate +Project-URL: Documentation, https://itsdangerous.palletsprojects.com/ +Project-URL: Changes, https://itsdangerous.palletsprojects.com/changes/ +Project-URL: Source Code, https://github.com/pallets/itsdangerous/ +Project-URL: Issue Tracker, https://github.com/pallets/itsdangerous/issues/ +Project-URL: Twitter, https://twitter.com/PalletsTeam +Project-URL: Chat, https://discord.gg/pallets +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Requires-Python: >=3.7 +Description-Content-Type: text/x-rst +License-File: LICENSE.rst + +ItsDangerous +============ + +... so better sign this + +Various helpers to pass data to untrusted environments and to get it +back safe and sound. Data is cryptographically signed to ensure that a +token has not been tampered with. + +It's possible to customize how data is serialized. Data is compressed as +needed. A timestamp can be added and verified automatically while +loading a token. + + +Installing +---------- + +Install and update using `pip`_: + +.. code-block:: text + + pip install -U itsdangerous + +.. _pip: https://pip.pypa.io/en/stable/getting-started/ + + +A Simple Example +---------------- + +Here's how you could generate a token for transmitting a user's id and +name between web requests. + +.. code-block:: python + + from itsdangerous import URLSafeSerializer + auth_s = URLSafeSerializer("secret key", "auth") + token = auth_s.dumps({"id": 5, "name": "itsdangerous"}) + + print(token) + # eyJpZCI6NSwibmFtZSI6Iml0c2Rhbmdlcm91cyJ9.6YP6T0BaO67XP--9UzTrmurXSmg + + data = auth_s.loads(token) + print(data["name"]) + # itsdangerous + + +Donate +------ + +The Pallets organization develops and supports ItsDangerous and other +popular packages. In order to grow the community of contributors and +users, and allow the maintainers to devote more time to the projects, +`please donate today`_. + +.. _please donate today: https://palletsprojects.com/donate + + +Links +----- + +- Documentation: https://itsdangerous.palletsprojects.com/ +- Changes: https://itsdangerous.palletsprojects.com/changes/ +- PyPI Releases: https://pypi.org/project/ItsDangerous/ +- Source Code: https://github.com/pallets/itsdangerous/ +- Issue Tracker: https://github.com/pallets/itsdangerous/issues/ +- Website: https://palletsprojects.com/p/itsdangerous/ +- Twitter: https://twitter.com/PalletsTeam +- Chat: https://discord.gg/pallets + + diff --git a/app/src/flask-server/venv/Lib/site-packages/itsdangerous-2.1.2.dist-info/RECORD b/app/src/flask-server/venv/Lib/site-packages/itsdangerous-2.1.2.dist-info/RECORD new file mode 100644 index 0000000..d3a279a --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/itsdangerous-2.1.2.dist-info/RECORD @@ -0,0 +1,23 @@ +itsdangerous-2.1.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +itsdangerous-2.1.2.dist-info/LICENSE.rst,sha256=Y68JiRtr6K0aQlLtQ68PTvun_JSOIoNnvtfzxa4LCdc,1475 +itsdangerous-2.1.2.dist-info/METADATA,sha256=ThrHIJQ_6XlfbDMCAVe_hawT7IXiIxnTBIDrwxxtucQ,2928 +itsdangerous-2.1.2.dist-info/RECORD,, +itsdangerous-2.1.2.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92 +itsdangerous-2.1.2.dist-info/top_level.txt,sha256=gKN1OKLk81i7fbWWildJA88EQ9NhnGMSvZqhfz9ICjk,13 +itsdangerous/__init__.py,sha256=n4mkyjlIVn23pgsgCIw0MJKPdcHIetyeRpe5Fwsn8qg,876 +itsdangerous/__pycache__/__init__.cpython-310.pyc,, +itsdangerous/__pycache__/_json.cpython-310.pyc,, +itsdangerous/__pycache__/encoding.cpython-310.pyc,, +itsdangerous/__pycache__/exc.cpython-310.pyc,, +itsdangerous/__pycache__/serializer.cpython-310.pyc,, +itsdangerous/__pycache__/signer.cpython-310.pyc,, +itsdangerous/__pycache__/timed.cpython-310.pyc,, +itsdangerous/__pycache__/url_safe.cpython-310.pyc,, +itsdangerous/_json.py,sha256=wIhs_7-_XZolmyr-JvKNiy_LgAcfevYR0qhCVdlIhg8,450 +itsdangerous/encoding.py,sha256=pgh86snHC76dPLNCnPlrjR5SaYL_M8H-gWRiiLNbhCU,1419 +itsdangerous/exc.py,sha256=VFxmP2lMoSJFqxNMzWonqs35ROII4-fvCBfG0v1Tkbs,3206 +itsdangerous/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +itsdangerous/serializer.py,sha256=zgZ1-U705jHDpt62x_pmLJdryEKDNAbt5UkJtnkcCSw,11144 +itsdangerous/signer.py,sha256=QUH0iX0in-OTptMAXKU5zWMwmOCXn1fsDsubXiGdFN4,9367 +itsdangerous/timed.py,sha256=5CBWLds4Nm8-3bFVC8RxNzFjx6PSwjch8wuZ5cwcHFI,8174 +itsdangerous/url_safe.py,sha256=5bC4jSKOjWNRkWrFseifWVXUnHnPgwOLROjiOwb-eeo,2402 diff --git a/app/src/flask-server/venv/Lib/site-packages/itsdangerous-2.1.2.dist-info/WHEEL b/app/src/flask-server/venv/Lib/site-packages/itsdangerous-2.1.2.dist-info/WHEEL new file mode 100644 index 0000000..becc9a6 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/itsdangerous-2.1.2.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.37.1) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/app/src/flask-server/venv/Lib/site-packages/itsdangerous-2.1.2.dist-info/top_level.txt b/app/src/flask-server/venv/Lib/site-packages/itsdangerous-2.1.2.dist-info/top_level.txt new file mode 100644 index 0000000..e163955 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/itsdangerous-2.1.2.dist-info/top_level.txt @@ -0,0 +1 @@ +itsdangerous diff --git a/app/src/flask-server/venv/Lib/site-packages/itsdangerous/__init__.py b/app/src/flask-server/venv/Lib/site-packages/itsdangerous/__init__.py new file mode 100644 index 0000000..fdb2dfd --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/itsdangerous/__init__.py @@ -0,0 +1,19 @@ +from .encoding import base64_decode as base64_decode +from .encoding import base64_encode as base64_encode +from .encoding import want_bytes as want_bytes +from .exc import BadData as BadData +from .exc import BadHeader as BadHeader +from .exc import BadPayload as BadPayload +from .exc import BadSignature as BadSignature +from .exc import BadTimeSignature as BadTimeSignature +from .exc import SignatureExpired as SignatureExpired +from .serializer import Serializer as Serializer +from .signer import HMACAlgorithm as HMACAlgorithm +from .signer import NoneAlgorithm as NoneAlgorithm +from .signer import Signer as Signer +from .timed import TimedSerializer as TimedSerializer +from .timed import TimestampSigner as TimestampSigner +from .url_safe import URLSafeSerializer as URLSafeSerializer +from .url_safe import URLSafeTimedSerializer as URLSafeTimedSerializer + +__version__ = "2.1.2" diff --git a/app/src/flask-server/venv/Lib/site-packages/itsdangerous/__pycache__/__init__.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/itsdangerous/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000..b80fad1 Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/itsdangerous/__pycache__/__init__.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/itsdangerous/__pycache__/_json.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/itsdangerous/__pycache__/_json.cpython-310.pyc new file mode 100644 index 0000000..e789af5 Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/itsdangerous/__pycache__/_json.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/itsdangerous/__pycache__/encoding.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/itsdangerous/__pycache__/encoding.cpython-310.pyc new file mode 100644 index 0000000..4042548 Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/itsdangerous/__pycache__/encoding.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/itsdangerous/__pycache__/exc.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/itsdangerous/__pycache__/exc.cpython-310.pyc new file mode 100644 index 0000000..3c9d403 Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/itsdangerous/__pycache__/exc.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/itsdangerous/__pycache__/serializer.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/itsdangerous/__pycache__/serializer.cpython-310.pyc new file mode 100644 index 0000000..ac673d3 Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/itsdangerous/__pycache__/serializer.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/itsdangerous/__pycache__/signer.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/itsdangerous/__pycache__/signer.cpython-310.pyc new file mode 100644 index 0000000..153d6ed Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/itsdangerous/__pycache__/signer.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/itsdangerous/__pycache__/timed.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/itsdangerous/__pycache__/timed.cpython-310.pyc new file mode 100644 index 0000000..20f8083 Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/itsdangerous/__pycache__/timed.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/itsdangerous/__pycache__/url_safe.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/itsdangerous/__pycache__/url_safe.cpython-310.pyc new file mode 100644 index 0000000..dbcb779 Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/itsdangerous/__pycache__/url_safe.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/itsdangerous/_json.py b/app/src/flask-server/venv/Lib/site-packages/itsdangerous/_json.py new file mode 100644 index 0000000..c70d37a --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/itsdangerous/_json.py @@ -0,0 +1,16 @@ +import json as _json +import typing as _t + + +class _CompactJSON: + """Wrapper around json module that strips whitespace.""" + + @staticmethod + def loads(payload: _t.Union[str, bytes]) -> _t.Any: + return _json.loads(payload) + + @staticmethod + def dumps(obj: _t.Any, **kwargs: _t.Any) -> str: + kwargs.setdefault("ensure_ascii", False) + kwargs.setdefault("separators", (",", ":")) + return _json.dumps(obj, **kwargs) diff --git a/app/src/flask-server/venv/Lib/site-packages/itsdangerous/encoding.py b/app/src/flask-server/venv/Lib/site-packages/itsdangerous/encoding.py new file mode 100644 index 0000000..edb04d1 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/itsdangerous/encoding.py @@ -0,0 +1,54 @@ +import base64 +import string +import struct +import typing as _t + +from .exc import BadData + +_t_str_bytes = _t.Union[str, bytes] + + +def want_bytes( + s: _t_str_bytes, encoding: str = "utf-8", errors: str = "strict" +) -> bytes: + if isinstance(s, str): + s = s.encode(encoding, errors) + + return s + + +def base64_encode(string: _t_str_bytes) -> bytes: + """Base64 encode a string of bytes or text. The resulting bytes are + safe to use in URLs. + """ + string = want_bytes(string) + return base64.urlsafe_b64encode(string).rstrip(b"=") + + +def base64_decode(string: _t_str_bytes) -> bytes: + """Base64 decode a URL-safe string of bytes or text. The result is + bytes. + """ + string = want_bytes(string, encoding="ascii", errors="ignore") + string += b"=" * (-len(string) % 4) + + try: + return base64.urlsafe_b64decode(string) + except (TypeError, ValueError) as e: + raise BadData("Invalid base64-encoded data") from e + + +# The alphabet used by base64.urlsafe_* +_base64_alphabet = f"{string.ascii_letters}{string.digits}-_=".encode("ascii") + +_int64_struct = struct.Struct(">Q") +_int_to_bytes = _int64_struct.pack +_bytes_to_int = _t.cast("_t.Callable[[bytes], _t.Tuple[int]]", _int64_struct.unpack) + + +def int_to_bytes(num: int) -> bytes: + return _int_to_bytes(num).lstrip(b"\x00") + + +def bytes_to_int(bytestr: bytes) -> int: + return _bytes_to_int(bytestr.rjust(8, b"\x00"))[0] diff --git a/app/src/flask-server/venv/Lib/site-packages/itsdangerous/exc.py b/app/src/flask-server/venv/Lib/site-packages/itsdangerous/exc.py new file mode 100644 index 0000000..c38a6af --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/itsdangerous/exc.py @@ -0,0 +1,107 @@ +import typing as _t +from datetime import datetime + +_t_opt_any = _t.Optional[_t.Any] +_t_opt_exc = _t.Optional[Exception] + + +class BadData(Exception): + """Raised if bad data of any sort was encountered. This is the base + for all exceptions that ItsDangerous defines. + + .. versionadded:: 0.15 + """ + + def __init__(self, message: str): + super().__init__(message) + self.message = message + + def __str__(self) -> str: + return self.message + + +class BadSignature(BadData): + """Raised if a signature does not match.""" + + def __init__(self, message: str, payload: _t_opt_any = None): + super().__init__(message) + + #: The payload that failed the signature test. In some + #: situations you might still want to inspect this, even if + #: you know it was tampered with. + #: + #: .. versionadded:: 0.14 + self.payload: _t_opt_any = payload + + +class BadTimeSignature(BadSignature): + """Raised if a time-based signature is invalid. This is a subclass + of :class:`BadSignature`. + """ + + def __init__( + self, + message: str, + payload: _t_opt_any = None, + date_signed: _t.Optional[datetime] = None, + ): + super().__init__(message, payload) + + #: If the signature expired this exposes the date of when the + #: signature was created. This can be helpful in order to + #: tell the user how long a link has been gone stale. + #: + #: .. versionchanged:: 2.0 + #: The datetime value is timezone-aware rather than naive. + #: + #: .. versionadded:: 0.14 + self.date_signed = date_signed + + +class SignatureExpired(BadTimeSignature): + """Raised if a signature timestamp is older than ``max_age``. This + is a subclass of :exc:`BadTimeSignature`. + """ + + +class BadHeader(BadSignature): + """Raised if a signed header is invalid in some form. This only + happens for serializers that have a header that goes with the + signature. + + .. versionadded:: 0.24 + """ + + def __init__( + self, + message: str, + payload: _t_opt_any = None, + header: _t_opt_any = None, + original_error: _t_opt_exc = None, + ): + super().__init__(message, payload) + + #: If the header is actually available but just malformed it + #: might be stored here. + self.header: _t_opt_any = header + + #: If available, the error that indicates why the payload was + #: not valid. This might be ``None``. + self.original_error: _t_opt_exc = original_error + + +class BadPayload(BadData): + """Raised if a payload is invalid. This could happen if the payload + is loaded despite an invalid signature, or if there is a mismatch + between the serializer and deserializer. The original exception + that occurred during loading is stored on as :attr:`original_error`. + + .. versionadded:: 0.15 + """ + + def __init__(self, message: str, original_error: _t_opt_exc = None): + super().__init__(message) + + #: If available, the error that indicates why the payload was + #: not valid. This might be ``None``. + self.original_error: _t_opt_exc = original_error diff --git a/app/src/flask-server/venv/Lib/site-packages/itsdangerous/py.typed b/app/src/flask-server/venv/Lib/site-packages/itsdangerous/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/app/src/flask-server/venv/Lib/site-packages/itsdangerous/serializer.py b/app/src/flask-server/venv/Lib/site-packages/itsdangerous/serializer.py new file mode 100644 index 0000000..9f4a84a --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/itsdangerous/serializer.py @@ -0,0 +1,295 @@ +import json +import typing as _t + +from .encoding import want_bytes +from .exc import BadPayload +from .exc import BadSignature +from .signer import _make_keys_list +from .signer import Signer + +_t_str_bytes = _t.Union[str, bytes] +_t_opt_str_bytes = _t.Optional[_t_str_bytes] +_t_kwargs = _t.Dict[str, _t.Any] +_t_opt_kwargs = _t.Optional[_t_kwargs] +_t_signer = _t.Type[Signer] +_t_fallbacks = _t.List[_t.Union[_t_kwargs, _t.Tuple[_t_signer, _t_kwargs], _t_signer]] +_t_load_unsafe = _t.Tuple[bool, _t.Any] +_t_secret_key = _t.Union[_t.Iterable[_t_str_bytes], _t_str_bytes] + + +def is_text_serializer(serializer: _t.Any) -> bool: + """Checks whether a serializer generates text or binary.""" + return isinstance(serializer.dumps({}), str) + + +class Serializer: + """A serializer wraps a :class:`~itsdangerous.signer.Signer` to + enable serializing and securely signing data other than bytes. It + can unsign to verify that the data hasn't been changed. + + The serializer provides :meth:`dumps` and :meth:`loads`, similar to + :mod:`json`, and by default uses :mod:`json` internally to serialize + the data to bytes. + + The secret key should be a random string of ``bytes`` and should not + be saved to code or version control. Different salts should be used + to distinguish signing in different contexts. See :doc:`/concepts` + for information about the security of the secret key and salt. + + :param secret_key: The secret key to sign and verify with. Can be a + list of keys, oldest to newest, to support key rotation. + :param salt: Extra key to combine with ``secret_key`` to distinguish + signatures in different contexts. + :param serializer: An object that provides ``dumps`` and ``loads`` + methods for serializing data to a string. Defaults to + :attr:`default_serializer`, which defaults to :mod:`json`. + :param serializer_kwargs: Keyword arguments to pass when calling + ``serializer.dumps``. + :param signer: A ``Signer`` class to instantiate when signing data. + Defaults to :attr:`default_signer`, which defaults to + :class:`~itsdangerous.signer.Signer`. + :param signer_kwargs: Keyword arguments to pass when instantiating + the ``Signer`` class. + :param fallback_signers: List of signer parameters to try when + unsigning with the default signer fails. Each item can be a dict + of ``signer_kwargs``, a ``Signer`` class, or a tuple of + ``(signer, signer_kwargs)``. Defaults to + :attr:`default_fallback_signers`. + + .. versionchanged:: 2.0 + Added support for key rotation by passing a list to + ``secret_key``. + + .. versionchanged:: 2.0 + Removed the default SHA-512 fallback signer from + ``default_fallback_signers``. + + .. versionchanged:: 1.1 + Added support for ``fallback_signers`` and configured a default + SHA-512 fallback. This fallback is for users who used the yanked + 1.0.0 release which defaulted to SHA-512. + + .. versionchanged:: 0.14 + The ``signer`` and ``signer_kwargs`` parameters were added to + the constructor. + """ + + #: The default serialization module to use to serialize data to a + #: string internally. The default is :mod:`json`, but can be changed + #: to any object that provides ``dumps`` and ``loads`` methods. + default_serializer: _t.Any = json + + #: The default ``Signer`` class to instantiate when signing data. + #: The default is :class:`itsdangerous.signer.Signer`. + default_signer: _t_signer = Signer + + #: The default fallback signers to try when unsigning fails. + default_fallback_signers: _t_fallbacks = [] + + def __init__( + self, + secret_key: _t_secret_key, + salt: _t_opt_str_bytes = b"itsdangerous", + serializer: _t.Any = None, + serializer_kwargs: _t_opt_kwargs = None, + signer: _t.Optional[_t_signer] = None, + signer_kwargs: _t_opt_kwargs = None, + fallback_signers: _t.Optional[_t_fallbacks] = None, + ): + #: The list of secret keys to try for verifying signatures, from + #: oldest to newest. The newest (last) key is used for signing. + #: + #: This allows a key rotation system to keep a list of allowed + #: keys and remove expired ones. + self.secret_keys: _t.List[bytes] = _make_keys_list(secret_key) + + if salt is not None: + salt = want_bytes(salt) + # if salt is None then the signer's default is used + + self.salt = salt + + if serializer is None: + serializer = self.default_serializer + + self.serializer: _t.Any = serializer + self.is_text_serializer: bool = is_text_serializer(serializer) + + if signer is None: + signer = self.default_signer + + self.signer: _t_signer = signer + self.signer_kwargs: _t_kwargs = signer_kwargs or {} + + if fallback_signers is None: + fallback_signers = list(self.default_fallback_signers or ()) + + self.fallback_signers: _t_fallbacks = fallback_signers + self.serializer_kwargs: _t_kwargs = serializer_kwargs or {} + + @property + def secret_key(self) -> bytes: + """The newest (last) entry in the :attr:`secret_keys` list. This + is for compatibility from before key rotation support was added. + """ + return self.secret_keys[-1] + + def load_payload( + self, payload: bytes, serializer: _t.Optional[_t.Any] = None + ) -> _t.Any: + """Loads the encoded object. This function raises + :class:`.BadPayload` if the payload is not valid. The + ``serializer`` parameter can be used to override the serializer + stored on the class. The encoded ``payload`` should always be + bytes. + """ + if serializer is None: + serializer = self.serializer + is_text = self.is_text_serializer + else: + is_text = is_text_serializer(serializer) + + try: + if is_text: + return serializer.loads(payload.decode("utf-8")) + + return serializer.loads(payload) + except Exception as e: + raise BadPayload( + "Could not load the payload because an exception" + " occurred on unserializing the data.", + original_error=e, + ) from e + + def dump_payload(self, obj: _t.Any) -> bytes: + """Dumps the encoded object. The return value is always bytes. + If the internal serializer returns text, the value will be + encoded as UTF-8. + """ + return want_bytes(self.serializer.dumps(obj, **self.serializer_kwargs)) + + def make_signer(self, salt: _t_opt_str_bytes = None) -> Signer: + """Creates a new instance of the signer to be used. The default + implementation uses the :class:`.Signer` base class. + """ + if salt is None: + salt = self.salt + + return self.signer(self.secret_keys, salt=salt, **self.signer_kwargs) + + def iter_unsigners(self, salt: _t_opt_str_bytes = None) -> _t.Iterator[Signer]: + """Iterates over all signers to be tried for unsigning. Starts + with the configured signer, then constructs each signer + specified in ``fallback_signers``. + """ + if salt is None: + salt = self.salt + + yield self.make_signer(salt) + + for fallback in self.fallback_signers: + if isinstance(fallback, dict): + kwargs = fallback + fallback = self.signer + elif isinstance(fallback, tuple): + fallback, kwargs = fallback + else: + kwargs = self.signer_kwargs + + for secret_key in self.secret_keys: + yield fallback(secret_key, salt=salt, **kwargs) + + def dumps(self, obj: _t.Any, salt: _t_opt_str_bytes = None) -> _t_str_bytes: + """Returns a signed string serialized with the internal + serializer. The return value can be either a byte or unicode + string depending on the format of the internal serializer. + """ + payload = want_bytes(self.dump_payload(obj)) + rv = self.make_signer(salt).sign(payload) + + if self.is_text_serializer: + return rv.decode("utf-8") + + return rv + + def dump(self, obj: _t.Any, f: _t.IO, salt: _t_opt_str_bytes = None) -> None: + """Like :meth:`dumps` but dumps into a file. The file handle has + to be compatible with what the internal serializer expects. + """ + f.write(self.dumps(obj, salt)) + + def loads( + self, s: _t_str_bytes, salt: _t_opt_str_bytes = None, **kwargs: _t.Any + ) -> _t.Any: + """Reverse of :meth:`dumps`. Raises :exc:`.BadSignature` if the + signature validation fails. + """ + s = want_bytes(s) + last_exception = None + + for signer in self.iter_unsigners(salt): + try: + return self.load_payload(signer.unsign(s)) + except BadSignature as err: + last_exception = err + + raise _t.cast(BadSignature, last_exception) + + def load(self, f: _t.IO, salt: _t_opt_str_bytes = None) -> _t.Any: + """Like :meth:`loads` but loads from a file.""" + return self.loads(f.read(), salt) + + def loads_unsafe( + self, s: _t_str_bytes, salt: _t_opt_str_bytes = None + ) -> _t_load_unsafe: + """Like :meth:`loads` but without verifying the signature. This + is potentially very dangerous to use depending on how your + serializer works. The return value is ``(signature_valid, + payload)`` instead of just the payload. The first item will be a + boolean that indicates if the signature is valid. This function + never fails. + + Use it for debugging only and if you know that your serializer + module is not exploitable (for example, do not use it with a + pickle serializer). + + .. versionadded:: 0.15 + """ + return self._loads_unsafe_impl(s, salt) + + def _loads_unsafe_impl( + self, + s: _t_str_bytes, + salt: _t_opt_str_bytes, + load_kwargs: _t_opt_kwargs = None, + load_payload_kwargs: _t_opt_kwargs = None, + ) -> _t_load_unsafe: + """Low level helper function to implement :meth:`loads_unsafe` + in serializer subclasses. + """ + if load_kwargs is None: + load_kwargs = {} + + try: + return True, self.loads(s, salt=salt, **load_kwargs) + except BadSignature as e: + if e.payload is None: + return False, None + + if load_payload_kwargs is None: + load_payload_kwargs = {} + + try: + return ( + False, + self.load_payload(e.payload, **load_payload_kwargs), + ) + except BadPayload: + return False, None + + def load_unsafe(self, f: _t.IO, salt: _t_opt_str_bytes = None) -> _t_load_unsafe: + """Like :meth:`loads_unsafe` but loads from a file. + + .. versionadded:: 0.15 + """ + return self.loads_unsafe(f.read(), salt=salt) diff --git a/app/src/flask-server/venv/Lib/site-packages/itsdangerous/signer.py b/app/src/flask-server/venv/Lib/site-packages/itsdangerous/signer.py new file mode 100644 index 0000000..aa12005 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/itsdangerous/signer.py @@ -0,0 +1,257 @@ +import hashlib +import hmac +import typing as _t + +from .encoding import _base64_alphabet +from .encoding import base64_decode +from .encoding import base64_encode +from .encoding import want_bytes +from .exc import BadSignature + +_t_str_bytes = _t.Union[str, bytes] +_t_opt_str_bytes = _t.Optional[_t_str_bytes] +_t_secret_key = _t.Union[_t.Iterable[_t_str_bytes], _t_str_bytes] + + +class SigningAlgorithm: + """Subclasses must implement :meth:`get_signature` to provide + signature generation functionality. + """ + + def get_signature(self, key: bytes, value: bytes) -> bytes: + """Returns the signature for the given key and value.""" + raise NotImplementedError() + + def verify_signature(self, key: bytes, value: bytes, sig: bytes) -> bool: + """Verifies the given signature matches the expected + signature. + """ + return hmac.compare_digest(sig, self.get_signature(key, value)) + + +class NoneAlgorithm(SigningAlgorithm): + """Provides an algorithm that does not perform any signing and + returns an empty signature. + """ + + def get_signature(self, key: bytes, value: bytes) -> bytes: + return b"" + + +class HMACAlgorithm(SigningAlgorithm): + """Provides signature generation using HMACs.""" + + #: The digest method to use with the MAC algorithm. This defaults to + #: SHA1, but can be changed to any other function in the hashlib + #: module. + default_digest_method: _t.Any = staticmethod(hashlib.sha1) + + def __init__(self, digest_method: _t.Any = None): + if digest_method is None: + digest_method = self.default_digest_method + + self.digest_method: _t.Any = digest_method + + def get_signature(self, key: bytes, value: bytes) -> bytes: + mac = hmac.new(key, msg=value, digestmod=self.digest_method) + return mac.digest() + + +def _make_keys_list(secret_key: _t_secret_key) -> _t.List[bytes]: + if isinstance(secret_key, (str, bytes)): + return [want_bytes(secret_key)] + + return [want_bytes(s) for s in secret_key] + + +class Signer: + """A signer securely signs bytes, then unsigns them to verify that + the value hasn't been changed. + + The secret key should be a random string of ``bytes`` and should not + be saved to code or version control. Different salts should be used + to distinguish signing in different contexts. See :doc:`/concepts` + for information about the security of the secret key and salt. + + :param secret_key: The secret key to sign and verify with. Can be a + list of keys, oldest to newest, to support key rotation. + :param salt: Extra key to combine with ``secret_key`` to distinguish + signatures in different contexts. + :param sep: Separator between the signature and value. + :param key_derivation: How to derive the signing key from the secret + key and salt. Possible values are ``concat``, ``django-concat``, + or ``hmac``. Defaults to :attr:`default_key_derivation`, which + defaults to ``django-concat``. + :param digest_method: Hash function to use when generating the HMAC + signature. Defaults to :attr:`default_digest_method`, which + defaults to :func:`hashlib.sha1`. Note that the security of the + hash alone doesn't apply when used intermediately in HMAC. + :param algorithm: A :class:`SigningAlgorithm` instance to use + instead of building a default :class:`HMACAlgorithm` with the + ``digest_method``. + + .. versionchanged:: 2.0 + Added support for key rotation by passing a list to + ``secret_key``. + + .. versionchanged:: 0.18 + ``algorithm`` was added as an argument to the class constructor. + + .. versionchanged:: 0.14 + ``key_derivation`` and ``digest_method`` were added as arguments + to the class constructor. + """ + + #: The default digest method to use for the signer. The default is + #: :func:`hashlib.sha1`, but can be changed to any :mod:`hashlib` or + #: compatible object. Note that the security of the hash alone + #: doesn't apply when used intermediately in HMAC. + #: + #: .. versionadded:: 0.14 + default_digest_method: _t.Any = staticmethod(hashlib.sha1) + + #: The default scheme to use to derive the signing key from the + #: secret key and salt. The default is ``django-concat``. Possible + #: values are ``concat``, ``django-concat``, and ``hmac``. + #: + #: .. versionadded:: 0.14 + default_key_derivation: str = "django-concat" + + def __init__( + self, + secret_key: _t_secret_key, + salt: _t_opt_str_bytes = b"itsdangerous.Signer", + sep: _t_str_bytes = b".", + key_derivation: _t.Optional[str] = None, + digest_method: _t.Optional[_t.Any] = None, + algorithm: _t.Optional[SigningAlgorithm] = None, + ): + #: The list of secret keys to try for verifying signatures, from + #: oldest to newest. The newest (last) key is used for signing. + #: + #: This allows a key rotation system to keep a list of allowed + #: keys and remove expired ones. + self.secret_keys: _t.List[bytes] = _make_keys_list(secret_key) + self.sep: bytes = want_bytes(sep) + + if self.sep in _base64_alphabet: + raise ValueError( + "The given separator cannot be used because it may be" + " contained in the signature itself. ASCII letters," + " digits, and '-_=' must not be used." + ) + + if salt is not None: + salt = want_bytes(salt) + else: + salt = b"itsdangerous.Signer" + + self.salt = salt + + if key_derivation is None: + key_derivation = self.default_key_derivation + + self.key_derivation: str = key_derivation + + if digest_method is None: + digest_method = self.default_digest_method + + self.digest_method: _t.Any = digest_method + + if algorithm is None: + algorithm = HMACAlgorithm(self.digest_method) + + self.algorithm: SigningAlgorithm = algorithm + + @property + def secret_key(self) -> bytes: + """The newest (last) entry in the :attr:`secret_keys` list. This + is for compatibility from before key rotation support was added. + """ + return self.secret_keys[-1] + + def derive_key(self, secret_key: _t_opt_str_bytes = None) -> bytes: + """This method is called to derive the key. The default key + derivation choices can be overridden here. Key derivation is not + intended to be used as a security method to make a complex key + out of a short password. Instead you should use large random + secret keys. + + :param secret_key: A specific secret key to derive from. + Defaults to the last item in :attr:`secret_keys`. + + .. versionchanged:: 2.0 + Added the ``secret_key`` parameter. + """ + if secret_key is None: + secret_key = self.secret_keys[-1] + else: + secret_key = want_bytes(secret_key) + + if self.key_derivation == "concat": + return _t.cast(bytes, self.digest_method(self.salt + secret_key).digest()) + elif self.key_derivation == "django-concat": + return _t.cast( + bytes, self.digest_method(self.salt + b"signer" + secret_key).digest() + ) + elif self.key_derivation == "hmac": + mac = hmac.new(secret_key, digestmod=self.digest_method) + mac.update(self.salt) + return mac.digest() + elif self.key_derivation == "none": + return secret_key + else: + raise TypeError("Unknown key derivation method") + + def get_signature(self, value: _t_str_bytes) -> bytes: + """Returns the signature for the given value.""" + value = want_bytes(value) + key = self.derive_key() + sig = self.algorithm.get_signature(key, value) + return base64_encode(sig) + + def sign(self, value: _t_str_bytes) -> bytes: + """Signs the given string.""" + value = want_bytes(value) + return value + self.sep + self.get_signature(value) + + def verify_signature(self, value: _t_str_bytes, sig: _t_str_bytes) -> bool: + """Verifies the signature for the given value.""" + try: + sig = base64_decode(sig) + except Exception: + return False + + value = want_bytes(value) + + for secret_key in reversed(self.secret_keys): + key = self.derive_key(secret_key) + + if self.algorithm.verify_signature(key, value, sig): + return True + + return False + + def unsign(self, signed_value: _t_str_bytes) -> bytes: + """Unsigns the given string.""" + signed_value = want_bytes(signed_value) + + if self.sep not in signed_value: + raise BadSignature(f"No {self.sep!r} found in value") + + value, sig = signed_value.rsplit(self.sep, 1) + + if self.verify_signature(value, sig): + return value + + raise BadSignature(f"Signature {sig!r} does not match", payload=value) + + def validate(self, signed_value: _t_str_bytes) -> bool: + """Only validates the given signed value. Returns ``True`` if + the signature exists and is valid. + """ + try: + self.unsign(signed_value) + return True + except BadSignature: + return False diff --git a/app/src/flask-server/venv/Lib/site-packages/itsdangerous/timed.py b/app/src/flask-server/venv/Lib/site-packages/itsdangerous/timed.py new file mode 100644 index 0000000..cad8da3 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/itsdangerous/timed.py @@ -0,0 +1,234 @@ +import time +import typing +import typing as _t +from datetime import datetime +from datetime import timezone + +from .encoding import base64_decode +from .encoding import base64_encode +from .encoding import bytes_to_int +from .encoding import int_to_bytes +from .encoding import want_bytes +from .exc import BadSignature +from .exc import BadTimeSignature +from .exc import SignatureExpired +from .serializer import Serializer +from .signer import Signer + +_t_str_bytes = _t.Union[str, bytes] +_t_opt_str_bytes = _t.Optional[_t_str_bytes] +_t_opt_int = _t.Optional[int] + +if _t.TYPE_CHECKING: + import typing_extensions as _te + + +class TimestampSigner(Signer): + """Works like the regular :class:`.Signer` but also records the time + of the signing and can be used to expire signatures. The + :meth:`unsign` method can raise :exc:`.SignatureExpired` if the + unsigning failed because the signature is expired. + """ + + def get_timestamp(self) -> int: + """Returns the current timestamp. The function must return an + integer. + """ + return int(time.time()) + + def timestamp_to_datetime(self, ts: int) -> datetime: + """Convert the timestamp from :meth:`get_timestamp` into an + aware :class`datetime.datetime` in UTC. + + .. versionchanged:: 2.0 + The timestamp is returned as a timezone-aware ``datetime`` + in UTC rather than a naive ``datetime`` assumed to be UTC. + """ + return datetime.fromtimestamp(ts, tz=timezone.utc) + + def sign(self, value: _t_str_bytes) -> bytes: + """Signs the given string and also attaches time information.""" + value = want_bytes(value) + timestamp = base64_encode(int_to_bytes(self.get_timestamp())) + sep = want_bytes(self.sep) + value = value + sep + timestamp + return value + sep + self.get_signature(value) + + # Ignore overlapping signatures check, return_timestamp is the only + # parameter that affects the return type. + + @typing.overload + def unsign( # type: ignore + self, + signed_value: _t_str_bytes, + max_age: _t_opt_int = None, + return_timestamp: "_te.Literal[False]" = False, + ) -> bytes: + ... + + @typing.overload + def unsign( + self, + signed_value: _t_str_bytes, + max_age: _t_opt_int = None, + return_timestamp: "_te.Literal[True]" = True, + ) -> _t.Tuple[bytes, datetime]: + ... + + def unsign( + self, + signed_value: _t_str_bytes, + max_age: _t_opt_int = None, + return_timestamp: bool = False, + ) -> _t.Union[_t.Tuple[bytes, datetime], bytes]: + """Works like the regular :meth:`.Signer.unsign` but can also + validate the time. See the base docstring of the class for + the general behavior. If ``return_timestamp`` is ``True`` the + timestamp of the signature will be returned as an aware + :class:`datetime.datetime` object in UTC. + + .. versionchanged:: 2.0 + The timestamp is returned as a timezone-aware ``datetime`` + in UTC rather than a naive ``datetime`` assumed to be UTC. + """ + try: + result = super().unsign(signed_value) + sig_error = None + except BadSignature as e: + sig_error = e + result = e.payload or b"" + + sep = want_bytes(self.sep) + + # If there is no timestamp in the result there is something + # seriously wrong. In case there was a signature error, we raise + # that one directly, otherwise we have a weird situation in + # which we shouldn't have come except someone uses a time-based + # serializer on non-timestamp data, so catch that. + if sep not in result: + if sig_error: + raise sig_error + + raise BadTimeSignature("timestamp missing", payload=result) + + value, ts_bytes = result.rsplit(sep, 1) + ts_int: _t_opt_int = None + ts_dt: _t.Optional[datetime] = None + + try: + ts_int = bytes_to_int(base64_decode(ts_bytes)) + except Exception: + pass + + # Signature is *not* okay. Raise a proper error now that we have + # split the value and the timestamp. + if sig_error is not None: + if ts_int is not None: + try: + ts_dt = self.timestamp_to_datetime(ts_int) + except (ValueError, OSError, OverflowError) as exc: + # Windows raises OSError + # 32-bit raises OverflowError + raise BadTimeSignature( + "Malformed timestamp", payload=value + ) from exc + + raise BadTimeSignature(str(sig_error), payload=value, date_signed=ts_dt) + + # Signature was okay but the timestamp is actually not there or + # malformed. Should not happen, but we handle it anyway. + if ts_int is None: + raise BadTimeSignature("Malformed timestamp", payload=value) + + # Check timestamp is not older than max_age + if max_age is not None: + age = self.get_timestamp() - ts_int + + if age > max_age: + raise SignatureExpired( + f"Signature age {age} > {max_age} seconds", + payload=value, + date_signed=self.timestamp_to_datetime(ts_int), + ) + + if age < 0: + raise SignatureExpired( + f"Signature age {age} < 0 seconds", + payload=value, + date_signed=self.timestamp_to_datetime(ts_int), + ) + + if return_timestamp: + return value, self.timestamp_to_datetime(ts_int) + + return value + + def validate(self, signed_value: _t_str_bytes, max_age: _t_opt_int = None) -> bool: + """Only validates the given signed value. Returns ``True`` if + the signature exists and is valid.""" + try: + self.unsign(signed_value, max_age=max_age) + return True + except BadSignature: + return False + + +class TimedSerializer(Serializer): + """Uses :class:`TimestampSigner` instead of the default + :class:`.Signer`. + """ + + default_signer: _t.Type[TimestampSigner] = TimestampSigner + + def iter_unsigners( + self, salt: _t_opt_str_bytes = None + ) -> _t.Iterator[TimestampSigner]: + return _t.cast("_t.Iterator[TimestampSigner]", super().iter_unsigners(salt)) + + # TODO: Signature is incompatible because parameters were added + # before salt. + + def loads( # type: ignore + self, + s: _t_str_bytes, + max_age: _t_opt_int = None, + return_timestamp: bool = False, + salt: _t_opt_str_bytes = None, + ) -> _t.Any: + """Reverse of :meth:`dumps`, raises :exc:`.BadSignature` if the + signature validation fails. If a ``max_age`` is provided it will + ensure the signature is not older than that time in seconds. In + case the signature is outdated, :exc:`.SignatureExpired` is + raised. All arguments are forwarded to the signer's + :meth:`~TimestampSigner.unsign` method. + """ + s = want_bytes(s) + last_exception = None + + for signer in self.iter_unsigners(salt): + try: + base64d, timestamp = signer.unsign( + s, max_age=max_age, return_timestamp=True + ) + payload = self.load_payload(base64d) + + if return_timestamp: + return payload, timestamp + + return payload + except SignatureExpired: + # The signature was unsigned successfully but was + # expired. Do not try the next signer. + raise + except BadSignature as err: + last_exception = err + + raise _t.cast(BadSignature, last_exception) + + def loads_unsafe( # type: ignore + self, + s: _t_str_bytes, + max_age: _t_opt_int = None, + salt: _t_opt_str_bytes = None, + ) -> _t.Tuple[bool, _t.Any]: + return self._loads_unsafe_impl(s, salt, load_kwargs={"max_age": max_age}) diff --git a/app/src/flask-server/venv/Lib/site-packages/itsdangerous/url_safe.py b/app/src/flask-server/venv/Lib/site-packages/itsdangerous/url_safe.py new file mode 100644 index 0000000..d5a9b0c --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/itsdangerous/url_safe.py @@ -0,0 +1,80 @@ +import typing as _t +import zlib + +from ._json import _CompactJSON +from .encoding import base64_decode +from .encoding import base64_encode +from .exc import BadPayload +from .serializer import Serializer +from .timed import TimedSerializer + + +class URLSafeSerializerMixin(Serializer): + """Mixed in with a regular serializer it will attempt to zlib + compress the string to make it shorter if necessary. It will also + base64 encode the string so that it can safely be placed in a URL. + """ + + default_serializer = _CompactJSON + + def load_payload( + self, + payload: bytes, + *args: _t.Any, + serializer: _t.Optional[_t.Any] = None, + **kwargs: _t.Any, + ) -> _t.Any: + decompress = False + + if payload.startswith(b"."): + payload = payload[1:] + decompress = True + + try: + json = base64_decode(payload) + except Exception as e: + raise BadPayload( + "Could not base64 decode the payload because of an exception", + original_error=e, + ) from e + + if decompress: + try: + json = zlib.decompress(json) + except Exception as e: + raise BadPayload( + "Could not zlib decompress the payload before decoding the payload", + original_error=e, + ) from e + + return super().load_payload(json, *args, **kwargs) + + def dump_payload(self, obj: _t.Any) -> bytes: + json = super().dump_payload(obj) + is_compressed = False + compressed = zlib.compress(json) + + if len(compressed) < (len(json) - 1): + json = compressed + is_compressed = True + + base64d = base64_encode(json) + + if is_compressed: + base64d = b"." + base64d + + return base64d + + +class URLSafeSerializer(URLSafeSerializerMixin, Serializer): + """Works like :class:`.Serializer` but dumps and loads into a URL + safe string consisting of the upper and lowercase character of the + alphabet as well as ``'_'``, ``'-'`` and ``'.'``. + """ + + +class URLSafeTimedSerializer(URLSafeSerializerMixin, TimedSerializer): + """Works like :class:`.TimedSerializer` but dumps and loads into a + URL safe string consisting of the upper and lowercase character of + the alphabet as well as ``'_'``, ``'-'`` and ``'.'``. + """ diff --git a/app/src/flask-server/venv/Lib/site-packages/jinja2/__init__.py b/app/src/flask-server/venv/Lib/site-packages/jinja2/__init__.py new file mode 100644 index 0000000..e323926 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/jinja2/__init__.py @@ -0,0 +1,37 @@ +"""Jinja is a template engine written in pure Python. It provides a +non-XML syntax that supports inline expressions and an optional +sandboxed environment. +""" +from .bccache import BytecodeCache as BytecodeCache +from .bccache import FileSystemBytecodeCache as FileSystemBytecodeCache +from .bccache import MemcachedBytecodeCache as MemcachedBytecodeCache +from .environment import Environment as Environment +from .environment import Template as Template +from .exceptions import TemplateAssertionError as TemplateAssertionError +from .exceptions import TemplateError as TemplateError +from .exceptions import TemplateNotFound as TemplateNotFound +from .exceptions import TemplateRuntimeError as TemplateRuntimeError +from .exceptions import TemplatesNotFound as TemplatesNotFound +from .exceptions import TemplateSyntaxError as TemplateSyntaxError +from .exceptions import UndefinedError as UndefinedError +from .loaders import BaseLoader as BaseLoader +from .loaders import ChoiceLoader as ChoiceLoader +from .loaders import DictLoader as DictLoader +from .loaders import FileSystemLoader as FileSystemLoader +from .loaders import FunctionLoader as FunctionLoader +from .loaders import ModuleLoader as ModuleLoader +from .loaders import PackageLoader as PackageLoader +from .loaders import PrefixLoader as PrefixLoader +from .runtime import ChainableUndefined as ChainableUndefined +from .runtime import DebugUndefined as DebugUndefined +from .runtime import make_logging_undefined as make_logging_undefined +from .runtime import StrictUndefined as StrictUndefined +from .runtime import Undefined as Undefined +from .utils import clear_caches as clear_caches +from .utils import is_undefined as is_undefined +from .utils import pass_context as pass_context +from .utils import pass_environment as pass_environment +from .utils import pass_eval_context as pass_eval_context +from .utils import select_autoescape as select_autoescape + +__version__ = "3.1.2" diff --git a/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/__init__.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000..43908a3 Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/__init__.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/_identifier.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/_identifier.cpython-310.pyc new file mode 100644 index 0000000..c0ac590 Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/_identifier.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/async_utils.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/async_utils.cpython-310.pyc new file mode 100644 index 0000000..a1b6432 Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/async_utils.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/bccache.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/bccache.cpython-310.pyc new file mode 100644 index 0000000..c142e82 Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/bccache.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/compiler.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/compiler.cpython-310.pyc new file mode 100644 index 0000000..999bac8 Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/compiler.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/constants.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/constants.cpython-310.pyc new file mode 100644 index 0000000..95a7b6f Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/constants.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/debug.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/debug.cpython-310.pyc new file mode 100644 index 0000000..28a6424 Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/debug.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/defaults.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/defaults.cpython-310.pyc new file mode 100644 index 0000000..0a43021 Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/defaults.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/environment.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/environment.cpython-310.pyc new file mode 100644 index 0000000..86d7915 Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/environment.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/exceptions.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/exceptions.cpython-310.pyc new file mode 100644 index 0000000..ee4a906 Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/exceptions.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/ext.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/ext.cpython-310.pyc new file mode 100644 index 0000000..a92dbb3 Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/ext.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/filters.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/filters.cpython-310.pyc new file mode 100644 index 0000000..d8fc135 Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/filters.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/idtracking.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/idtracking.cpython-310.pyc new file mode 100644 index 0000000..19997aa Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/idtracking.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/lexer.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/lexer.cpython-310.pyc new file mode 100644 index 0000000..529db7d Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/lexer.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/loaders.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/loaders.cpython-310.pyc new file mode 100644 index 0000000..a600d46 Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/loaders.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/meta.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/meta.cpython-310.pyc new file mode 100644 index 0000000..0d1edab Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/meta.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/nativetypes.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/nativetypes.cpython-310.pyc new file mode 100644 index 0000000..ef66153 Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/nativetypes.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/nodes.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/nodes.cpython-310.pyc new file mode 100644 index 0000000..191f022 Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/nodes.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/optimizer.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/optimizer.cpython-310.pyc new file mode 100644 index 0000000..5a1568c Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/optimizer.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/parser.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/parser.cpython-310.pyc new file mode 100644 index 0000000..28d3708 Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/parser.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/runtime.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/runtime.cpython-310.pyc new file mode 100644 index 0000000..f85c11d Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/runtime.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/sandbox.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/sandbox.cpython-310.pyc new file mode 100644 index 0000000..ffb8bb6 Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/sandbox.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/tests.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/tests.cpython-310.pyc new file mode 100644 index 0000000..cddf30b Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/tests.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/utils.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/utils.cpython-310.pyc new file mode 100644 index 0000000..c37419a Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/utils.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/visitor.cpython-310.pyc b/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/visitor.cpython-310.pyc new file mode 100644 index 0000000..0cdce0b Binary files /dev/null and b/app/src/flask-server/venv/Lib/site-packages/jinja2/__pycache__/visitor.cpython-310.pyc differ diff --git a/app/src/flask-server/venv/Lib/site-packages/jinja2/_identifier.py b/app/src/flask-server/venv/Lib/site-packages/jinja2/_identifier.py new file mode 100644 index 0000000..928c150 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/jinja2/_identifier.py @@ -0,0 +1,6 @@ +import re + +# generated by scripts/generate_identifier_pattern.py +pattern = re.compile( + r"[\w·̀-ͯ·҃-֑҇-ׇֽֿׁׂׅׄؐ-ًؚ-ٰٟۖ-ۜ۟-۪ۤۧۨ-ܑۭܰ-݊ަ-ް߫-߽߳ࠖ-࠙ࠛ-ࠣࠥ-ࠧࠩ-࡙࠭-࡛࣓-ࣣ࣡-ःऺ-़ा-ॏ॑-ॗॢॣঁ-ঃ়া-ৄেৈো-্ৗৢৣ৾ਁ-ਃ਼ਾ-ੂੇੈੋ-੍ੑੰੱੵઁ-ઃ઼ા-ૅે-ૉો-્ૢૣૺ-૿ଁ-ଃ଼ା-ୄେୈୋ-୍ୖୗୢୣஂா-ூெ-ைொ-்ௗఀ-ఄా-ౄె-ైొ-్ౕౖౢౣಁ-ಃ಼ಾ-ೄೆ-ೈೊ-್ೕೖೢೣഀ-ഃ഻഼ാ-ൄെ-ൈൊ-്ൗൢൣංඃ්ා-ුූෘ-ෟෲෳัิ-ฺ็-๎ັິ-ູົຼ່-ໍ༹༘༙༵༷༾༿ཱ-྄྆྇ྍ-ྗྙ-ྼ࿆ါ-ှၖ-ၙၞ-ၠၢ-ၤၧ-ၭၱ-ၴႂ-ႍႏႚ-ႝ፝-፟ᜒ-᜔ᜲ-᜴ᝒᝓᝲᝳ឴-៓៝᠋-᠍ᢅᢆᢩᤠ-ᤫᤰ-᤻ᨗ-ᨛᩕ-ᩞ᩠-᩿᩼᪰-᪽ᬀ-ᬄ᬴-᭄᭫-᭳ᮀ-ᮂᮡ-ᮭ᯦-᯳ᰤ-᰷᳐-᳔᳒-᳨᳭ᳲ-᳴᳷-᳹᷀-᷹᷻-᷿‿⁀⁔⃐-⃥⃜⃡-⃰℘℮⳯-⵿⳱ⷠ-〪ⷿ-゙゚〯꙯ꙴ-꙽ꚞꚟ꛰꛱ꠂ꠆ꠋꠣ-ꠧꢀꢁꢴ-ꣅ꣠-꣱ꣿꤦ-꤭ꥇ-꥓ꦀ-ꦃ꦳-꧀ꧥꨩ-ꨶꩃꩌꩍꩻ-ꩽꪰꪲ-ꪴꪷꪸꪾ꪿꫁ꫫ-ꫯꫵ꫶ꯣ-ꯪ꯬꯭ﬞ︀-️︠-︯︳︴﹍-﹏_𐇽𐋠𐍶-𐍺𐨁-𐨃𐨅𐨆𐨌-𐨏𐨸-𐨿𐨺𐫦𐫥𐴤-𐽆𐴧-𐽐𑀀-𑀂𑀸-𑁆𑁿-𑂂𑂰-𑂺𑄀-𑄂𑄧-𑄴𑅅𑅆𑅳𑆀-𑆂𑆳-𑇀𑇉-𑇌𑈬-𑈷𑈾𑋟-𑋪𑌀-𑌃𑌻𑌼𑌾-𑍄𑍇𑍈𑍋-𑍍𑍗𑍢𑍣𑍦-𑍬𑍰-𑍴𑐵-𑑆𑑞𑒰-𑓃𑖯-𑖵𑖸-𑗀𑗜𑗝𑘰-𑙀𑚫-𑚷𑜝-𑜫𑠬-𑠺𑨁-𑨊𑨳-𑨹𑨻-𑨾𑩇𑩑-𑩛𑪊-𑪙𑰯-𑰶𑰸-𑰿𑲒-𑲧𑲩-𑲶𑴱-𑴶𑴺𑴼𑴽𑴿-𑵅𑵇𑶊-𑶎𑶐𑶑𑶓-𑶗𑻳-𑻶𖫰-𖫴𖬰-𖬶𖽑-𖽾𖾏-𖾒𛲝𛲞𝅥-𝅩𝅭-𝅲𝅻-𝆂𝆅-𝆋𝆪-𝆭𝉂-𝉄𝨀-𝨶𝨻-𝩬𝩵𝪄𝪛-𝪟𝪡-𝪯𞀀-𞀆𞀈-𞀘𞀛-𞀡𞀣𞀤𞀦-𞣐𞀪-𞣖𞥄-𞥊󠄀-󠇯]+" # noqa: B950 +) diff --git a/app/src/flask-server/venv/Lib/site-packages/jinja2/async_utils.py b/app/src/flask-server/venv/Lib/site-packages/jinja2/async_utils.py new file mode 100644 index 0000000..1a4f389 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/jinja2/async_utils.py @@ -0,0 +1,84 @@ +import inspect +import typing as t +from functools import WRAPPER_ASSIGNMENTS +from functools import wraps + +from .utils import _PassArg +from .utils import pass_eval_context + +V = t.TypeVar("V") + + +def async_variant(normal_func): # type: ignore + def decorator(async_func): # type: ignore + pass_arg = _PassArg.from_obj(normal_func) + need_eval_context = pass_arg is None + + if pass_arg is _PassArg.environment: + + def is_async(args: t.Any) -> bool: + return t.cast(bool, args[0].is_async) + + else: + + def is_async(args: t.Any) -> bool: + return t.cast(bool, args[0].environment.is_async) + + # Take the doc and annotations from the sync function, but the + # name from the async function. Pallets-Sphinx-Themes + # build_function_directive expects __wrapped__ to point to the + # sync function. + async_func_attrs = ("__module__", "__name__", "__qualname__") + normal_func_attrs = tuple(set(WRAPPER_ASSIGNMENTS).difference(async_func_attrs)) + + @wraps(normal_func, assigned=normal_func_attrs) + @wraps(async_func, assigned=async_func_attrs, updated=()) + def wrapper(*args, **kwargs): # type: ignore + b = is_async(args) + + if need_eval_context: + args = args[1:] + + if b: + return async_func(*args, **kwargs) + + return normal_func(*args, **kwargs) + + if need_eval_context: + wrapper = pass_eval_context(wrapper) + + wrapper.jinja_async_variant = True + return wrapper + + return decorator + + +_common_primitives = {int, float, bool, str, list, dict, tuple, type(None)} + + +async def auto_await(value: t.Union[t.Awaitable["V"], "V"]) -> "V": + # Avoid a costly call to isawaitable + if type(value) in _common_primitives: + return t.cast("V", value) + + if inspect.isawaitable(value): + return await t.cast("t.Awaitable[V]", value) + + return t.cast("V", value) + + +async def auto_aiter( + iterable: "t.Union[t.AsyncIterable[V], t.Iterable[V]]", +) -> "t.AsyncIterator[V]": + if hasattr(iterable, "__aiter__"): + async for item in t.cast("t.AsyncIterable[V]", iterable): + yield item + else: + for item in t.cast("t.Iterable[V]", iterable): + yield item + + +async def auto_to_list( + value: "t.Union[t.AsyncIterable[V], t.Iterable[V]]", +) -> t.List["V"]: + return [x async for x in auto_aiter(value)] diff --git a/app/src/flask-server/venv/Lib/site-packages/jinja2/bccache.py b/app/src/flask-server/venv/Lib/site-packages/jinja2/bccache.py new file mode 100644 index 0000000..d0ddf56 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/jinja2/bccache.py @@ -0,0 +1,406 @@ +"""The optional bytecode cache system. This is useful if you have very +complex template situations and the compilation of all those templates +slows down your application too much. + +Situations where this is useful are often forking web applications that +are initialized on the first request. +""" +import errno +import fnmatch +import marshal +import os +import pickle +import stat +import sys +import tempfile +import typing as t +from hashlib import sha1 +from io import BytesIO +from types import CodeType + +if t.TYPE_CHECKING: + import typing_extensions as te + from .environment import Environment + + class _MemcachedClient(te.Protocol): + def get(self, key: str) -> bytes: + ... + + def set(self, key: str, value: bytes, timeout: t.Optional[int] = None) -> None: + ... + + +bc_version = 5 +# Magic bytes to identify Jinja bytecode cache files. Contains the +# Python major and minor version to avoid loading incompatible bytecode +# if a project upgrades its Python version. +bc_magic = ( + b"j2" + + pickle.dumps(bc_version, 2) + + pickle.dumps((sys.version_info[0] << 24) | sys.version_info[1], 2) +) + + +class Bucket: + """Buckets are used to store the bytecode for one template. It's created + and initialized by the bytecode cache and passed to the loading functions. + + The buckets get an internal checksum from the cache assigned and use this + to automatically reject outdated cache material. Individual bytecode + cache subclasses don't have to care about cache invalidation. + """ + + def __init__(self, environment: "Environment", key: str, checksum: str) -> None: + self.environment = environment + self.key = key + self.checksum = checksum + self.reset() + + def reset(self) -> None: + """Resets the bucket (unloads the bytecode).""" + self.code: t.Optional[CodeType] = None + + def load_bytecode(self, f: t.BinaryIO) -> None: + """Loads bytecode from a file or file like object.""" + # make sure the magic header is correct + magic = f.read(len(bc_magic)) + if magic != bc_magic: + self.reset() + return + # the source code of the file changed, we need to reload + checksum = pickle.load(f) + if self.checksum != checksum: + self.reset() + return + # if marshal_load fails then we need to reload + try: + self.code = marshal.load(f) + except (EOFError, ValueError, TypeError): + self.reset() + return + + def write_bytecode(self, f: t.IO[bytes]) -> None: + """Dump the bytecode into the file or file like object passed.""" + if self.code is None: + raise TypeError("can't write empty bucket") + f.write(bc_magic) + pickle.dump(self.checksum, f, 2) + marshal.dump(self.code, f) + + def bytecode_from_string(self, string: bytes) -> None: + """Load bytecode from bytes.""" + self.load_bytecode(BytesIO(string)) + + def bytecode_to_string(self) -> bytes: + """Return the bytecode as bytes.""" + out = BytesIO() + self.write_bytecode(out) + return out.getvalue() + + +class BytecodeCache: + """To implement your own bytecode cache you have to subclass this class + and override :meth:`load_bytecode` and :meth:`dump_bytecode`. Both of + these methods are passed a :class:`~jinja2.bccache.Bucket`. + + A very basic bytecode cache that saves the bytecode on the file system:: + + from os import path + + class MyCache(BytecodeCache): + + def __init__(self, directory): + self.directory = directory + + def load_bytecode(self, bucket): + filename = path.join(self.directory, bucket.key) + if path.exists(filename): + with open(filename, 'rb') as f: + bucket.load_bytecode(f) + + def dump_bytecode(self, bucket): + filename = path.join(self.directory, bucket.key) + with open(filename, 'wb') as f: + bucket.write_bytecode(f) + + A more advanced version of a filesystem based bytecode cache is part of + Jinja. + """ + + def load_bytecode(self, bucket: Bucket) -> None: + """Subclasses have to override this method to load bytecode into a + bucket. If they are not able to find code in the cache for the + bucket, it must not do anything. + """ + raise NotImplementedError() + + def dump_bytecode(self, bucket: Bucket) -> None: + """Subclasses have to override this method to write the bytecode + from a bucket back to the cache. If it unable to do so it must not + fail silently but raise an exception. + """ + raise NotImplementedError() + + def clear(self) -> None: + """Clears the cache. This method is not used by Jinja but should be + implemented to allow applications to clear the bytecode cache used + by a particular environment. + """ + + def get_cache_key( + self, name: str, filename: t.Optional[t.Union[str]] = None + ) -> str: + """Returns the unique hash key for this template name.""" + hash = sha1(name.encode("utf-8")) + + if filename is not None: + hash.update(f"|{filename}".encode()) + + return hash.hexdigest() + + def get_source_checksum(self, source: str) -> str: + """Returns a checksum for the source.""" + return sha1(source.encode("utf-8")).hexdigest() + + def get_bucket( + self, + environment: "Environment", + name: str, + filename: t.Optional[str], + source: str, + ) -> Bucket: + """Return a cache bucket for the given template. All arguments are + mandatory but filename may be `None`. + """ + key = self.get_cache_key(name, filename) + checksum = self.get_source_checksum(source) + bucket = Bucket(environment, key, checksum) + self.load_bytecode(bucket) + return bucket + + def set_bucket(self, bucket: Bucket) -> None: + """Put the bucket into the cache.""" + self.dump_bytecode(bucket) + + +class FileSystemBytecodeCache(BytecodeCache): + """A bytecode cache that stores bytecode on the filesystem. It accepts + two arguments: The directory where the cache items are stored and a + pattern string that is used to build the filename. + + If no directory is specified a default cache directory is selected. On + Windows the user's temp directory is used, on UNIX systems a directory + is created for the user in the system temp directory. + + The pattern can be used to have multiple separate caches operate on the + same directory. The default pattern is ``'__jinja2_%s.cache'``. ``%s`` + is replaced with the cache key. + + >>> bcc = FileSystemBytecodeCache('/tmp/jinja_cache', '%s.cache') + + This bytecode cache supports clearing of the cache using the clear method. + """ + + def __init__( + self, directory: t.Optional[str] = None, pattern: str = "__jinja2_%s.cache" + ) -> None: + if directory is None: + directory = self._get_default_cache_dir() + self.directory = directory + self.pattern = pattern + + def _get_default_cache_dir(self) -> str: + def _unsafe_dir() -> "te.NoReturn": + raise RuntimeError( + "Cannot determine safe temp directory. You " + "need to explicitly provide one." + ) + + tmpdir = tempfile.gettempdir() + + # On windows the temporary directory is used specific unless + # explicitly forced otherwise. We can just use that. + if os.name == "nt": + return tmpdir + if not hasattr(os, "getuid"): + _unsafe_dir() + + dirname = f"_jinja2-cache-{os.getuid()}" + actual_dir = os.path.join(tmpdir, dirname) + + try: + os.mkdir(actual_dir, stat.S_IRWXU) + except OSError as e: + if e.errno != errno.EEXIST: + raise + try: + os.chmod(actual_dir, stat.S_IRWXU) + actual_dir_stat = os.lstat(actual_dir) + if ( + actual_dir_stat.st_uid != os.getuid() + or not stat.S_ISDIR(actual_dir_stat.st_mode) + or stat.S_IMODE(actual_dir_stat.st_mode) != stat.S_IRWXU + ): + _unsafe_dir() + except OSError as e: + if e.errno != errno.EEXIST: + raise + + actual_dir_stat = os.lstat(actual_dir) + if ( + actual_dir_stat.st_uid != os.getuid() + or not stat.S_ISDIR(actual_dir_stat.st_mode) + or stat.S_IMODE(actual_dir_stat.st_mode) != stat.S_IRWXU + ): + _unsafe_dir() + + return actual_dir + + def _get_cache_filename(self, bucket: Bucket) -> str: + return os.path.join(self.directory, self.pattern % (bucket.key,)) + + def load_bytecode(self, bucket: Bucket) -> None: + filename = self._get_cache_filename(bucket) + + # Don't test for existence before opening the file, since the + # file could disappear after the test before the open. + try: + f = open(filename, "rb") + except (FileNotFoundError, IsADirectoryError, PermissionError): + # PermissionError can occur on Windows when an operation is + # in progress, such as calling clear(). + return + + with f: + bucket.load_bytecode(f) + + def dump_bytecode(self, bucket: Bucket) -> None: + # Write to a temporary file, then rename to the real name after + # writing. This avoids another process reading the file before + # it is fully written. + name = self._get_cache_filename(bucket) + f = tempfile.NamedTemporaryFile( + mode="wb", + dir=os.path.dirname(name), + prefix=os.path.basename(name), + suffix=".tmp", + delete=False, + ) + + def remove_silent() -> None: + try: + os.remove(f.name) + except OSError: + # Another process may have called clear(). On Windows, + # another program may be holding the file open. + pass + + try: + with f: + bucket.write_bytecode(f) + except BaseException: + remove_silent() + raise + + try: + os.replace(f.name, name) + except OSError: + # Another process may have called clear(). On Windows, + # another program may be holding the file open. + remove_silent() + except BaseException: + remove_silent() + raise + + def clear(self) -> None: + # imported lazily here because google app-engine doesn't support + # write access on the file system and the function does not exist + # normally. + from os import remove + + files = fnmatch.filter(os.listdir(self.directory), self.pattern % ("*",)) + for filename in files: + try: + remove(os.path.join(self.directory, filename)) + except OSError: + pass + + +class MemcachedBytecodeCache(BytecodeCache): + """This class implements a bytecode cache that uses a memcache cache for + storing the information. It does not enforce a specific memcache library + (tummy's memcache or cmemcache) but will accept any class that provides + the minimal interface required. + + Libraries compatible with this class: + + - `cachelib `_ + - `python-memcached `_ + + (Unfortunately the django cache interface is not compatible because it + does not support storing binary data, only text. You can however pass + the underlying cache client to the bytecode cache which is available + as `django.core.cache.cache._client`.) + + The minimal interface for the client passed to the constructor is this: + + .. class:: MinimalClientInterface + + .. method:: set(key, value[, timeout]) + + Stores the bytecode in the cache. `value` is a string and + `timeout` the timeout of the key. If timeout is not provided + a default timeout or no timeout should be assumed, if it's + provided it's an integer with the number of seconds the cache + item should exist. + + .. method:: get(key) + + Returns the value for the cache key. If the item does not + exist in the cache the return value must be `None`. + + The other arguments to the constructor are the prefix for all keys that + is added before the actual cache key and the timeout for the bytecode in + the cache system. We recommend a high (or no) timeout. + + This bytecode cache does not support clearing of used items in the cache. + The clear method is a no-operation function. + + .. versionadded:: 2.7 + Added support for ignoring memcache errors through the + `ignore_memcache_errors` parameter. + """ + + def __init__( + self, + client: "_MemcachedClient", + prefix: str = "jinja2/bytecode/", + timeout: t.Optional[int] = None, + ignore_memcache_errors: bool = True, + ): + self.client = client + self.prefix = prefix + self.timeout = timeout + self.ignore_memcache_errors = ignore_memcache_errors + + def load_bytecode(self, bucket: Bucket) -> None: + try: + code = self.client.get(self.prefix + bucket.key) + except Exception: + if not self.ignore_memcache_errors: + raise + else: + bucket.bytecode_from_string(code) + + def dump_bytecode(self, bucket: Bucket) -> None: + key = self.prefix + bucket.key + value = bucket.bytecode_to_string() + + try: + if self.timeout is not None: + self.client.set(key, value, self.timeout) + else: + self.client.set(key, value) + except Exception: + if not self.ignore_memcache_errors: + raise diff --git a/app/src/flask-server/venv/Lib/site-packages/jinja2/compiler.py b/app/src/flask-server/venv/Lib/site-packages/jinja2/compiler.py new file mode 100644 index 0000000..3458095 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/jinja2/compiler.py @@ -0,0 +1,1957 @@ +"""Compiles nodes from the parser into Python code.""" +import typing as t +from contextlib import contextmanager +from functools import update_wrapper +from io import StringIO +from itertools import chain +from keyword import iskeyword as is_python_keyword + +from markupsafe import escape +from markupsafe import Markup + +from . import nodes +from .exceptions import TemplateAssertionError +from .idtracking import Symbols +from .idtracking import VAR_LOAD_ALIAS +from .idtracking import VAR_LOAD_PARAMETER +from .idtracking import VAR_LOAD_RESOLVE +from .idtracking import VAR_LOAD_UNDEFINED +from .nodes import EvalContext +from .optimizer import Optimizer +from .utils import _PassArg +from .utils import concat +from .visitor import NodeVisitor + +if t.TYPE_CHECKING: + import typing_extensions as te + from .environment import Environment + +F = t.TypeVar("F", bound=t.Callable[..., t.Any]) + +operators = { + "eq": "==", + "ne": "!=", + "gt": ">", + "gteq": ">=", + "lt": "<", + "lteq": "<=", + "in": "in", + "notin": "not in", +} + + +def optimizeconst(f: F) -> F: + def new_func( + self: "CodeGenerator", node: nodes.Expr, frame: "Frame", **kwargs: t.Any + ) -> t.Any: + # Only optimize if the frame is not volatile + if self.optimizer is not None and not frame.eval_ctx.volatile: + new_node = self.optimizer.visit(node, frame.eval_ctx) + + if new_node != node: + return self.visit(new_node, frame) + + return f(self, node, frame, **kwargs) + + return update_wrapper(t.cast(F, new_func), f) + + +def _make_binop(op: str) -> t.Callable[["CodeGenerator", nodes.BinExpr, "Frame"], None]: + @optimizeconst + def visitor(self: "CodeGenerator", node: nodes.BinExpr, frame: Frame) -> None: + if ( + self.environment.sandboxed + and op in self.environment.intercepted_binops # type: ignore + ): + self.write(f"environment.call_binop(context, {op!r}, ") + self.visit(node.left, frame) + self.write(", ") + self.visit(node.right, frame) + else: + self.write("(") + self.visit(node.left, frame) + self.write(f" {op} ") + self.visit(node.right, frame) + + self.write(")") + + return visitor + + +def _make_unop( + op: str, +) -> t.Callable[["CodeGenerator", nodes.UnaryExpr, "Frame"], None]: + @optimizeconst + def visitor(self: "CodeGenerator", node: nodes.UnaryExpr, frame: Frame) -> None: + if ( + self.environment.sandboxed + and op in self.environment.intercepted_unops # type: ignore + ): + self.write(f"environment.call_unop(context, {op!r}, ") + self.visit(node.node, frame) + else: + self.write("(" + op) + self.visit(node.node, frame) + + self.write(")") + + return visitor + + +def generate( + node: nodes.Template, + environment: "Environment", + name: t.Optional[str], + filename: t.Optional[str], + stream: t.Optional[t.TextIO] = None, + defer_init: bool = False, + optimized: bool = True, +) -> t.Optional[str]: + """Generate the python source for a node tree.""" + if not isinstance(node, nodes.Template): + raise TypeError("Can't compile non template nodes") + + generator = environment.code_generator_class( + environment, name, filename, stream, defer_init, optimized + ) + generator.visit(node) + + if stream is None: + return generator.stream.getvalue() # type: ignore + + return None + + +def has_safe_repr(value: t.Any) -> bool: + """Does the node have a safe representation?""" + if value is None or value is NotImplemented or value is Ellipsis: + return True + + if type(value) in {bool, int, float, complex, range, str, Markup}: + return True + + if type(value) in {tuple, list, set, frozenset}: + return all(has_safe_repr(v) for v in value) + + if type(value) is dict: + return all(has_safe_repr(k) and has_safe_repr(v) for k, v in value.items()) + + return False + + +def find_undeclared( + nodes: t.Iterable[nodes.Node], names: t.Iterable[str] +) -> t.Set[str]: + """Check if the names passed are accessed undeclared. The return value + is a set of all the undeclared names from the sequence of names found. + """ + visitor = UndeclaredNameVisitor(names) + try: + for node in nodes: + visitor.visit(node) + except VisitorExit: + pass + return visitor.undeclared + + +class MacroRef: + def __init__(self, node: t.Union[nodes.Macro, nodes.CallBlock]) -> None: + self.node = node + self.accesses_caller = False + self.accesses_kwargs = False + self.accesses_varargs = False + + +class Frame: + """Holds compile time information for us.""" + + def __init__( + self, + eval_ctx: EvalContext, + parent: t.Optional["Frame"] = None, + level: t.Optional[int] = None, + ) -> None: + self.eval_ctx = eval_ctx + + # the parent of this frame + self.parent = parent + + if parent is None: + self.symbols = Symbols(level=level) + + # in some dynamic inheritance situations the compiler needs to add + # write tests around output statements. + self.require_output_check = False + + # inside some tags we are using a buffer rather than yield statements. + # this for example affects {% filter %} or {% macro %}. If a frame + # is buffered this variable points to the name of the list used as + # buffer. + self.buffer: t.Optional[str] = None + + # the name of the block we're in, otherwise None. + self.block: t.Optional[str] = None + + else: + self.symbols = Symbols(parent.symbols, level=level) + self.require_output_check = parent.require_output_check + self.buffer = parent.buffer + self.block = parent.block + + # a toplevel frame is the root + soft frames such as if conditions. + self.toplevel = False + + # the root frame is basically just the outermost frame, so no if + # conditions. This information is used to optimize inheritance + # situations. + self.rootlevel = False + + # variables set inside of loops and blocks should not affect outer frames, + # but they still needs to be kept track of as part of the active context. + self.loop_frame = False + self.block_frame = False + + # track whether the frame is being used in an if-statement or conditional + # expression as it determines which errors should be raised during runtime + # or compile time. + self.soft_frame = False + + def copy(self) -> "Frame": + """Create a copy of the current one.""" + rv = object.__new__(self.__class__) + rv.__dict__.update(self.__dict__) + rv.symbols = self.symbols.copy() + return rv + + def inner(self, isolated: bool = False) -> "Frame": + """Return an inner frame.""" + if isolated: + return Frame(self.eval_ctx, level=self.symbols.level + 1) + return Frame(self.eval_ctx, self) + + def soft(self) -> "Frame": + """Return a soft frame. A soft frame may not be modified as + standalone thing as it shares the resources with the frame it + was created of, but it's not a rootlevel frame any longer. + + This is only used to implement if-statements and conditional + expressions. + """ + rv = self.copy() + rv.rootlevel = False + rv.soft_frame = True + return rv + + __copy__ = copy + + +class VisitorExit(RuntimeError): + """Exception used by the `UndeclaredNameVisitor` to signal a stop.""" + + +class DependencyFinderVisitor(NodeVisitor): + """A visitor that collects filter and test calls.""" + + def __init__(self) -> None: + self.filters: t.Set[str] = set() + self.tests: t.Set[str] = set() + + def visit_Filter(self, node: nodes.Filter) -> None: + self.generic_visit(node) + self.filters.add(node.name) + + def visit_Test(self, node: nodes.Test) -> None: + self.generic_visit(node) + self.tests.add(node.name) + + def visit_Block(self, node: nodes.Block) -> None: + """Stop visiting at blocks.""" + + +class UndeclaredNameVisitor(NodeVisitor): + """A visitor that checks if a name is accessed without being + declared. This is different from the frame visitor as it will + not stop at closure frames. + """ + + def __init__(self, names: t.Iterable[str]) -> None: + self.names = set(names) + self.undeclared: t.Set[str] = set() + + def visit_Name(self, node: nodes.Name) -> None: + if node.ctx == "load" and node.name in self.names: + self.undeclared.add(node.name) + if self.undeclared == self.names: + raise VisitorExit() + else: + self.names.discard(node.name) + + def visit_Block(self, node: nodes.Block) -> None: + """Stop visiting a blocks.""" + + +class CompilerExit(Exception): + """Raised if the compiler encountered a situation where it just + doesn't make sense to further process the code. Any block that + raises such an exception is not further processed. + """ + + +class CodeGenerator(NodeVisitor): + def __init__( + self, + environment: "Environment", + name: t.Optional[str], + filename: t.Optional[str], + stream: t.Optional[t.TextIO] = None, + defer_init: bool = False, + optimized: bool = True, + ) -> None: + if stream is None: + stream = StringIO() + self.environment = environment + self.name = name + self.filename = filename + self.stream = stream + self.created_block_context = False + self.defer_init = defer_init + self.optimizer: t.Optional[Optimizer] = None + + if optimized: + self.optimizer = Optimizer(environment) + + # aliases for imports + self.import_aliases: t.Dict[str, str] = {} + + # a registry for all blocks. Because blocks are moved out + # into the global python scope they are registered here + self.blocks: t.Dict[str, nodes.Block] = {} + + # the number of extends statements so far + self.extends_so_far = 0 + + # some templates have a rootlevel extends. In this case we + # can safely assume that we're a child template and do some + # more optimizations. + self.has_known_extends = False + + # the current line number + self.code_lineno = 1 + + # registry of all filters and tests (global, not block local) + self.tests: t.Dict[str, str] = {} + self.filters: t.Dict[str, str] = {} + + # the debug information + self.debug_info: t.List[t.Tuple[int, int]] = [] + self._write_debug_info: t.Optional[int] = None + + # the number of new lines before the next write() + self._new_lines = 0 + + # the line number of the last written statement + self._last_line = 0 + + # true if nothing was written so far. + self._first_write = True + + # used by the `temporary_identifier` method to get new + # unique, temporary identifier + self._last_identifier = 0 + + # the current indentation + self._indentation = 0 + + # Tracks toplevel assignments + self._assign_stack: t.List[t.Set[str]] = [] + + # Tracks parameter definition blocks + self._param_def_block: t.List[t.Set[str]] = [] + + # Tracks the current context. + self._context_reference_stack = ["context"] + + @property + def optimized(self) -> bool: + return self.optimizer is not None + + # -- Various compilation helpers + + def fail(self, msg: str, lineno: int) -> "te.NoReturn": + """Fail with a :exc:`TemplateAssertionError`.""" + raise TemplateAssertionError(msg, lineno, self.name, self.filename) + + def temporary_identifier(self) -> str: + """Get a new unique identifier.""" + self._last_identifier += 1 + return f"t_{self._last_identifier}" + + def buffer(self, frame: Frame) -> None: + """Enable buffering for the frame from that point onwards.""" + frame.buffer = self.temporary_identifier() + self.writeline(f"{frame.buffer} = []") + + def return_buffer_contents( + self, frame: Frame, force_unescaped: bool = False + ) -> None: + """Return the buffer contents of the frame.""" + if not force_unescaped: + if frame.eval_ctx.volatile: + self.writeline("if context.eval_ctx.autoescape:") + self.indent() + self.writeline(f"return Markup(concat({frame.buffer}))") + self.outdent() + self.writeline("else:") + self.indent() + self.writeline(f"return concat({frame.buffer})") + self.outdent() + return + elif frame.eval_ctx.autoescape: + self.writeline(f"return Markup(concat({frame.buffer}))") + return + self.writeline(f"return concat({frame.buffer})") + + def indent(self) -> None: + """Indent by one.""" + self._indentation += 1 + + def outdent(self, step: int = 1) -> None: + """Outdent by step.""" + self._indentation -= step + + def start_write(self, frame: Frame, node: t.Optional[nodes.Node] = None) -> None: + """Yield or write into the frame buffer.""" + if frame.buffer is None: + self.writeline("yield ", node) + else: + self.writeline(f"{frame.buffer}.append(", node) + + def end_write(self, frame: Frame) -> None: + """End the writing process started by `start_write`.""" + if frame.buffer is not None: + self.write(")") + + def simple_write( + self, s: str, frame: Frame, node: t.Optional[nodes.Node] = None + ) -> None: + """Simple shortcut for start_write + write + end_write.""" + self.start_write(frame, node) + self.write(s) + self.end_write(frame) + + def blockvisit(self, nodes: t.Iterable[nodes.Node], frame: Frame) -> None: + """Visit a list of nodes as block in a frame. If the current frame + is no buffer a dummy ``if 0: yield None`` is written automatically. + """ + try: + self.writeline("pass") + for node in nodes: + self.visit(node, frame) + except CompilerExit: + pass + + def write(self, x: str) -> None: + """Write a string into the output stream.""" + if self._new_lines: + if not self._first_write: + self.stream.write("\n" * self._new_lines) + self.code_lineno += self._new_lines + if self._write_debug_info is not None: + self.debug_info.append((self._write_debug_info, self.code_lineno)) + self._write_debug_info = None + self._first_write = False + self.stream.write(" " * self._indentation) + self._new_lines = 0 + self.stream.write(x) + + def writeline( + self, x: str, node: t.Optional[nodes.Node] = None, extra: int = 0 + ) -> None: + """Combination of newline and write.""" + self.newline(node, extra) + self.write(x) + + def newline(self, node: t.Optional[nodes.Node] = None, extra: int = 0) -> None: + """Add one or more newlines before the next write.""" + self._new_lines = max(self._new_lines, 1 + extra) + if node is not None and node.lineno != self._last_line: + self._write_debug_info = node.lineno + self._last_line = node.lineno + + def signature( + self, + node: t.Union[nodes.Call, nodes.Filter, nodes.Test], + frame: Frame, + extra_kwargs: t.Optional[t.Mapping[str, t.Any]] = None, + ) -> None: + """Writes a function call to the stream for the current node. + A leading comma is added automatically. The extra keyword + arguments may not include python keywords otherwise a syntax + error could occur. The extra keyword arguments should be given + as python dict. + """ + # if any of the given keyword arguments is a python keyword + # we have to make sure that no invalid call is created. + kwarg_workaround = any( + is_python_keyword(t.cast(str, k)) + for k in chain((x.key for x in node.kwargs), extra_kwargs or ()) + ) + + for arg in node.args: + self.write(", ") + self.visit(arg, frame) + + if not kwarg_workaround: + for kwarg in node.kwargs: + self.write(", ") + self.visit(kwarg, frame) + if extra_kwargs is not None: + for key, value in extra_kwargs.items(): + self.write(f", {key}={value}") + if node.dyn_args: + self.write(", *") + self.visit(node.dyn_args, frame) + + if kwarg_workaround: + if node.dyn_kwargs is not None: + self.write(", **dict({") + else: + self.write(", **{") + for kwarg in node.kwargs: + self.write(f"{kwarg.key!r}: ") + self.visit(kwarg.value, frame) + self.write(", ") + if extra_kwargs is not None: + for key, value in extra_kwargs.items(): + self.write(f"{key!r}: {value}, ") + if node.dyn_kwargs is not None: + self.write("}, **") + self.visit(node.dyn_kwargs, frame) + self.write(")") + else: + self.write("}") + + elif node.dyn_kwargs is not None: + self.write(", **") + self.visit(node.dyn_kwargs, frame) + + def pull_dependencies(self, nodes: t.Iterable[nodes.Node]) -> None: + """Find all filter and test names used in the template and + assign them to variables in the compiled namespace. Checking + that the names are registered with the environment is done when + compiling the Filter and Test nodes. If the node is in an If or + CondExpr node, the check is done at runtime instead. + + .. versionchanged:: 3.0 + Filters and tests in If and CondExpr nodes are checked at + runtime instead of compile time. + """ + visitor = DependencyFinderVisitor() + + for node in nodes: + visitor.visit(node) + + for id_map, names, dependency in (self.filters, visitor.filters, "filters"), ( + self.tests, + visitor.tests, + "tests", + ): + for name in sorted(names): + if name not in id_map: + id_map[name] = self.temporary_identifier() + + # add check during runtime that dependencies used inside of executed + # blocks are defined, as this step may be skipped during compile time + self.writeline("try:") + self.indent() + self.writeline(f"{id_map[name]} = environment.{dependency}[{name!r}]") + self.outdent() + self.writeline("except KeyError:") + self.indent() + self.writeline("@internalcode") + self.writeline(f"def {id_map[name]}(*unused):") + self.indent() + self.writeline( + f'raise TemplateRuntimeError("No {dependency[:-1]}' + f' named {name!r} found.")' + ) + self.outdent() + self.outdent() + + def enter_frame(self, frame: Frame) -> None: + undefs = [] + for target, (action, param) in frame.symbols.loads.items(): + if action == VAR_LOAD_PARAMETER: + pass + elif action == VAR_LOAD_RESOLVE: + self.writeline(f"{target} = {self.get_resolve_func()}({param!r})") + elif action == VAR_LOAD_ALIAS: + self.writeline(f"{target} = {param}") + elif action == VAR_LOAD_UNDEFINED: + undefs.append(target) + else: + raise NotImplementedError("unknown load instruction") + if undefs: + self.writeline(f"{' = '.join(undefs)} = missing") + + def leave_frame(self, frame: Frame, with_python_scope: bool = False) -> None: + if not with_python_scope: + undefs = [] + for target in frame.symbols.loads: + undefs.append(target) + if undefs: + self.writeline(f"{' = '.join(undefs)} = missing") + + def choose_async(self, async_value: str = "async ", sync_value: str = "") -> str: + return async_value if self.environment.is_async else sync_value + + def func(self, name: str) -> str: + return f"{self.choose_async()}def {name}" + + def macro_body( + self, node: t.Union[nodes.Macro, nodes.CallBlock], frame: Frame + ) -> t.Tuple[Frame, MacroRef]: + """Dump the function def of a macro or call block.""" + frame = frame.inner() + frame.symbols.analyze_node(node) + macro_ref = MacroRef(node) + + explicit_caller = None + skip_special_params = set() + args = [] + + for idx, arg in enumerate(node.args): + if arg.name == "caller": + explicit_caller = idx + if arg.name in ("kwargs", "varargs"): + skip_special_params.add(arg.name) + args.append(frame.symbols.ref(arg.name)) + + undeclared = find_undeclared(node.body, ("caller", "kwargs", "varargs")) + + if "caller" in undeclared: + # In older Jinja versions there was a bug that allowed caller + # to retain the special behavior even if it was mentioned in + # the argument list. However thankfully this was only really + # working if it was the last argument. So we are explicitly + # checking this now and error out if it is anywhere else in + # the argument list. + if explicit_caller is not None: + try: + node.defaults[explicit_caller - len(node.args)] + except IndexError: + self.fail( + "When defining macros or call blocks the " + 'special "caller" argument must be omitted ' + "or be given a default.", + node.lineno, + ) + else: + args.append(frame.symbols.declare_parameter("caller")) + macro_ref.accesses_caller = True + if "kwargs" in undeclared and "kwargs" not in skip_special_params: + args.append(frame.symbols.declare_parameter("kwargs")) + macro_ref.accesses_kwargs = True + if "varargs" in undeclared and "varargs" not in skip_special_params: + args.append(frame.symbols.declare_parameter("varargs")) + macro_ref.accesses_varargs = True + + # macros are delayed, they never require output checks + frame.require_output_check = False + frame.symbols.analyze_node(node) + self.writeline(f"{self.func('macro')}({', '.join(args)}):", node) + self.indent() + + self.buffer(frame) + self.enter_frame(frame) + + self.push_parameter_definitions(frame) + for idx, arg in enumerate(node.args): + ref = frame.symbols.ref(arg.name) + self.writeline(f"if {ref} is missing:") + self.indent() + try: + default = node.defaults[idx - len(node.args)] + except IndexError: + self.writeline( + f'{ref} = undefined("parameter {arg.name!r} was not provided",' + f" name={arg.name!r})" + ) + else: + self.writeline(f"{ref} = ") + self.visit(default, frame) + self.mark_parameter_stored(ref) + self.outdent() + self.pop_parameter_definitions() + + self.blockvisit(node.body, frame) + self.return_buffer_contents(frame, force_unescaped=True) + self.leave_frame(frame, with_python_scope=True) + self.outdent() + + return frame, macro_ref + + def macro_def(self, macro_ref: MacroRef, frame: Frame) -> None: + """Dump the macro definition for the def created by macro_body.""" + arg_tuple = ", ".join(repr(x.name) for x in macro_ref.node.args) + name = getattr(macro_ref.node, "name", None) + if len(macro_ref.node.args) == 1: + arg_tuple += "," + self.write( + f"Macro(environment, macro, {name!r}, ({arg_tuple})," + f" {macro_ref.accesses_kwargs!r}, {macro_ref.accesses_varargs!r}," + f" {macro_ref.accesses_caller!r}, context.eval_ctx.autoescape)" + ) + + def position(self, node: nodes.Node) -> str: + """Return a human readable position for the node.""" + rv = f"line {node.lineno}" + if self.name is not None: + rv = f"{rv} in {self.name!r}" + return rv + + def dump_local_context(self, frame: Frame) -> str: + items_kv = ", ".join( + f"{name!r}: {target}" + for name, target in frame.symbols.dump_stores().items() + ) + return f"{{{items_kv}}}" + + def write_commons(self) -> None: + """Writes a common preamble that is used by root and block functions. + Primarily this sets up common local helpers and enforces a generator + through a dead branch. + """ + self.writeline("resolve = context.resolve_or_missing") + self.writeline("undefined = environment.undefined") + self.writeline("concat = environment.concat") + # always use the standard Undefined class for the implicit else of + # conditional expressions + self.writeline("cond_expr_undefined = Undefined") + self.writeline("if 0: yield None") + + def push_parameter_definitions(self, frame: Frame) -> None: + """Pushes all parameter targets from the given frame into a local + stack that permits tracking of yet to be assigned parameters. In + particular this enables the optimization from `visit_Name` to skip + undefined expressions for parameters in macros as macros can reference + otherwise unbound parameters. + """ + self._param_def_block.append(frame.symbols.dump_param_targets()) + + def pop_parameter_definitions(self) -> None: + """Pops the current parameter definitions set.""" + self._param_def_block.pop() + + def mark_parameter_stored(self, target: str) -> None: + """Marks a parameter in the current parameter definitions as stored. + This will skip the enforced undefined checks. + """ + if self._param_def_block: + self._param_def_block[-1].discard(target) + + def push_context_reference(self, target: str) -> None: + self._context_reference_stack.append(target) + + def pop_context_reference(self) -> None: + self._context_reference_stack.pop() + + def get_context_ref(self) -> str: + return self._context_reference_stack[-1] + + def get_resolve_func(self) -> str: + target = self._context_reference_stack[-1] + if target == "context": + return "resolve" + return f"{target}.resolve" + + def derive_context(self, frame: Frame) -> str: + return f"{self.get_context_ref()}.derived({self.dump_local_context(frame)})" + + def parameter_is_undeclared(self, target: str) -> bool: + """Checks if a given target is an undeclared parameter.""" + if not self._param_def_block: + return False + return target in self._param_def_block[-1] + + def push_assign_tracking(self) -> None: + """Pushes a new layer for assignment tracking.""" + self._assign_stack.append(set()) + + def pop_assign_tracking(self, frame: Frame) -> None: + """Pops the topmost level for assignment tracking and updates the + context variables if necessary. + """ + vars = self._assign_stack.pop() + if ( + not frame.block_frame + and not frame.loop_frame + and not frame.toplevel + or not vars + ): + return + public_names = [x for x in vars if x[:1] != "_"] + if len(vars) == 1: + name = next(iter(vars)) + ref = frame.symbols.ref(name) + if frame.loop_frame: + self.writeline(f"_loop_vars[{name!r}] = {ref}") + return + if frame.block_frame: + self.writeline(f"_block_vars[{name!r}] = {ref}") + return + self.writeline(f"context.vars[{name!r}] = {ref}") + else: + if frame.loop_frame: + self.writeline("_loop_vars.update({") + elif frame.block_frame: + self.writeline("_block_vars.update({") + else: + self.writeline("context.vars.update({") + for idx, name in enumerate(vars): + if idx: + self.write(", ") + ref = frame.symbols.ref(name) + self.write(f"{name!r}: {ref}") + self.write("})") + if not frame.block_frame and not frame.loop_frame and public_names: + if len(public_names) == 1: + self.writeline(f"context.exported_vars.add({public_names[0]!r})") + else: + names_str = ", ".join(map(repr, public_names)) + self.writeline(f"context.exported_vars.update(({names_str}))") + + # -- Statement Visitors + + def visit_Template( + self, node: nodes.Template, frame: t.Optional[Frame] = None + ) -> None: + assert frame is None, "no root frame allowed" + eval_ctx = EvalContext(self.environment, self.name) + + from .runtime import exported, async_exported + + if self.environment.is_async: + exported_names = sorted(exported + async_exported) + else: + exported_names = sorted(exported) + + self.writeline("from jinja2.runtime import " + ", ".join(exported_names)) + + # if we want a deferred initialization we cannot move the + # environment into a local name + envenv = "" if self.defer_init else ", environment=environment" + + # do we have an extends tag at all? If not, we can save some + # overhead by just not processing any inheritance code. + have_extends = node.find(nodes.Extends) is not None + + # find all blocks + for block in node.find_all(nodes.Block): + if block.name in self.blocks: + self.fail(f"block {block.name!r} defined twice", block.lineno) + self.blocks[block.name] = block + + # find all imports and import them + for import_ in node.find_all(nodes.ImportedName): + if import_.importname not in self.import_aliases: + imp = import_.importname + self.import_aliases[imp] = alias = self.temporary_identifier() + if "." in imp: + module, obj = imp.rsplit(".", 1) + self.writeline(f"from {module} import {obj} as {alias}") + else: + self.writeline(f"import {imp} as {alias}") + + # add the load name + self.writeline(f"name = {self.name!r}") + + # generate the root render function. + self.writeline( + f"{self.func('root')}(context, missing=missing{envenv}):", extra=1 + ) + self.indent() + self.write_commons() + + # process the root + frame = Frame(eval_ctx) + if "self" in find_undeclared(node.body, ("self",)): + ref = frame.symbols.declare_parameter("self") + self.writeline(f"{ref} = TemplateReference(context)") + frame.symbols.analyze_node(node) + frame.toplevel = frame.rootlevel = True + frame.require_output_check = have_extends and not self.has_known_extends + if have_extends: + self.writeline("parent_template = None") + self.enter_frame(frame) + self.pull_dependencies(node.body) + self.blockvisit(node.body, frame) + self.leave_frame(frame, with_python_scope=True) + self.outdent() + + # make sure that the parent root is called. + if have_extends: + if not self.has_known_extends: + self.indent() + self.writeline("if parent_template is not None:") + self.indent() + if not self.environment.is_async: + self.writeline("yield from parent_template.root_render_func(context)") + else: + self.writeline( + "async for event in parent_template.root_render_func(context):" + ) + self.indent() + self.writeline("yield event") + self.outdent() + self.outdent(1 + (not self.has_known_extends)) + + # at this point we now have the blocks collected and can visit them too. + for name, block in self.blocks.items(): + self.writeline( + f"{self.func('block_' + name)}(context, missing=missing{envenv}):", + block, + 1, + ) + self.indent() + self.write_commons() + # It's important that we do not make this frame a child of the + # toplevel template. This would cause a variety of + # interesting issues with identifier tracking. + block_frame = Frame(eval_ctx) + block_frame.block_frame = True + undeclared = find_undeclared(block.body, ("self", "super")) + if "self" in undeclared: + ref = block_frame.symbols.declare_parameter("self") + self.writeline(f"{ref} = TemplateReference(context)") + if "super" in undeclared: + ref = block_frame.symbols.declare_parameter("super") + self.writeline(f"{ref} = context.super({name!r}, block_{name})") + block_frame.symbols.analyze_node(block) + block_frame.block = name + self.writeline("_block_vars = {}") + self.enter_frame(block_frame) + self.pull_dependencies(block.body) + self.blockvisit(block.body, block_frame) + self.leave_frame(block_frame, with_python_scope=True) + self.outdent() + + blocks_kv_str = ", ".join(f"{x!r}: block_{x}" for x in self.blocks) + self.writeline(f"blocks = {{{blocks_kv_str}}}", extra=1) + debug_kv_str = "&".join(f"{k}={v}" for k, v in self.debug_info) + self.writeline(f"debug_info = {debug_kv_str!r}") + + def visit_Block(self, node: nodes.Block, frame: Frame) -> None: + """Call a block and register it for the template.""" + level = 0 + if frame.toplevel: + # if we know that we are a child template, there is no need to + # check if we are one + if self.has_known_extends: + return + if self.extends_so_far > 0: + self.writeline("if parent_template is None:") + self.indent() + level += 1 + + if node.scoped: + context = self.derive_context(frame) + else: + context = self.get_context_ref() + + if node.required: + self.writeline(f"if len(context.blocks[{node.name!r}]) <= 1:", node) + self.indent() + self.writeline( + f'raise TemplateRuntimeError("Required block {node.name!r} not found")', + node, + ) + self.outdent() + + if not self.environment.is_async and frame.buffer is None: + self.writeline( + f"yield from context.blocks[{node.name!r}][0]({context})", node + ) + else: + self.writeline( + f"{self.choose_async()}for event in" + f" context.blocks[{node.name!r}][0]({context}):", + node, + ) + self.indent() + self.simple_write("event", frame) + self.outdent() + + self.outdent(level) + + def visit_Extends(self, node: nodes.Extends, frame: Frame) -> None: + """Calls the extender.""" + if not frame.toplevel: + self.fail("cannot use extend from a non top-level scope", node.lineno) + + # if the number of extends statements in general is zero so + # far, we don't have to add a check if something extended + # the template before this one. + if self.extends_so_far > 0: + + # if we have a known extends we just add a template runtime + # error into the generated code. We could catch that at compile + # time too, but i welcome it not to confuse users by throwing the + # same error at different times just "because we can". + if not self.has_known_extends: + self.writeline("if parent_template is not None:") + self.indent() + self.writeline('raise TemplateRuntimeError("extended multiple times")') + + # if we have a known extends already we don't need that code here + # as we know that the template execution will end here. + if self.has_known_extends: + raise CompilerExit() + else: + self.outdent() + + self.writeline("parent_template = environment.get_template(", node) + self.visit(node.template, frame) + self.write(f", {self.name!r})") + self.writeline("for name, parent_block in parent_template.blocks.items():") + self.indent() + self.writeline("context.blocks.setdefault(name, []).append(parent_block)") + self.outdent() + + # if this extends statement was in the root level we can take + # advantage of that information and simplify the generated code + # in the top level from this point onwards + if frame.rootlevel: + self.has_known_extends = True + + # and now we have one more + self.extends_so_far += 1 + + def visit_Include(self, node: nodes.Include, frame: Frame) -> None: + """Handles includes.""" + if node.ignore_missing: + self.writeline("try:") + self.indent() + + func_name = "get_or_select_template" + if isinstance(node.template, nodes.Const): + if isinstance(node.template.value, str): + func_name = "get_template" + elif isinstance(node.template.value, (tuple, list)): + func_name = "select_template" + elif isinstance(node.template, (nodes.Tuple, nodes.List)): + func_name = "select_template" + + self.writeline(f"template = environment.{func_name}(", node) + self.visit(node.template, frame) + self.write(f", {self.name!r})") + if node.ignore_missing: + self.outdent() + self.writeline("except TemplateNotFound:") + self.indent() + self.writeline("pass") + self.outdent() + self.writeline("else:") + self.indent() + + skip_event_yield = False + if node.with_context: + self.writeline( + f"{self.choose_async()}for event in template.root_render_func(" + "template.new_context(context.get_all(), True," + f" {self.dump_local_context(frame)})):" + ) + elif self.environment.is_async: + self.writeline( + "for event in (await template._get_default_module_async())" + "._body_stream:" + ) + else: + self.writeline("yield from template._get_default_module()._body_stream") + skip_event_yield = True + + if not skip_event_yield: + self.indent() + self.simple_write("event", frame) + self.outdent() + + if node.ignore_missing: + self.outdent() + + def _import_common( + self, node: t.Union[nodes.Import, nodes.FromImport], frame: Frame + ) -> None: + self.write(f"{self.choose_async('await ')}environment.get_template(") + self.visit(node.template, frame) + self.write(f", {self.name!r}).") + + if node.with_context: + f_name = f"make_module{self.choose_async('_async')}" + self.write( + f"{f_name}(context.get_all(), True, {self.dump_local_context(frame)})" + ) + else: + self.write(f"_get_default_module{self.choose_async('_async')}(context)") + + def visit_Import(self, node: nodes.Import, frame: Frame) -> None: + """Visit regular imports.""" + self.writeline(f"{frame.symbols.ref(node.target)} = ", node) + if frame.toplevel: + self.write(f"context.vars[{node.target!r}] = ") + + self._import_common(node, frame) + + if frame.toplevel and not node.target.startswith("_"): + self.writeline(f"context.exported_vars.discard({node.target!r})") + + def visit_FromImport(self, node: nodes.FromImport, frame: Frame) -> None: + """Visit named imports.""" + self.newline(node) + self.write("included_template = ") + self._import_common(node, frame) + var_names = [] + discarded_names = [] + for name in node.names: + if isinstance(name, tuple): + name, alias = name + else: + alias = name + self.writeline( + f"{frame.symbols.ref(alias)} =" + f" getattr(included_template, {name!r}, missing)" + ) + self.writeline(f"if {frame.symbols.ref(alias)} is missing:") + self.indent() + message = ( + "the template {included_template.__name__!r}" + f" (imported on {self.position(node)})" + f" does not export the requested name {name!r}" + ) + self.writeline( + f"{frame.symbols.ref(alias)} = undefined(f{message!r}, name={name!r})" + ) + self.outdent() + if frame.toplevel: + var_names.append(alias) + if not alias.startswith("_"): + discarded_names.append(alias) + + if var_names: + if len(var_names) == 1: + name = var_names[0] + self.writeline(f"context.vars[{name!r}] = {frame.symbols.ref(name)}") + else: + names_kv = ", ".join( + f"{name!r}: {frame.symbols.ref(name)}" for name in var_names + ) + self.writeline(f"context.vars.update({{{names_kv}}})") + if discarded_names: + if len(discarded_names) == 1: + self.writeline(f"context.exported_vars.discard({discarded_names[0]!r})") + else: + names_str = ", ".join(map(repr, discarded_names)) + self.writeline( + f"context.exported_vars.difference_update(({names_str}))" + ) + + def visit_For(self, node: nodes.For, frame: Frame) -> None: + loop_frame = frame.inner() + loop_frame.loop_frame = True + test_frame = frame.inner() + else_frame = frame.inner() + + # try to figure out if we have an extended loop. An extended loop + # is necessary if the loop is in recursive mode if the special loop + # variable is accessed in the body if the body is a scoped block. + extended_loop = ( + node.recursive + or "loop" + in find_undeclared(node.iter_child_nodes(only=("body",)), ("loop",)) + or any(block.scoped for block in node.find_all(nodes.Block)) + ) + + loop_ref = None + if extended_loop: + loop_ref = loop_frame.symbols.declare_parameter("loop") + + loop_frame.symbols.analyze_node(node, for_branch="body") + if node.else_: + else_frame.symbols.analyze_node(node, for_branch="else") + + if node.test: + loop_filter_func = self.temporary_identifier() + test_frame.symbols.analyze_node(node, for_branch="test") + self.writeline(f"{self.func(loop_filter_func)}(fiter):", node.test) + self.indent() + self.enter_frame(test_frame) + self.writeline(self.choose_async("async for ", "for ")) + self.visit(node.target, loop_frame) + self.write(" in ") + self.write(self.choose_async("auto_aiter(fiter)", "fiter")) + self.write(":") + self.indent() + self.writeline("if ", node.test) + self.visit(node.test, test_frame) + self.write(":") + self.indent() + self.writeline("yield ") + self.visit(node.target, loop_frame) + self.outdent(3) + self.leave_frame(test_frame, with_python_scope=True) + + # if we don't have an recursive loop we have to find the shadowed + # variables at that point. Because loops can be nested but the loop + # variable is a special one we have to enforce aliasing for it. + if node.recursive: + self.writeline( + f"{self.func('loop')}(reciter, loop_render_func, depth=0):", node + ) + self.indent() + self.buffer(loop_frame) + + # Use the same buffer for the else frame + else_frame.buffer = loop_frame.buffer + + # make sure the loop variable is a special one and raise a template + # assertion error if a loop tries to write to loop + if extended_loop: + self.writeline(f"{loop_ref} = missing") + + for name in node.find_all(nodes.Name): + if name.ctx == "store" and name.name == "loop": + self.fail( + "Can't assign to special loop variable in for-loop target", + name.lineno, + ) + + if node.else_: + iteration_indicator = self.temporary_identifier() + self.writeline(f"{iteration_indicator} = 1") + + self.writeline(self.choose_async("async for ", "for "), node) + self.visit(node.target, loop_frame) + if extended_loop: + self.write(f", {loop_ref} in {self.choose_async('Async')}LoopContext(") + else: + self.write(" in ") + + if node.test: + self.write(f"{loop_filter_func}(") + if node.recursive: + self.write("reciter") + else: + if self.environment.is_async and not extended_loop: + self.write("auto_aiter(") + self.visit(node.iter, frame) + if self.environment.is_async and not extended_loop: + self.write(")") + if node.test: + self.write(")") + + if node.recursive: + self.write(", undefined, loop_render_func, depth):") + else: + self.write(", undefined):" if extended_loop else ":") + + self.indent() + self.enter_frame(loop_frame) + + self.writeline("_loop_vars = {}") + self.blockvisit(node.body, loop_frame) + if node.else_: + self.writeline(f"{iteration_indicator} = 0") + self.outdent() + self.leave_frame( + loop_frame, with_python_scope=node.recursive and not node.else_ + ) + + if node.else_: + self.writeline(f"if {iteration_indicator}:") + self.indent() + self.enter_frame(else_frame) + self.blockvisit(node.else_, else_frame) + self.leave_frame(else_frame) + self.outdent() + + # if the node was recursive we have to return the buffer contents + # and start the iteration code + if node.recursive: + self.return_buffer_contents(loop_frame) + self.outdent() + self.start_write(frame, node) + self.write(f"{self.choose_async('await ')}loop(") + if self.environment.is_async: + self.write("auto_aiter(") + self.visit(node.iter, frame) + if self.environment.is_async: + self.write(")") + self.write(", loop)") + self.end_write(frame) + + # at the end of the iteration, clear any assignments made in the + # loop from the top level + if self._assign_stack: + self._assign_stack[-1].difference_update(loop_frame.symbols.stores) + + def visit_If(self, node: nodes.If, frame: Frame) -> None: + if_frame = frame.soft() + self.writeline("if ", node) + self.visit(node.test, if_frame) + self.write(":") + self.indent() + self.blockvisit(node.body, if_frame) + self.outdent() + for elif_ in node.elif_: + self.writeline("elif ", elif_) + self.visit(elif_.test, if_frame) + self.write(":") + self.indent() + self.blockvisit(elif_.body, if_frame) + self.outdent() + if node.else_: + self.writeline("else:") + self.indent() + self.blockvisit(node.else_, if_frame) + self.outdent() + + def visit_Macro(self, node: nodes.Macro, frame: Frame) -> None: + macro_frame, macro_ref = self.macro_body(node, frame) + self.newline() + if frame.toplevel: + if not node.name.startswith("_"): + self.write(f"context.exported_vars.add({node.name!r})") + self.writeline(f"context.vars[{node.name!r}] = ") + self.write(f"{frame.symbols.ref(node.name)} = ") + self.macro_def(macro_ref, macro_frame) + + def visit_CallBlock(self, node: nodes.CallBlock, frame: Frame) -> None: + call_frame, macro_ref = self.macro_body(node, frame) + self.writeline("caller = ") + self.macro_def(macro_ref, call_frame) + self.start_write(frame, node) + self.visit_Call(node.call, frame, forward_caller=True) + self.end_write(frame) + + def visit_FilterBlock(self, node: nodes.FilterBlock, frame: Frame) -> None: + filter_frame = frame.inner() + filter_frame.symbols.analyze_node(node) + self.enter_frame(filter_frame) + self.buffer(filter_frame) + self.blockvisit(node.body, filter_frame) + self.start_write(frame, node) + self.visit_Filter(node.filter, filter_frame) + self.end_write(frame) + self.leave_frame(filter_frame) + + def visit_With(self, node: nodes.With, frame: Frame) -> None: + with_frame = frame.inner() + with_frame.symbols.analyze_node(node) + self.enter_frame(with_frame) + for target, expr in zip(node.targets, node.values): + self.newline() + self.visit(target, with_frame) + self.write(" = ") + self.visit(expr, frame) + self.blockvisit(node.body, with_frame) + self.leave_frame(with_frame) + + def visit_ExprStmt(self, node: nodes.ExprStmt, frame: Frame) -> None: + self.newline(node) + self.visit(node.node, frame) + + class _FinalizeInfo(t.NamedTuple): + const: t.Optional[t.Callable[..., str]] + src: t.Optional[str] + + @staticmethod + def _default_finalize(value: t.Any) -> t.Any: + """The default finalize function if the environment isn't + configured with one. Or, if the environment has one, this is + called on that function's output for constants. + """ + return str(value) + + _finalize: t.Optional[_FinalizeInfo] = None + + def _make_finalize(self) -> _FinalizeInfo: + """Build the finalize function to be used on constants and at + runtime. Cached so it's only created once for all output nodes. + + Returns a ``namedtuple`` with the following attributes: + + ``const`` + A function to finalize constant data at compile time. + + ``src`` + Source code to output around nodes to be evaluated at + runtime. + """ + if self._finalize is not None: + return self._finalize + + finalize: t.Optional[t.Callable[..., t.Any]] + finalize = default = self._default_finalize + src = None + + if self.environment.finalize: + src = "environment.finalize(" + env_finalize = self.environment.finalize + pass_arg = { + _PassArg.context: "context", + _PassArg.eval_context: "context.eval_ctx", + _PassArg.environment: "environment", + }.get( + _PassArg.from_obj(env_finalize) # type: ignore + ) + finalize = None + + if pass_arg is None: + + def finalize(value: t.Any) -> t.Any: + return default(env_finalize(value)) + + else: + src = f"{src}{pass_arg}, " + + if pass_arg == "environment": + + def finalize(value: t.Any) -> t.Any: + return default(env_finalize(self.environment, value)) + + self._finalize = self._FinalizeInfo(finalize, src) + return self._finalize + + def _output_const_repr(self, group: t.Iterable[t.Any]) -> str: + """Given a group of constant values converted from ``Output`` + child nodes, produce a string to write to the template module + source. + """ + return repr(concat(group)) + + def _output_child_to_const( + self, node: nodes.Expr, frame: Frame, finalize: _FinalizeInfo + ) -> str: + """Try to optimize a child of an ``Output`` node by trying to + convert it to constant, finalized data at compile time. + + If :exc:`Impossible` is raised, the node is not constant and + will be evaluated at runtime. Any other exception will also be + evaluated at runtime for easier debugging. + """ + const = node.as_const(frame.eval_ctx) + + if frame.eval_ctx.autoescape: + const = escape(const) + + # Template data doesn't go through finalize. + if isinstance(node, nodes.TemplateData): + return str(const) + + return finalize.const(const) # type: ignore + + def _output_child_pre( + self, node: nodes.Expr, frame: Frame, finalize: _FinalizeInfo + ) -> None: + """Output extra source code before visiting a child of an + ``Output`` node. + """ + if frame.eval_ctx.volatile: + self.write("(escape if context.eval_ctx.autoescape else str)(") + elif frame.eval_ctx.autoescape: + self.write("escape(") + else: + self.write("str(") + + if finalize.src is not None: + self.write(finalize.src) + + def _output_child_post( + self, node: nodes.Expr, frame: Frame, finalize: _FinalizeInfo + ) -> None: + """Output extra source code after visiting a child of an + ``Output`` node. + """ + self.write(")") + + if finalize.src is not None: + self.write(")") + + def visit_Output(self, node: nodes.Output, frame: Frame) -> None: + # If an extends is active, don't render outside a block. + if frame.require_output_check: + # A top-level extends is known to exist at compile time. + if self.has_known_extends: + return + + self.writeline("if parent_template is None:") + self.indent() + + finalize = self._make_finalize() + body: t.List[t.Union[t.List[t.Any], nodes.Expr]] = [] + + # Evaluate constants at compile time if possible. Each item in + # body will be either a list of static data or a node to be + # evaluated at runtime. + for child in node.nodes: + try: + if not ( + # If the finalize function requires runtime context, + # constants can't be evaluated at compile time. + finalize.const + # Unless it's basic template data that won't be + # finalized anyway. + or isinstance(child, nodes.TemplateData) + ): + raise nodes.Impossible() + + const = self._output_child_to_const(child, frame, finalize) + except (nodes.Impossible, Exception): + # The node was not constant and needs to be evaluated at + # runtime. Or another error was raised, which is easier + # to debug at runtime. + body.append(child) + continue + + if body and isinstance(body[-1], list): + body[-1].append(const) + else: + body.append([const]) + + if frame.buffer is not None: + if len(body) == 1: + self.writeline(f"{frame.buffer}.append(") + else: + self.writeline(f"{frame.buffer}.extend((") + + self.indent() + + for item in body: + if isinstance(item, list): + # A group of constant data to join and output. + val = self._output_const_repr(item) + + if frame.buffer is None: + self.writeline("yield " + val) + else: + self.writeline(val + ",") + else: + if frame.buffer is None: + self.writeline("yield ", item) + else: + self.newline(item) + + # A node to be evaluated at runtime. + self._output_child_pre(item, frame, finalize) + self.visit(item, frame) + self._output_child_post(item, frame, finalize) + + if frame.buffer is not None: + self.write(",") + + if frame.buffer is not None: + self.outdent() + self.writeline(")" if len(body) == 1 else "))") + + if frame.require_output_check: + self.outdent() + + def visit_Assign(self, node: nodes.Assign, frame: Frame) -> None: + self.push_assign_tracking() + self.newline(node) + self.visit(node.target, frame) + self.write(" = ") + self.visit(node.node, frame) + self.pop_assign_tracking(frame) + + def visit_AssignBlock(self, node: nodes.AssignBlock, frame: Frame) -> None: + self.push_assign_tracking() + block_frame = frame.inner() + # This is a special case. Since a set block always captures we + # will disable output checks. This way one can use set blocks + # toplevel even in extended templates. + block_frame.require_output_check = False + block_frame.symbols.analyze_node(node) + self.enter_frame(block_frame) + self.buffer(block_frame) + self.blockvisit(node.body, block_frame) + self.newline(node) + self.visit(node.target, frame) + self.write(" = (Markup if context.eval_ctx.autoescape else identity)(") + if node.filter is not None: + self.visit_Filter(node.filter, block_frame) + else: + self.write(f"concat({block_frame.buffer})") + self.write(")") + self.pop_assign_tracking(frame) + self.leave_frame(block_frame) + + # -- Expression Visitors + + def visit_Name(self, node: nodes.Name, frame: Frame) -> None: + if node.ctx == "store" and ( + frame.toplevel or frame.loop_frame or frame.block_frame + ): + if self._assign_stack: + self._assign_stack[-1].add(node.name) + ref = frame.symbols.ref(node.name) + + # If we are looking up a variable we might have to deal with the + # case where it's undefined. We can skip that case if the load + # instruction indicates a parameter which are always defined. + if node.ctx == "load": + load = frame.symbols.find_load(ref) + if not ( + load is not None + and load[0] == VAR_LOAD_PARAMETER + and not self.parameter_is_undeclared(ref) + ): + self.write( + f"(undefined(name={node.name!r}) if {ref} is missing else {ref})" + ) + return + + self.write(ref) + + def visit_NSRef(self, node: nodes.NSRef, frame: Frame) -> None: + # NSRefs can only be used to store values; since they use the normal + # `foo.bar` notation they will be parsed as a normal attribute access + # when used anywhere but in a `set` context + ref = frame.symbols.ref(node.name) + self.writeline(f"if not isinstance({ref}, Namespace):") + self.indent() + self.writeline( + "raise TemplateRuntimeError" + '("cannot assign attribute on non-namespace object")' + ) + self.outdent() + self.writeline(f"{ref}[{node.attr!r}]") + + def visit_Const(self, node: nodes.Const, frame: Frame) -> None: + val = node.as_const(frame.eval_ctx) + if isinstance(val, float): + self.write(str(val)) + else: + self.write(repr(val)) + + def visit_TemplateData(self, node: nodes.TemplateData, frame: Frame) -> None: + try: + self.write(repr(node.as_const(frame.eval_ctx))) + except nodes.Impossible: + self.write( + f"(Markup if context.eval_ctx.autoescape else identity)({node.data!r})" + ) + + def visit_Tuple(self, node: nodes.Tuple, frame: Frame) -> None: + self.write("(") + idx = -1 + for idx, item in enumerate(node.items): + if idx: + self.write(", ") + self.visit(item, frame) + self.write(",)" if idx == 0 else ")") + + def visit_List(self, node: nodes.List, frame: Frame) -> None: + self.write("[") + for idx, item in enumerate(node.items): + if idx: + self.write(", ") + self.visit(item, frame) + self.write("]") + + def visit_Dict(self, node: nodes.Dict, frame: Frame) -> None: + self.write("{") + for idx, item in enumerate(node.items): + if idx: + self.write(", ") + self.visit(item.key, frame) + self.write(": ") + self.visit(item.value, frame) + self.write("}") + + visit_Add = _make_binop("+") + visit_Sub = _make_binop("-") + visit_Mul = _make_binop("*") + visit_Div = _make_binop("/") + visit_FloorDiv = _make_binop("//") + visit_Pow = _make_binop("**") + visit_Mod = _make_binop("%") + visit_And = _make_binop("and") + visit_Or = _make_binop("or") + visit_Pos = _make_unop("+") + visit_Neg = _make_unop("-") + visit_Not = _make_unop("not ") + + @optimizeconst + def visit_Concat(self, node: nodes.Concat, frame: Frame) -> None: + if frame.eval_ctx.volatile: + func_name = "(markup_join if context.eval_ctx.volatile else str_join)" + elif frame.eval_ctx.autoescape: + func_name = "markup_join" + else: + func_name = "str_join" + self.write(f"{func_name}((") + for arg in node.nodes: + self.visit(arg, frame) + self.write(", ") + self.write("))") + + @optimizeconst + def visit_Compare(self, node: nodes.Compare, frame: Frame) -> None: + self.write("(") + self.visit(node.expr, frame) + for op in node.ops: + self.visit(op, frame) + self.write(")") + + def visit_Operand(self, node: nodes.Operand, frame: Frame) -> None: + self.write(f" {operators[node.op]} ") + self.visit(node.expr, frame) + + @optimizeconst + def visit_Getattr(self, node: nodes.Getattr, frame: Frame) -> None: + if self.environment.is_async: + self.write("(await auto_await(") + + self.write("environment.getattr(") + self.visit(node.node, frame) + self.write(f", {node.attr!r})") + + if self.environment.is_async: + self.write("))") + + @optimizeconst + def visit_Getitem(self, node: nodes.Getitem, frame: Frame) -> None: + # slices bypass the environment getitem method. + if isinstance(node.arg, nodes.Slice): + self.visit(node.node, frame) + self.write("[") + self.visit(node.arg, frame) + self.write("]") + else: + if self.environment.is_async: + self.write("(await auto_await(") + + self.write("environment.getitem(") + self.visit(node.node, frame) + self.write(", ") + self.visit(node.arg, frame) + self.write(")") + + if self.environment.is_async: + self.write("))") + + def visit_Slice(self, node: nodes.Slice, frame: Frame) -> None: + if node.start is not None: + self.visit(node.start, frame) + self.write(":") + if node.stop is not None: + self.visit(node.stop, frame) + if node.step is not None: + self.write(":") + self.visit(node.step, frame) + + @contextmanager + def _filter_test_common( + self, node: t.Union[nodes.Filter, nodes.Test], frame: Frame, is_filter: bool + ) -> t.Iterator[None]: + if self.environment.is_async: + self.write("(await auto_await(") + + if is_filter: + self.write(f"{self.filters[node.name]}(") + func = self.environment.filters.get(node.name) + else: + self.write(f"{self.tests[node.name]}(") + func = self.environment.tests.get(node.name) + + # When inside an If or CondExpr frame, allow the filter to be + # undefined at compile time and only raise an error if it's + # actually called at runtime. See pull_dependencies. + if func is None and not frame.soft_frame: + type_name = "filter" if is_filter else "test" + self.fail(f"No {type_name} named {node.name!r}.", node.lineno) + + pass_arg = { + _PassArg.context: "context", + _PassArg.eval_context: "context.eval_ctx", + _PassArg.environment: "environment", + }.get( + _PassArg.from_obj(func) # type: ignore + ) + + if pass_arg is not None: + self.write(f"{pass_arg}, ") + + # Back to the visitor function to handle visiting the target of + # the filter or test. + yield + + self.signature(node, frame) + self.write(")") + + if self.environment.is_async: + self.write("))") + + @optimizeconst + def visit_Filter(self, node: nodes.Filter, frame: Frame) -> None: + with self._filter_test_common(node, frame, True): + # if the filter node is None we are inside a filter block + # and want to write to the current buffer + if node.node is not None: + self.visit(node.node, frame) + elif frame.eval_ctx.volatile: + self.write( + f"(Markup(concat({frame.buffer}))" + f" if context.eval_ctx.autoescape else concat({frame.buffer}))" + ) + elif frame.eval_ctx.autoescape: + self.write(f"Markup(concat({frame.buffer}))") + else: + self.write(f"concat({frame.buffer})") + + @optimizeconst + def visit_Test(self, node: nodes.Test, frame: Frame) -> None: + with self._filter_test_common(node, frame, False): + self.visit(node.node, frame) + + @optimizeconst + def visit_CondExpr(self, node: nodes.CondExpr, frame: Frame) -> None: + frame = frame.soft() + + def write_expr2() -> None: + if node.expr2 is not None: + self.visit(node.expr2, frame) + return + + self.write( + f'cond_expr_undefined("the inline if-expression on' + f" {self.position(node)} evaluated to false and no else" + f' section was defined.")' + ) + + self.write("(") + self.visit(node.expr1, frame) + self.write(" if ") + self.visit(node.test, frame) + self.write(" else ") + write_expr2() + self.write(")") + + @optimizeconst + def visit_Call( + self, node: nodes.Call, frame: Frame, forward_caller: bool = False + ) -> None: + if self.environment.is_async: + self.write("(await auto_await(") + if self.environment.sandboxed: + self.write("environment.call(context, ") + else: + self.write("context.call(") + self.visit(node.node, frame) + extra_kwargs = {"caller": "caller"} if forward_caller else None + loop_kwargs = {"_loop_vars": "_loop_vars"} if frame.loop_frame else {} + block_kwargs = {"_block_vars": "_block_vars"} if frame.block_frame else {} + if extra_kwargs: + extra_kwargs.update(loop_kwargs, **block_kwargs) + elif loop_kwargs or block_kwargs: + extra_kwargs = dict(loop_kwargs, **block_kwargs) + self.signature(node, frame, extra_kwargs) + self.write(")") + if self.environment.is_async: + self.write("))") + + def visit_Keyword(self, node: nodes.Keyword, frame: Frame) -> None: + self.write(node.key + "=") + self.visit(node.value, frame) + + # -- Unused nodes for extensions + + def visit_MarkSafe(self, node: nodes.MarkSafe, frame: Frame) -> None: + self.write("Markup(") + self.visit(node.expr, frame) + self.write(")") + + def visit_MarkSafeIfAutoescape( + self, node: nodes.MarkSafeIfAutoescape, frame: Frame + ) -> None: + self.write("(Markup if context.eval_ctx.autoescape else identity)(") + self.visit(node.expr, frame) + self.write(")") + + def visit_EnvironmentAttribute( + self, node: nodes.EnvironmentAttribute, frame: Frame + ) -> None: + self.write("environment." + node.name) + + def visit_ExtensionAttribute( + self, node: nodes.ExtensionAttribute, frame: Frame + ) -> None: + self.write(f"environment.extensions[{node.identifier!r}].{node.name}") + + def visit_ImportedName(self, node: nodes.ImportedName, frame: Frame) -> None: + self.write(self.import_aliases[node.importname]) + + def visit_InternalName(self, node: nodes.InternalName, frame: Frame) -> None: + self.write(node.name) + + def visit_ContextReference( + self, node: nodes.ContextReference, frame: Frame + ) -> None: + self.write("context") + + def visit_DerivedContextReference( + self, node: nodes.DerivedContextReference, frame: Frame + ) -> None: + self.write(self.derive_context(frame)) + + def visit_Continue(self, node: nodes.Continue, frame: Frame) -> None: + self.writeline("continue", node) + + def visit_Break(self, node: nodes.Break, frame: Frame) -> None: + self.writeline("break", node) + + def visit_Scope(self, node: nodes.Scope, frame: Frame) -> None: + scope_frame = frame.inner() + scope_frame.symbols.analyze_node(node) + self.enter_frame(scope_frame) + self.blockvisit(node.body, scope_frame) + self.leave_frame(scope_frame) + + def visit_OverlayScope(self, node: nodes.OverlayScope, frame: Frame) -> None: + ctx = self.temporary_identifier() + self.writeline(f"{ctx} = {self.derive_context(frame)}") + self.writeline(f"{ctx}.vars = ") + self.visit(node.context, frame) + self.push_context_reference(ctx) + + scope_frame = frame.inner(isolated=True) + scope_frame.symbols.analyze_node(node) + self.enter_frame(scope_frame) + self.blockvisit(node.body, scope_frame) + self.leave_frame(scope_frame) + self.pop_context_reference() + + def visit_EvalContextModifier( + self, node: nodes.EvalContextModifier, frame: Frame + ) -> None: + for keyword in node.options: + self.writeline(f"context.eval_ctx.{keyword.key} = ") + self.visit(keyword.value, frame) + try: + val = keyword.value.as_const(frame.eval_ctx) + except nodes.Impossible: + frame.eval_ctx.volatile = True + else: + setattr(frame.eval_ctx, keyword.key, val) + + def visit_ScopedEvalContextModifier( + self, node: nodes.ScopedEvalContextModifier, frame: Frame + ) -> None: + old_ctx_name = self.temporary_identifier() + saved_ctx = frame.eval_ctx.save() + self.writeline(f"{old_ctx_name} = context.eval_ctx.save()") + self.visit_EvalContextModifier(node, frame) + for child in node.body: + self.visit(child, frame) + frame.eval_ctx.revert(saved_ctx) + self.writeline(f"context.eval_ctx.revert({old_ctx_name})") diff --git a/app/src/flask-server/venv/Lib/site-packages/jinja2/constants.py b/app/src/flask-server/venv/Lib/site-packages/jinja2/constants.py new file mode 100644 index 0000000..41a1c23 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/jinja2/constants.py @@ -0,0 +1,20 @@ +#: list of lorem ipsum words used by the lipsum() helper function +LOREM_IPSUM_WORDS = """\ +a ac accumsan ad adipiscing aenean aliquam aliquet amet ante aptent arcu at +auctor augue bibendum blandit class commodo condimentum congue consectetuer +consequat conubia convallis cras cubilia cum curabitur curae cursus dapibus +diam dictum dictumst dignissim dis dolor donec dui duis egestas eget eleifend +elementum elit enim erat eros est et etiam eu euismod facilisi facilisis fames +faucibus felis fermentum feugiat fringilla fusce gravida habitant habitasse hac +hendrerit hymenaeos iaculis id imperdiet in inceptos integer interdum ipsum +justo lacinia lacus laoreet lectus leo libero ligula litora lobortis lorem +luctus maecenas magna magnis malesuada massa mattis mauris metus mi molestie +mollis montes morbi mus nam nascetur natoque nec neque netus nibh nisi nisl non +nonummy nostra nulla nullam nunc odio orci ornare parturient pede pellentesque +penatibus per pharetra phasellus placerat platea porta porttitor posuere +potenti praesent pretium primis proin pulvinar purus quam quis quisque rhoncus +ridiculus risus rutrum sagittis sapien scelerisque sed sem semper senectus sit +sociis sociosqu sodales sollicitudin suscipit suspendisse taciti tellus tempor +tempus tincidunt torquent tortor tristique turpis ullamcorper ultrices +ultricies urna ut varius vehicula vel velit venenatis vestibulum vitae vivamus +viverra volutpat vulputate""" diff --git a/app/src/flask-server/venv/Lib/site-packages/jinja2/debug.py b/app/src/flask-server/venv/Lib/site-packages/jinja2/debug.py new file mode 100644 index 0000000..7ed7e92 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/jinja2/debug.py @@ -0,0 +1,191 @@ +import sys +import typing as t +from types import CodeType +from types import TracebackType + +from .exceptions import TemplateSyntaxError +from .utils import internal_code +from .utils import missing + +if t.TYPE_CHECKING: + from .runtime import Context + + +def rewrite_traceback_stack(source: t.Optional[str] = None) -> BaseException: + """Rewrite the current exception to replace any tracebacks from + within compiled template code with tracebacks that look like they + came from the template source. + + This must be called within an ``except`` block. + + :param source: For ``TemplateSyntaxError``, the original source if + known. + :return: The original exception with the rewritten traceback. + """ + _, exc_value, tb = sys.exc_info() + exc_value = t.cast(BaseException, exc_value) + tb = t.cast(TracebackType, tb) + + if isinstance(exc_value, TemplateSyntaxError) and not exc_value.translated: + exc_value.translated = True + exc_value.source = source + # Remove the old traceback, otherwise the frames from the + # compiler still show up. + exc_value.with_traceback(None) + # Outside of runtime, so the frame isn't executing template + # code, but it still needs to point at the template. + tb = fake_traceback( + exc_value, None, exc_value.filename or "", exc_value.lineno + ) + else: + # Skip the frame for the render function. + tb = tb.tb_next + + stack = [] + + # Build the stack of traceback object, replacing any in template + # code with the source file and line information. + while tb is not None: + # Skip frames decorated with @internalcode. These are internal + # calls that aren't useful in template debugging output. + if tb.tb_frame.f_code in internal_code: + tb = tb.tb_next + continue + + template = tb.tb_frame.f_globals.get("__jinja_template__") + + if template is not None: + lineno = template.get_corresponding_lineno(tb.tb_lineno) + fake_tb = fake_traceback(exc_value, tb, template.filename, lineno) + stack.append(fake_tb) + else: + stack.append(tb) + + tb = tb.tb_next + + tb_next = None + + # Assign tb_next in reverse to avoid circular references. + for tb in reversed(stack): + tb.tb_next = tb_next + tb_next = tb + + return exc_value.with_traceback(tb_next) + + +def fake_traceback( # type: ignore + exc_value: BaseException, tb: t.Optional[TracebackType], filename: str, lineno: int +) -> TracebackType: + """Produce a new traceback object that looks like it came from the + template source instead of the compiled code. The filename, line + number, and location name will point to the template, and the local + variables will be the current template context. + + :param exc_value: The original exception to be re-raised to create + the new traceback. + :param tb: The original traceback to get the local variables and + code info from. + :param filename: The template filename. + :param lineno: The line number in the template source. + """ + if tb is not None: + # Replace the real locals with the context that would be + # available at that point in the template. + locals = get_template_locals(tb.tb_frame.f_locals) + locals.pop("__jinja_exception__", None) + else: + locals = {} + + globals = { + "__name__": filename, + "__file__": filename, + "__jinja_exception__": exc_value, + } + # Raise an exception at the correct line number. + code: CodeType = compile( + "\n" * (lineno - 1) + "raise __jinja_exception__", filename, "exec" + ) + + # Build a new code object that points to the template file and + # replaces the location with a block name. + location = "template" + + if tb is not None: + function = tb.tb_frame.f_code.co_name + + if function == "root": + location = "top-level template code" + elif function.startswith("block_"): + location = f"block {function[6:]!r}" + + if sys.version_info >= (3, 8): + code = code.replace(co_name=location) + else: + code = CodeType( + code.co_argcount, + code.co_kwonlyargcount, + code.co_nlocals, + code.co_stacksize, + code.co_flags, + code.co_code, + code.co_consts, + code.co_names, + code.co_varnames, + code.co_filename, + location, + code.co_firstlineno, + code.co_lnotab, + code.co_freevars, + code.co_cellvars, + ) + + # Execute the new code, which is guaranteed to raise, and return + # the new traceback without this frame. + try: + exec(code, globals, locals) + except BaseException: + return sys.exc_info()[2].tb_next # type: ignore + + +def get_template_locals(real_locals: t.Mapping[str, t.Any]) -> t.Dict[str, t.Any]: + """Based on the runtime locals, get the context that would be + available at that point in the template. + """ + # Start with the current template context. + ctx: "t.Optional[Context]" = real_locals.get("context") + + if ctx is not None: + data: t.Dict[str, t.Any] = ctx.get_all().copy() + else: + data = {} + + # Might be in a derived context that only sets local variables + # rather than pushing a context. Local variables follow the scheme + # l_depth_name. Find the highest-depth local that has a value for + # each name. + local_overrides: t.Dict[str, t.Tuple[int, t.Any]] = {} + + for name, value in real_locals.items(): + if not name.startswith("l_") or value is missing: + # Not a template variable, or no longer relevant. + continue + + try: + _, depth_str, name = name.split("_", 2) + depth = int(depth_str) + except ValueError: + continue + + cur_depth = local_overrides.get(name, (-1,))[0] + + if cur_depth < depth: + local_overrides[name] = (depth, value) + + # Modify the context with any derived context. + for name, (_, value) in local_overrides.items(): + if value is missing: + data.pop(name, None) + else: + data[name] = value + + return data diff --git a/app/src/flask-server/venv/Lib/site-packages/jinja2/defaults.py b/app/src/flask-server/venv/Lib/site-packages/jinja2/defaults.py new file mode 100644 index 0000000..638cad3 --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/jinja2/defaults.py @@ -0,0 +1,48 @@ +import typing as t + +from .filters import FILTERS as DEFAULT_FILTERS # noqa: F401 +from .tests import TESTS as DEFAULT_TESTS # noqa: F401 +from .utils import Cycler +from .utils import generate_lorem_ipsum +from .utils import Joiner +from .utils import Namespace + +if t.TYPE_CHECKING: + import typing_extensions as te + +# defaults for the parser / lexer +BLOCK_START_STRING = "{%" +BLOCK_END_STRING = "%}" +VARIABLE_START_STRING = "{{" +VARIABLE_END_STRING = "}}" +COMMENT_START_STRING = "{#" +COMMENT_END_STRING = "#}" +LINE_STATEMENT_PREFIX: t.Optional[str] = None +LINE_COMMENT_PREFIX: t.Optional[str] = None +TRIM_BLOCKS = False +LSTRIP_BLOCKS = False +NEWLINE_SEQUENCE: "te.Literal['\\n', '\\r\\n', '\\r']" = "\n" +KEEP_TRAILING_NEWLINE = False + +# default filters, tests and namespace + +DEFAULT_NAMESPACE = { + "range": range, + "dict": dict, + "lipsum": generate_lorem_ipsum, + "cycler": Cycler, + "joiner": Joiner, + "namespace": Namespace, +} + +# default policies +DEFAULT_POLICIES: t.Dict[str, t.Any] = { + "compiler.ascii_str": True, + "urlize.rel": "noopener", + "urlize.target": None, + "urlize.extra_schemes": None, + "truncate.leeway": 5, + "json.dumps_function": None, + "json.dumps_kwargs": {"sort_keys": True}, + "ext.i18n.trimmed": False, +} diff --git a/app/src/flask-server/venv/Lib/site-packages/jinja2/environment.py b/app/src/flask-server/venv/Lib/site-packages/jinja2/environment.py new file mode 100644 index 0000000..ea04e8b --- /dev/null +++ b/app/src/flask-server/venv/Lib/site-packages/jinja2/environment.py @@ -0,0 +1,1667 @@ +"""Classes for managing templates and their runtime and compile time +options. +""" +import os +import typing +import typing as t +import weakref +from collections import ChainMap +from functools import lru_cache +from functools import partial +from functools import reduce +from types import CodeType + +from markupsafe import Markup + +from . import nodes +from .compiler import CodeGenerator +from .compiler import generate +from .defaults import BLOCK_END_STRING +from .defaults import BLOCK_START_STRING +from .defaults import COMMENT_END_STRING +from .defaults import COMMENT_START_STRING +from .defaults import DEFAULT_FILTERS +from .defaults import DEFAULT_NAMESPACE +from .defaults import DEFAULT_POLICIES +from .defaults import DEFAULT_TESTS +from .defaults import KEEP_TRAILING_NEWLINE +from .defaults import LINE_COMMENT_PREFIX +from .defaults import LINE_STATEMENT_PREFIX +from .defaults import LSTRIP_BLOCKS +from .defaults import NEWLINE_SEQUENCE +from .defaults import TRIM_BLOCKS +from .defaults import VARIABLE_END_STRING +from .defaults import VARIABLE_START_STRING +from .exceptions import TemplateNotFound +from .exceptions import TemplateRuntimeError +from .exceptions import TemplatesNotFound +from .exceptions import TemplateSyntaxError +from .exceptions import UndefinedError +from .lexer import get_lexer +from .lexer import Lexer +from .lexer import TokenStream +from .nodes import EvalContext +from .parser import Parser +from .runtime import Context +from .runtime import new_context +from .runtime import Undefined +from .utils import _PassArg +from .utils import concat +from .utils import consume +from .utils import import_string +from .utils import internalcode +from .utils import LRUCache +from .utils import missing + +if t.TYPE_CHECKING: + import typing_extensions as te + from .bccache import BytecodeCache + from .ext import Extension + from .loaders import BaseLoader + +_env_bound = t.TypeVar("_env_bound", bound="Environment") + + +# for direct template usage we have up to ten living environments +@lru_cache(maxsize=10) +def get_spontaneous_environment(cls: t.Type[_env_bound], *args: t.Any) -> _env_bound: + """Return a new spontaneous environment. A spontaneous environment + is used for templates created directly rather than through an + existing environment. + + :param cls: Environment class to create. + :param args: Positional arguments passed to environment. + """ + env = cls(*args) + env.shared = True + return env + + +def create_cache( + size: int, +) -> t.Optional[t.MutableMapping[t.Tuple[weakref.ref, str], "Template"]]: + """Return the cache class for the given size.""" + if size == 0: + return None + + if size < 0: + return {} + + return LRUCache(size) # type: ignore + + +def copy_cache( + cache: t.Optional[t.MutableMapping], +) -> t.Optional[t.MutableMapping[t.Tuple[weakref.ref, str], "Template"]]: + """Create an empty copy of the given cache.""" + if cache is None: + return None + + if type(cache) is dict: + return {} + + return LRUCache(cache.capacity) # type: ignore + + +def load_extensions( + environment: "Environment", + extensions: t.Sequence[t.Union[str, t.Type["Extension"]]], +) -> t.Dict[str, "Extension"]: + """Load the extensions from the list and bind it to the environment. + Returns a dict of instantiated extensions. + """ + result = {} + + for extension in extensions: + if isinstance(extension, str): + extension = t.cast(t.Type["Extension"], import_string(extension)) + + result[extension.identifier] = extension(environment) + + return result + + +def _environment_config_check(environment: "Environment") -> "Environment": + """Perform a sanity check on the environment.""" + assert issubclass( + environment.undefined, Undefined + ), "'undefined' must be a subclass of 'jinja2.Undefined'." + assert ( + environment.block_start_string + != environment.variable_start_string + != environment.comment_start_string + ), "block, variable and comment start strings must be different." + assert environment.newline_sequence in { + "\r", + "\r\n", + "\n", + }, "'newline_sequence' must be one of '\\n', '\\r\\n', or '\\r'." + return environment + + +class Environment: + r"""The core component of Jinja is the `Environment`. It contains + important shared variables like configuration, filters, tests, + globals and others. Instances of this class may be modified if + they are not shared and if no template was loaded so far. + Modifications on environments after the first template was loaded + will lead to surprising effects and undefined behavior. + + Here are the possible initialization parameters: + + `block_start_string` + The string marking the beginning of a block. Defaults to ``'{%'``. + + `block_end_string` + The string marking the end of a block. Defaults to ``'%}'``. + + `variable_start_string` + The string marking the beginning of a print statement. + Defaults to ``'{{'``. + + `variable_end_string` + The string marking the end of a print statement. Defaults to + ``'}}'``. + + `comment_start_string` + The string marking the beginning of a comment. Defaults to ``'{#'``. + + `comment_end_string` + The string marking the end of a comment. Defaults to ``'#}'``. + + `line_statement_prefix` + If given and a string, this will be used as prefix for line based + statements. See also :ref:`line-statements`. + + `line_comment_prefix` + If given and a string, this will be used as prefix for line based + comments. See also :ref:`line-statements`. + + .. versionadded:: 2.2 + + `trim_blocks` + If this is set to ``True`` the first newline after a block is + removed (block, not variable tag!). Defaults to `False`. + + `lstrip_blocks` + If this is set to ``True`` leading spaces and tabs are stripped + from the start of a line to a block. Defaults to `False`. + + `newline_sequence` + The sequence that starts a newline. Must be one of ``'\r'``, + ``'\n'`` or ``'\r\n'``. The default is ``'\n'`` which is a + useful default for Linux and OS X systems as well as web + applications. + + `keep_trailing_newline` + Preserve the trailing newline when rendering templates. + The default is ``False``, which causes a single newline, + if present, to be stripped from the end of the template. + + .. versionadded:: 2.7 + + `extensions` + List of Jinja extensions to use. This can either be import paths + as strings or extension classes. For more information have a + look at :ref:`the extensions documentation `. + + `optimized` + should the optimizer be enabled? Default is ``True``. + + `undefined` + :class:`Undefined` or a subclass of it that is used to represent + undefined values in the template. + + `finalize` + A callable that can be used to process the result of a variable + expression before it is output. For example one can convert + ``None`` implicitly into an empty string here. + + `autoescape` + If set to ``True`` the XML/HTML autoescaping feature is enabled by + default. For more details about autoescaping see + :class:`~markupsafe.Markup`. As of Jinja 2.4 this can also + be a callable that is passed the template name and has to + return ``True`` or ``False`` depending on autoescape should be + enabled by default. + + .. versionchanged:: 2.4 + `autoescape` can now be a function + + `loader` + The template loader for this environment. + + `cache_size` + The size of the cache. Per default this is ``400`` which means + that if more than 400 templates are loaded the loader will clean + out the least recently used template. If the cache size is set to + ``0`` templates are recompiled all the time, if the cache size is + ``-1`` the cache will not be cleaned. + + .. versionchanged:: 2.8 + The cache size was increased to 400 from a low 50. + + `auto_reload` + Some loaders load templates from locations where the template + sources may change (ie: file system or database). If + ``auto_reload`` is set to ``True`` (default) every time a template is + requested the loader checks if the source changed and if yes, it + will reload the template. For higher performance it's possible to + disable that. + + `bytecode_cache` + If set to a bytecode cache object, this object will provide a + cache for the internal Jinja bytecode so that templates don't + have to be parsed if they were not changed. + + See :ref:`bytecode-cache` for more information. + + `enable_async` + If set to true this enables async template execution which + allows using async functions and generators. + """ + + #: if this environment is sandboxed. Modifying this variable won't make + #: the environment sandboxed though. For a real sandboxed environment + #: have a look at jinja2.sandbox. This flag alone controls the code + #: generation by the compiler. + sandboxed = False + + #: True if the environment is just an overlay + overlayed = False + + #: the environment this environment is linked to if it is an overlay + linked_to: t.Optional["Environment"] = None + + #: shared environments have this set to `True`. A shared environment + #: must not be modified + shared = False + + #: the class that is used for code generation. See + #: :class:`~jinja2.compiler.CodeGenerator` for more information. + code_generator_class: t.Type["CodeGenerator"] = CodeGenerator + + concat = "".join + + #: the context class that is used for templates. See + #: :class:`~jinja2.runtime.Context` for more information. + context_class: t.Type[Context] = Context + + template_class: t.Type["Template"] + + def __init__( + self, + block_start_string: str = BLOCK_START_STRING, + block_end_string: str = BLOCK_END_STRING, + variable_start_string: str = VARIABLE_START_STRING, + variable_end_string: str = VARIABLE_END_STRING, + comment_start_string: str = COMMENT_START_STRING, + comment_end_string: str = COMMENT_END_STRING, + line_statement_prefix: t.Optional[str] = LINE_STATEMENT_PREFIX, + line_comment_prefix: t.Optional[str] = LINE_COMMENT_PREFIX, + trim_blocks: bool = TRIM_BLOCKS, + lstrip_blocks: bool = LSTRIP_BLOCKS, + newline_sequence: "te.Literal['\\n', '\\r\\n', '\\r']" = NEWLINE_SEQUENCE, + keep_trailing_newline: bool = KEEP_TRAILING_NEWLINE, + extensions: t.Sequence[t.Union[str, t.Type["Extension"]]] = (), + optimized: bool = True, + undefined: t.Type[Undefined] = Undefined, + finalize: t.Optional[t.Callable[..., t.Any]] = None, + autoescape: t.Union[bool, t.Callable[[t.Optional[str]], bool]] = False, + loader: t.Optional["BaseLoader"] = None, + cache_size: int = 400, + auto_reload: bool = True, + bytecode_cache: t.Optional["BytecodeCache"] = None, + enable_async: bool = False, + ): + # !!Important notice!! + # The constructor accepts quite a few arguments that should be + # passed by keyword rather than position. However it's important to + # not change the order of arguments because it's used at least + # internally in those cases: + # - spontaneous environments (i18n extension and Template) + # - unittests + # If parameter changes are required only add parameters at the end + # and don't change the arguments (or the defaults!) of the arguments + # existing already. + + # lexer / parser information + self.block_start_string = block_start_string + self.block_end_string = block_end_string + self.variable_start_string = variable_start_string + self.variable_end_string = variable_end_string + self.comment_start_string = comment_start_string + self.comment_end_string = comment_end_string + self.line_statement_prefix = line_statement_prefix + self.line_comment_prefix = line_comment_prefix + self.trim_blocks = trim_blocks + self.lstrip_blocks = lstrip_blocks + self.newline_sequence = newline_sequence + self.keep_trailing_newline = keep_trailing_newline + + # runtime information + self.undefined: t.Type[Undefined] = undefined + self.optimized = optimized + self.finalize = finalize + self.autoescape = autoescape + + # defaults + self.filters = DEFAULT_FILTERS.copy() + self.tests = DEFAULT_TESTS.copy() + self.globals = DEFAULT_NAMESPACE.copy() + + # set the loader provided + self.loader = loader + self.cache = create_cache(cache_size) + self.bytecode_cache = bytecode_cache + self.auto_reload = auto_reload + + # configurable policies + self.policies = DEFAULT_POLICIES.copy() + + # load extensions + self.extensions = load_extensions(self, extensions) + + self.is_async = enable_async + _environment_config_check(self) + + def add_extension(self, extension: t.Union[str, t.Type["Extension"]]) -> None: + """Adds an extension after the environment was created. + + .. versionadded:: 2.5 + """ + self.extensions.update(load_extensions(self, [extension])) + + def extend(self, **attributes: t.Any) -> None: + """Add the items to the instance of the environment if they do not exist + yet. This is used by :ref:`extensions ` to register + callbacks and configuration values without breaking inheritance. + """ + for key, value in attributes.items(): + if not hasattr(self, key): + setattr(self, key, value) + + def overlay( + self, + block_start_string: str = missing, + block_end_string: str = missing, + variable_start_string: str = missing, + variable_end_string: str = missing, + comment_start_string: str = missing, + comment_end_string: str = missing, + line_statement_prefix: t.Optional[str] = missing, + line_comment_prefix: t.Optional[str] = missing, + trim_blocks: bool = missing, + lstrip_blocks: bool = missing, + newline_sequence: "te.Literal['\\n', '\\r\\n', '\\r']" = missing, + keep_trailing_newline: bool = missing, + extensions: t.Sequence[t.Union[str, t.Type["Extension"]]] = missing, + optimized: bool = missing, + undefined: t.Type[Undefined] = missing, + finalize: t.Optional[t.Callable[..., t.Any]] = missing, + autoescape: t.Union[bool, t.Callable[[t.Optional[str]], bool]] = missing, + loader: t.Optional["BaseLoader"] = missing, + cache_size: int = missing, + auto_reload: bool = missing, + bytecode_cache: t.Optional["BytecodeCache"] = missing, + enable_async: bool = False, + ) -> "Environment": + """Create a new overlay environment that shares all the data with the + current environment except for cache and the overridden attributes. + Extensions cannot be removed for an overlayed environment. An overlayed + environment automatically gets all the extensions of the environment it + is linked to plus optional extra extensions. + + Creating overlays should happen after the initial environment was set + up completely. Not all attributes are truly linked, some are just + copied over so modifications on the original environment may not shine + through. + + .. versionchanged:: 3.1.2 + Added the ``newline_sequence``,, ``keep_trailing_newline``, + and ``enable_async`` parameters to match ``__init__``. + """ + args = dict(locals()) + del args["self"], args["cache_size"], args["extensions"], args["enable_async"] + + rv = object.__new__(self.__class__) + rv.__dict__.update(self.__dict__) + rv.overlayed = True + rv.linked_to = self + + for key, value in args.items(): + if value is not missing: + setattr(rv, key, value) + + if cache_size is not missing: + rv.cache = create_cache(cache_size) + else: + rv.cache = copy_cache(self.cache) + + rv.extensions = {} + for key, value in self.extensions.items(): + rv.extensions[key] = value.bind(rv) + if extensions is not missing: + rv.extensions.update(load_extensions(rv, extensions)) + + if enable_async is not missing: + rv.is_async = enable_async + + return _environment_config_check(rv) + + @property + def lexer(self) -> Lexer: + """The lexer for this environment.""" + return get_lexer(self) + + def iter_extensions(self) -> t.Iterator["Extension"]: + """Iterates over the extensions by priority.""" + return iter(sorted(self.extensions.values(), key=lambda x: x.priority)) + + def getitem( + self, obj: t.Any, argument: t.Union[str, t.Any] + ) -> t.Union[t.Any, Undefined]: + """Get an item or attribute of an object but prefer the item.""" + try: + return obj[argument] + except (AttributeError, TypeError, LookupError): + if isinstance(argument, str): + try: + attr = str(argument) + except Exception: + pass + else: + try: + return getattr(obj, attr) + except AttributeError: + pass + return self.undefined(obj=obj, name=argument) + + def getattr(self, obj: t.Any, attribute: str) -> t.Any: + """Get an item or attribute of an object but prefer the attribute. + Unlike :meth:`getitem` the attribute *must* be a string. + """ + try: + return getattr(obj, attribute) + except AttributeError: + pass + try: + return obj[attribute] + except (TypeError, LookupError, AttributeError): + return self.undefined(obj=obj, name=attribute) + + def _filter_test_common( + self, + name: t.Union[str, Undefined], + value: t.Any, + args: t.Optional[t.Sequence[t.Any]], + kwargs: t.Optional[t.Mapping[str, t.Any]], + context: t.Optional[Context], + eval_ctx: t.Optional[EvalContext], + is_filter: bool, + ) -> t.Any: + if is_filter: + env_map = self.filters + type_name = "filter" + else: + env_map = self.tests + type_name = "test" + + func = env_map.get(name) # type: ignore + + if func is None: + msg = f"No {type_name} named {name!r}." + + if isinstance(name, Undefined): + try: + name._fail_with_undefined_error() + except Exception as e: + msg = f"{msg} ({e}; did you forget to quote the callable name?)" + + raise TemplateRuntimeError(msg) + + args = [value, *(args if args is not None else ())] + kwargs = kwargs if kwargs is not None else {} + pass_arg = _PassArg.from_obj(func) + + if pass_arg is _PassArg.context: + if context is None: + raise TemplateRuntimeError( + f"Attempted to invoke a context {type_name} without context." + ) + + args.insert(0, context) + elif pass_arg is _PassArg.eval_context: + if eval_ctx is None: + if context is not None: + eval_ctx = context.eval_ctx + else: + eval_ctx = EvalContext(self) + + args.insert(0, eval_ctx) + elif pass_arg is _PassArg.environment: + args.insert(0, self) + + return func(*args, **kwargs) + + def call_filter( + self, + name: str, + value: t.Any, + args: t.Optional[t.Sequence[t.Any]] = None, + kwargs: t.Optional[t.Mapping[str, t.Any]] = None, + context: t.Optional[Context] = None, + eval_ctx: t.Optional[EvalContext] = None, + ) -> t.Any: + """Invoke a filter on a value the same way the compiler does. + + This might return a coroutine if the filter is running from an + environment in async mode and the filter supports async + execution. It's your responsibility to await this if needed. + + .. versionadded:: 2.7 + """ + return self._filter_test_common( + name, value, args, kwargs, context, eval_ctx, True + ) + + def call_test( + self, + name: str, + value: t.Any, + args: t.Optional[t.Sequence[t.Any]] = None, + kwargs: t.Optional[t.Mapping[str, t.Any]] = None, + context: t.Optional[Context] = None, + eval_ctx: t.Optional[EvalContext] = None, + ) -> t.Any: + """Invoke a test on a value the same way the compiler does. + + This might return a coroutine if the test is running from an + environment in async mode and the test supports async execution. + It's your responsibility to await this if needed. + + .. versionchanged:: 3.0 + Tests support ``@pass_context``, etc. decorators. Added + the ``context`` and ``eval_ctx`` parameters. + + .. versionadded:: 2.7 + """ + return self._filter_test_common( + name, value, args, kwargs, context, eval_ctx, False + ) + + @internalcode + def parse( + self, + source: str, + name: t.Optional[str] = None, + filename: t.Optional[str] = None, + ) -> nodes.Template: + """Parse the sourcecode and return the abstract syntax tree. This + tree of nodes is used by the compiler to convert the template into + executable source- or bytecode. This is useful for debugging or to + extract information from templates. + + If you are :ref:`developing Jinja extensions ` + this gives you a good overview of the node tree generated. + """ + try: + return self._parse(source, name, filename) + except TemplateSyntaxError: + self.handle_exception(source=source) + + def _parse( + self, source: str, name: t.Optional[str], filename: t.Optional[str] + ) -> nodes.Template: + """Internal parsing function used by `parse` and `compile`.""" + return Parser(self, source, name, filename).parse() + + def lex( + self, + source: str, + name: t.Optional[str] = None, + filename: t.Optional[str] = None, + ) -> t.Iterator[t.Tuple[int, str, str]]: + """Lex the given sourcecode and return a generator that yields + tokens as tuples in the form ``(lineno, token_type, value)``. + This can be useful for :ref:`extension development ` + and debugging templates. + + This does not perform preprocessing. If you want the preprocessing + of the extensions to be applied you have to filter source through + the :meth:`preprocess` method. + """ + source = str(source) + try: + return self.lexer.tokeniter(source, name, filename) + except TemplateSyntaxError: + self.handle_exception(source=source) + + def preprocess( + self, + source: str, + name: t.Optional[str] = None, + filename: t.Optional[str] = None, + ) -> str: + """Preprocesses the source with all extensions. This is automatically + called for all parsing and compiling methods but *not* for :meth:`lex` + because there you usually only want the actual source tokenized. + """ + return reduce( + lambda s, e: e.preprocess(s, name, filename), + self.iter_extensions(), + str(source), + ) + + def _tokenize( + self, + source: str, + name: t.Optional[str], + filename: t.Optional[str] = None, + state: t.Optional[str] = None, + ) -> TokenStream: + """Called by the parser to do the preprocessing and filtering + for all the extensions. Returns a :class:`~jinja2.lexer.TokenStream`. + """ + source = self.preprocess(source, name, filename) + stream = self.lexer.tokenize(source, name, filename, state) + + for ext in self.iter_extensions(): + stream = ext.filter_stream(stream) # type: ignore + + if not isinstance(stream, TokenStream): + stream = TokenStream(stream, name, filename) # type: ignore + + return stream + + def _generate( + self, + source: nodes.Template, + name: t.Optional[str], + filename: t.Optional[str], + defer_init: bool = False, + ) -> str: + """Internal hook that can be overridden to hook a different generate + method in. + + .. versionadded:: 2.5 + """ + return generate( # type: ignore + source, + self, + name, + filename, + defer_init=defer_init, + optimized=self.optimized, + ) + + def _compile(self, source: str, filename: str) -> CodeType: + """Internal hook that can be overridden to hook a different compile + method in. + + .. versionadded:: 2.5 + """ + return compile(source, filename, "exec") # type: ignore + + @typing.overload + def compile( # type: ignore + self, + source: t.Union[str, nodes.Template], + name: t.Optional[str] = None, + filename: t.Optional[str] = None, + raw: "te.Literal[False]" = False, + defer_init: bool = False, + ) -> CodeType: + ... + + @typing.overload + def compile( + self, + source: t.Union[str, nodes.Template], + name: t.Optional[str] = None, + filename: t.Optional[str] = None, + raw: "te.Literal[True]" = ..., + defer_init: bool = False, + ) -> str: + ... + + @internalcode + def compile( + self, + source: t.Union[str, nodes.Template], + name: t.Optional[str] = None, + filename: t.Optional[str] = None, + raw: bool = False, + defer_init: bool = False, + ) -> t.Union[str, CodeType]: + """Compile a node or template source code. The `name` parameter is + the load name of the template after it was joined using + :meth:`join_path` if necessary, not the filename on the file system. + the `filename` parameter is the estimated filename of the template on + the file system. If the template came from a database or memory this + can be omitted. + + The return value of this method is a python code object. If the `raw` + parameter is `True` the return value will be a string with python + code equivalent to the bytecode returned otherwise. This method is + mainly used internally. + + `defer_init` is use internally to aid the module code generator. This + causes the generated code to be able to import without the global + environment variable to be set. + + .. versionadded:: 2.4 + `defer_init` parameter added. + """ + source_hint = None + try: + if isinstance(source, str): + source_hint = source + source = self._parse(source, name, filename) + source = self._generate(source, name, filename, defer_init=defer_init) + if raw: + return source + if filename is None: + filename = "