SuperCollider-3.6.3-Source-linux~repack/0000775000175000017500000000000012110505246016342 5ustar dandanSuperCollider-3.6.3-Source-linux~repack/SCDoc/0000775000175000017500000000000012110505246017275 5ustar dandanSuperCollider-3.6.3-Source-linux~repack/SCDoc/SCDoc.tab.hpp0000664000175000017500000000703212057624166021525 0ustar dandan/* A Bison parser, made by GNU Bison 2.5. */ /* Bison interface for Yacc-like parsers in C Copyright (C) 1984, 1989-1990, 2000-2011 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers know about them. */ enum yytokentype { END = 0, CLASS = 258, TITLE = 259, SUMMARY = 260, RELATED = 261, CATEGORIES = 262, REDIRECT = 263, CLASSTREE = 264, COPYMETHOD = 265, KEYWORD = 266, PRIVATE = 267, SECTION = 268, SUBSECTION = 269, METHOD = 270, ARGUMENT = 271, DESCRIPTION = 272, CLASSMETHODS = 273, INSTANCEMETHODS = 274, EXAMPLES = 275, RETURNS = 276, DISCUSSION = 277, LIST = 278, TREE = 279, NUMBEREDLIST = 280, DEFINITIONLIST = 281, TABLE = 282, FOOTNOTE = 283, NOTE = 284, WARNING = 285, CODE = 286, LINK = 287, ANCHOR = 288, SOFT = 289, IMAGE = 290, TELETYPE = 291, MATH = 292, STRONG = 293, EMPHASIS = 294, CODEBLOCK = 295, TELETYPEBLOCK = 296, MATHBLOCK = 297, TAGSYM = 298, BARS = 299, HASHES = 300, TEXT = 301, URL = 302, COMMA = 303, METHODNAME = 304, METHODARGS = 305, NEWLINE = 306, EMPTYLINES = 307, BAD_METHODNAME = 308, START_FULL = 309, START_PARTIAL = 310, START_METADATA = 311 }; #endif #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef union YYSTYPE { /* Line 2068 of yacc.c */ #line 55 "SCDoc.y" int i; const char *id; char *str; DocNode *doc_node; /* Line 2068 of yacc.c */ #line 116 "SCDoc.tab.hpp" } YYSTYPE; # define YYSTYPE_IS_TRIVIAL 1 # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 #endif extern YYSTYPE scdoclval; #if ! defined YYLTYPE && ! defined YYLTYPE_IS_DECLARED typedef struct YYLTYPE { int first_line; int first_column; int last_line; int last_column; } YYLTYPE; # define yyltype YYLTYPE /* obsolescent; will be withdrawn */ # define YYLTYPE_IS_DECLARED 1 # define YYLTYPE_IS_TRIVIAL 1 #endif extern YYLTYPE scdoclloc; SuperCollider-3.6.3-Source-linux~repack/SCDoc/build_parser.sh0000775000175000017500000000027211743774635022335 0ustar dandan#!/bin/sh flex -P scdoc -o lex.scdoc.cpp SCDoc.l && bison -p scdoc --defines -o SCDoc.tab.cpp SCDoc.y #g++ -g -O3 -o scdoc_parse_dump lex.scdoc.cpp SCDoc.tab.cpp SCDoc.cpp main.cpp -ll SuperCollider-3.6.3-Source-linux~repack/SCDoc/SCDoc.tab.cpp0000664000175000017500000027556012106676016021531 0ustar dandan/* A Bison parser, made by GNU Bison 2.5. */ /* Bison implementation for Yacc-like parsers in C Copyright (C) 1984, 1989-1990, 2000-2011 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* C LALR(1) parser skeleton written by Richard Stallman, by simplifying the original so-called "semantic" parser. */ /* All symbols defined below should begin with yy or YY, to avoid infringing on user name space. This should be done even for local variables, as they might otherwise be expanded by user macros. There are some unavoidable exceptions within include files to define necessary library symbols; they are noted "INFRINGES ON USER NAME SPACE" below. */ /* Identify Bison output. */ #define YYBISON 1 /* Bison version. */ #define YYBISON_VERSION "2.5" /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" /* Pure parsers. */ #define YYPURE 0 /* Push parsers. */ #define YYPUSH 0 /* Pull parsers. */ #define YYPULL 1 /* Using locations. */ #define YYLSP_NEEDED 1 /* Substitute the variable and function names. */ #define yyparse scdocparse #define yylex scdoclex #define yyerror scdocerror #define yylval scdoclval #define yychar scdocchar #define yydebug scdocdebug #define yynerrs scdocnerrs #define yylloc scdoclloc /* Copy the first part of user declarations. */ /* Line 268 of yacc.c */ #line 1 "SCDoc.y" /************************************************************************ * * Copyright 2012 Jonatan Liljedahl * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ************************************************************************/ #include #include #include #include "SCDoc.h" //#define YYLEX_PARAM &yylval, &yylloc int scdocparse(); extern int scdoclineno; extern char *scdoctext; extern int scdoc_start_token; extern FILE *scdocin; //extern struct YYLTYPE scdoclloc; //int scdoc_metadata_mode; static const char * method_type = NULL; static DocNode * topnode; void scdocerror(const char *str); extern void error(const char *fmt, ...); extern void post(const char *fmt, ...); static inline bool stringEqual(const char * a, const char * b) { return strcmp(a, b) == 0; } /* Line 268 of yacc.c */ #line 133 "SCDoc.tab.cpp" /* Enabling traces. */ #ifndef YYDEBUG # define YYDEBUG 0 #endif /* Enabling verbose error messages. */ #ifdef YYERROR_VERBOSE # undef YYERROR_VERBOSE # define YYERROR_VERBOSE 1 #else # define YYERROR_VERBOSE 1 #endif /* Enabling the token table. */ #ifndef YYTOKEN_TABLE # define YYTOKEN_TABLE 0 #endif /* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers know about them. */ enum yytokentype { END = 0, CLASS = 258, TITLE = 259, SUMMARY = 260, RELATED = 261, CATEGORIES = 262, REDIRECT = 263, CLASSTREE = 264, COPYMETHOD = 265, KEYWORD = 266, PRIVATE = 267, SECTION = 268, SUBSECTION = 269, METHOD = 270, ARGUMENT = 271, DESCRIPTION = 272, CLASSMETHODS = 273, INSTANCEMETHODS = 274, EXAMPLES = 275, RETURNS = 276, DISCUSSION = 277, LIST = 278, TREE = 279, NUMBEREDLIST = 280, DEFINITIONLIST = 281, TABLE = 282, FOOTNOTE = 283, NOTE = 284, WARNING = 285, CODE = 286, LINK = 287, ANCHOR = 288, SOFT = 289, IMAGE = 290, TELETYPE = 291, MATH = 292, STRONG = 293, EMPHASIS = 294, CODEBLOCK = 295, TELETYPEBLOCK = 296, MATHBLOCK = 297, TAGSYM = 298, BARS = 299, HASHES = 300, TEXT = 301, URL = 302, COMMA = 303, METHODNAME = 304, METHODARGS = 305, NEWLINE = 306, EMPTYLINES = 307, BAD_METHODNAME = 308, START_FULL = 309, START_PARTIAL = 310, START_METADATA = 311 }; #endif #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef union YYSTYPE { /* Line 293 of yacc.c */ #line 55 "SCDoc.y" int i; const char *id; char *str; DocNode *doc_node; /* Line 293 of yacc.c */ #line 235 "SCDoc.tab.cpp" } YYSTYPE; # define YYSTYPE_IS_TRIVIAL 1 # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 #endif #if ! defined YYLTYPE && ! defined YYLTYPE_IS_DECLARED typedef struct YYLTYPE { int first_line; int first_column; int last_line; int last_column; } YYLTYPE; # define yyltype YYLTYPE /* obsolescent; will be withdrawn */ # define YYLTYPE_IS_DECLARED 1 # define YYLTYPE_IS_TRIVIAL 1 #endif /* Copy the second part of user declarations. */ /* Line 343 of yacc.c */ #line 100 "SCDoc.y" //int scdoclex (YYSTYPE * yylval_param, struct YYLTYPE * yylloc_param ); int scdoclex (void); /* Line 343 of yacc.c */ #line 266 "SCDoc.tab.cpp" #ifdef short # undef short #endif #ifdef YYTYPE_UINT8 typedef YYTYPE_UINT8 yytype_uint8; #else typedef unsigned char yytype_uint8; #endif #ifdef YYTYPE_INT8 typedef YYTYPE_INT8 yytype_int8; #elif (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) typedef signed char yytype_int8; #else typedef short int yytype_int8; #endif #ifdef YYTYPE_UINT16 typedef YYTYPE_UINT16 yytype_uint16; #else typedef unsigned short int yytype_uint16; #endif #ifdef YYTYPE_INT16 typedef YYTYPE_INT16 yytype_int16; #else typedef short int yytype_int16; #endif #ifndef YYSIZE_T # ifdef __SIZE_TYPE__ # define YYSIZE_T __SIZE_TYPE__ # elif defined size_t # define YYSIZE_T size_t # elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ # define YYSIZE_T size_t # else # define YYSIZE_T unsigned int # endif #endif #define YYSIZE_MAXIMUM ((YYSIZE_T) -1) #ifndef YY_ # if defined YYENABLE_NLS && YYENABLE_NLS # if ENABLE_NLS # include /* INFRINGES ON USER NAME SPACE */ # define YY_(msgid) dgettext ("bison-runtime", msgid) # endif # endif # ifndef YY_ # define YY_(msgid) msgid # endif #endif /* Suppress unused-variable warnings by "using" E. */ #if ! defined lint || defined __GNUC__ # define YYUSE(e) ((void) (e)) #else # define YYUSE(e) /* empty */ #endif /* Identity function, used to suppress warnings about constant conditions. */ #ifndef lint # define YYID(n) (n) #else #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static int YYID (int yyi) #else static int YYID (yyi) int yyi; #endif { return yyi; } #endif #if ! defined yyoverflow || YYERROR_VERBOSE /* The parser invokes alloca or malloc; define the necessary symbols. */ # ifdef YYSTACK_USE_ALLOCA # if YYSTACK_USE_ALLOCA # ifdef __GNUC__ # define YYSTACK_ALLOC __builtin_alloca # elif defined __BUILTIN_VA_ARG_INCR # include /* INFRINGES ON USER NAME SPACE */ # elif defined _AIX # define YYSTACK_ALLOC __alloca # elif defined _MSC_VER # include /* INFRINGES ON USER NAME SPACE */ # define alloca _alloca # else # define YYSTACK_ALLOC alloca # if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ # ifndef EXIT_SUCCESS # define EXIT_SUCCESS 0 # endif # endif # endif # endif # endif # ifdef YYSTACK_ALLOC /* Pacify GCC's `empty if-body' warning. */ # define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) # ifndef YYSTACK_ALLOC_MAXIMUM /* The OS might guarantee only one guard page at the bottom of the stack, and a page size can be as small as 4096 bytes. So we cannot safely invoke alloca (N) if N exceeds 4096. Use a slightly smaller number to allow for a few compiler-allocated temporary stack slots. */ # define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ # endif # else # define YYSTACK_ALLOC YYMALLOC # define YYSTACK_FREE YYFREE # ifndef YYSTACK_ALLOC_MAXIMUM # define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM # endif # if (defined __cplusplus && ! defined EXIT_SUCCESS \ && ! ((defined YYMALLOC || defined malloc) \ && (defined YYFREE || defined free))) # include /* INFRINGES ON USER NAME SPACE */ # ifndef EXIT_SUCCESS # define EXIT_SUCCESS 0 # endif # endif # ifndef YYMALLOC # define YYMALLOC malloc # if ! defined malloc && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ # endif # endif # ifndef YYFREE # define YYFREE free # if ! defined free && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) void free (void *); /* INFRINGES ON USER NAME SPACE */ # endif # endif # endif #endif /* ! defined yyoverflow || YYERROR_VERBOSE */ #if (! defined yyoverflow \ && (! defined __cplusplus \ || (defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL \ && defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) /* A type that is properly aligned for any stack member. */ union yyalloc { yytype_int16 yyss_alloc; YYSTYPE yyvs_alloc; YYLTYPE yyls_alloc; }; /* The size of the maximum gap between one aligned stack and the next. */ # define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) /* The size of an array large to enough to hold all stacks, each with N elements. */ # define YYSTACK_BYTES(N) \ ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE) + sizeof (YYLTYPE)) \ + 2 * YYSTACK_GAP_MAXIMUM) # define YYCOPY_NEEDED 1 /* Relocate STACK from its old location to the new one. The local variables YYSIZE and YYSTACKSIZE give the old and new number of elements in the stack, and YYPTR gives the new location of the stack. Advance YYPTR to a properly aligned location for the next stack. */ # define YYSTACK_RELOCATE(Stack_alloc, Stack) \ do \ { \ YYSIZE_T yynewbytes; \ YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ Stack = &yyptr->Stack_alloc; \ yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ yyptr += yynewbytes / sizeof (*yyptr); \ } \ while (YYID (0)) #endif #if defined YYCOPY_NEEDED && YYCOPY_NEEDED /* Copy COUNT objects from FROM to TO. The source and destination do not overlap. */ # ifndef YYCOPY # if defined __GNUC__ && 1 < __GNUC__ # define YYCOPY(To, From, Count) \ __builtin_memcpy (To, From, (Count) * sizeof (*(From))) # else # define YYCOPY(To, From, Count) \ do \ { \ YYSIZE_T yyi; \ for (yyi = 0; yyi < (Count); yyi++) \ (To)[yyi] = (From)[yyi]; \ } \ while (YYID (0)) # endif # endif #endif /* !YYCOPY_NEEDED */ /* YYFINAL -- State number of the termination state. */ #define YYFINAL 70 /* YYLAST -- Last index in YYTABLE. */ #define YYLAST 434 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 57 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 55 /* YYNRULES -- Number of rules. */ #define YYNRULES 134 /* YYNRULES -- Number of states. */ #define YYNSTATES 193 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 #define YYMAXUTOK 311 #define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) /* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ static const yytype_uint8 yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56 }; #if YYDEBUG /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in YYRHS. */ static const yytype_uint16 yyprhs[] = { 0, 0, 3, 5, 8, 13, 16, 20, 22, 23, 26, 28, 32, 36, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 59, 62, 64, 66, 67, 73, 76, 78, 79, 82, 84, 86, 91, 93, 94, 97, 99, 101, 107, 111, 115, 116, 118, 120, 124, 126, 131, 133, 134, 136, 137, 140, 142, 147, 151, 154, 155, 158, 159, 161, 163, 166, 169, 171, 174, 176, 180, 184, 188, 192, 196, 200, 204, 206, 210, 213, 215, 217, 219, 223, 227, 229, 231, 233, 235, 237, 239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 259, 261, 265, 268, 271, 274, 276, 280, 282, 286, 289, 293, 296, 298, 300, 302, 304, 306, 309, 311, 314, 316, 318, 320, 322, 324, 326, 328, 331, 333, 336, 339, 341, 343, 347 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ static const yytype_int8 yyrhs[] = { 58, 0, -1, 59, -1, 59, 1, -1, 54, 60, 61, 65, -1, 55, 66, -1, 56, 61, 65, -1, 106, -1, -1, 61, 62, -1, 62, -1, 63, 105, 106, -1, 7, 111, 106, -1, 6, 111, 106, -1, 3, -1, 4, -1, 5, -1, 8, -1, 18, -1, 19, -1, 17, -1, 20, -1, 66, -1, -1, 66, 67, -1, 67, -1, 73, -1, -1, 13, 68, 105, 106, 69, -1, 64, 69, -1, 70, -1, -1, 70, 71, -1, 71, -1, 73, -1, 14, 105, 106, 72, -1, 73, -1, -1, 73, 74, -1, 74, -1, 85, -1, 15, 77, 75, 106, 78, -1, 10, 104, 106, -1, 12, 111, 107, -1, -1, 50, -1, 49, -1, 77, 48, 76, -1, 76, -1, 79, 80, 83, 84, -1, 85, -1, -1, 81, -1, -1, 81, 82, -1, 82, -1, 16, 104, 106, 79, -1, 16, 106, 85, -1, 21, 85, -1, -1, 22, 85, -1, -1, 86, -1, 87, -1, 87, 88, -1, 86, 88, -1, 88, -1, 86, 89, -1, 89, -1, 94, 85, 43, -1, 93, 95, 43, -1, 27, 97, 43, -1, 26, 101, 43, -1, 92, 109, 43, -1, 9, 104, 107, -1, 11, 111, 107, -1, 52, -1, 35, 105, 43, -1, 89, 90, -1, 90, -1, 103, -1, 47, -1, 91, 104, 43, -1, 28, 85, 43, -1, 51, -1, 32, -1, 38, -1, 34, -1, 39, -1, 31, -1, 36, -1, 37, -1, 33, -1, 40, -1, 41, -1, 42, -1, 23, -1, 24, -1, 25, -1, 30, -1, 29, -1, 95, 45, 85, -1, 45, 85, -1, 45, 98, -1, 97, 96, -1, 96, -1, 98, 44, 79, -1, 79, -1, 99, 45, 85, -1, 45, 85, -1, 99, 44, 79, -1, 101, 100, -1, 100, -1, 103, -1, 47, -1, 46, -1, 48, -1, 104, 103, -1, 103, -1, 105, 102, -1, 102, -1, 51, -1, 52, -1, 106, -1, 0, -1, 103, -1, 106, -1, 109, 108, -1, 108, -1, 110, 46, -1, 110, 47, -1, 46, -1, 47, -1, 111, 48, 110, -1, 110, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const yytype_uint16 yyrline[] = { 0, 107, 107, 108, 111, 117, 121, 129, 130, 133, 134, 137, 138, 139, 142, 143, 144, 145, 148, 149, 150, 151, 154, 155, 158, 159, 160, 163, 163, 164, 167, 168, 171, 172, 173, 176, 179, 180, 183, 184, 185, 188, 195, 201, 206, 207, 218, 229, 230, 233, 242, 243, 246, 247, 250, 251, 254, 255, 258, 259, 262, 263, 271, 272, 275, 276, 277, 280, 281, 284, 285, 286, 287, 288, 289, 290, 293, 294, 297, 298, 301, 302, 303, 304, 305, 308, 309, 310, 311, 312, 313, 314, 315, 318, 319, 320, 323, 324, 325, 328, 329, 332, 333, 336, 339, 340, 343, 344, 347, 348, 351, 358, 359, 362, 363, 366, 367, 370, 371, 374, 375, 378, 379, 382, 383, 386, 387, 390, 391, 394, 395, 396, 397, 400, 401 }; #endif #if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. First, the terminals, then, starting at YYNTOKENS, nonterminals. */ static const char *const yytname[] = { "\"end of file\"", "error", "$undefined", "CLASS", "TITLE", "SUMMARY", "RELATED", "CATEGORIES", "REDIRECT", "CLASSTREE", "COPYMETHOD", "KEYWORD", "PRIVATE", "SECTION", "SUBSECTION", "METHOD", "ARGUMENT", "DESCRIPTION", "CLASSMETHODS", "INSTANCEMETHODS", "EXAMPLES", "RETURNS", "DISCUSSION", "LIST", "TREE", "NUMBEREDLIST", "DEFINITIONLIST", "TABLE", "FOOTNOTE", "NOTE", "WARNING", "CODE", "LINK", "ANCHOR", "SOFT", "IMAGE", "TELETYPE", "MATH", "STRONG", "EMPHASIS", "\"CODE block\"", "\"TELETYPE block\"", "\"MATH block\"", "\"::\"", "\"||\"", "\"##\"", "\"text\"", "URL", "COMMA", "\"method name\"", "\"arguments string\"", "\"newline\"", "\"empty lines\"", "\"bad method name\"", "START_FULL", "START_PARTIAL", "START_METADATA", "$accept", "start", "document", "eateol", "dochead", "headline", "headtag", "sectiontag", "optsections", "sections", "section", "$@1", "optsubsections", "subsections", "subsection", "optsubsubsections", "subsubsections", "subsubsection", "optMETHODARGS", "methodname", "methnames", "methodbody", "optbody", "optargs", "args", "arg", "optreturns", "optdiscussion", "body", "blockA", "blockB", "bodyelem", "prose", "proseelem", "inlinetag", "blocktag", "listtag", "rangetag", "listbody", "tablerow", "tablebody", "tablecells", "defterms", "deflistrow", "deflistbody", "anywordurl", "anyword", "words", "words2", "eol", "eoleof", "anywordnl", "wordsnl", "nocommawords", "commalist", 0 }; #endif # ifdef YYPRINT /* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to token YYLEX-NUM. */ static const yytype_uint16 yytoknum[] = { 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311 }; # endif /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_uint8 yyr1[] = { 0, 57, 58, 58, 59, 59, 59, 60, 60, 61, 61, 62, 62, 62, 63, 63, 63, 63, 64, 64, 64, 64, 65, 65, 66, 66, 66, 68, 67, 67, 69, 69, 70, 70, 70, 71, 72, 72, 73, 73, 73, 74, 74, 74, 75, 75, 76, 77, 77, 78, 79, 79, 80, 80, 81, 81, 82, 82, 83, 83, 84, 84, 85, 85, 86, 86, 86, 87, 87, 88, 88, 88, 88, 88, 88, 88, 88, 88, 89, 89, 90, 90, 90, 90, 90, 91, 91, 91, 91, 91, 91, 91, 91, 92, 92, 92, 93, 93, 93, 94, 94, 95, 95, 96, 97, 97, 98, 98, 99, 99, 100, 101, 101, 102, 102, 103, 103, 104, 104, 105, 105, 106, 106, 107, 107, 108, 108, 109, 109, 110, 110, 110, 110, 111, 111 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ static const yytype_uint8 yyr2[] = { 0, 2, 1, 2, 4, 2, 3, 1, 0, 2, 1, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, 1, 1, 0, 5, 2, 1, 0, 2, 1, 1, 4, 1, 0, 2, 1, 1, 5, 3, 3, 0, 1, 1, 3, 1, 4, 1, 0, 1, 0, 2, 1, 4, 3, 2, 0, 2, 0, 1, 1, 2, 2, 1, 2, 1, 3, 3, 3, 3, 3, 3, 3, 1, 3, 2, 1, 1, 1, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, 2, 2, 1, 3, 1, 3, 2, 3, 2, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 2, 1, 1, 3, 1 }; /* YYDEFACT[STATE-NAME] -- Default reduction number in state STATE-NUM. Performed when YYTABLE doesn't specify something else to do. Zero means the default is an error. */ static const yytype_uint8 yydefact[] = { 0, 8, 0, 0, 0, 0, 121, 122, 0, 7, 0, 0, 0, 0, 27, 0, 20, 18, 19, 21, 96, 97, 98, 0, 0, 0, 100, 99, 89, 85, 92, 87, 0, 90, 91, 86, 88, 93, 94, 95, 115, 81, 116, 84, 76, 31, 5, 25, 26, 39, 40, 62, 63, 66, 68, 79, 0, 0, 0, 0, 80, 14, 15, 16, 0, 0, 17, 23, 10, 0, 1, 3, 23, 118, 0, 0, 131, 132, 134, 0, 0, 0, 46, 48, 44, 0, 0, 112, 0, 51, 105, 0, 0, 114, 120, 113, 0, 0, 29, 30, 33, 34, 24, 38, 65, 67, 64, 78, 0, 125, 126, 128, 0, 0, 0, 0, 0, 0, 9, 6, 22, 0, 4, 124, 117, 123, 74, 42, 129, 130, 0, 75, 43, 0, 0, 45, 0, 109, 51, 0, 72, 111, 107, 50, 103, 71, 104, 83, 77, 119, 0, 32, 82, 73, 127, 102, 70, 0, 69, 13, 12, 11, 133, 31, 47, 51, 110, 108, 51, 37, 101, 28, 41, 53, 106, 35, 36, 0, 59, 52, 55, 0, 0, 0, 61, 54, 51, 57, 58, 0, 49, 56, 60 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int16 yydefgoto[] = { -1, 4, 5, 8, 67, 68, 69, 45, 119, 120, 47, 81, 98, 99, 100, 175, 48, 49, 136, 83, 84, 172, 142, 178, 179, 180, 184, 190, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 114, 90, 91, 144, 86, 87, 88, 94, 60, 74, 96, 125, 126, 111, 112, 78, 79 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ #define YYPACT_NINF -125 static const yytype_int16 yypact[] = { -4, 78, 226, 150, 19, 139, -125, -125, 150, -125, -35, -35, 100, 100, -125, -21, -125, -125, -125, -125, -125, -125, -125, -10, -6, 348, -125, -125, -125, -125, -125, -125, 54, -125, -125, -125, -125, -125, -125, -125, -125, -125, -125, -125, -125, 270, 125, -125, 30, -125, -125, 348, 382, -125, 58, -125, -35, 25, -2, 348, -125, -125, -125, -125, 100, 100, -125, 182, -125, 54, -125, -125, 182, -125, 7, 25, -125, -125, 104, 16, 16, 54, -125, -125, -23, 348, 117, -125, 74, 348, -125, 80, 32, -125, -125, -125, 35, 54, -125, 71, -125, 30, -125, -125, -125, 58, -125, -125, -31, -125, -125, -125, -22, 348, 83, 64, 62, 62, -125, -125, 125, -15, -125, -125, -125, -125, -125, -125, -125, -125, 100, -125, -125, -15, -21, -125, 78, -125, 348, 348, -125, -125, -125, -125, 93, -125, -125, -125, -125, -125, -15, -125, -125, -125, -125, -125, -125, 348, -125, -125, -125, -125, 104, 270, -125, 348, -125, -125, 348, 314, -125, -125, -125, 102, -125, -125, 30, 25, 101, 102, -125, 25, 348, 348, 109, -125, 348, -125, -125, 348, -125, -125, -125 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int16 yypgoto[] = { -125, -125, -125, -125, 140, 26, -125, -125, 97, 157, -41, -125, 8, -125, 75, -125, -42, -40, -125, 39, -125, -125, -124, -125, -125, 0, -125, -125, -5, -125, -125, 113, 124, -48, -125, -125, -125, -125, -125, 91, -125, -125, -125, 95, -125, -87, -9, -7, -59, -1, 87, 84, -125, 68, 5 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule which number is the opposite. If YYTABLE_NINF, syntax error. */ #define YYTABLE_NINF -3 static const yytype_int16 yytable[] = { 9, 73, 73, 101, 75, 102, 107, 123, 103, 149, 121, 40, 152, 42, 166, 40, 123, 42, 80, 70, 92, 153, 133, 95, 40, 134, 42, 135, 82, 6, 7, 40, 93, 42, 149, 85, 6, 7, 150, 89, 11, 173, 13, 113, 174, 15, 149, 73, 109, 108, 1, 2, 3, 40, 115, 42, 110, 107, 6, 7, 95, 103, 191, 149, 130, 124, 124, 6, 7, 116, 117, 40, 95, 42, 127, 147, 6, 7, 148, 102, 137, 40, 93, 42, 143, 97, 25, 95, 95, 28, 29, 30, 31, 118, 33, 34, 35, 36, 118, 124, 40, 93, 42, 109, 40, 41, 42, 158, 155, 43, 130, 110, 95, 6, 7, 159, 160, 140, 177, 85, 161, 101, 183, 145, 95, 89, 156, 176, 157, 6, 7, 189, 163, 143, 167, 165, 103, 168, 14, -2, 71, 95, 16, 17, 18, 19, 76, 77, 72, 169, 128, 129, 170, 61, 62, 63, 64, 65, 66, 46, 143, 138, 139, 143, 104, 106, 131, 132, 73, 122, 181, 171, 124, 164, 151, 105, 182, 187, 188, 185, 186, 143, 146, 141, 192, 61, 62, 63, 64, 65, 66, 10, 11, 12, 13, 14, 154, 15, 162, 16, 17, 18, 19, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 0, 0, 0, 40, 41, 42, 0, 0, 43, 44, 10, 11, 12, 13, 14, 0, 15, 0, 16, 17, 18, 19, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 0, 0, 0, 40, 41, 42, 0, 0, 43, 44, 10, 11, 12, 13, 0, 97, 15, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 0, 0, 0, 40, 41, 42, 0, 0, 43, 44, 10, 11, 12, 13, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 10, 0, 12, 40, 41, 42, 0, 0, 43, 44, 0, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 10, 0, 12, 40, 41, 42, 0, 0, 43, 44, 0, 0, 0, 0, 20, 21, 22, 23, 24, 0, 26, 27, 0, 0, 0, 0, 32, 0, 0, 0, 0, 37, 38, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44 }; #define yypact_value_is_default(yystate) \ ((yystate) == (-125)) #define yytable_value_is_error(yytable_value) \ YYID (0) static const yytype_int16 yycheck[] = { 1, 10, 11, 45, 11, 46, 54, 0, 48, 96, 69, 46, 43, 48, 138, 46, 0, 48, 13, 0, 25, 43, 81, 32, 46, 48, 48, 50, 49, 51, 52, 46, 47, 48, 121, 45, 51, 52, 97, 45, 10, 165, 12, 45, 168, 15, 133, 56, 57, 56, 54, 55, 56, 46, 59, 48, 57, 105, 51, 52, 69, 101, 186, 150, 48, 74, 75, 51, 52, 64, 65, 46, 81, 48, 75, 43, 51, 52, 43, 120, 85, 46, 47, 48, 89, 14, 28, 96, 97, 31, 32, 33, 34, 67, 36, 37, 38, 39, 72, 108, 46, 47, 48, 112, 46, 47, 48, 43, 113, 51, 48, 112, 121, 51, 52, 116, 117, 43, 16, 45, 121, 163, 21, 43, 133, 45, 43, 169, 45, 51, 52, 22, 133, 138, 139, 136, 176, 44, 13, 0, 1, 150, 17, 18, 19, 20, 46, 47, 8, 150, 46, 47, 157, 3, 4, 5, 6, 7, 8, 2, 165, 44, 45, 168, 51, 52, 79, 80, 177, 72, 177, 163, 181, 134, 99, 51, 177, 182, 183, 179, 181, 186, 91, 88, 189, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 112, 15, 130, 17, 18, 19, 20, -1, -1, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, -1, -1, -1, 46, 47, 48, -1, -1, 51, 52, 9, 10, 11, 12, 13, -1, 15, -1, 17, 18, 19, 20, -1, -1, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, -1, -1, -1, 46, 47, 48, -1, -1, 51, 52, 9, 10, 11, 12, -1, 14, 15, -1, -1, -1, -1, -1, -1, -1, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, -1, -1, -1, 46, 47, 48, -1, -1, 51, 52, 9, 10, 11, 12, -1, -1, 15, -1, -1, -1, -1, -1, -1, -1, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 9, -1, 11, 46, 47, 48, -1, -1, 51, 52, -1, -1, -1, -1, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 9, -1, 11, 46, 47, 48, -1, -1, 51, 52, -1, -1, -1, -1, 23, 24, 25, 26, 27, -1, 29, 30, -1, -1, -1, -1, 35, -1, -1, -1, -1, 40, 41, 42, -1, -1, -1, -1, -1, -1, -1, -1, -1, 52 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const yytype_uint8 yystos[] = { 0, 54, 55, 56, 58, 59, 51, 52, 60, 106, 9, 10, 11, 12, 13, 15, 17, 18, 19, 20, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 46, 47, 48, 51, 52, 64, 66, 67, 73, 74, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 103, 3, 4, 5, 6, 7, 8, 61, 62, 63, 0, 1, 61, 103, 104, 104, 46, 47, 110, 111, 111, 68, 49, 76, 77, 45, 99, 100, 101, 45, 96, 97, 85, 47, 102, 103, 105, 14, 69, 70, 71, 73, 67, 74, 88, 89, 88, 90, 104, 103, 106, 108, 109, 45, 95, 85, 111, 111, 62, 65, 66, 105, 65, 0, 103, 106, 107, 106, 46, 47, 48, 107, 107, 105, 48, 50, 75, 85, 44, 45, 43, 100, 79, 85, 98, 43, 96, 43, 43, 102, 105, 71, 43, 43, 108, 85, 43, 45, 43, 106, 106, 106, 110, 106, 76, 106, 79, 85, 44, 106, 85, 69, 78, 79, 79, 72, 73, 16, 80, 81, 82, 104, 106, 21, 83, 82, 106, 85, 85, 22, 84, 79, 85 }; #define yyerrok (yyerrstatus = 0) #define yyclearin (yychar = YYEMPTY) #define YYEMPTY (-2) #define YYEOF 0 #define YYACCEPT goto yyacceptlab #define YYABORT goto yyabortlab #define YYERROR goto yyerrorlab /* Like YYERROR except do call yyerror. This remains here temporarily to ease the transition to the new meaning of YYERROR, for GCC. Once GCC version 2 has supplanted version 1, this can go. However, YYFAIL appears to be in use. Nevertheless, it is formally deprecated in Bison 2.4.2's NEWS entry, where a plan to phase it out is discussed. */ #define YYFAIL goto yyerrlab #if defined YYFAIL /* This is here to suppress warnings from the GCC cpp's -Wunused-macros. Normally we don't worry about that warning, but some users do, and we want to make it easy for users to remove YYFAIL uses, which will produce warnings from Bison 2.5. */ #endif #define YYRECOVERING() (!!yyerrstatus) #define YYBACKUP(Token, Value) \ do \ if (yychar == YYEMPTY && yylen == 1) \ { \ yychar = (Token); \ yylval = (Value); \ YYPOPSTACK (1); \ goto yybackup; \ } \ else \ { \ yyerror (YY_("syntax error: cannot back up")); \ YYERROR; \ } \ while (YYID (0)) #define YYTERROR 1 #define YYERRCODE 256 /* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. If N is 0, then set CURRENT to the empty location which ends the previous symbol: RHS[0] (always defined). */ #define YYRHSLOC(Rhs, K) ((Rhs)[K]) #ifndef YYLLOC_DEFAULT # define YYLLOC_DEFAULT(Current, Rhs, N) \ do \ if (YYID (N)) \ { \ (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ } \ else \ { \ (Current).first_line = (Current).last_line = \ YYRHSLOC (Rhs, 0).last_line; \ (Current).first_column = (Current).last_column = \ YYRHSLOC (Rhs, 0).last_column; \ } \ while (YYID (0)) #endif /* YY_LOCATION_PRINT -- Print the location on the stream. This macro was not mandated originally: define only if we know we won't break user code: when these are the locations we know. */ #ifndef YY_LOCATION_PRINT # if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL # define YY_LOCATION_PRINT(File, Loc) \ fprintf (File, "%d.%d-%d.%d", \ (Loc).first_line, (Loc).first_column, \ (Loc).last_line, (Loc).last_column) # else # define YY_LOCATION_PRINT(File, Loc) ((void) 0) # endif #endif /* YYLEX -- calling `yylex' with the right arguments. */ #ifdef YYLEX_PARAM # define YYLEX yylex (YYLEX_PARAM) #else # define YYLEX yylex () #endif /* Enable debugging if requested. */ #if YYDEBUG # ifndef YYFPRINTF # include /* INFRINGES ON USER NAME SPACE */ # define YYFPRINTF fprintf # endif # define YYDPRINTF(Args) \ do { \ if (yydebug) \ YYFPRINTF Args; \ } while (YYID (0)) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ do { \ if (yydebug) \ { \ YYFPRINTF (stderr, "%s ", Title); \ yy_symbol_print (stderr, \ Type, Value, Location); \ YYFPRINTF (stderr, "\n"); \ } \ } while (YYID (0)) /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ /*ARGSUSED*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp) #else static void yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp) FILE *yyoutput; int yytype; YYSTYPE const * const yyvaluep; YYLTYPE const * const yylocationp; #endif { if (!yyvaluep) return; YYUSE (yylocationp); # ifdef YYPRINT if (yytype < YYNTOKENS) YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); # else YYUSE (yyoutput); # endif switch (yytype) { default: break; } } /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp) #else static void yy_symbol_print (yyoutput, yytype, yyvaluep, yylocationp) FILE *yyoutput; int yytype; YYSTYPE const * const yyvaluep; YYLTYPE const * const yylocationp; #endif { if (yytype < YYNTOKENS) YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); else YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); YY_LOCATION_PRINT (yyoutput, *yylocationp); YYFPRINTF (yyoutput, ": "); yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp); YYFPRINTF (yyoutput, ")"); } /*------------------------------------------------------------------. | yy_stack_print -- Print the state stack from its BOTTOM up to its | | TOP (included). | `------------------------------------------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop) #else static void yy_stack_print (yybottom, yytop) yytype_int16 *yybottom; yytype_int16 *yytop; #endif { YYFPRINTF (stderr, "Stack now"); for (; yybottom <= yytop; yybottom++) { int yybot = *yybottom; YYFPRINTF (stderr, " %d", yybot); } YYFPRINTF (stderr, "\n"); } # define YY_STACK_PRINT(Bottom, Top) \ do { \ if (yydebug) \ yy_stack_print ((Bottom), (Top)); \ } while (YYID (0)) /*------------------------------------------------. | Report that the YYRULE is going to be reduced. | `------------------------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_reduce_print (YYSTYPE *yyvsp, YYLTYPE *yylsp, int yyrule) #else static void yy_reduce_print (yyvsp, yylsp, yyrule) YYSTYPE *yyvsp; YYLTYPE *yylsp; int yyrule; #endif { int yynrhs = yyr2[yyrule]; int yyi; unsigned long int yylno = yyrline[yyrule]; YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", yyrule - 1, yylno); /* The symbols being reduced. */ for (yyi = 0; yyi < yynrhs; yyi++) { YYFPRINTF (stderr, " $%d = ", yyi + 1); yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], &(yyvsp[(yyi + 1) - (yynrhs)]) , &(yylsp[(yyi + 1) - (yynrhs)]) ); YYFPRINTF (stderr, "\n"); } } # define YY_REDUCE_PRINT(Rule) \ do { \ if (yydebug) \ yy_reduce_print (yyvsp, yylsp, Rule); \ } while (YYID (0)) /* Nonzero means print parse trace. It is left uninitialized so that multiple parsers can coexist. */ int yydebug; #else /* !YYDEBUG */ # define YYDPRINTF(Args) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) # define YY_STACK_PRINT(Bottom, Top) # define YY_REDUCE_PRINT(Rule) #endif /* !YYDEBUG */ /* YYINITDEPTH -- initial size of the parser's stacks. */ #ifndef YYINITDEPTH # define YYINITDEPTH 200 #endif /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only if the built-in stack extension method is used). Do not make this value too large; the results are undefined if YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) evaluated with infinite-precision integer arithmetic. */ #ifndef YYMAXDEPTH # define YYMAXDEPTH 10000 #endif #if YYERROR_VERBOSE # ifndef yystrlen # if defined __GLIBC__ && defined _STRING_H # define yystrlen strlen # else /* Return the length of YYSTR. */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static YYSIZE_T yystrlen (const char *yystr) #else static YYSIZE_T yystrlen (yystr) const char *yystr; #endif { YYSIZE_T yylen; for (yylen = 0; yystr[yylen]; yylen++) continue; return yylen; } # endif # endif # ifndef yystpcpy # if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE # define yystpcpy stpcpy # else /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in YYDEST. */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static char * yystpcpy (char *yydest, const char *yysrc) #else static char * yystpcpy (yydest, yysrc) char *yydest; const char *yysrc; #endif { char *yyd = yydest; const char *yys = yysrc; while ((*yyd++ = *yys++) != '\0') continue; return yyd - 1; } # endif # endif # ifndef yytnamerr /* Copy to YYRES the contents of YYSTR after stripping away unnecessary quotes and backslashes, so that it's suitable for yyerror. The heuristic is that double-quoting is unnecessary unless the string contains an apostrophe, a comma, or backslash (other than backslash-backslash). YYSTR is taken from yytname. If YYRES is null, do not copy; instead, return the length of what the result would have been. */ static YYSIZE_T yytnamerr (char *yyres, const char *yystr) { if (*yystr == '"') { YYSIZE_T yyn = 0; char const *yyp = yystr; for (;;) switch (*++yyp) { case '\'': case ',': goto do_not_strip_quotes; case '\\': if (*++yyp != '\\') goto do_not_strip_quotes; /* Fall through. */ default: if (yyres) yyres[yyn] = *yyp; yyn++; break; case '"': if (yyres) yyres[yyn] = '\0'; return yyn; } do_not_strip_quotes: ; } if (! yyres) return yystrlen (yystr); return yystpcpy (yyres, yystr) - yyres; } # endif /* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message about the unexpected token YYTOKEN for the state stack whose top is YYSSP. Return 0 if *YYMSG was successfully written. Return 1 if *YYMSG is not large enough to hold the message. In that case, also set *YYMSG_ALLOC to the required number of bytes. Return 2 if the required number of bytes is too large to store. */ static int yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg, yytype_int16 *yyssp, int yytoken) { YYSIZE_T yysize0 = yytnamerr (0, yytname[yytoken]); YYSIZE_T yysize = yysize0; YYSIZE_T yysize1; enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; /* Internationalized format string. */ const char *yyformat = 0; /* Arguments of yyformat. */ char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; /* Number of reported tokens (one for the "unexpected", one per "expected"). */ int yycount = 0; /* There are many possibilities here to consider: - Assume YYFAIL is not used. It's too flawed to consider. See for details. YYERROR is fine as it does not invoke this function. - If this state is a consistent state with a default action, then the only way this function was invoked is if the default action is an error action. In that case, don't check for expected tokens because there are none. - The only way there can be no lookahead present (in yychar) is if this state is a consistent state with a default action. Thus, detecting the absence of a lookahead is sufficient to determine that there is no unexpected or expected token to report. In that case, just report a simple "syntax error". - Don't assume there isn't a lookahead just because this state is a consistent state with a default action. There might have been a previous inconsistent state, consistent state with a non-default action, or user semantic action that manipulated yychar. - Of course, the expected token list depends on states to have correct lookahead information, and it depends on the parser not to perform extra reductions after fetching a lookahead from the scanner and before detecting a syntax error. Thus, state merging (from LALR or IELR) and default reductions corrupt the expected token list. However, the list is correct for canonical LR with one exception: it will still contain any token that will not be accepted due to an error action in a later state. */ if (yytoken != YYEMPTY) { int yyn = yypact[*yyssp]; yyarg[yycount++] = yytname[yytoken]; if (!yypact_value_is_default (yyn)) { /* Start YYX at -YYN if negative to avoid negative indexes in YYCHECK. In other words, skip the first -YYN actions for this state because they are default actions. */ int yyxbegin = yyn < 0 ? -yyn : 0; /* Stay within bounds of both yycheck and yytname. */ int yychecklim = YYLAST - yyn + 1; int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; int yyx; for (yyx = yyxbegin; yyx < yyxend; ++yyx) if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR && !yytable_value_is_error (yytable[yyx + yyn])) { if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) { yycount = 1; yysize = yysize0; break; } yyarg[yycount++] = yytname[yyx]; yysize1 = yysize + yytnamerr (0, yytname[yyx]); if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) return 2; yysize = yysize1; } } } switch (yycount) { # define YYCASE_(N, S) \ case N: \ yyformat = S; \ break YYCASE_(0, YY_("syntax error")); YYCASE_(1, YY_("syntax error, unexpected %s")); YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s")); YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s")); YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s")); YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s")); # undef YYCASE_ } yysize1 = yysize + yystrlen (yyformat); if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) return 2; yysize = yysize1; if (*yymsg_alloc < yysize) { *yymsg_alloc = 2 * yysize; if (! (yysize <= *yymsg_alloc && *yymsg_alloc <= YYSTACK_ALLOC_MAXIMUM)) *yymsg_alloc = YYSTACK_ALLOC_MAXIMUM; return 1; } /* Avoid sprintf, as that infringes on the user's name space. Don't have undefined behavior even if the translation produced a string with the wrong number of "%s"s. */ { char *yyp = *yymsg; int yyi = 0; while ((*yyp = *yyformat) != '\0') if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount) { yyp += yytnamerr (yyp, yyarg[yyi++]); yyformat += 2; } else { yyp++; yyformat++; } } return 0; } #endif /* YYERROR_VERBOSE */ /*-----------------------------------------------. | Release the memory associated to this symbol. | `-----------------------------------------------*/ /*ARGSUSED*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocationp) #else static void yydestruct (yymsg, yytype, yyvaluep, yylocationp) const char *yymsg; int yytype; YYSTYPE *yyvaluep; YYLTYPE *yylocationp; #endif { YYUSE (yyvaluep); YYUSE (yylocationp); if (!yymsg) yymsg = "Deleting"; YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); switch (yytype) { case 46: /* "\"text\"" */ /* Line 1391 of yacc.c */ #line 98 "SCDoc.y" { free((yyvaluep->str)); }; /* Line 1391 of yacc.c */ #line 1469 "SCDoc.tab.cpp" break; case 47: /* "URL" */ /* Line 1391 of yacc.c */ #line 98 "SCDoc.y" { free((yyvaluep->str)); }; /* Line 1391 of yacc.c */ #line 1478 "SCDoc.tab.cpp" break; case 48: /* "COMMA" */ /* Line 1391 of yacc.c */ #line 98 "SCDoc.y" { free((yyvaluep->str)); }; /* Line 1391 of yacc.c */ #line 1487 "SCDoc.tab.cpp" break; case 49: /* "\"method name\"" */ /* Line 1391 of yacc.c */ #line 98 "SCDoc.y" { free((yyvaluep->str)); }; /* Line 1391 of yacc.c */ #line 1496 "SCDoc.tab.cpp" break; case 50: /* "\"arguments string\"" */ /* Line 1391 of yacc.c */ #line 98 "SCDoc.y" { free((yyvaluep->str)); }; /* Line 1391 of yacc.c */ #line 1505 "SCDoc.tab.cpp" break; case 59: /* "document" */ /* Line 1391 of yacc.c */ #line 97 "SCDoc.y" { doc_node_free_tree((yyvaluep->doc_node)); }; /* Line 1391 of yacc.c */ #line 1514 "SCDoc.tab.cpp" break; case 61: /* "dochead" */ /* Line 1391 of yacc.c */ #line 97 "SCDoc.y" { doc_node_free_tree((yyvaluep->doc_node)); }; /* Line 1391 of yacc.c */ #line 1523 "SCDoc.tab.cpp" break; case 62: /* "headline" */ /* Line 1391 of yacc.c */ #line 97 "SCDoc.y" { doc_node_free_tree((yyvaluep->doc_node)); }; /* Line 1391 of yacc.c */ #line 1532 "SCDoc.tab.cpp" break; case 65: /* "optsections" */ /* Line 1391 of yacc.c */ #line 97 "SCDoc.y" { doc_node_free_tree((yyvaluep->doc_node)); }; /* Line 1391 of yacc.c */ #line 1541 "SCDoc.tab.cpp" break; case 66: /* "sections" */ /* Line 1391 of yacc.c */ #line 97 "SCDoc.y" { doc_node_free_tree((yyvaluep->doc_node)); }; /* Line 1391 of yacc.c */ #line 1550 "SCDoc.tab.cpp" break; case 67: /* "section" */ /* Line 1391 of yacc.c */ #line 97 "SCDoc.y" { doc_node_free_tree((yyvaluep->doc_node)); }; /* Line 1391 of yacc.c */ #line 1559 "SCDoc.tab.cpp" break; case 69: /* "optsubsections" */ /* Line 1391 of yacc.c */ #line 97 "SCDoc.y" { doc_node_free_tree((yyvaluep->doc_node)); }; /* Line 1391 of yacc.c */ #line 1568 "SCDoc.tab.cpp" break; case 70: /* "subsections" */ /* Line 1391 of yacc.c */ #line 97 "SCDoc.y" { doc_node_free_tree((yyvaluep->doc_node)); }; /* Line 1391 of yacc.c */ #line 1577 "SCDoc.tab.cpp" break; case 71: /* "subsection" */ /* Line 1391 of yacc.c */ #line 97 "SCDoc.y" { doc_node_free_tree((yyvaluep->doc_node)); }; /* Line 1391 of yacc.c */ #line 1586 "SCDoc.tab.cpp" break; case 72: /* "optsubsubsections" */ /* Line 1391 of yacc.c */ #line 97 "SCDoc.y" { doc_node_free_tree((yyvaluep->doc_node)); }; /* Line 1391 of yacc.c */ #line 1595 "SCDoc.tab.cpp" break; case 73: /* "subsubsections" */ /* Line 1391 of yacc.c */ #line 97 "SCDoc.y" { doc_node_free_tree((yyvaluep->doc_node)); }; /* Line 1391 of yacc.c */ #line 1604 "SCDoc.tab.cpp" break; case 74: /* "subsubsection" */ /* Line 1391 of yacc.c */ #line 97 "SCDoc.y" { doc_node_free_tree((yyvaluep->doc_node)); }; /* Line 1391 of yacc.c */ #line 1613 "SCDoc.tab.cpp" break; case 75: /* "optMETHODARGS" */ /* Line 1391 of yacc.c */ #line 98 "SCDoc.y" { free((yyvaluep->str)); }; /* Line 1391 of yacc.c */ #line 1622 "SCDoc.tab.cpp" break; case 76: /* "methodname" */ /* Line 1391 of yacc.c */ #line 98 "SCDoc.y" { free((yyvaluep->str)); }; /* Line 1391 of yacc.c */ #line 1631 "SCDoc.tab.cpp" break; case 77: /* "methnames" */ /* Line 1391 of yacc.c */ #line 97 "SCDoc.y" { doc_node_free_tree((yyvaluep->doc_node)); }; /* Line 1391 of yacc.c */ #line 1640 "SCDoc.tab.cpp" break; case 78: /* "methodbody" */ /* Line 1391 of yacc.c */ #line 97 "SCDoc.y" { doc_node_free_tree((yyvaluep->doc_node)); }; /* Line 1391 of yacc.c */ #line 1649 "SCDoc.tab.cpp" break; case 79: /* "optbody" */ /* Line 1391 of yacc.c */ #line 97 "SCDoc.y" { doc_node_free_tree((yyvaluep->doc_node)); }; /* Line 1391 of yacc.c */ #line 1658 "SCDoc.tab.cpp" break; case 80: /* "optargs" */ /* Line 1391 of yacc.c */ #line 97 "SCDoc.y" { doc_node_free_tree((yyvaluep->doc_node)); }; /* Line 1391 of yacc.c */ #line 1667 "SCDoc.tab.cpp" break; case 81: /* "args" */ /* Line 1391 of yacc.c */ #line 97 "SCDoc.y" { doc_node_free_tree((yyvaluep->doc_node)); }; /* Line 1391 of yacc.c */ #line 1676 "SCDoc.tab.cpp" break; case 82: /* "arg" */ /* Line 1391 of yacc.c */ #line 97 "SCDoc.y" { doc_node_free_tree((yyvaluep->doc_node)); }; /* Line 1391 of yacc.c */ #line 1685 "SCDoc.tab.cpp" break; case 83: /* "optreturns" */ /* Line 1391 of yacc.c */ #line 97 "SCDoc.y" { doc_node_free_tree((yyvaluep->doc_node)); }; /* Line 1391 of yacc.c */ #line 1694 "SCDoc.tab.cpp" break; case 84: /* "optdiscussion" */ /* Line 1391 of yacc.c */ #line 97 "SCDoc.y" { doc_node_free_tree((yyvaluep->doc_node)); }; /* Line 1391 of yacc.c */ #line 1703 "SCDoc.tab.cpp" break; case 85: /* "body" */ /* Line 1391 of yacc.c */ #line 97 "SCDoc.y" { doc_node_free_tree((yyvaluep->doc_node)); }; /* Line 1391 of yacc.c */ #line 1712 "SCDoc.tab.cpp" break; case 86: /* "blockA" */ /* Line 1391 of yacc.c */ #line 97 "SCDoc.y" { doc_node_free_tree((yyvaluep->doc_node)); }; /* Line 1391 of yacc.c */ #line 1721 "SCDoc.tab.cpp" break; case 87: /* "blockB" */ /* Line 1391 of yacc.c */ #line 97 "SCDoc.y" { doc_node_free_tree((yyvaluep->doc_node)); }; /* Line 1391 of yacc.c */ #line 1730 "SCDoc.tab.cpp" break; case 88: /* "bodyelem" */ /* Line 1391 of yacc.c */ #line 97 "SCDoc.y" { doc_node_free_tree((yyvaluep->doc_node)); }; /* Line 1391 of yacc.c */ #line 1739 "SCDoc.tab.cpp" break; case 89: /* "prose" */ /* Line 1391 of yacc.c */ #line 97 "SCDoc.y" { doc_node_free_tree((yyvaluep->doc_node)); }; /* Line 1391 of yacc.c */ #line 1748 "SCDoc.tab.cpp" break; case 90: /* "proseelem" */ /* Line 1391 of yacc.c */ #line 97 "SCDoc.y" { doc_node_free_tree((yyvaluep->doc_node)); }; /* Line 1391 of yacc.c */ #line 1757 "SCDoc.tab.cpp" break; case 95: /* "listbody" */ /* Line 1391 of yacc.c */ #line 97 "SCDoc.y" { doc_node_free_tree((yyvaluep->doc_node)); }; /* Line 1391 of yacc.c */ #line 1766 "SCDoc.tab.cpp" break; case 96: /* "tablerow" */ /* Line 1391 of yacc.c */ #line 97 "SCDoc.y" { doc_node_free_tree((yyvaluep->doc_node)); }; /* Line 1391 of yacc.c */ #line 1775 "SCDoc.tab.cpp" break; case 97: /* "tablebody" */ /* Line 1391 of yacc.c */ #line 97 "SCDoc.y" { doc_node_free_tree((yyvaluep->doc_node)); }; /* Line 1391 of yacc.c */ #line 1784 "SCDoc.tab.cpp" break; case 98: /* "tablecells" */ /* Line 1391 of yacc.c */ #line 97 "SCDoc.y" { doc_node_free_tree((yyvaluep->doc_node)); }; /* Line 1391 of yacc.c */ #line 1793 "SCDoc.tab.cpp" break; case 99: /* "defterms" */ /* Line 1391 of yacc.c */ #line 97 "SCDoc.y" { doc_node_free_tree((yyvaluep->doc_node)); }; /* Line 1391 of yacc.c */ #line 1802 "SCDoc.tab.cpp" break; case 100: /* "deflistrow" */ /* Line 1391 of yacc.c */ #line 97 "SCDoc.y" { doc_node_free_tree((yyvaluep->doc_node)); }; /* Line 1391 of yacc.c */ #line 1811 "SCDoc.tab.cpp" break; case 101: /* "deflistbody" */ /* Line 1391 of yacc.c */ #line 97 "SCDoc.y" { doc_node_free_tree((yyvaluep->doc_node)); }; /* Line 1391 of yacc.c */ #line 1820 "SCDoc.tab.cpp" break; case 102: /* "anywordurl" */ /* Line 1391 of yacc.c */ #line 98 "SCDoc.y" { free((yyvaluep->str)); }; /* Line 1391 of yacc.c */ #line 1829 "SCDoc.tab.cpp" break; case 103: /* "anyword" */ /* Line 1391 of yacc.c */ #line 98 "SCDoc.y" { free((yyvaluep->str)); }; /* Line 1391 of yacc.c */ #line 1838 "SCDoc.tab.cpp" break; case 104: /* "words" */ /* Line 1391 of yacc.c */ #line 98 "SCDoc.y" { free((yyvaluep->str)); }; /* Line 1391 of yacc.c */ #line 1847 "SCDoc.tab.cpp" break; case 105: /* "words2" */ /* Line 1391 of yacc.c */ #line 98 "SCDoc.y" { free((yyvaluep->str)); }; /* Line 1391 of yacc.c */ #line 1856 "SCDoc.tab.cpp" break; case 108: /* "anywordnl" */ /* Line 1391 of yacc.c */ #line 98 "SCDoc.y" { free((yyvaluep->str)); }; /* Line 1391 of yacc.c */ #line 1865 "SCDoc.tab.cpp" break; case 109: /* "wordsnl" */ /* Line 1391 of yacc.c */ #line 98 "SCDoc.y" { free((yyvaluep->str)); }; /* Line 1391 of yacc.c */ #line 1874 "SCDoc.tab.cpp" break; case 110: /* "nocommawords" */ /* Line 1391 of yacc.c */ #line 98 "SCDoc.y" { free((yyvaluep->str)); }; /* Line 1391 of yacc.c */ #line 1883 "SCDoc.tab.cpp" break; case 111: /* "commalist" */ /* Line 1391 of yacc.c */ #line 97 "SCDoc.y" { doc_node_free_tree((yyvaluep->doc_node)); }; /* Line 1391 of yacc.c */ #line 1892 "SCDoc.tab.cpp" break; default: break; } } /* Prevent warnings from -Wmissing-prototypes. */ #ifdef YYPARSE_PARAM #if defined __STDC__ || defined __cplusplus int yyparse (void *YYPARSE_PARAM); #else int yyparse (); #endif #else /* ! YYPARSE_PARAM */ #if defined __STDC__ || defined __cplusplus int yyparse (void); #else int yyparse (); #endif #endif /* ! YYPARSE_PARAM */ /* The lookahead symbol. */ int yychar; /* The semantic value of the lookahead symbol. */ YYSTYPE yylval; /* Location data for the lookahead symbol. */ YYLTYPE yylloc; /* Number of syntax errors so far. */ int yynerrs; /*----------. | yyparse. | `----------*/ #ifdef YYPARSE_PARAM #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) int yyparse (void *YYPARSE_PARAM) #else int yyparse (YYPARSE_PARAM) void *YYPARSE_PARAM; #endif #else /* ! YYPARSE_PARAM */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) int yyparse (void) #else int yyparse () #endif #endif { int yystate; /* Number of tokens to shift before error messages enabled. */ int yyerrstatus; /* The stacks and their tools: `yyss': related to states. `yyvs': related to semantic values. `yyls': related to locations. Refer to the stacks thru separate pointers, to allow yyoverflow to reallocate them elsewhere. */ /* The state stack. */ yytype_int16 yyssa[YYINITDEPTH]; yytype_int16 *yyss; yytype_int16 *yyssp; /* The semantic value stack. */ YYSTYPE yyvsa[YYINITDEPTH]; YYSTYPE *yyvs; YYSTYPE *yyvsp; /* The location stack. */ YYLTYPE yylsa[YYINITDEPTH]; YYLTYPE *yyls; YYLTYPE *yylsp; /* The locations where the error started and ended. */ YYLTYPE yyerror_range[3]; YYSIZE_T yystacksize; int yyn; int yyresult; /* Lookahead token as an internal (translated) token number. */ int yytoken; /* The variables used to return semantic value and location from the action routines. */ YYSTYPE yyval; YYLTYPE yyloc; #if YYERROR_VERBOSE /* Buffer for error messages, and its allocated size. */ char yymsgbuf[128]; char *yymsg = yymsgbuf; YYSIZE_T yymsg_alloc = sizeof yymsgbuf; #endif #define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N), yylsp -= (N)) /* The number of symbols on the RHS of the reduced rule. Keep to zero when no symbol should be popped. */ int yylen = 0; yytoken = 0; yyss = yyssa; yyvs = yyvsa; yyls = yylsa; yystacksize = YYINITDEPTH; YYDPRINTF ((stderr, "Starting parse\n")); yystate = 0; yyerrstatus = 0; yynerrs = 0; yychar = YYEMPTY; /* Cause a token to be read. */ /* Initialize stack pointers. Waste one element of value and location stack so that they stay on the same level as the state stack. The wasted elements are never initialized. */ yyssp = yyss; yyvsp = yyvs; yylsp = yyls; #if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL /* Initialize the default location before parsing starts. */ yylloc.first_line = yylloc.last_line = 1; yylloc.first_column = yylloc.last_column = 1; #endif goto yysetstate; /*------------------------------------------------------------. | yynewstate -- Push a new state, which is found in yystate. | `------------------------------------------------------------*/ yynewstate: /* In all cases, when you get here, the value and location stacks have just been pushed. So pushing a state here evens the stacks. */ yyssp++; yysetstate: *yyssp = yystate; if (yyss + yystacksize - 1 <= yyssp) { /* Get the current used size of the three stacks, in elements. */ YYSIZE_T yysize = yyssp - yyss + 1; #ifdef yyoverflow { /* Give user a chance to reallocate the stack. Use copies of these so that the &'s don't force the real ones into memory. */ YYSTYPE *yyvs1 = yyvs; yytype_int16 *yyss1 = yyss; YYLTYPE *yyls1 = yyls; /* Each stack pointer address is followed by the size of the data in use in that stack, in bytes. This used to be a conditional around just the two extra args, but that might be undefined if yyoverflow is a macro. */ yyoverflow (YY_("memory exhausted"), &yyss1, yysize * sizeof (*yyssp), &yyvs1, yysize * sizeof (*yyvsp), &yyls1, yysize * sizeof (*yylsp), &yystacksize); yyls = yyls1; yyss = yyss1; yyvs = yyvs1; } #else /* no yyoverflow */ # ifndef YYSTACK_RELOCATE goto yyexhaustedlab; # else /* Extend the stack our own way. */ if (YYMAXDEPTH <= yystacksize) goto yyexhaustedlab; yystacksize *= 2; if (YYMAXDEPTH < yystacksize) yystacksize = YYMAXDEPTH; { yytype_int16 *yyss1 = yyss; union yyalloc *yyptr = (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); if (! yyptr) goto yyexhaustedlab; YYSTACK_RELOCATE (yyss_alloc, yyss); YYSTACK_RELOCATE (yyvs_alloc, yyvs); YYSTACK_RELOCATE (yyls_alloc, yyls); # undef YYSTACK_RELOCATE if (yyss1 != yyssa) YYSTACK_FREE (yyss1); } # endif #endif /* no yyoverflow */ yyssp = yyss + yysize - 1; yyvsp = yyvs + yysize - 1; yylsp = yyls + yysize - 1; YYDPRINTF ((stderr, "Stack size increased to %lu\n", (unsigned long int) yystacksize)); if (yyss + yystacksize - 1 <= yyssp) YYABORT; } YYDPRINTF ((stderr, "Entering state %d\n", yystate)); if (yystate == YYFINAL) YYACCEPT; goto yybackup; /*-----------. | yybackup. | `-----------*/ yybackup: /* Do appropriate processing given the current state. Read a lookahead token if we need one and don't already have one. */ /* First try to decide what to do without reference to lookahead token. */ yyn = yypact[yystate]; if (yypact_value_is_default (yyn)) goto yydefault; /* Not known => get a lookahead token if don't already have one. */ /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ if (yychar == YYEMPTY) { YYDPRINTF ((stderr, "Reading a token: ")); yychar = YYLEX; } if (yychar <= YYEOF) { yychar = yytoken = YYEOF; YYDPRINTF ((stderr, "Now at end of input.\n")); } else { yytoken = YYTRANSLATE (yychar); YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); } /* If the proper action on seeing token YYTOKEN is to reduce or to detect an error, take that action. */ yyn += yytoken; if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) goto yydefault; yyn = yytable[yyn]; if (yyn <= 0) { if (yytable_value_is_error (yyn)) goto yyerrlab; yyn = -yyn; goto yyreduce; } /* Count tokens shifted since error; after three, turn off error status. */ if (yyerrstatus) yyerrstatus--; /* Shift the lookahead token. */ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); /* Discard the shifted token. */ yychar = YYEMPTY; yystate = yyn; *++yyvsp = yylval; *++yylsp = yylloc; goto yynewstate; /*-----------------------------------------------------------. | yydefault -- do the default action for the current state. | `-----------------------------------------------------------*/ yydefault: yyn = yydefact[yystate]; if (yyn == 0) goto yyerrlab; goto yyreduce; /*-----------------------------. | yyreduce -- Do a reduction. | `-----------------------------*/ yyreduce: /* yyn is the number of a rule to reduce with. */ yylen = yyr2[yyn]; /* If YYLEN is nonzero, implement the default value of the action: `$$ = $1'. Otherwise, the following line sets YYVAL to garbage. This behavior is undocumented and Bison users should not rely upon it. Assigning to YYVAL unconditionally makes the parser a bit smaller, and it avoids a GCC warning that YYVAL may be used uninitialized. */ yyval = yyvsp[1-yylen]; /* Default location. */ YYLLOC_DEFAULT (yyloc, (yylsp - yylen), yylen); YY_REDUCE_PRINT (yyn); switch (yyn) { case 2: /* Line 1806 of yacc.c */ #line 107 "SCDoc.y" { topnode = (yyvsp[(1) - (1)].doc_node); } break; case 3: /* Line 1806 of yacc.c */ #line 108 "SCDoc.y" { topnode = NULL; doc_node_free_tree((yyvsp[(1) - (2)].doc_node)); } break; case 4: /* Line 1806 of yacc.c */ #line 112 "SCDoc.y" { (yyval.doc_node) = doc_node_create("DOCUMENT"); doc_node_add_child((yyval.doc_node), (yyvsp[(3) - (4)].doc_node)); doc_node_add_child((yyval.doc_node), (yyvsp[(4) - (4)].doc_node)); } break; case 5: /* Line 1806 of yacc.c */ #line 118 "SCDoc.y" { (yyval.doc_node) = doc_node_make_take_children("BODY",NULL,(yyvsp[(2) - (2)].doc_node)); } break; case 6: /* Line 1806 of yacc.c */ #line 122 "SCDoc.y" { (yyval.doc_node) = doc_node_create("DOCUMENT"); doc_node_add_child((yyval.doc_node), (yyvsp[(2) - (3)].doc_node)); doc_node_add_child((yyval.doc_node), (yyvsp[(3) - (3)].doc_node)); } break; case 9: /* Line 1806 of yacc.c */ #line 133 "SCDoc.y" { (yyval.doc_node) = doc_node_add_child((yyvsp[(1) - (2)].doc_node),(yyvsp[(2) - (2)].doc_node)); } break; case 10: /* Line 1806 of yacc.c */ #line 134 "SCDoc.y" { (yyval.doc_node) = doc_node_make("HEADER",NULL,(yyvsp[(1) - (1)].doc_node)); } break; case 11: /* Line 1806 of yacc.c */ #line 137 "SCDoc.y" { (yyval.doc_node) = doc_node_make((yyvsp[(1) - (3)].id),(yyvsp[(2) - (3)].str),NULL); } break; case 12: /* Line 1806 of yacc.c */ #line 138 "SCDoc.y" { (yyval.doc_node) = doc_node_make_take_children("CATEGORIES",NULL,(yyvsp[(2) - (3)].doc_node)); } break; case 13: /* Line 1806 of yacc.c */ #line 139 "SCDoc.y" { (yyval.doc_node) = doc_node_make_take_children("RELATED",NULL,(yyvsp[(2) - (3)].doc_node)); } break; case 14: /* Line 1806 of yacc.c */ #line 142 "SCDoc.y" { (yyval.id) = "TITLE"; } break; case 15: /* Line 1806 of yacc.c */ #line 143 "SCDoc.y" { (yyval.id) = "TITLE"; } break; case 16: /* Line 1806 of yacc.c */ #line 144 "SCDoc.y" { (yyval.id) = "SUMMARY"; } break; case 17: /* Line 1806 of yacc.c */ #line 145 "SCDoc.y" { (yyval.id) = "REDIRECT"; } break; case 18: /* Line 1806 of yacc.c */ #line 148 "SCDoc.y" { (yyval.id) = "CLASSMETHODS"; method_type = "CMETHOD"; } break; case 19: /* Line 1806 of yacc.c */ #line 149 "SCDoc.y" { (yyval.id) = "INSTANCEMETHODS"; method_type = "IMETHOD"; } break; case 20: /* Line 1806 of yacc.c */ #line 150 "SCDoc.y" { (yyval.id) = "DESCRIPTION"; method_type = "METHOD"; } break; case 21: /* Line 1806 of yacc.c */ #line 151 "SCDoc.y" { (yyval.id) = "EXAMPLES"; method_type = "METHOD"; } break; case 23: /* Line 1806 of yacc.c */ #line 155 "SCDoc.y" { (yyval.doc_node) = doc_node_make("BODY",NULL,NULL); } break; case 24: /* Line 1806 of yacc.c */ #line 158 "SCDoc.y" { (yyval.doc_node) = doc_node_add_child((yyvsp[(1) - (2)].doc_node),(yyvsp[(2) - (2)].doc_node)); } break; case 25: /* Line 1806 of yacc.c */ #line 159 "SCDoc.y" { (yyval.doc_node) = doc_node_make("BODY",NULL,(yyvsp[(1) - (1)].doc_node)); } break; case 26: /* Line 1806 of yacc.c */ #line 160 "SCDoc.y" { (yyval.doc_node) = doc_node_make_take_children("BODY",NULL,(yyvsp[(1) - (1)].doc_node)); } break; case 27: /* Line 1806 of yacc.c */ #line 163 "SCDoc.y" { method_type = "METHOD"; } break; case 28: /* Line 1806 of yacc.c */ #line 163 "SCDoc.y" { (yyval.doc_node) = doc_node_make_take_children("SECTION",(yyvsp[(3) - (5)].str),(yyvsp[(5) - (5)].doc_node)); } break; case 29: /* Line 1806 of yacc.c */ #line 164 "SCDoc.y" { (yyval.doc_node) = doc_node_make_take_children((yyvsp[(1) - (2)].id), NULL,(yyvsp[(2) - (2)].doc_node)); } break; case 31: /* Line 1806 of yacc.c */ #line 168 "SCDoc.y" { (yyval.doc_node) = NULL; } break; case 32: /* Line 1806 of yacc.c */ #line 171 "SCDoc.y" { (yyval.doc_node) = doc_node_add_child((yyvsp[(1) - (2)].doc_node),(yyvsp[(2) - (2)].doc_node)); } break; case 33: /* Line 1806 of yacc.c */ #line 172 "SCDoc.y" { (yyval.doc_node) = doc_node_make("(SUBSECTIONS)",NULL,(yyvsp[(1) - (1)].doc_node)); } break; case 35: /* Line 1806 of yacc.c */ #line 176 "SCDoc.y" { (yyval.doc_node) = doc_node_make_take_children("SUBSECTION", (yyvsp[(2) - (4)].str), (yyvsp[(4) - (4)].doc_node)); } break; case 37: /* Line 1806 of yacc.c */ #line 180 "SCDoc.y" { (yyval.doc_node) = NULL; } break; case 38: /* Line 1806 of yacc.c */ #line 183 "SCDoc.y" { (yyval.doc_node) = doc_node_add_child((yyvsp[(1) - (2)].doc_node),(yyvsp[(2) - (2)].doc_node)); } break; case 39: /* Line 1806 of yacc.c */ #line 184 "SCDoc.y" { (yyval.doc_node) = doc_node_make("(SUBSUBSECTIONS)",NULL,(yyvsp[(1) - (1)].doc_node)); } break; case 40: /* Line 1806 of yacc.c */ #line 185 "SCDoc.y" { (yyval.doc_node) = doc_node_make_take_children("(SUBSUBSECTIONS)",NULL,(yyvsp[(1) - (1)].doc_node)); } break; case 41: /* Line 1806 of yacc.c */ #line 189 "SCDoc.y" { (yyvsp[(2) - (5)].doc_node)->id = "METHODNAMES"; (yyval.doc_node) = doc_node_make(method_type,(yyvsp[(3) - (5)].str),(yyvsp[(2) - (5)].doc_node)); doc_node_add_child((yyval.doc_node), (yyvsp[(5) - (5)].doc_node)); // doc_node_add_child($2, $3); } break; case 42: /* Line 1806 of yacc.c */ #line 195 "SCDoc.y" { (yyval.doc_node) = doc_node_make( stringEqual(method_type, "CMETHOD") ? "CCOPYMETHOD" : (stringEqual(method_type, "IMETHOD") ? "ICOPYMETHOD" : "COPYMETHOD"), (yyvsp[(2) - (3)].str), NULL ); } break; case 43: /* Line 1806 of yacc.c */ #line 201 "SCDoc.y" { (yyval.doc_node) = doc_node_make_take_children( stringEqual(method_type, "CMETHOD") ? "CPRIVATE" : "IPRIVATE", NULL, (yyvsp[(2) - (3)].doc_node)); } break; case 44: /* Line 1806 of yacc.c */ #line 206 "SCDoc.y" { (yyval.str) = NULL; } break; case 45: /* Line 1806 of yacc.c */ #line 208 "SCDoc.y" { // $$ = doc_node_make("ARGSTRING",$1,NULL); (yyval.str) = (yyvsp[(1) - (1)].str); if(!stringEqual(method_type, "METHOD")) { yyerror("METHOD argument string is not allowed inside CLASSMETHODS or INSTANCEMETHODS"); YYERROR; } } break; case 46: /* Line 1806 of yacc.c */ #line 219 "SCDoc.y" { char *p = (yyvsp[(1) - (1)].str)+strlen((yyvsp[(1) - (1)].str))-1; if(*p=='_') { post("WARNING: SCDoc: In %s\n Property setter %s should be documented without underscore.\n", scdoc_current_file, (yyvsp[(1) - (1)].str)); *p = '\0'; }; (yyval.str) = (yyvsp[(1) - (1)].str); } break; case 47: /* Line 1806 of yacc.c */ #line 229 "SCDoc.y" { free((yyvsp[(2) - (3)].str)); (yyvsp[(2) - (3)].str) = NULL; (yyval.doc_node) = doc_node_add_child((yyvsp[(1) - (3)].doc_node), doc_node_make("STRING",(yyvsp[(3) - (3)].str),NULL)); } break; case 48: /* Line 1806 of yacc.c */ #line 230 "SCDoc.y" { (yyval.doc_node) = doc_node_make("(METHODNAMES)",NULL,doc_node_make("STRING",(yyvsp[(1) - (1)].str),NULL)); } break; case 49: /* Line 1806 of yacc.c */ #line 234 "SCDoc.y" { (yyval.doc_node) = doc_node_make_take_children("METHODBODY",NULL,(yyvsp[(1) - (4)].doc_node)); doc_node_add_child((yyval.doc_node), (yyvsp[(2) - (4)].doc_node)); doc_node_add_child((yyval.doc_node), (yyvsp[(3) - (4)].doc_node)); doc_node_add_child((yyval.doc_node), (yyvsp[(4) - (4)].doc_node)); } break; case 51: /* Line 1806 of yacc.c */ #line 243 "SCDoc.y" { (yyval.doc_node) = NULL; } break; case 53: /* Line 1806 of yacc.c */ #line 247 "SCDoc.y" { (yyval.doc_node) = NULL; } break; case 54: /* Line 1806 of yacc.c */ #line 250 "SCDoc.y" { (yyval.doc_node) = doc_node_add_child((yyvsp[(1) - (2)].doc_node),(yyvsp[(2) - (2)].doc_node)); } break; case 55: /* Line 1806 of yacc.c */ #line 251 "SCDoc.y" { (yyval.doc_node) = doc_node_make("ARGUMENTS",NULL,(yyvsp[(1) - (1)].doc_node)); } break; case 56: /* Line 1806 of yacc.c */ #line 254 "SCDoc.y" { (yyval.doc_node) = doc_node_make_take_children("ARGUMENT", (yyvsp[(2) - (4)].str), (yyvsp[(4) - (4)].doc_node)); } break; case 57: /* Line 1806 of yacc.c */ #line 255 "SCDoc.y" { (yyval.doc_node) = doc_node_make_take_children("ARGUMENT", NULL, (yyvsp[(3) - (3)].doc_node)); } break; case 58: /* Line 1806 of yacc.c */ #line 258 "SCDoc.y" { (yyval.doc_node) = doc_node_make_take_children("RETURNS",NULL,(yyvsp[(2) - (2)].doc_node)); } break; case 59: /* Line 1806 of yacc.c */ #line 259 "SCDoc.y" { (yyval.doc_node) = NULL; } break; case 60: /* Line 1806 of yacc.c */ #line 262 "SCDoc.y" { (yyval.doc_node) = doc_node_make_take_children("DISCUSSION",NULL,(yyvsp[(2) - (2)].doc_node)); } break; case 61: /* Line 1806 of yacc.c */ #line 263 "SCDoc.y" { (yyval.doc_node) = NULL; } break; case 64: /* Line 1806 of yacc.c */ #line 275 "SCDoc.y" { (yyval.doc_node) = doc_node_add_child((yyvsp[(1) - (2)].doc_node),(yyvsp[(2) - (2)].doc_node)); } break; case 65: /* Line 1806 of yacc.c */ #line 276 "SCDoc.y" { (yyval.doc_node) = doc_node_add_child((yyvsp[(1) - (2)].doc_node),(yyvsp[(2) - (2)].doc_node)); } break; case 66: /* Line 1806 of yacc.c */ #line 277 "SCDoc.y" { (yyval.doc_node) = doc_node_make("(SECTIONBODY)",NULL,(yyvsp[(1) - (1)].doc_node)); } break; case 67: /* Line 1806 of yacc.c */ #line 280 "SCDoc.y" { (yyval.doc_node) = doc_node_add_child((yyvsp[(1) - (2)].doc_node),(yyvsp[(2) - (2)].doc_node)); } break; case 68: /* Line 1806 of yacc.c */ #line 281 "SCDoc.y" { (yyval.doc_node) = doc_node_make("(SECTIONBODY)",NULL,(yyvsp[(1) - (1)].doc_node)); } break; case 69: /* Line 1806 of yacc.c */ #line 284 "SCDoc.y" { (yyval.doc_node) = doc_node_make_take_children((yyvsp[(1) - (3)].id),NULL,(yyvsp[(2) - (3)].doc_node)); } break; case 70: /* Line 1806 of yacc.c */ #line 285 "SCDoc.y" { (yyval.doc_node) = doc_node_make_take_children((yyvsp[(1) - (3)].id),NULL,(yyvsp[(2) - (3)].doc_node)); } break; case 71: /* Line 1806 of yacc.c */ #line 286 "SCDoc.y" { (yyval.doc_node) = doc_node_make_take_children("TABLE",NULL,(yyvsp[(2) - (3)].doc_node)); } break; case 72: /* Line 1806 of yacc.c */ #line 287 "SCDoc.y" { (yyval.doc_node) = doc_node_make_take_children("DEFINITIONLIST",NULL,(yyvsp[(2) - (3)].doc_node)); } break; case 73: /* Line 1806 of yacc.c */ #line 288 "SCDoc.y" { (yyval.doc_node) = doc_node_make((yyvsp[(1) - (3)].id),(yyvsp[(2) - (3)].str),NULL); } break; case 74: /* Line 1806 of yacc.c */ #line 289 "SCDoc.y" { (yyval.doc_node) = doc_node_make("CLASSTREE",(yyvsp[(2) - (3)].str),NULL); } break; case 75: /* Line 1806 of yacc.c */ #line 290 "SCDoc.y" { (yyval.doc_node) = doc_node_make_take_children("KEYWORD",NULL,(yyvsp[(2) - (3)].doc_node)); // printf("keyword '%s'\n",$2->children[0]->text); } break; case 76: /* Line 1806 of yacc.c */ #line 293 "SCDoc.y" { (yyval.doc_node) = NULL; } break; case 77: /* Line 1806 of yacc.c */ #line 294 "SCDoc.y" { (yyval.doc_node) = doc_node_make("IMAGE",(yyvsp[(2) - (3)].str),NULL); } break; case 78: /* Line 1806 of yacc.c */ #line 297 "SCDoc.y" { (yyval.doc_node) = doc_node_add_child((yyvsp[(1) - (2)].doc_node), (yyvsp[(2) - (2)].doc_node)); } break; case 79: /* Line 1806 of yacc.c */ #line 298 "SCDoc.y" { (yyval.doc_node) = doc_node_make("PROSE",NULL,(yyvsp[(1) - (1)].doc_node)); } break; case 80: /* Line 1806 of yacc.c */ #line 301 "SCDoc.y" { (yyval.doc_node) = doc_node_make(NODE_TEXT,(yyvsp[(1) - (1)].str),NULL); } break; case 81: /* Line 1806 of yacc.c */ #line 302 "SCDoc.y" { (yyval.doc_node) = doc_node_make("LINK",(yyvsp[(1) - (1)].str),NULL); } break; case 82: /* Line 1806 of yacc.c */ #line 303 "SCDoc.y" { (yyval.doc_node) = doc_node_make((yyvsp[(1) - (3)].id),(yyvsp[(2) - (3)].str),NULL); } break; case 83: /* Line 1806 of yacc.c */ #line 304 "SCDoc.y" { (yyval.doc_node) = doc_node_make_take_children("FOOTNOTE",NULL,(yyvsp[(2) - (3)].doc_node)); } break; case 84: /* Line 1806 of yacc.c */ #line 305 "SCDoc.y" { (yyval.doc_node) = doc_node_create(NODE_NL); } break; case 85: /* Line 1806 of yacc.c */ #line 308 "SCDoc.y" { (yyval.id) = "LINK"; } break; case 86: /* Line 1806 of yacc.c */ #line 309 "SCDoc.y" { (yyval.id) = "STRONG"; } break; case 87: /* Line 1806 of yacc.c */ #line 310 "SCDoc.y" { (yyval.id) = "SOFT"; } break; case 88: /* Line 1806 of yacc.c */ #line 311 "SCDoc.y" { (yyval.id) = "EMPHASIS"; } break; case 89: /* Line 1806 of yacc.c */ #line 312 "SCDoc.y" { (yyval.id) = "CODE"; } break; case 90: /* Line 1806 of yacc.c */ #line 313 "SCDoc.y" { (yyval.id) = "TELETYPE"; } break; case 91: /* Line 1806 of yacc.c */ #line 314 "SCDoc.y" { (yyval.id) = "MATH"; } break; case 92: /* Line 1806 of yacc.c */ #line 315 "SCDoc.y" { (yyval.id) = "ANCHOR"; } break; case 93: /* Line 1806 of yacc.c */ #line 318 "SCDoc.y" { (yyval.id) = "CODEBLOCK"; } break; case 94: /* Line 1806 of yacc.c */ #line 319 "SCDoc.y" { (yyval.id) = "TELETYPEBLOCK"; } break; case 95: /* Line 1806 of yacc.c */ #line 320 "SCDoc.y" { (yyval.id) = "MATHBLOCK"; } break; case 96: /* Line 1806 of yacc.c */ #line 323 "SCDoc.y" { (yyval.id) = "LIST"; } break; case 97: /* Line 1806 of yacc.c */ #line 324 "SCDoc.y" { (yyval.id) = "TREE"; } break; case 98: /* Line 1806 of yacc.c */ #line 325 "SCDoc.y" { (yyval.id) = "NUMBEREDLIST"; } break; case 99: /* Line 1806 of yacc.c */ #line 328 "SCDoc.y" { (yyval.id) = "WARNING"; } break; case 100: /* Line 1806 of yacc.c */ #line 329 "SCDoc.y" { (yyval.id) = "NOTE"; } break; case 101: /* Line 1806 of yacc.c */ #line 332 "SCDoc.y" { (yyval.doc_node) = doc_node_add_child((yyvsp[(1) - (3)].doc_node), doc_node_make_take_children("ITEM",NULL,(yyvsp[(3) - (3)].doc_node))); } break; case 102: /* Line 1806 of yacc.c */ #line 333 "SCDoc.y" { (yyval.doc_node) = doc_node_make("(LISTBODY)",NULL, doc_node_make_take_children("ITEM",NULL,(yyvsp[(2) - (2)].doc_node))); } break; case 103: /* Line 1806 of yacc.c */ #line 336 "SCDoc.y" { (yyval.doc_node) = doc_node_make_take_children("TABROW",NULL,(yyvsp[(2) - (2)].doc_node)); } break; case 104: /* Line 1806 of yacc.c */ #line 339 "SCDoc.y" { (yyval.doc_node) = doc_node_add_child((yyvsp[(1) - (2)].doc_node),(yyvsp[(2) - (2)].doc_node)); } break; case 105: /* Line 1806 of yacc.c */ #line 340 "SCDoc.y" { (yyval.doc_node) = doc_node_make("(TABLEBODY)",NULL,(yyvsp[(1) - (1)].doc_node)); } break; case 106: /* Line 1806 of yacc.c */ #line 343 "SCDoc.y" { (yyval.doc_node) = doc_node_add_child((yyvsp[(1) - (3)].doc_node), doc_node_make_take_children("TABCOL",NULL,(yyvsp[(3) - (3)].doc_node))); } break; case 107: /* Line 1806 of yacc.c */ #line 344 "SCDoc.y" { (yyval.doc_node) = doc_node_make("(TABLECELLS)",NULL, doc_node_make_take_children("TABCOL",NULL,(yyvsp[(1) - (1)].doc_node))); } break; case 108: /* Line 1806 of yacc.c */ #line 347 "SCDoc.y" { (yyval.doc_node) = doc_node_add_child((yyvsp[(1) - (3)].doc_node),doc_node_make_take_children("TERM",NULL,(yyvsp[(3) - (3)].doc_node))); } break; case 109: /* Line 1806 of yacc.c */ #line 348 "SCDoc.y" { (yyval.doc_node) = doc_node_make("(TERMS)",NULL,doc_node_make_take_children("TERM",NULL,(yyvsp[(2) - (2)].doc_node))); } break; case 110: /* Line 1806 of yacc.c */ #line 352 "SCDoc.y" { (yyval.doc_node) = doc_node_make_take_children("DEFLISTITEM", NULL, (yyvsp[(1) - (3)].doc_node)); doc_node_add_child((yyval.doc_node), doc_node_make_take_children("DEFINITION", NULL, (yyvsp[(3) - (3)].doc_node))); } break; case 111: /* Line 1806 of yacc.c */ #line 358 "SCDoc.y" { (yyval.doc_node) = doc_node_add_child((yyvsp[(1) - (2)].doc_node),(yyvsp[(2) - (2)].doc_node)); } break; case 112: /* Line 1806 of yacc.c */ #line 359 "SCDoc.y" { (yyval.doc_node) = doc_node_make("(DEFLISTBODY)",NULL,(yyvsp[(1) - (1)].doc_node)); } break; case 117: /* Line 1806 of yacc.c */ #line 370 "SCDoc.y" { (yyval.str) = strmerge((yyvsp[(1) - (2)].str),(yyvsp[(2) - (2)].str)); } break; case 119: /* Line 1806 of yacc.c */ #line 374 "SCDoc.y" { (yyval.str) = strmerge((yyvsp[(1) - (2)].str),(yyvsp[(2) - (2)].str)); } break; case 126: /* Line 1806 of yacc.c */ #line 387 "SCDoc.y" { (yyval.str) = strdup("\n"); } break; case 127: /* Line 1806 of yacc.c */ #line 390 "SCDoc.y" { (yyval.str) = strmerge((yyvsp[(1) - (2)].str),(yyvsp[(2) - (2)].str)); } break; case 129: /* Line 1806 of yacc.c */ #line 394 "SCDoc.y" { (yyval.str) = strmerge((yyvsp[(1) - (2)].str),(yyvsp[(2) - (2)].str)); } break; case 130: /* Line 1806 of yacc.c */ #line 395 "SCDoc.y" { (yyval.str) = strmerge((yyvsp[(1) - (2)].str),(yyvsp[(2) - (2)].str)); } break; case 133: /* Line 1806 of yacc.c */ #line 400 "SCDoc.y" { free((yyvsp[(2) - (3)].str)); (yyvsp[(2) - (3)].str)=NULL; (yyval.doc_node) = doc_node_add_child((yyvsp[(1) - (3)].doc_node),doc_node_make("STRING",(yyvsp[(3) - (3)].str),NULL)); } break; case 134: /* Line 1806 of yacc.c */ #line 401 "SCDoc.y" { (yyval.doc_node) = doc_node_make("(COMMALIST)",NULL,doc_node_make("STRING",(yyvsp[(1) - (1)].str),NULL)); } break; /* Line 1806 of yacc.c */ #line 3031 "SCDoc.tab.cpp" default: break; } /* User semantic actions sometimes alter yychar, and that requires that yytoken be updated with the new translation. We take the approach of translating immediately before every use of yytoken. One alternative is translating here after every semantic action, but that translation would be missed if the semantic action invokes YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an incorrect destructor might then be invoked immediately. In the case of YYERROR or YYBACKUP, subsequent parser actions might lead to an incorrect destructor call or verbose syntax error message before the lookahead is translated. */ YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); *++yyvsp = yyval; *++yylsp = yyloc; /* Now `shift' the result of the reduction. Determine what state that goes to, based on the state we popped back to and the rule number reduced by. */ yyn = yyr1[yyn]; yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) yystate = yytable[yystate]; else yystate = yydefgoto[yyn - YYNTOKENS]; goto yynewstate; /*------------------------------------. | yyerrlab -- here on detecting error | `------------------------------------*/ yyerrlab: /* Make sure we have latest lookahead translation. See comments at user semantic actions for why this is necessary. */ yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar); /* If not already recovering from an error, report this error. */ if (!yyerrstatus) { ++yynerrs; #if ! YYERROR_VERBOSE yyerror (YY_("syntax error")); #else # define YYSYNTAX_ERROR yysyntax_error (&yymsg_alloc, &yymsg, \ yyssp, yytoken) { char const *yymsgp = YY_("syntax error"); int yysyntax_error_status; yysyntax_error_status = YYSYNTAX_ERROR; if (yysyntax_error_status == 0) yymsgp = yymsg; else if (yysyntax_error_status == 1) { if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); yymsg = (char *) YYSTACK_ALLOC (yymsg_alloc); if (!yymsg) { yymsg = yymsgbuf; yymsg_alloc = sizeof yymsgbuf; yysyntax_error_status = 2; } else { yysyntax_error_status = YYSYNTAX_ERROR; yymsgp = yymsg; } } yyerror (yymsgp); if (yysyntax_error_status == 2) goto yyexhaustedlab; } # undef YYSYNTAX_ERROR #endif } yyerror_range[1] = yylloc; if (yyerrstatus == 3) { /* If just tried and failed to reuse lookahead token after an error, discard it. */ if (yychar <= YYEOF) { /* Return failure if at end of input. */ if (yychar == YYEOF) YYABORT; } else { yydestruct ("Error: discarding", yytoken, &yylval, &yylloc); yychar = YYEMPTY; } } /* Else will try to reuse lookahead token after shifting the error token. */ goto yyerrlab1; /*---------------------------------------------------. | yyerrorlab -- error raised explicitly by YYERROR. | `---------------------------------------------------*/ yyerrorlab: /* Pacify compilers like GCC when the user code never invokes YYERROR and the label yyerrorlab therefore never appears in user code. */ if (/*CONSTCOND*/ 0) goto yyerrorlab; yyerror_range[1] = yylsp[1-yylen]; /* Do not reclaim the symbols of the rule which action triggered this YYERROR. */ YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); yystate = *yyssp; goto yyerrlab1; /*-------------------------------------------------------------. | yyerrlab1 -- common code for both syntax error and YYERROR. | `-------------------------------------------------------------*/ yyerrlab1: yyerrstatus = 3; /* Each real token shifted decrements this. */ for (;;) { yyn = yypact[yystate]; if (!yypact_value_is_default (yyn)) { yyn += YYTERROR; if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) { yyn = yytable[yyn]; if (0 < yyn) break; } } /* Pop the current state because it cannot handle the error token. */ if (yyssp == yyss) YYABORT; yyerror_range[1] = *yylsp; yydestruct ("Error: popping", yystos[yystate], yyvsp, yylsp); YYPOPSTACK (1); yystate = *yyssp; YY_STACK_PRINT (yyss, yyssp); } *++yyvsp = yylval; yyerror_range[2] = yylloc; /* Using YYLLOC is tempting, but would change the location of the lookahead. YYLOC is available though. */ YYLLOC_DEFAULT (yyloc, yyerror_range, 2); *++yylsp = yyloc; /* Shift the error token. */ YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); yystate = yyn; goto yynewstate; /*-------------------------------------. | yyacceptlab -- YYACCEPT comes here. | `-------------------------------------*/ yyacceptlab: yyresult = 0; goto yyreturn; /*-----------------------------------. | yyabortlab -- YYABORT comes here. | `-----------------------------------*/ yyabortlab: yyresult = 1; goto yyreturn; #if !defined(yyoverflow) || YYERROR_VERBOSE /*-------------------------------------------------. | yyexhaustedlab -- memory exhaustion comes here. | `-------------------------------------------------*/ yyexhaustedlab: yyerror (YY_("memory exhausted")); yyresult = 2; /* Fall through. */ #endif yyreturn: if (yychar != YYEMPTY) { /* Make sure we have latest lookahead translation. See comments at user semantic actions for why this is necessary. */ yytoken = YYTRANSLATE (yychar); yydestruct ("Cleanup: discarding lookahead", yytoken, &yylval, &yylloc); } /* Do not reclaim the symbols of the rule which action triggered this YYABORT or YYACCEPT. */ YYPOPSTACK (yylen); YY_STACK_PRINT (yyss, yyssp); while (yyssp != yyss) { yydestruct ("Cleanup: popping", yystos[*yyssp], yyvsp, yylsp); YYPOPSTACK (1); } #ifndef yyoverflow if (yyss != yyssa) YYSTACK_FREE (yyss); #endif #if YYERROR_VERBOSE if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); #endif /* Make sure YYID is used. */ return YYID (yyresult); } /* Line 2067 of yacc.c */ #line 404 "SCDoc.y" DocNode * scdoc_parse_run(int mode) { int modes[] = {START_FULL, START_PARTIAL, START_METADATA}; if(mode<0 || mode>=sizeof(modes)) { error("scdoc_parse_run(): unknown mode: %d\n",mode); } scdoc_start_token = modes[mode]; /* scdoc_start_token = START_FULL; scdoc_metadata_mode = 0; if(mode==SCDOC_PARSE_PARTIAL) { scdoc_start_token = START_PARTIAL; } else if(mode==SCDOC_PARSE_METADATA) { scdoc_metadata_mode = 1; }*/ topnode = NULL; method_type = "METHOD"; if(scdocparse()!=0) { return NULL; } return topnode; } void scdocerror(const char *str) { error("In %s:\n At line %d: %s\n\n",scdoc_current_file,scdoclineno,str); /* FIXME: this does not work well, since the reported linenumber is often *after* the actual error line fseek(scdocin, 0, SEEK_SET); int line = 1; char buf[256],*txt; while(line!=scdoclineno && !feof(scdocin)) { int c = fgetc(scdocin); if(c=='\n') line++; } txt = fgets(buf, 256, scdocin); if(txt) fprintf(stderr," %s\n-------------------\n", txt); */ } SuperCollider-3.6.3-Source-linux~repack/SCDoc/lex.scdoc.cpp0000664000175000017500000040765211743774635021726 0ustar dandan#line 2 "lex.scdoc.cpp" #line 4 "lex.scdoc.cpp" #define YY_INT_ALIGNED short int /* A lexical scanner generated by flex */ #define yy_create_buffer scdoc_create_buffer #define yy_delete_buffer scdoc_delete_buffer #define yy_flex_debug scdoc_flex_debug #define yy_init_buffer scdoc_init_buffer #define yy_flush_buffer scdoc_flush_buffer #define yy_load_buffer_state scdoc_load_buffer_state #define yy_switch_to_buffer scdoc_switch_to_buffer #define yyin scdocin #define yyleng scdocleng #define yylex scdoclex #define yylineno scdoclineno #define yyout scdocout #define yyrestart scdocrestart #define yytext scdoctext #define yywrap scdocwrap #define yyalloc scdocalloc #define yyrealloc scdocrealloc #define yyfree scdocfree #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 #define YY_FLEX_MINOR_VERSION 5 #define YY_FLEX_SUBMINOR_VERSION 35 #if YY_FLEX_SUBMINOR_VERSION > 0 #define FLEX_BETA #endif /* First, we deal with platform-specific or compiler-specific issues. */ /* begin standard C headers. */ #include #include #include #include /* end standard C headers. */ /* flex integer type definitions */ #ifndef FLEXINT_H #define FLEXINT_H /* C99 systems have . Non-C99 systems may or may not. */ #if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, * if you want the limit (max/min) macros for int types. */ #ifndef __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS 1 #endif #include typedef int8_t flex_int8_t; typedef uint8_t flex_uint8_t; typedef int16_t flex_int16_t; typedef uint16_t flex_uint16_t; typedef int32_t flex_int32_t; typedef uint32_t flex_uint32_t; #else typedef signed char flex_int8_t; typedef short int flex_int16_t; typedef int flex_int32_t; typedef unsigned char flex_uint8_t; typedef unsigned short int flex_uint16_t; typedef unsigned int flex_uint32_t; /* Limits of integral types. */ #ifndef INT8_MIN #define INT8_MIN (-128) #endif #ifndef INT16_MIN #define INT16_MIN (-32767-1) #endif #ifndef INT32_MIN #define INT32_MIN (-2147483647-1) #endif #ifndef INT8_MAX #define INT8_MAX (127) #endif #ifndef INT16_MAX #define INT16_MAX (32767) #endif #ifndef INT32_MAX #define INT32_MAX (2147483647) #endif #ifndef UINT8_MAX #define UINT8_MAX (255U) #endif #ifndef UINT16_MAX #define UINT16_MAX (65535U) #endif #ifndef UINT32_MAX #define UINT32_MAX (4294967295U) #endif #endif /* ! C99 */ #endif /* ! FLEXINT_H */ #ifdef __cplusplus /* The "const" storage-class-modifier is valid. */ #define YY_USE_CONST #else /* ! __cplusplus */ /* C99 requires __STDC__ to be defined as 1. */ #if defined (__STDC__) #define YY_USE_CONST #endif /* defined (__STDC__) */ #endif /* ! __cplusplus */ #ifdef YY_USE_CONST #define yyconst const #else #define yyconst #endif /* Returned upon end-of-file. */ #define YY_NULL 0 /* Promotes a possibly negative, possibly signed char to an unsigned * integer for use as an array index. If the signed char is negative, * we want to instead treat it as an 8-bit unsigned char, hence the * double cast. */ #define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) /* Enter a start condition. This macro really ought to take a parameter, * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN. */ #define BEGIN (yy_start) = 1 + 2 * /* Translate the current start state into a value that can be later handed * to BEGIN to return to the state. The YYSTATE alias is for lex * compatibility. */ #define YY_START (((yy_start) - 1) / 2) #define YYSTATE YY_START /* Action number for EOF rule of a given start state. */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) /* Special action meaning "start processing a new file". */ #define YY_NEW_FILE scdocrestart(scdocin ) #define YY_END_OF_BUFFER_CHAR 0 /* Size of default input buffer. */ #ifndef YY_BUF_SIZE #ifdef __ia64__ /* On IA-64, the buffer size is 16k, not 8k. * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case. * Ditto for the __ia64__ case accordingly. */ #define YY_BUF_SIZE 32768 #else #define YY_BUF_SIZE 16384 #endif /* __ia64__ */ #endif /* The state buf must be large enough to hold one state per character in the main buffer. */ #define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) #ifndef YY_TYPEDEF_YY_BUFFER_STATE #define YY_TYPEDEF_YY_BUFFER_STATE typedef struct yy_buffer_state *YY_BUFFER_STATE; #endif extern int scdocleng; extern FILE *scdocin, *scdocout; #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 /* Note: We specifically omit the test for yy_rule_can_match_eol because it requires * access to the local variable yy_act. Since yyless() is a macro, it would break * existing scanners that call yyless() from OUTSIDE scdoclex. * One obvious solution it to make yy_act a global. I tried that, and saw * a 5% performance hit in a non-scdoclineno scanner, because yy_act is * normally declared as a register variable-- so it is not worth it. */ #define YY_LESS_LINENO(n) \ do { \ int yyl;\ for ( yyl = n; yyl < scdocleng; ++yyl )\ if ( scdoctext[yyl] == '\n' )\ --scdoclineno;\ }while(0) /* Return all but the first "n" matched characters back to the input stream. */ #define yyless(n) \ do \ { \ /* Undo effects of setting up scdoctext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ *yy_cp = (yy_hold_char); \ YY_RESTORE_YY_MORE_OFFSET \ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ YY_DO_BEFORE_ACTION; /* set up scdoctext again */ \ } \ while ( 0 ) #define unput(c) yyunput( c, (yytext_ptr) ) #ifndef YY_TYPEDEF_YY_SIZE_T #define YY_TYPEDEF_YY_SIZE_T typedef size_t yy_size_t; #endif #ifndef YY_STRUCT_YY_BUFFER_STATE #define YY_STRUCT_YY_BUFFER_STATE struct yy_buffer_state { FILE *yy_input_file; char *yy_ch_buf; /* input buffer */ char *yy_buf_pos; /* current position in input buffer */ /* Size of input buffer in bytes, not including room for EOB * characters. */ yy_size_t yy_buf_size; /* Number of characters read into yy_ch_buf, not including EOB * characters. */ int yy_n_chars; /* Whether we "own" the buffer - i.e., we know we created it, * and can realloc() it to grow it, and should free() it to * delete it. */ int yy_is_our_buffer; /* Whether this is an "interactive" input source; if so, and * if we're using stdio for input, then we want to use getc() * instead of fread(), to make sure we stop fetching input after * each newline. */ int yy_is_interactive; /* Whether we're considered to be at the beginning of a line. * If so, '^' rules will be active on the next match, otherwise * not. */ int yy_at_bol; int yy_bs_lineno; /**< The line count. */ int yy_bs_column; /**< The column count. */ /* Whether to try to fill the input buffer when we reach the * end of it. */ int yy_fill_buffer; int yy_buffer_status; #define YY_BUFFER_NEW 0 #define YY_BUFFER_NORMAL 1 /* When an EOF's been seen but there's still some text to process * then we mark the buffer as YY_EOF_PENDING, to indicate that we * shouldn't try reading from the input source any more. We might * still have a bunch of tokens to match, though, because of * possible backing-up. * * When we actually see the EOF, we change the status to "new" * (via scdocrestart()), so that the user can continue scanning by * just pointing scdocin at a new input file. */ #define YY_BUFFER_EOF_PENDING 2 }; #endif /* !YY_STRUCT_YY_BUFFER_STATE */ /* Stack of input buffers. */ static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */ /* We provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general * "scanner state". * * Returns the top of the stack, or NULL. */ #define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ : NULL) /* Same as previous macro, but useful when we know that the buffer stack is not * NULL or when we need an lvalue. For internal use only. */ #define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] /* yy_hold_char holds the character lost when scdoctext is formed. */ static char yy_hold_char; static int yy_n_chars; /* number of characters read into yy_ch_buf */ int scdocleng; /* Points to current character in buffer. */ static char *yy_c_buf_p = (char *) 0; static int yy_init = 0; /* whether we need to initialize */ static int yy_start = 0; /* start state number */ /* Flag which is used to allow scdocwrap()'s to do buffer switches * instead of setting up a fresh scdocin. A bit of a hack ... */ static int yy_did_buffer_switch_on_eof; void scdocrestart (FILE *input_file ); void scdoc_switch_to_buffer (YY_BUFFER_STATE new_buffer ); YY_BUFFER_STATE scdoc_create_buffer (FILE *file,int size ); void scdoc_delete_buffer (YY_BUFFER_STATE b ); void scdoc_flush_buffer (YY_BUFFER_STATE b ); void scdocpush_buffer_state (YY_BUFFER_STATE new_buffer ); void scdocpop_buffer_state (void ); static void scdocensure_buffer_stack (void ); static void scdoc_load_buffer_state (void ); static void scdoc_init_buffer (YY_BUFFER_STATE b,FILE *file ); #define YY_FLUSH_BUFFER scdoc_flush_buffer(YY_CURRENT_BUFFER ) YY_BUFFER_STATE scdoc_scan_buffer (char *base,yy_size_t size ); YY_BUFFER_STATE scdoc_scan_string (yyconst char *yy_str ); YY_BUFFER_STATE scdoc_scan_bytes (yyconst char *bytes,int len ); void *scdocalloc (yy_size_t ); void *scdocrealloc (void *,yy_size_t ); void scdocfree (void * ); #define yy_new_buffer scdoc_create_buffer #define yy_set_interactive(is_interactive) \ { \ if ( ! YY_CURRENT_BUFFER ){ \ scdocensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ scdoc_create_buffer(scdocin,YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ } #define yy_set_bol(at_bol) \ { \ if ( ! YY_CURRENT_BUFFER ){\ scdocensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ scdoc_create_buffer(scdocin,YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ } #define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) /* Begin user sect3 */ #define scdocwrap(n) 1 #define YY_SKIP_YYWRAP typedef unsigned char YY_CHAR; FILE *scdocin = (FILE *) 0, *scdocout = (FILE *) 0; typedef int yy_state_type; extern int scdoclineno; int scdoclineno = 1; extern char *scdoctext; #define yytext_ptr scdoctext static yy_state_type yy_get_previous_state (void ); static yy_state_type yy_try_NUL_trans (yy_state_type current_state ); static int yy_get_next_buffer (void ); static void yy_fatal_error (yyconst char msg[] ); /* Done after the current pattern has been matched and before the * corresponding action - sets up scdoctext. */ #define YY_DO_BEFORE_ACTION \ (yytext_ptr) = yy_bp; \ scdocleng = (size_t) (yy_cp - yy_bp); \ (yy_hold_char) = *yy_cp; \ *yy_cp = '\0'; \ (yy_c_buf_p) = yy_cp; #define YY_NUM_RULES 107 #define YY_END_OF_BUFFER 108 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info { flex_int32_t yy_verify; flex_int32_t yy_nxt; }; static yyconst flex_int16_t yy_accept[1261] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 66, 55, 48, 56, 64, 66, 50, 67, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 67, 66, 65, 54, 47, 67, 64, 67, 54, 46, 56, 67, 89, 89, 85, 56, 86, 88, 90, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 90, 106, 106, 56, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 56, 106, 106, 62, 60, 61, 56, 58, 62, 50, 58, 55, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 64, 45, 50, 41, 0, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 0, 0, 0, 44, 65, 47, 64, 0, 0, 0, 0, 89, 89, 86, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 86, 88, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104, 0, 0, 60, 60, 58, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 52, 53, 51, 44, 42, 0, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 105, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 43, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 63, 63, 63, 63, 0, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 0, 0, 0, 63, 0, 63, 63, 63, 63, 63, 63, 0, 63, 63, 63, 63, 63, 63, 0, 63, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 63, 63, 0, 63, 63, 35, 63, 63, 63, 63, 63, 63, 63, 0, 63, 63, 29, 21, 37, 63, 28, 63, 63, 63, 63, 63, 63, 32, 63, 63, 63, 0, 63, 0, 22, 63, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 87, 0, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 0, 0, 0, 0, 0, 0, 0, 0, 98, 0, 0, 0, 0, 0, 0, 0, 92, 100, 0, 0, 0, 0, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 63, 1, 63, 63, 35, 38, 63, 63, 63, 63, 63, 63, 63, 31, 63, 63, 29, 21, 37, 40, 0, 28, 63, 63, 63, 63, 63, 63, 32, 0, 63, 63, 25, 63, 2, 22, 63, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 87, 68, 87, 87, 87, 87, 87, 87, 87, 0, 87, 87, 87, 87, 87, 87, 69, 0, 0, 0, 0, 0, 0, 0, 98, 101, 0, 0, 0, 0, 94, 0, 0, 92, 100, 103, 0, 0, 0, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 63, 63, 1, 63, 63, 63, 63, 63, 63, 63, 63, 63, 31, 63, 0, 13, 63, 0, 63, 0, 0, 0, 33, 63, 0, 25, 63, 2, 0, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 87, 68, 87, 87, 87, 87, 87, 87, 0, 80, 0, 87, 0, 0, 87, 0, 69, 0, 0, 0, 93, 0, 0, 0, 0, 0, 0, 0, 94, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 63, 63, 63, 63, 63, 63, 63, 0, 0, 0, 63, 8, 13, 63, 9, 0, 4, 19, 10, 33, 63, 3, 0, 27, 89, 89, 89, 89, 89, 89, 89, 89, 89, 87, 87, 87, 87, 87, 0, 87, 75, 80, 76, 0, 71, 77, 87, 70, 0, 93, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 63, 63, 0, 63, 63, 63, 63, 34, 18, 26, 63, 8, 63, 9, 6, 4, 19, 10, 63, 3, 36, 27, 89, 89, 89, 89, 89, 89, 89, 87, 87, 0, 87, 87, 84, 87, 75, 76, 73, 71, 77, 87, 70, 0, 0, 0, 0, 0, 97, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 63, 7, 0, 63, 63, 0, 34, 18, 26, 63, 63, 6, 0, 36, 39, 89, 89, 89, 89, 89, 89, 0, 87, 74, 0, 87, 84, 87, 73, 0, 0, 0, 0, 97, 0, 99, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 63, 7, 12, 63, 0, 20, 63, 63, 11, 89, 89, 89, 72, 87, 74, 79, 0, 87, 78, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 12, 63, 15, 20, 63, 0, 11, 89, 89, 72, 0, 79, 81, 87, 78, 0, 0, 0, 0, 0, 16, 63, 15, 63, 23, 89, 82, 81, 87, 0, 0, 0, 16, 0, 63, 23, 89, 82, 87, 0, 0, 0, 24, 0, 89, 0, 0, 24, 17, 83, 17, 83, 0 } ; static yyconst flex_int32_t yy_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 6, 7, 8, 1, 9, 9, 7, 10, 11, 9, 9, 12, 9, 7, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 1, 9, 9, 9, 6, 9, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 25, 32, 33, 34, 35, 36, 37, 38, 39, 25, 7, 40, 7, 1, 41, 1, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 51, 58, 59, 60, 61, 62, 63, 64, 65, 51, 7, 66, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ; static yyconst flex_int32_t yy_meta[67] = { 0, 1, 2, 3, 3, 2, 1, 1, 1, 1, 4, 4, 5, 1, 6, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 1 } ; static yyconst flex_int16_t yy_base[1269] = { 0, 0, 0, 65, 104, 143, 182, 222, 0, 288, 0, 353, 0, 79, 83, 413, 0, 3961, 3962, 478, 87, 118, 89, 3952, 72, 3944, 97, 3943, 109, 117, 102, 86, 144, 58, 119, 159, 146, 145, 175, 519, 346, 348, 476, 3891, 0, 514, 543, 557, 202, 3941, 3962, 566, 3962, 3962, 0, 605, 3962, 3962, 126, 3941, 3962, 665, 731, 536, 558, 605, 574, 661, 666, 667, 782, 727, 3939, 3962, 842, 3962, 109, 164, 158, 337, 354, 347, 350, 557, 344, 467, 665, 563, 638, 760, 3938, 786, 3962, 593, 3962, 166, 639, 0, 209, 0, 0, 790, 3944, 213, 3936, 456, 674, 728, 457, 470, 472, 530, 543, 739, 654, 554, 582, 776, 783, 602, 3884, 816, 848, 871, 852, 487, 3962, 3936, 3933, 735, 734, 789, 798, 827, 850, 653, 703, 864, 874, 875, 878, 761, 883, 880, 888, 890, 892, 895, 917, 903, 908, 911, 924, 791, 900, 920, 913, 934, 3939, 3931, 3879, 969, 0, 979, 950, 983, 997, 3929, 3928, 0, 0, 538, 963, 634, 664, 781, 888, 943, 933, 975, 976, 979, 765, 3928, 988, 990, 998, 1018, 1026, 1031, 1036, 1061, 1056, 1077, 1078, 1095, 1136, 1094, 3926, 0, 1102, 987, 971, 981, 993, 1060, 999, 1018, 1035, 1121, 1117, 1108, 1127, 1141, 1116, 1125, 1141, 1143, 1129, 1126, 1141, 1139, 1140, 1152, 1168, 1159, 1159, 1149, 1176, 1157, 1160, 1212, 3925, 3962, 1220, 3922, 1224, 1207, 1225, 3924, 0, 1196, 1198, 1217, 1218, 1218, 1207, 1225, 1212, 1210, 1206, 1213, 1213, 1214, 1216, 1224, 1229, 1261, 1237, 1265, 1240, 1233, 1227, 1244, 1238, 1295, 3920, 1269, 1270, 1274, 1289, 1287, 1286, 1288, 1295, 1308, 1294, 1296, 1300, 1313, 1312, 1317, 1314, 1315, 1321, 1322, 1327, 1338, 1326, 1341, 1342, 1344, 1348, 1349, 1359, 1352, 1362, 1371, 1372, 1379, 1380, 1378, 3962, 3962, 3962, 1399, 3962, 3917, 1362, 1381, 1368, 1377, 1396, 1380, 1375, 1383, 1395, 1401, 1403, 1413, 1393, 1428, 1433, 1434, 1441, 1475, 1466, 1479, 1488, 1497, 1522, 1518, 1524, 1540, 1560, 1565, 3962, 1560, 1417, 1425, 1439, 1452, 1477, 1523, 1518, 1545, 1545, 1557, 1564, 1563, 1561, 1574, 1578, 1580, 1568, 1582, 1592, 1575, 1576, 1585, 1586, 1592, 1602, 1598, 3962, 3962, 1593, 1611, 1600, 1617, 1599, 1615, 1622, 1624, 1615, 1610, 1613, 1612, 1616, 1629, 1630, 1635, 1639, 1622, 1636, 1645, 1627, 1633, 1638, 1644, 1647, 1657, 1653, 1663, 1656, 0, 1674, 1677, 1679, 1675, 3914, 1684, 1681, 1687, 1680, 1698, 1676, 1703, 1701, 1707, 1705, 3907, 3902, 3900, 1709, 3898, 1722, 1710, 1714, 1728, 1735, 1729, 3894, 1740, 1736, 1744, 1751, 1739, 1755, 3892, 1733, 3962, 1743, 1731, 1735, 1758, 1749, 1744, 1743, 1758, 1748, 1761, 1771, 1757, 1759, 1766, 1769, 1799, 1798, 1807, 1800, 1843, 1848, 1849, 1850, 1856, 1881, 1891, 1900, 1899, 1901, 1942, 1778, 1789, 1799, 1806, 1821, 1834, 3890, 1840, 1852, 1872, 1889, 1902, 1919, 1908, 3886, 3882, 1910, 1933, 1927, 1926, 1939, 3881, 1936, 1947, 1952, 1936, 1951, 1945, 1952, 1943, 3855, 1949, 1949, 1947, 1945, 1950, 1953, 1967, 1957, 3854, 3852, 1960, 3851, 1972, 1985, 1978, 1977, 1980, 1990, 1995, 2001, 1999, 1986, 2001, 3840, 1998, 0, 2010, 2008, 2009, 2016, 542, 2014, 2011, 2034, 2018, 2038, 2037, 2042, 3833, 2040, 2041, 753, 817, 854, 2044, 1052, 2047, 2051, 2060, 2063, 2052, 2071, 1125, 2072, 2073, 2078, 3832, 2077, 3829, 1241, 2067, 2052, 2069, 2075, 2072, 2077, 2096, 2083, 2084, 2099, 2086, 2085, 2097, 2103, 2108, 2105, 2116, 2158, 2137, 2154, 2138, 2179, 2171, 2201, 2203, 2220, 2222, 2228, 2253, 2258, 2271, 3826, 3807, 2092, 2101, 2105, 2274, 3804, 2117, 2132, 2138, 2149, 3801, 2160, 2167, 3779, 3776, 2203, 2205, 2221, 2231, 2223, 3769, 2269, 2274, 2261, 2255, 3701, 2276, 2269, 2295, 3700, 2284, 2281, 2283, 2279, 2288, 2291, 2297, 2300, 3654, 3622, 2316, 3606, 2304, 2303, 2319, 2320, 2313, 2313, 2326, 2313, 3601, 2307, 3554, 3486, 2319, 3485, 2335, 2341, 1363, 2339, 2345, 1432, 2342, 2352, 2360, 2363, 2364, 2367, 2366, 1416, 2365, 2374, 843, 2402, 2392, 3470, 2425, 2395, 2396, 2403, 2405, 2410, 2408, 2429, 3464, 2420, 2421, 1499, 2424, 1510, 2454, 2423, 2410, 2433, 2424, 2422, 2422, 2422, 2420, 2434, 2428, 2444, 2445, 2438, 2455, 2442, 3405, 2476, 3359, 2482, 2489, 2480, 2521, 2523, 2528, 2541, 2572, 2573, 2574, 2579, 2604, 2620, 2622, 3322, 3315, 3306, 2446, 3295, 2457, 2477, 2469, 2559, 2470, 2510, 2525, 2534, 3290, 2538, 2540, 1203, 2605, 3251, 2571, 2578, 2592, 2584, 2638, 3241, 2610, 2606, 2617, 2622, 2621, 3211, 2635, 2624, 2663, 2624, 2629, 2636, 2636, 2652, 2649, 2667, 2667, 2689, 3168, 2668, 2670, 2678, 2678, 2666, 2671, 2667, 2663, 3133, 2672, 3129, 2682, 1831, 2690, 2691, 1560, 2698, 2716, 2705, 3110, 2719, 2720, 2703, 2723, 2706, 2718, 2725, 1803, 2728, 3080, 2221, 2750, 2754, 3091, 1835, 2776, 2745, 3067, 2751, 3046, 3028, 3024, 2784, 1874, 2752, 2948, 2789, 2780, 2396, 2794, 2932, 2688, 2729, 2750, 2749, 2753, 2781, 2785, 2785, 2927, 2785, 2788, 2788, 2783, 2779, 2775, 2818, 2515, 2819, 2827, 2828, 2860, 2862, 2866, 2884, 2902, 2908, 2909, 2914, 2918, 2952, 2957, 2767, 2813, 2817, 2793, 2895, 2812, 2803, 2821, 2904, 2900, 2836, 2831, 2868, 2872, 2823, 2908, 2883, 2944, 2950, 2894, 2873, 2898, 2841, 2837, 2986, 2802, 2933, 2746, 2939, 2932, 2951, 2943, 2958, 2993, 2957, 2957, 2952, 2969, 2964, 2980, 2989, 2608, 3012, 2597, 2992, 2590, 2982, 2558, 2551, 2511, 2994, 2510, 3000, 2498, 3019, 2480, 3007, 3023, 3015, 3014, 3017, 3018, 3016, 3021, 2468, 2461, 2393, 3047, 3026, 2017, 3053, 3030, 2147, 2377, 2162, 2338, 2469, 3065, 3035, 2704, 3082, 2369, 3054, 2808, 3038, 3029, 3051, 3049, 3041, 3043, 3058, 2288, 2267, 3045, 2257, 2246, 3057, 2245, 3076, 3088, 3093, 3094, 3101, 3103, 3136, 3142, 2201, 3106, 2190, 3146, 2151, 2140, 3144, 2133, 3110, 3136, 3162, 3079, 3132, 3080, 3132, 3148, 3145, 3153, 2116, 1921, 3177, 3152, 1917, 3205, 3155, 1880, 1867, 3167, 3167, 3171, 3163, 3174, 3181, 3182, 1866, 1856, 3186, 1824, 3188, 1818, 1794, 1713, 1702, 1546, 3188, 1540, 1532, 1505, 3218, 2851, 3206, 3207, 1492, 3209, 3214, 3212, 3217, 3220, 3221, 3232, 3233, 3247, 3253, 3235, 3255, 3249, 3265, 3271, 3275, 3279, 3263, 3284, 3275, 3291, 3205, 3238, 3251, 3261, 3274, 1486, 3271, 1465, 3270, 3286, 3285, 3293, 3313, 3306, 1464, 3334, 3301, 3302, 3309, 1454, 3329, 3342, 3341, 3351, 1450, 3358, 3318, 3322, 1427, 3346, 3337, 1354, 3352, 3397, 3350, 1353, 1301, 3348, 3352, 1247, 3365, 3356, 3356, 3359, 1186, 1182, 3369, 3368, 1131, 3366, 1100, 3401, 1084, 3394, 3360, 1047, 3389, 3402, 1012, 3420, 3424, 3430, 3404, 3435, 3415, 3439, 3441, 3445, 3449, 3453, 1011, 3454, 3458, 3463, 3403, 3415, 993, 3430, 3439, 3450, 3443, 3461, 3462, 982, 3467, 3457, 3522, 3503, 3488, 3500, 3506, 3526, 3527, 3519, 3534, 961, 960, 3461, 953, 3487, 3548, 3487, 943, 3538, 916, 3503, 910, 898, 3511, 3515, 849, 3520, 3522, 844, 3555, 3560, 3553, 3552, 3569, 3563, 3558, 824, 3564, 3584, 3588, 3592, 3583, 3568, 3598, 3586, 3602, 824, 801, 3565, 771, 3580, 3578, 756, 731, 3597, 3612, 720, 3604, 3638, 3606, 3613, 714, 3642, 3590, 677, 3661, 3602, 3665, 666, 641, 3593, 631, 3630, 611, 604, 3635, 3627, 600, 3669, 3671, 593, 3673, 3677, 3662, 3668, 3686, 3670, 576, 3691, 3653, 569, 3669, 3692, 3683, 3699, 3700, 549, 3687, 3704, 3717, 536, 3677, 493, 3675, 488, 3681, 470, 3722, 3715, 3730, 3708, 3742, 3746, 3737, 3740, 3736, 379, 3701, 3756, 374, 3757, 3761, 3751, 3767, 3735, 345, 3726, 3752, 344, 3771, 204, 3785, 3762, 3796, 3760, 3806, 3810, 3790, 3759, 195, 3769, 3822, 3770, 185, 3831, 3770, 3835, 3815, 167, 120, 112, 3848, 3841, 98, 82, 78, 3856, 3860, 3870, 3874, 3878, 3962, 3883, 3886, 3894, 3902, 3910, 3918, 3922, 3930 } ; static yyconst flex_int16_t yy_def[1269] = { 0, 1260, 1, 1261, 1261, 1261, 1261, 1260, 7, 1260, 9, 9, 11, 11, 11, 1260, 15, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1260, 1260, 1263, 1260, 1260, 1260, 1263, 1260, 1260, 1260, 1260, 1260, 1264, 1264, 1260, 1260, 1260, 1264, 1260, 1265, 1265, 62, 62, 62, 62, 62, 62, 62, 62, 62, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1266, 1260, 1267, 19, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1260, 1260, 1260, 1260, 1263, 1260, 1263, 1260, 1260, 1260, 1260, 1264, 55, 1260, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1260, 1264, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 1260, 74, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1266, 1267, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1260, 1260, 1260, 1260, 1260, 1260, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1268, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1260, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1268, 1262, 1262, 1262, 1262, 1260, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1260, 1260, 1260, 1262, 1260, 1262, 1262, 1262, 1262, 1262, 1262, 1260, 1262, 1262, 1262, 1262, 1262, 1262, 1260, 1262, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1262, 1262, 1262, 1260, 1262, 1262, 1260, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1260, 1262, 1262, 1260, 1260, 1260, 1262, 1260, 1262, 1262, 1262, 1262, 1262, 1262, 1260, 1262, 1262, 1262, 1260, 1262, 1260, 1260, 1262, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 62, 1260, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1262, 1262, 1260, 1262, 1262, 1260, 1260, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1260, 1262, 1262, 1260, 1260, 1260, 1260, 1260, 1260, 1262, 1262, 1262, 1262, 1262, 1262, 1260, 1260, 1262, 1262, 1260, 1262, 1260, 1260, 1262, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 62, 1260, 62, 62, 62, 62, 62, 62, 62, 1260, 62, 62, 62, 62, 62, 62, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1262, 1262, 1260, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1260, 1262, 1260, 1260, 1262, 1260, 1262, 1260, 1260, 1260, 1260, 1262, 1260, 1260, 1262, 1260, 1260, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 62, 1260, 62, 62, 62, 62, 62, 62, 1260, 1260, 1260, 62, 1260, 1260, 62, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1260, 1260, 1260, 1262, 1260, 1260, 1262, 1260, 1260, 1260, 1260, 1260, 1260, 1262, 1260, 1260, 1260, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 62, 62, 62, 62, 62, 1260, 62, 1260, 1260, 1260, 1260, 1260, 1260, 62, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1262, 1262, 1260, 1262, 1262, 1262, 1262, 1260, 1260, 1260, 1262, 1260, 1262, 1260, 1260, 1260, 1260, 1260, 1262, 1260, 1260, 1260, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 62, 62, 1260, 62, 62, 1260, 62, 1260, 1260, 1260, 1260, 1260, 62, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1262, 1260, 1260, 1262, 1262, 1260, 1260, 1260, 1260, 1262, 1262, 1260, 1260, 1260, 1260, 1264, 1264, 1264, 1264, 1264, 1264, 1260, 62, 1260, 1260, 62, 1260, 62, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1262, 1260, 1260, 1262, 1260, 1260, 1262, 1262, 1260, 1264, 1264, 1264, 1260, 62, 1260, 1260, 1260, 62, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1262, 1260, 1260, 1262, 1260, 1260, 1264, 1264, 1260, 1260, 1260, 1260, 62, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1262, 1260, 1262, 1260, 1264, 1260, 1260, 62, 1260, 1260, 1260, 1260, 1260, 1262, 1260, 1264, 1260, 62, 1260, 1260, 1260, 1260, 1260, 1264, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 0, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260 } ; static yyconst flex_int16_t yy_nxt[4029] = { 0, 18, 19, 20, 21, 19, 22, 22, 23, 18, 22, 22, 24, 18, 22, 25, 26, 27, 28, 29, 30, 31, 27, 27, 32, 27, 33, 34, 35, 36, 27, 37, 38, 39, 40, 27, 27, 41, 27, 27, 42, 18, 26, 27, 28, 29, 30, 31, 27, 27, 32, 27, 33, 34, 35, 36, 27, 37, 38, 39, 40, 27, 27, 41, 27, 27, 43, 45, 46, 21, 47, 48, 48, 127, 125, 48, 48, 125, 141, 48, 25, 73, 91, 75, 73, 73, 91, 75, 73, 121, 122, 121, 121, 1256, 73, 123, 123, 1257, 73, 123, 123, 127, 104, 123, 141, 49, 45, 46, 21, 47, 48, 48, 127, 1253, 48, 48, 138, 127, 48, 25, 101, 101, 101, 101, 127, 131, 129, 1254, 182, 130, 136, 182, 127, 104, 127, 1250, 132, 134, 210, 133, 137, 135, 138, 142, 49, 50, 51, 52, 53, 48, 48, 131, 129, 48, 48, 130, 136, 48, 53, 127, 127, 127, 132, 134, 210, 133, 137, 135, 237, 142, 237, 237, 139, 140, 127, 143, 145, 147, 214, 144, 211, 146, 1253, 53, 50, 51, 52, 53, 48, 48, 127, 212, 48, 48, 213, 148, 48, 53, 139, 140, 1251, 143, 145, 147, 214, 144, 211, 146, 164, 164, 1248, 125, 164, 164, 125, 125, 164, 212, 125, 1241, 213, 148, 53, 54, 55, 56, 57, 55, 54, 54, 54, 54, 54, 54, 58, 54, 59, 60, 61, 61, 62, 63, 64, 61, 61, 61, 65, 61, 66, 61, 67, 61, 61, 68, 69, 70, 71, 61, 61, 61, 61, 61, 72, 54, 61, 61, 62, 63, 64, 61, 61, 61, 65, 61, 66, 61, 67, 61, 61, 68, 69, 70, 71, 61, 61, 61, 61, 61, 54, 73, 74, 73, 75, 74, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 76, 73, 77, 78, 79, 73, 73, 73, 80, 73, 81, 82, 83, 73, 73, 84, 85, 86, 87, 73, 73, 73, 73, 73, 73, 73, 76, 73, 77, 78, 79, 73, 73, 73, 80, 73, 81, 82, 83, 73, 73, 84, 85, 86, 87, 73, 73, 73, 73, 73, 73, 88, 88, 89, 88, 1232, 1228, 127, 153, 127, 157, 215, 154, 219, 90, 73, 155, 73, 73, 73, 220, 216, 223, 73, 156, 73, 73, 73, 217, 218, 73, 73, 73, 73, 153, 1234, 157, 215, 154, 219, 1218, 73, 155, 73, 73, 73, 220, 216, 223, 73, 156, 73, 73, 73, 217, 218, 73, 73, 73, 73, 92, 93, 94, 95, 93, 96, 92, 92, 96, 97, 92, 98, 96, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 96, 100, 101, 101, 100, 158, 1227, 102, 224, 241, 125, 103, 159, 125, 104, 105, 247, 106, 107, 108, 109, 248, 249, 110, 1210, 111, 112, 113, 114, 1224, 115, 116, 117, 118, 224, 241, 119, 101, 101, 101, 101, 105, 247, 106, 107, 108, 109, 248, 249, 110, 104, 111, 112, 113, 114, 127, 115, 116, 117, 118, 149, 182, 119, 160, 182, 120, 101, 163, 101, 101, 150, 250, 1218, 184, 151, 152, 266, 188, 646, 104, 101, 101, 101, 101, 184, 1220, 149, 184, 251, 165, 166, 166, 165, 104, 221, 184, 150, 250, 222, 184, 151, 152, 167, 188, 229, 1195, 184, 256, 230, 184, 184, 184, 1213, 184, 251, 191, 236, 189, 237, 236, 221, 184, 184, 257, 222, 184, 103, 168, 170, 1207, 229, 170, 184, 256, 230, 184, 1187, 184, 171, 264, 1184, 191, 184, 189, 172, 173, 174, 1203, 184, 257, 175, 184, 176, 184, 177, 190, 184, 178, 179, 180, 181, 231, 231, 231, 231, 264, 238, 1181, 184, 238, 172, 173, 174, 238, 232, 311, 175, 1178, 176, 184, 177, 190, 184, 178, 179, 180, 181, 169, 169, 127, 1167, 169, 169, 169, 169, 169, 169, 169, 184, 169, 169, 311, 192, 184, 184, 254, 225, 275, 194, 184, 255, 242, 184, 1195, 184, 184, 226, 184, 184, 193, 227, 228, 243, 312, 184, 244, 238, 169, 192, 184, 184, 254, 225, 275, 194, 184, 255, 242, 184, 127, 184, 184, 226, 184, 184, 193, 227, 228, 243, 312, 1197, 244, 169, 169, 169, 276, 1194, 169, 169, 169, 169, 169, 169, 169, 184, 169, 169, 1191, 185, 245, 127, 127, 197, 246, 267, 184, 252, 268, 184, 186, 253, 276, 187, 231, 231, 231, 231, 266, 182, 657, 184, 182, 1160, 169, 185, 245, 232, 127, 197, 246, 267, 184, 252, 268, 184, 186, 253, 1155, 187, 234, 234, 234, 234, 101, 101, 101, 101, 258, 169, 184, 260, 281, 235, 195, 261, 127, 104, 127, 262, 297, 184, 313, 259, 184, 127, 270, 263, 1152, 196, 121, 122, 121, 121, 258, 269, 184, 260, 281, 1145, 195, 261, 266, 104, 658, 262, 297, 184, 313, 259, 184, 1183, 270, 263, 127, 196, 199, 782, 271, 199, 782, 269, 121, 122, 121, 121, 265, 265, 265, 265, 272, 1176, 200, 201, 202, 104, 1173, 127, 203, 266, 204, 659, 205, 273, 271, 206, 207, 208, 209, 123, 123, 127, 277, 123, 123, 274, 272, 123, 200, 201, 202, 127, 127, 279, 203, 127, 204, 127, 205, 273, 127, 206, 207, 208, 209, 127, 278, 127, 277, 127, 314, 274, 127, 280, 282, 1170, 284, 127, 283, 279, 127, 288, 287, 292, 285, 127, 286, 1132, 127, 298, 127, 293, 278, 1168, 127, 300, 314, 127, 289, 280, 282, 127, 284, 295, 283, 294, 290, 288, 287, 292, 285, 127, 286, 291, 296, 298, 299, 293, 164, 164, 1160, 300, 164, 164, 289, 315, 164, 316, 301, 295, 1155, 294, 290, 305, 305, 305, 305, 1152, 1161, 291, 296, 308, 299, 101, 163, 101, 101, 165, 166, 166, 165, 315, 309, 316, 301, 310, 104, 317, 318, 1154, 167, 166, 166, 166, 166, 320, 184, 308, 184, 214, 1097, 216, 218, 319, 167, 219, 322, 184, 309, 184, 184, 310, 184, 317, 318, 168, 321, 184, 1143, 1136, 184, 320, 184, 223, 184, 214, 184, 216, 218, 319, 224, 219, 322, 184, 184, 184, 184, 184, 184, 325, 184, 323, 321, 184, 184, 184, 184, 225, 184, 223, 184, 324, 184, 184, 1133, 184, 224, 266, 184, 661, 184, 326, 228, 184, 184, 325, 184, 323, 338, 184, 184, 184, 222, 225, 184, 184, 184, 324, 184, 184, 184, 184, 328, 184, 184, 184, 184, 326, 228, 330, 184, 1130, 327, 329, 338, 184, 184, 331, 222, 184, 184, 184, 184, 184, 184, 332, 184, 1128, 328, 184, 211, 184, 184, 184, 184, 330, 184, 184, 327, 329, 335, 212, 184, 331, 337, 184, 184, 340, 184, 184, 266, 332, 668, 339, 341, 342, 211, 230, 1080, 184, 184, 345, 184, 184, 184, 333, 335, 212, 346, 347, 337, 348, 343, 340, 349, 184, 334, 350, 184, 339, 341, 342, 351, 230, 344, 352, 353, 345, 354, 357, 184, 333, 358, 359, 346, 347, 362, 348, 343, 355, 349, 184, 334, 350, 184, 360, 363, 356, 351, 1075, 344, 352, 353, 1074, 354, 357, 361, 851, 358, 359, 851, 237, 362, 237, 237, 355, 231, 231, 231, 231, 366, 360, 363, 356, 234, 234, 234, 234, 236, 232, 237, 236, 361, 238, 367, 368, 238, 235, 103, 369, 238, 371, 373, 374, 375, 376, 366, 377, 378, 379, 380, 370, 381, 372, 382, 383, 266, 387, 675, 390, 367, 368, 391, 392, 1120, 369, 393, 371, 373, 374, 375, 376, 394, 377, 378, 379, 380, 370, 381, 372, 382, 383, 384, 387, 388, 390, 127, 127, 391, 392, 385, 127, 393, 238, 396, 389, 398, 386, 394, 265, 265, 265, 265, 127, 127, 127, 127, 397, 384, 400, 388, 127, 127, 127, 402, 403, 385, 127, 1065, 405, 396, 389, 398, 386, 399, 127, 406, 401, 404, 127, 127, 127, 127, 397, 127, 400, 407, 408, 127, 127, 402, 403, 411, 127, 127, 405, 413, 414, 409, 415, 399, 412, 406, 401, 404, 127, 410, 416, 127, 127, 419, 127, 407, 408, 417, 127, 127, 418, 411, 127, 1117, 1114, 413, 414, 409, 415, 127, 412, 266, 127, 767, 420, 410, 416, 421, 422, 419, 424, 127, 127, 417, 423, 425, 418, 427, 127, 127, 127, 432, 433, 426, 434, 429, 305, 305, 305, 305, 420, 428, 430, 421, 422, 435, 424, 436, 437, 438, 423, 425, 439, 427, 440, 441, 443, 432, 433, 426, 434, 429, 446, 442, 266, 444, 779, 428, 430, 770, 771, 435, 770, 436, 437, 438, 445, 1097, 439, 184, 440, 441, 443, 447, 184, 184, 463, 464, 446, 442, 184, 444, 184, 184, 450, 184, 184, 465, 184, 184, 1109, 448, 445, 184, 1104, 184, 184, 466, 449, 447, 184, 184, 463, 464, 1100, 1033, 184, 184, 184, 184, 450, 184, 184, 465, 184, 184, 184, 448, 184, 184, 184, 184, 184, 466, 449, 452, 1028, 184, 451, 184, 184, 184, 1068, 184, 184, 467, 454, 266, 184, 798, 184, 453, 184, 184, 184, 1013, 184, 184, 266, 184, 800, 452, 184, 184, 451, 184, 184, 184, 455, 457, 184, 467, 454, 184, 184, 184, 184, 453, 468, 184, 184, 456, 1064, 184, 184, 184, 184, 184, 184, 184, 1011, 184, 469, 458, 455, 457, 1008, 891, 470, 184, 891, 184, 184, 471, 468, 184, 184, 456, 459, 184, 184, 184, 184, 184, 462, 184, 184, 184, 469, 458, 472, 473, 184, 460, 470, 184, 344, 461, 184, 471, 184, 184, 474, 475, 459, 476, 477, 184, 478, 479, 462, 480, 184, 481, 482, 483, 472, 473, 184, 460, 484, 184, 344, 461, 485, 486, 184, 487, 474, 475, 488, 476, 477, 489, 478, 479, 490, 480, 491, 481, 482, 483, 492, 493, 494, 495, 484, 496, 497, 498, 485, 486, 499, 487, 500, 501, 488, 502, 503, 489, 504, 505, 490, 506, 491, 507, 508, 509, 492, 493, 494, 495, 510, 496, 497, 498, 511, 512, 499, 513, 500, 501, 514, 502, 503, 515, 504, 505, 516, 506, 517, 507, 508, 509, 127, 127, 127, 127, 510, 127, 127, 127, 511, 512, 127, 513, 521, 127, 514, 519, 520, 515, 529, 522, 516, 525, 517, 524, 127, 528, 527, 127, 1007, 127, 526, 127, 531, 127, 532, 127, 127, 540, 521, 1006, 127, 519, 520, 530, 529, 522, 533, 525, 127, 524, 537, 528, 527, 539, 127, 127, 526, 541, 531, 127, 532, 127, 127, 540, 544, 127, 127, 547, 553, 530, 127, 548, 533, 542, 554, 555, 537, 127, 543, 539, 546, 127, 549, 541, 550, 556, 551, 557, 558, 559, 544, 560, 561, 547, 553, 562, 563, 548, 564, 542, 554, 555, 565, 566, 543, 567, 546, 568, 549, 584, 550, 556, 551, 557, 558, 559, 901, 560, 561, 901, 1062, 562, 563, 585, 564, 184, 184, 184, 565, 566, 586, 567, 569, 568, 184, 584, 184, 184, 184, 184, 184, 184, 570, 572, 1004, 184, 571, 587, 184, 585, 1001, 184, 184, 184, 588, 266, 586, 888, 569, 266, 184, 904, 184, 184, 184, 184, 184, 184, 570, 572, 184, 184, 571, 587, 184, 574, 184, 184, 589, 591, 588, 184, 1059, 577, 184, 573, 184, 184, 184, 184, 575, 576, 1058, 1050, 184, 592, 184, 184, 266, 593, 911, 574, 184, 184, 589, 591, 1049, 184, 184, 577, 184, 573, 184, 184, 184, 184, 575, 576, 184, 184, 184, 592, 184, 184, 578, 593, 184, 184, 582, 184, 581, 594, 184, 595, 184, 580, 579, 184, 184, 184, 184, 184, 184, 1033, 184, 184, 596, 1028, 184, 597, 578, 600, 184, 184, 582, 184, 581, 594, 184, 595, 601, 580, 579, 184, 184, 184, 184, 184, 184, 184, 602, 603, 596, 583, 604, 597, 606, 600, 607, 608, 184, 609, 610, 184, 611, 612, 601, 613, 615, 616, 617, 618, 619, 620, 621, 184, 602, 603, 622, 583, 604, 625, 606, 627, 607, 608, 184, 609, 610, 184, 611, 612, 628, 613, 615, 616, 617, 618, 619, 620, 621, 629, 630, 631, 622, 632, 633, 625, 634, 627, 635, 636, 637, 639, 127, 127, 127, 127, 628, 641, 127, 266, 643, 1001, 127, 647, 648, 629, 630, 631, 642, 632, 633, 640, 634, 644, 635, 636, 637, 639, 127, 645, 650, 127, 127, 641, 127, 127, 127, 649, 127, 647, 648, 127, 660, 652, 642, 127, 127, 640, 655, 644, 651, 653, 656, 677, 127, 645, 650, 127, 662, 664, 666, 127, 665, 649, 663, 127, 127, 127, 660, 652, 670, 127, 127, 669, 655, 676, 651, 653, 656, 677, 667, 678, 679, 680, 662, 664, 666, 681, 665, 671, 663, 682, 683, 684, 685, 673, 670, 686, 687, 669, 688, 676, 689, 690, 691, 711, 667, 678, 679, 680, 1045, 184, 712, 681, 713, 671, 717, 682, 683, 684, 685, 673, 184, 686, 687, 692, 688, 1037, 689, 690, 691, 711, 184, 184, 1035, 718, 696, 184, 712, 266, 713, 1004, 717, 184, 698, 1034, 184, 184, 184, 184, 719, 692, 693, 184, 266, 720, 1006, 697, 184, 184, 184, 718, 696, 184, 184, 694, 184, 184, 722, 184, 698, 695, 184, 184, 184, 184, 719, 184, 723, 184, 184, 720, 700, 697, 1032, 184, 184, 699, 184, 184, 184, 694, 184, 184, 722, 1030, 184, 695, 184, 701, 184, 726, 782, 184, 723, 782, 184, 184, 700, 184, 184, 184, 184, 699, 184, 184, 702, 184, 727, 703, 728, 704, 184, 184, 184, 701, 184, 726, 184, 184, 729, 184, 730, 184, 184, 184, 184, 705, 184, 947, 945, 184, 702, 184, 727, 703, 728, 704, 184, 184, 706, 944, 184, 184, 184, 184, 729, 184, 730, 184, 184, 942, 184, 705, 184, 708, 184, 184, 693, 707, 732, 733, 734, 735, 184, 736, 706, 184, 737, 184, 184, 714, 940, 742, 743, 184, 744, 715, 184, 738, 184, 745, 184, 184, 746, 707, 732, 733, 734, 735, 747, 736, 739, 184, 737, 748, 184, 714, 740, 742, 743, 749, 744, 715, 751, 752, 753, 745, 754, 755, 746, 756, 757, 758, 759, 761, 747, 763, 739, 127, 266, 748, 1007, 127, 740, 127, 127, 749, 768, 127, 751, 752, 753, 765, 754, 755, 127, 756, 757, 758, 759, 761, 766, 763, 127, 772, 769, 127, 127, 127, 127, 127, 780, 1012, 768, 773, 777, 776, 127, 765, 774, 1005, 781, 784, 785, 775, 784, 916, 766, 778, 916, 772, 769, 783, 783, 783, 783, 999, 780, 127, 127, 773, 777, 776, 788, 789, 774, 127, 781, 127, 790, 775, 127, 791, 127, 778, 787, 787, 787, 787, 794, 794, 794, 794, 127, 127, 793, 127, 127, 803, 788, 789, 792, 806, 802, 807, 790, 693, 808, 791, 809, 810, 811, 796, 799, 801, 801, 801, 801, 797, 804, 812, 793, 813, 814, 803, 805, 815, 792, 806, 802, 807, 816, 817, 808, 998, 809, 810, 811, 796, 799, 266, 997, 1008, 837, 797, 804, 812, 839, 813, 814, 184, 805, 815, 989, 184, 840, 184, 816, 817, 841, 820, 184, 844, 184, 184, 184, 818, 184, 184, 837, 184, 987, 822, 839, 184, 933, 184, 184, 933, 821, 184, 840, 184, 985, 983, 841, 820, 184, 844, 184, 184, 184, 818, 184, 184, 184, 184, 184, 822, 845, 184, 824, 184, 184, 825, 821, 184, 846, 184, 184, 823, 184, 847, 184, 849, 184, 184, 850, 826, 842, 843, 184, 842, 184, 982, 845, 184, 824, 184, 184, 825, 981, 184, 846, 184, 184, 823, 184, 847, 184, 849, 184, 184, 850, 826, 827, 184, 184, 184, 854, 829, 828, 184, 184, 855, 184, 830, 184, 184, 184, 184, 184, 184, 979, 184, 852, 853, 184, 852, 856, 904, 857, 184, 184, 184, 854, 829, 828, 184, 184, 855, 977, 830, 184, 184, 184, 184, 184, 184, 184, 184, 831, 184, 184, 184, 856, 184, 857, 858, 858, 858, 858, 860, 861, 184, 184, 862, 184, 184, 863, 184, 864, 832, 865, 866, 184, 868, 831, 184, 833, 184, 869, 184, 867, 771, 870, 867, 871, 860, 861, 872, 184, 862, 184, 184, 863, 184, 864, 832, 865, 866, 873, 868, 874, 875, 833, 878, 869, 879, 876, 785, 870, 876, 871, 880, 881, 872, 882, 883, 884, 885, 886, 887, 127, 127, 770, 771, 873, 770, 874, 875, 127, 878, 890, 879, 266, 127, 1011, 918, 127, 880, 881, 889, 882, 883, 884, 885, 886, 887, 127, 892, 127, 127, 127, 893, 896, 127, 898, 127, 890, 894, 127, 895, 900, 918, 897, 902, 919, 889, 899, 783, 783, 783, 783, 784, 785, 892, 784, 127, 947, 893, 896, 905, 898, 127, 127, 894, 948, 895, 900, 948, 897, 902, 919, 912, 899, 787, 787, 787, 787, 920, 921, 922, 907, 794, 794, 794, 794, 905, 914, 914, 914, 914, 127, 801, 801, 801, 801, 915, 923, 912, 924, 925, 926, 927, 928, 920, 921, 922, 907, 929, 930, 931, 949, 843, 963, 949, 950, 853, 266, 950, 1013, 951, 960, 915, 923, 960, 924, 925, 926, 927, 928, 184, 184, 953, 954, 929, 930, 931, 955, 932, 184, 184, 184, 184, 935, 184, 184, 951, 936, 945, 934, 184, 184, 944, 184, 184, 956, 184, 184, 953, 954, 266, 957, 1065, 955, 932, 184, 184, 184, 184, 935, 184, 184, 184, 936, 184, 934, 184, 184, 184, 184, 184, 956, 939, 184, 942, 184, 184, 957, 184, 184, 937, 938, 184, 853, 940, 940, 184, 958, 184, 843, 184, 959, 842, 843, 184, 842, 952, 184, 939, 184, 184, 184, 184, 941, 184, 184, 937, 938, 184, 942, 184, 184, 184, 958, 961, 944, 184, 959, 962, 945, 184, 184, 184, 184, 184, 184, 184, 184, 827, 943, 184, 184, 851, 917, 184, 851, 184, 184, 852, 853, 961, 852, 184, 964, 962, 965, 184, 184, 184, 913, 184, 184, 966, 184, 184, 943, 184, 184, 947, 184, 184, 967, 946, 968, 969, 184, 970, 971, 184, 964, 184, 965, 972, 184, 858, 858, 858, 858, 966, 973, 184, 867, 771, 974, 867, 184, 975, 967, 946, 968, 969, 184, 970, 971, 184, 976, 184, 978, 972, 184, 876, 785, 980, 876, 984, 973, 986, 988, 127, 974, 988, 891, 975, 990, 891, 127, 127, 127, 127, 127, 992, 976, 127, 978, 991, 910, 995, 127, 980, 909, 984, 127, 986, 993, 994, 901, 127, 996, 901, 990, 1000, 1002, 916, 1003, 1002, 916, 992, 908, 1014, 1015, 991, 1010, 995, 1009, 1009, 1009, 1009, 1016, 1017, 993, 994, 1018, 1019, 996, 1020, 1021, 1000, 1022, 906, 1003, 914, 914, 914, 914, 1014, 1015, 933, 1010, 184, 933, 785, 903, 1023, 1016, 1017, 1038, 1040, 1018, 1019, 184, 1020, 1021, 184, 1022, 1031, 184, 184, 1031, 948, 771, 1025, 948, 1024, 184, 184, 184, 184, 184, 1023, 184, 184, 1038, 1040, 1027, 184, 184, 184, 1026, 184, 184, 1039, 184, 184, 1039, 949, 843, 1025, 949, 1024, 184, 800, 184, 184, 184, 798, 184, 184, 1028, 184, 1027, 184, 1041, 184, 1026, 184, 184, 184, 1033, 184, 184, 950, 853, 184, 950, 1042, 184, 1029, 184, 184, 184, 1036, 1043, 184, 1044, 184, 960, 1046, 1041, 960, 877, 184, 1048, 184, 1051, 184, 184, 1052, 1053, 184, 1054, 1042, 184, 1029, 184, 184, 184, 1036, 1043, 184, 1044, 1055, 1056, 1046, 1047, 1047, 1047, 1047, 1048, 1057, 1051, 1060, 1061, 1052, 1053, 1063, 1054, 988, 127, 127, 988, 127, 1088, 767, 127, 1069, 127, 1055, 1056, 127, 266, 266, 1073, 1074, 1067, 1057, 1066, 1060, 1061, 1071, 1070, 1063, 266, 1072, 1075, 127, 1077, 127, 1088, 1077, 1076, 1069, 1002, 859, 1079, 1002, 1078, 1079, 1089, 266, 1067, 1080, 1066, 827, 1081, 1071, 1070, 1081, 1090, 1072, 1082, 1082, 1082, 1082, 1083, 127, 1076, 1083, 1009, 1009, 1009, 1009, 1078, 1085, 1089, 266, 1085, 1086, 1091, 1084, 1087, 1087, 1087, 1087, 1090, 1092, 1093, 1094, 184, 184, 1102, 1031, 848, 1102, 1031, 1097, 184, 838, 1103, 184, 184, 1103, 1096, 184, 1091, 1084, 1095, 184, 836, 184, 184, 1092, 1093, 1094, 184, 184, 184, 835, 1105, 1098, 184, 1105, 184, 1099, 834, 184, 184, 184, 1096, 184, 184, 1106, 1095, 184, 1106, 184, 184, 184, 1110, 1111, 1108, 1101, 184, 1108, 184, 1098, 184, 1039, 184, 1099, 1039, 184, 1112, 184, 1113, 184, 184, 1107, 184, 1115, 266, 819, 1132, 184, 1110, 1111, 1116, 1101, 1118, 1119, 184, 1121, 1122, 1123, 184, 1124, 1125, 184, 1112, 1126, 1113, 184, 1127, 1107, 184, 1115, 1047, 1047, 1047, 1047, 1129, 127, 1116, 1129, 1118, 1119, 127, 1121, 1122, 1123, 1131, 1124, 1125, 1134, 127, 1126, 127, 708, 1127, 1137, 1137, 1137, 1137, 1138, 1138, 1138, 1138, 127, 1135, 1139, 1139, 1139, 1139, 1146, 1077, 1140, 1131, 1077, 1079, 1134, 1142, 1079, 1147, 1142, 1081, 1141, 1148, 1081, 1082, 1082, 1082, 1082, 1083, 1085, 1135, 1083, 1085, 1144, 1145, 1146, 1144, 1140, 1087, 1087, 1087, 1087, 1149, 1150, 1147, 1151, 184, 1141, 1148, 1152, 184, 184, 795, 1162, 1153, 1155, 184, 184, 786, 1156, 184, 184, 184, 1102, 184, 184, 1102, 184, 1149, 1150, 184, 1151, 184, 764, 675, 1103, 184, 184, 1103, 1162, 1153, 1159, 184, 184, 1159, 1156, 184, 184, 184, 1163, 184, 184, 184, 184, 1165, 1169, 184, 1157, 1157, 1157, 1157, 1105, 1106, 184, 1105, 1106, 184, 1160, 184, 1108, 1158, 1171, 1108, 1166, 1167, 1163, 1166, 1172, 184, 184, 1165, 1169, 184, 1164, 1164, 1164, 1164, 1174, 1175, 184, 1177, 1145, 184, 1177, 184, 1129, 1158, 1171, 1129, 266, 127, 1178, 762, 1172, 1180, 184, 127, 1180, 184, 266, 266, 1181, 1184, 1174, 1175, 1182, 127, 1188, 1179, 1137, 1137, 1137, 1137, 1138, 1138, 1138, 1138, 1139, 1139, 1139, 1139, 127, 266, 1142, 1187, 1186, 1142, 1144, 1145, 1185, 1144, 1182, 1189, 1188, 1179, 1190, 184, 1193, 1159, 760, 1193, 1159, 1195, 184, 661, 184, 1199, 184, 1200, 1201, 184, 1186, 1196, 1192, 184, 1185, 184, 184, 1189, 184, 750, 1190, 184, 1157, 1157, 1157, 1157, 1198, 1167, 184, 1198, 184, 1199, 184, 1200, 1201, 184, 1202, 1196, 1192, 184, 1204, 184, 184, 1205, 184, 1164, 1164, 1164, 1164, 1166, 1167, 658, 1166, 1177, 1145, 1206, 1177, 1180, 1206, 127, 1180, 1208, 1202, 266, 1208, 1210, 1204, 127, 1215, 1205, 1211, 1211, 1211, 1211, 1216, 1214, 1217, 1209, 1214, 1217, 1218, 184, 1212, 1193, 1219, 184, 1193, 1219, 1222, 1223, 1225, 1222, 184, 1226, 1215, 184, 184, 741, 708, 1221, 1216, 1198, 1167, 1209, 1198, 127, 1206, 184, 1212, 1206, 266, 184, 1228, 1233, 1208, 1223, 1225, 1208, 184, 1226, 1214, 184, 184, 1214, 1229, 1221, 1230, 1230, 1230, 1230, 1211, 1211, 1211, 1211, 127, 266, 1237, 1232, 1231, 1233, 1217, 1219, 1238, 1217, 1219, 1235, 1235, 1235, 1235, 184, 1229, 1222, 1236, 1239, 1222, 1240, 1240, 1240, 1240, 127, 184, 1244, 1237, 184, 1231, 266, 731, 1250, 1238, 1230, 1230, 1230, 1230, 725, 1247, 184, 724, 1242, 1236, 1239, 1243, 1243, 1243, 1243, 1249, 1252, 184, 1244, 184, 184, 1245, 1245, 1245, 1245, 1235, 1235, 1235, 1235, 721, 184, 1247, 716, 184, 1242, 710, 1246, 1240, 1240, 1240, 1240, 1249, 1252, 1253, 184, 184, 1243, 1243, 1243, 1243, 1245, 1245, 1245, 1245, 709, 184, 184, 674, 184, 184, 672, 654, 1246, 1255, 1255, 1255, 1255, 266, 638, 1256, 184, 1255, 1255, 1255, 1255, 1258, 1258, 1258, 1258, 626, 624, 184, 623, 614, 184, 1259, 1259, 1259, 1259, 1258, 1258, 1258, 1258, 1259, 1259, 1259, 1259, 44, 44, 44, 44, 44, 44, 44, 44, 44, 128, 128, 162, 605, 599, 162, 162, 162, 598, 162, 169, 169, 590, 169, 552, 169, 545, 169, 184, 184, 538, 184, 536, 184, 535, 184, 239, 239, 239, 534, 239, 239, 239, 239, 239, 240, 523, 240, 518, 431, 395, 518, 365, 518, 364, 518, 518, 233, 336, 183, 307, 306, 304, 303, 302, 127, 266, 161, 126, 124, 233, 198, 183, 159, 161, 127, 126, 124, 1260, 17, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260 } ; static yyconst flex_int16_t yy_chk[4029] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 33, 24, 3, 3, 24, 33, 3, 3, 13, 13, 13, 13, 14, 14, 14, 14, 20, 20, 20, 20, 1254, 13, 22, 22, 1253, 14, 22, 22, 31, 20, 22, 33, 3, 4, 4, 4, 4, 4, 4, 26, 1252, 4, 4, 31, 30, 4, 4, 21, 21, 21, 21, 28, 28, 26, 1249, 58, 26, 30, 58, 29, 21, 34, 1248, 28, 29, 76, 28, 30, 29, 31, 34, 4, 5, 5, 5, 5, 5, 5, 28, 26, 5, 5, 26, 30, 5, 5, 32, 37, 36, 28, 29, 76, 28, 30, 29, 95, 34, 95, 95, 32, 32, 35, 35, 36, 37, 78, 35, 77, 36, 1247, 5, 6, 6, 6, 6, 6, 6, 38, 77, 6, 6, 77, 38, 6, 6, 32, 32, 1242, 35, 36, 37, 78, 35, 77, 36, 48, 48, 1238, 98, 48, 48, 98, 103, 48, 77, 103, 1229, 77, 38, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 11, 11, 11, 11, 1227, 1224, 40, 40, 41, 41, 79, 40, 81, 11, 11, 40, 11, 11, 11, 82, 79, 84, 11, 40, 11, 11, 11, 80, 80, 11, 11, 11, 11, 40, 1218, 41, 79, 40, 81, 1215, 11, 40, 11, 11, 11, 82, 79, 84, 11, 40, 11, 11, 11, 80, 80, 11, 11, 11, 11, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 19, 19, 19, 19, 42, 1205, 19, 85, 105, 125, 19, 42, 125, 19, 19, 108, 19, 19, 19, 19, 109, 110, 19, 1203, 19, 19, 19, 19, 1201, 19, 19, 19, 19, 85, 105, 19, 45, 45, 45, 45, 19, 108, 19, 19, 19, 19, 109, 110, 19, 45, 19, 19, 19, 19, 39, 19, 19, 19, 19, 39, 171, 19, 42, 171, 19, 46, 46, 46, 46, 39, 111, 1199, 63, 39, 39, 523, 63, 523, 46, 47, 47, 47, 47, 63, 1195, 39, 63, 112, 51, 51, 51, 51, 47, 83, 64, 39, 111, 83, 63, 39, 39, 51, 63, 87, 1189, 64, 115, 87, 64, 63, 66, 1186, 63, 112, 66, 93, 64, 93, 93, 83, 64, 66, 116, 83, 66, 93, 51, 55, 1179, 87, 55, 64, 115, 87, 64, 1176, 66, 55, 119, 1173, 66, 65, 64, 55, 55, 55, 1172, 66, 116, 55, 66, 55, 65, 55, 65, 65, 55, 55, 55, 55, 88, 88, 88, 88, 119, 96, 1170, 65, 96, 55, 55, 55, 96, 88, 173, 55, 1168, 55, 65, 55, 65, 65, 55, 55, 55, 55, 61, 61, 135, 1167, 61, 61, 61, 61, 61, 61, 61, 67, 61, 61, 173, 67, 68, 69, 114, 86, 135, 69, 67, 114, 106, 67, 1163, 68, 69, 86, 68, 69, 68, 86, 86, 106, 174, 67, 106, 96, 61, 67, 68, 69, 114, 86, 135, 69, 67, 114, 106, 67, 136, 68, 69, 86, 68, 69, 68, 86, 86, 106, 174, 1160, 106, 61, 62, 62, 136, 1155, 62, 62, 62, 62, 62, 62, 62, 71, 62, 62, 1152, 62, 107, 130, 129, 71, 107, 129, 71, 113, 130, 71, 62, 113, 136, 62, 89, 89, 89, 89, 534, 182, 534, 71, 182, 1151, 62, 62, 107, 89, 141, 71, 107, 129, 71, 113, 130, 71, 62, 113, 1148, 62, 91, 91, 91, 91, 101, 101, 101, 101, 117, 62, 70, 118, 141, 91, 70, 118, 131, 101, 153, 118, 153, 70, 175, 117, 70, 132, 132, 118, 1146, 70, 121, 121, 121, 121, 117, 131, 70, 118, 141, 1145, 70, 118, 535, 121, 535, 118, 153, 70, 175, 117, 70, 1135, 132, 118, 133, 70, 74, 657, 133, 74, 657, 131, 122, 122, 122, 122, 124, 124, 124, 124, 133, 1127, 74, 74, 74, 122, 1124, 134, 74, 536, 74, 536, 74, 134, 133, 74, 74, 74, 74, 123, 123, 137, 137, 123, 123, 134, 133, 123, 74, 74, 74, 138, 139, 139, 74, 140, 74, 143, 74, 134, 142, 74, 74, 74, 74, 144, 138, 145, 137, 146, 176, 134, 147, 140, 142, 1121, 143, 154, 142, 139, 149, 147, 146, 149, 144, 150, 145, 1120, 151, 154, 156, 150, 138, 1118, 148, 156, 176, 155, 148, 140, 142, 152, 143, 152, 142, 151, 148, 147, 146, 149, 144, 157, 145, 148, 152, 154, 155, 150, 164, 164, 1116, 156, 164, 164, 148, 177, 164, 178, 157, 152, 1112, 151, 148, 161, 161, 161, 161, 1110, 1109, 148, 152, 172, 155, 163, 163, 163, 163, 165, 165, 165, 165, 177, 172, 178, 157, 172, 163, 179, 180, 1097, 165, 166, 166, 166, 166, 181, 184, 172, 185, 201, 1090, 202, 203, 180, 166, 204, 186, 184, 172, 185, 184, 172, 185, 179, 180, 165, 185, 186, 1084, 1072, 186, 181, 184, 206, 185, 201, 187, 202, 203, 180, 207, 204, 186, 184, 188, 185, 184, 187, 185, 189, 187, 187, 185, 186, 190, 188, 186, 208, 188, 206, 189, 188, 187, 189, 1069, 190, 207, 538, 190, 538, 188, 190, 208, 187, 192, 189, 187, 187, 205, 191, 190, 188, 205, 208, 188, 192, 189, 188, 192, 189, 191, 190, 192, 191, 190, 193, 194, 190, 208, 194, 192, 1066, 191, 193, 205, 191, 193, 194, 205, 193, 194, 192, 197, 195, 192, 195, 191, 1064, 192, 191, 200, 193, 194, 197, 195, 194, 197, 195, 191, 193, 197, 200, 193, 194, 200, 193, 194, 210, 197, 195, 545, 195, 545, 209, 211, 212, 200, 209, 1062, 197, 195, 214, 197, 195, 196, 196, 197, 200, 215, 216, 200, 217, 213, 210, 218, 196, 196, 219, 196, 209, 211, 212, 220, 209, 213, 221, 222, 214, 223, 225, 196, 196, 226, 227, 215, 216, 229, 217, 213, 224, 218, 196, 196, 219, 196, 228, 230, 224, 220, 1059, 213, 221, 222, 1058, 223, 225, 228, 724, 226, 227, 724, 237, 229, 237, 237, 224, 231, 231, 231, 231, 241, 228, 230, 224, 234, 234, 234, 234, 236, 231, 236, 236, 228, 238, 242, 243, 238, 234, 236, 244, 238, 245, 246, 247, 248, 249, 241, 250, 251, 252, 253, 244, 254, 245, 255, 256, 552, 258, 552, 260, 242, 243, 261, 262, 1053, 244, 263, 245, 246, 247, 248, 249, 264, 250, 251, 252, 253, 244, 254, 245, 255, 256, 257, 258, 259, 260, 267, 268, 261, 262, 257, 269, 263, 238, 267, 259, 269, 257, 264, 265, 265, 265, 265, 272, 271, 273, 270, 268, 257, 271, 259, 276, 274, 277, 273, 274, 257, 278, 1050, 276, 267, 259, 269, 257, 270, 275, 277, 272, 275, 280, 279, 282, 283, 268, 281, 271, 278, 279, 284, 285, 273, 274, 282, 288, 286, 276, 284, 285, 280, 286, 270, 283, 277, 272, 275, 287, 281, 287, 289, 290, 290, 291, 278, 279, 288, 292, 293, 289, 282, 295, 1049, 1045, 284, 285, 280, 286, 294, 283, 643, 296, 643, 291, 281, 287, 292, 293, 290, 295, 297, 298, 288, 294, 296, 289, 298, 301, 299, 300, 308, 309, 297, 310, 300, 305, 305, 305, 305, 291, 299, 301, 292, 293, 311, 295, 312, 313, 314, 294, 296, 315, 298, 316, 317, 318, 308, 309, 297, 310, 300, 320, 317, 654, 319, 654, 299, 301, 646, 646, 311, 646, 312, 313, 314, 319, 1042, 315, 321, 316, 317, 318, 321, 322, 323, 338, 339, 320, 317, 321, 319, 324, 321, 324, 322, 323, 340, 322, 323, 1038, 322, 319, 324, 1033, 321, 324, 341, 323, 321, 322, 323, 338, 339, 1028, 1021, 321, 326, 324, 321, 324, 322, 323, 340, 322, 323, 325, 322, 326, 324, 327, 326, 324, 341, 323, 326, 1019, 325, 325, 328, 325, 327, 992, 326, 327, 342, 328, 672, 329, 672, 328, 327, 325, 328, 326, 987, 327, 326, 674, 329, 674, 326, 329, 325, 325, 328, 325, 327, 329, 331, 327, 342, 328, 330, 329, 332, 328, 327, 343, 328, 331, 330, 986, 331, 330, 329, 332, 330, 329, 332, 985, 333, 344, 332, 329, 331, 983, 767, 345, 330, 767, 332, 333, 346, 343, 333, 331, 330, 333, 331, 330, 334, 332, 330, 337, 332, 335, 333, 344, 332, 347, 348, 334, 334, 345, 334, 337, 335, 333, 346, 335, 333, 349, 350, 333, 351, 352, 334, 353, 354, 337, 355, 335, 356, 357, 358, 347, 348, 334, 334, 359, 334, 337, 335, 360, 361, 335, 362, 349, 350, 363, 351, 352, 366, 353, 354, 367, 355, 368, 356, 357, 358, 369, 370, 371, 372, 359, 373, 374, 375, 360, 361, 376, 362, 377, 378, 363, 379, 380, 366, 381, 382, 367, 383, 368, 384, 385, 386, 369, 370, 371, 372, 387, 373, 374, 375, 388, 389, 376, 390, 377, 378, 391, 379, 380, 392, 381, 382, 393, 383, 394, 384, 385, 386, 396, 399, 406, 397, 387, 398, 404, 402, 388, 389, 401, 390, 398, 403, 391, 396, 397, 392, 406, 399, 393, 402, 394, 401, 405, 405, 404, 408, 982, 407, 403, 410, 408, 409, 409, 414, 417, 417, 398, 981, 418, 396, 397, 407, 406, 399, 410, 402, 416, 401, 414, 405, 404, 416, 419, 421, 403, 418, 408, 430, 409, 420, 424, 417, 421, 427, 423, 424, 430, 407, 425, 425, 410, 419, 432, 433, 414, 426, 420, 416, 423, 428, 426, 418, 427, 434, 428, 435, 436, 437, 421, 438, 439, 424, 430, 440, 441, 425, 442, 419, 432, 433, 443, 444, 420, 445, 423, 446, 426, 462, 427, 434, 428, 435, 436, 437, 779, 438, 439, 779, 980, 440, 441, 463, 442, 448, 447, 450, 443, 444, 464, 445, 447, 446, 449, 462, 448, 447, 450, 448, 447, 450, 448, 450, 979, 449, 449, 465, 449, 463, 977, 448, 447, 450, 466, 764, 464, 764, 447, 786, 449, 786, 448, 447, 450, 448, 447, 450, 448, 450, 451, 449, 449, 465, 449, 452, 453, 454, 467, 469, 466, 451, 975, 455, 451, 451, 452, 453, 454, 452, 453, 454, 974, 966, 455, 470, 451, 455, 795, 471, 795, 452, 453, 454, 467, 469, 965, 451, 456, 455, 451, 451, 452, 453, 454, 452, 453, 454, 457, 456, 455, 470, 456, 455, 456, 471, 459, 458, 460, 457, 459, 472, 457, 473, 456, 458, 457, 459, 458, 460, 459, 458, 460, 962, 457, 456, 474, 959, 456, 475, 456, 478, 459, 458, 460, 457, 459, 472, 457, 473, 479, 458, 457, 459, 458, 460, 459, 458, 460, 461, 480, 481, 474, 461, 482, 475, 484, 478, 485, 486, 461, 487, 488, 461, 489, 490, 479, 491, 493, 494, 495, 496, 497, 498, 499, 461, 480, 481, 500, 461, 482, 503, 484, 505, 485, 486, 461, 487, 488, 461, 489, 490, 506, 491, 493, 494, 495, 496, 497, 498, 499, 507, 508, 509, 500, 510, 511, 503, 512, 505, 513, 514, 515, 517, 520, 521, 519, 525, 506, 520, 524, 903, 522, 903, 527, 524, 525, 507, 508, 509, 521, 510, 511, 519, 512, 522, 513, 514, 515, 517, 526, 522, 527, 529, 528, 520, 532, 533, 530, 526, 537, 524, 525, 539, 537, 529, 521, 540, 543, 519, 532, 522, 528, 530, 533, 554, 541, 522, 527, 542, 539, 541, 543, 553, 542, 526, 540, 544, 546, 547, 537, 529, 547, 550, 548, 546, 532, 553, 528, 530, 533, 554, 544, 555, 556, 557, 539, 541, 543, 558, 542, 548, 540, 559, 560, 561, 562, 550, 547, 563, 564, 546, 565, 553, 566, 567, 568, 586, 544, 555, 556, 557, 958, 569, 587, 558, 588, 548, 591, 559, 560, 561, 562, 550, 569, 563, 564, 569, 565, 947, 566, 567, 568, 586, 571, 573, 945, 592, 571, 569, 587, 906, 588, 906, 591, 571, 573, 944, 571, 573, 569, 572, 593, 569, 570, 570, 908, 594, 908, 572, 571, 573, 572, 592, 571, 572, 570, 570, 575, 570, 596, 571, 573, 570, 571, 573, 574, 572, 593, 575, 597, 570, 575, 594, 575, 572, 942, 574, 572, 574, 574, 572, 570, 570, 575, 570, 596, 940, 576, 570, 577, 576, 574, 600, 782, 575, 597, 782, 575, 576, 575, 577, 576, 574, 577, 574, 574, 578, 577, 579, 601, 578, 602, 579, 576, 580, 577, 576, 578, 600, 579, 578, 603, 579, 604, 576, 580, 577, 576, 580, 577, 931, 929, 578, 577, 579, 601, 578, 602, 579, 581, 580, 581, 928, 578, 582, 579, 578, 603, 579, 604, 581, 580, 926, 581, 580, 582, 583, 583, 582, 589, 582, 606, 607, 608, 609, 581, 611, 581, 583, 612, 582, 583, 589, 925, 615, 616, 581, 617, 589, 581, 613, 582, 618, 583, 582, 619, 582, 606, 607, 608, 609, 620, 611, 613, 583, 612, 621, 583, 589, 613, 615, 616, 622, 617, 589, 625, 627, 628, 618, 629, 630, 619, 631, 632, 633, 634, 636, 620, 639, 613, 641, 909, 621, 909, 644, 613, 642, 647, 622, 644, 645, 625, 627, 628, 641, 629, 630, 648, 631, 632, 633, 634, 636, 642, 639, 649, 647, 645, 650, 651, 655, 653, 652, 655, 915, 644, 648, 652, 651, 656, 641, 649, 907, 656, 659, 659, 650, 659, 800, 642, 653, 800, 647, 645, 658, 658, 658, 658, 900, 655, 662, 663, 648, 652, 651, 662, 663, 649, 664, 656, 665, 664, 650, 667, 665, 666, 653, 661, 661, 661, 661, 668, 668, 668, 668, 670, 671, 667, 676, 673, 677, 662, 663, 666, 679, 676, 680, 664, 678, 681, 665, 682, 683, 684, 670, 673, 675, 675, 675, 675, 671, 678, 685, 667, 686, 687, 677, 678, 688, 666, 679, 676, 680, 689, 690, 681, 899, 682, 683, 684, 670, 673, 910, 898, 910, 711, 671, 678, 685, 713, 686, 687, 692, 678, 688, 889, 696, 714, 694, 689, 690, 715, 694, 692, 717, 695, 692, 696, 692, 694, 696, 711, 694, 887, 696, 713, 695, 819, 692, 695, 819, 695, 696, 714, 694, 885, 883, 715, 694, 692, 717, 695, 692, 696, 692, 694, 696, 697, 694, 698, 696, 718, 695, 698, 699, 695, 699, 695, 697, 719, 698, 697, 697, 698, 720, 699, 722, 700, 699, 723, 700, 716, 716, 697, 716, 698, 882, 718, 700, 698, 699, 700, 699, 881, 697, 719, 698, 697, 697, 698, 720, 699, 722, 700, 699, 723, 700, 701, 701, 702, 703, 727, 703, 702, 700, 704, 728, 700, 704, 701, 702, 703, 701, 702, 703, 879, 704, 725, 725, 704, 725, 729, 877, 730, 701, 702, 703, 727, 703, 702, 705, 704, 728, 875, 704, 701, 702, 703, 701, 702, 703, 705, 704, 705, 705, 704, 706, 729, 707, 730, 731, 731, 731, 731, 733, 734, 705, 706, 735, 707, 706, 736, 707, 737, 706, 739, 740, 705, 742, 705, 705, 707, 706, 743, 707, 741, 741, 744, 741, 745, 733, 734, 746, 706, 735, 707, 706, 736, 707, 737, 706, 739, 740, 747, 742, 748, 749, 707, 752, 743, 753, 750, 750, 744, 750, 745, 754, 755, 746, 756, 757, 758, 759, 761, 763, 765, 766, 770, 770, 747, 770, 748, 749, 768, 752, 766, 753, 913, 774, 913, 803, 776, 754, 755, 765, 756, 757, 758, 759, 761, 763, 769, 768, 777, 772, 773, 769, 774, 775, 776, 778, 766, 772, 780, 773, 778, 803, 775, 780, 804, 765, 777, 783, 783, 783, 783, 784, 784, 768, 784, 788, 861, 769, 774, 788, 776, 790, 796, 772, 834, 773, 778, 834, 775, 780, 804, 796, 777, 787, 787, 787, 787, 805, 806, 807, 790, 794, 794, 794, 794, 788, 798, 798, 798, 798, 799, 801, 801, 801, 801, 799, 808, 796, 809, 810, 812, 813, 814, 805, 806, 807, 790, 815, 816, 817, 835, 835, 859, 835, 836, 836, 917, 836, 917, 837, 848, 799, 808, 848, 809, 810, 812, 813, 814, 818, 820, 839, 840, 815, 816, 817, 841, 818, 821, 822, 818, 820, 821, 818, 820, 837, 822, 857, 820, 821, 822, 856, 821, 822, 844, 818, 820, 839, 840, 989, 845, 989, 841, 818, 821, 822, 818, 820, 821, 818, 820, 823, 822, 824, 820, 821, 822, 825, 821, 822, 844, 825, 823, 854, 824, 823, 845, 824, 825, 823, 824, 825, 853, 850, 826, 826, 846, 823, 843, 824, 847, 842, 842, 825, 842, 838, 826, 825, 823, 826, 824, 823, 827, 824, 825, 823, 824, 825, 828, 828, 829, 826, 846, 849, 830, 830, 847, 855, 831, 831, 828, 829, 826, 828, 829, 826, 830, 811, 829, 830, 831, 851, 802, 831, 851, 828, 829, 852, 852, 849, 852, 830, 860, 855, 862, 831, 828, 829, 797, 828, 829, 863, 830, 832, 829, 830, 831, 833, 833, 831, 864, 832, 865, 866, 832, 868, 869, 832, 860, 833, 862, 870, 833, 858, 858, 858, 858, 863, 871, 832, 867, 867, 872, 867, 833, 873, 864, 832, 865, 866, 832, 868, 869, 832, 874, 833, 878, 870, 833, 876, 876, 880, 876, 884, 871, 886, 888, 890, 872, 888, 891, 873, 890, 891, 893, 892, 896, 894, 895, 893, 874, 897, 878, 892, 793, 896, 902, 880, 792, 884, 905, 886, 894, 895, 901, 912, 897, 901, 890, 902, 904, 916, 905, 904, 916, 893, 791, 918, 919, 892, 912, 896, 911, 911, 911, 911, 920, 921, 894, 895, 922, 923, 897, 924, 927, 902, 930, 789, 905, 914, 914, 914, 914, 918, 919, 933, 912, 932, 933, 785, 781, 932, 920, 921, 951, 953, 922, 923, 932, 924, 927, 932, 930, 941, 934, 935, 941, 948, 771, 935, 948, 934, 936, 932, 937, 934, 935, 932, 934, 935, 951, 953, 937, 936, 932, 937, 936, 932, 937, 952, 934, 935, 952, 949, 949, 935, 949, 934, 936, 762, 937, 934, 935, 760, 934, 935, 938, 938, 937, 936, 954, 937, 936, 939, 937, 946, 943, 943, 938, 950, 950, 938, 950, 955, 939, 939, 946, 939, 943, 946, 956, 943, 957, 938, 960, 961, 954, 960, 751, 939, 964, 946, 967, 943, 938, 968, 969, 938, 970, 955, 939, 939, 946, 939, 943, 946, 956, 943, 957, 971, 972, 961, 963, 963, 963, 963, 964, 973, 967, 976, 978, 968, 969, 984, 970, 988, 990, 991, 988, 993, 1014, 738, 995, 993, 994, 971, 972, 996, 997, 998, 997, 998, 991, 973, 990, 976, 978, 995, 994, 984, 999, 996, 999, 1000, 1001, 1003, 1014, 1001, 1000, 993, 1002, 732, 1004, 1002, 1003, 1004, 1015, 1005, 991, 1005, 990, 726, 1006, 995, 994, 1006, 1016, 996, 1007, 1007, 1007, 1007, 1008, 1010, 1000, 1008, 1009, 1009, 1009, 1009, 1003, 1011, 1015, 1012, 1011, 1012, 1017, 1010, 1013, 1013, 1013, 1013, 1016, 1018, 1020, 1022, 1024, 1023, 1030, 1031, 721, 1030, 1031, 1025, 1025, 712, 1032, 1024, 1023, 1032, 1024, 1023, 1017, 1010, 1023, 1025, 710, 1027, 1025, 1018, 1020, 1022, 1024, 1023, 1026, 709, 1034, 1026, 1027, 1034, 1025, 1027, 708, 1024, 1023, 1026, 1024, 1023, 1026, 1035, 1023, 1025, 1035, 1027, 1025, 1029, 1040, 1041, 1037, 1029, 1026, 1037, 1036, 1026, 1027, 1039, 1029, 1027, 1039, 1029, 1043, 1026, 1044, 1036, 1026, 1036, 1036, 1046, 1068, 693, 1068, 1029, 1040, 1041, 1048, 1029, 1051, 1052, 1036, 1054, 1055, 1056, 1029, 1057, 1060, 1029, 1043, 1061, 1044, 1036, 1063, 1036, 1036, 1046, 1047, 1047, 1047, 1047, 1065, 1070, 1048, 1065, 1051, 1052, 1067, 1054, 1055, 1056, 1067, 1057, 1060, 1070, 1071, 1061, 1076, 691, 1063, 1073, 1073, 1073, 1073, 1074, 1074, 1074, 1074, 1078, 1071, 1075, 1075, 1075, 1075, 1088, 1077, 1076, 1067, 1077, 1079, 1070, 1080, 1079, 1089, 1080, 1081, 1078, 1091, 1081, 1082, 1082, 1082, 1082, 1083, 1085, 1071, 1083, 1085, 1086, 1086, 1088, 1086, 1076, 1087, 1087, 1087, 1087, 1092, 1093, 1089, 1094, 1099, 1078, 1091, 1095, 1095, 1096, 669, 1111, 1096, 1098, 1098, 1099, 660, 1099, 1099, 1095, 1096, 1102, 1095, 1096, 1102, 1098, 1092, 1093, 1098, 1094, 1099, 640, 638, 1103, 1095, 1096, 1103, 1111, 1096, 1104, 1098, 1099, 1104, 1099, 1099, 1095, 1096, 1113, 1095, 1096, 1101, 1098, 1115, 1119, 1098, 1100, 1100, 1100, 1100, 1105, 1106, 1101, 1105, 1106, 1101, 1107, 1107, 1108, 1101, 1122, 1108, 1117, 1117, 1113, 1117, 1123, 1101, 1107, 1115, 1119, 1107, 1114, 1114, 1114, 1114, 1125, 1126, 1101, 1128, 1128, 1101, 1128, 1107, 1129, 1101, 1122, 1129, 1130, 1131, 1130, 637, 1123, 1132, 1107, 1134, 1132, 1107, 1133, 1136, 1133, 1136, 1125, 1126, 1134, 1141, 1147, 1131, 1137, 1137, 1137, 1137, 1138, 1138, 1138, 1138, 1139, 1139, 1139, 1139, 1140, 1143, 1142, 1143, 1141, 1142, 1144, 1144, 1140, 1144, 1134, 1149, 1147, 1131, 1150, 1153, 1154, 1159, 635, 1154, 1159, 1156, 1156, 626, 1158, 1162, 1153, 1165, 1169, 1153, 1141, 1158, 1153, 1156, 1140, 1158, 1156, 1149, 1158, 624, 1150, 1153, 1157, 1157, 1157, 1157, 1161, 1161, 1156, 1161, 1158, 1162, 1153, 1165, 1169, 1153, 1171, 1158, 1153, 1156, 1174, 1158, 1156, 1175, 1158, 1164, 1164, 1164, 1164, 1166, 1166, 623, 1166, 1177, 1177, 1178, 1177, 1180, 1178, 1182, 1180, 1181, 1171, 1183, 1181, 1183, 1174, 1185, 1188, 1175, 1184, 1184, 1184, 1184, 1190, 1187, 1191, 1182, 1187, 1191, 1192, 1192, 1185, 1193, 1194, 1196, 1193, 1194, 1197, 1200, 1202, 1197, 1192, 1204, 1188, 1192, 1196, 614, 610, 1196, 1190, 1198, 1198, 1182, 1198, 1209, 1206, 1192, 1185, 1206, 1207, 1196, 1207, 1216, 1208, 1200, 1202, 1208, 1192, 1204, 1214, 1192, 1196, 1214, 1209, 1196, 1210, 1210, 1210, 1210, 1211, 1211, 1211, 1211, 1212, 1213, 1223, 1213, 1212, 1216, 1217, 1219, 1225, 1217, 1219, 1220, 1220, 1220, 1220, 1221, 1209, 1222, 1221, 1226, 1222, 1228, 1228, 1228, 1228, 1231, 1221, 1233, 1223, 1221, 1212, 1241, 605, 1241, 1225, 1230, 1230, 1230, 1230, 599, 1237, 1221, 598, 1231, 1221, 1226, 1232, 1232, 1232, 1232, 1239, 1244, 1221, 1233, 1236, 1221, 1234, 1234, 1234, 1234, 1235, 1235, 1235, 1235, 595, 1236, 1237, 590, 1236, 1231, 585, 1236, 1240, 1240, 1240, 1240, 1239, 1244, 1246, 1246, 1236, 1243, 1243, 1243, 1243, 1245, 1245, 1245, 1245, 584, 1246, 1236, 551, 1246, 1236, 549, 531, 1236, 1250, 1250, 1250, 1250, 1251, 516, 1251, 1246, 1255, 1255, 1255, 1255, 1256, 1256, 1256, 1256, 504, 502, 1246, 501, 492, 1246, 1257, 1257, 1257, 1257, 1258, 1258, 1258, 1258, 1259, 1259, 1259, 1259, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1262, 1262, 1263, 483, 477, 1263, 1263, 1263, 476, 1263, 1264, 1264, 468, 1264, 429, 1264, 422, 1264, 1265, 1265, 415, 1265, 413, 1265, 412, 1265, 1266, 1266, 1266, 411, 1266, 1266, 1266, 1266, 1266, 1267, 400, 1267, 1268, 307, 266, 1268, 239, 1268, 235, 1268, 1268, 232, 198, 183, 168, 167, 160, 159, 158, 128, 127, 120, 104, 102, 90, 72, 59, 49, 43, 27, 25, 23, 17, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260 } ; /* Table of booleans, true if rule could match eol. */ static yyconst flex_int32_t yy_rule_can_match_eol[108] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, }; static yy_state_type yy_last_accepting_state; static char *yy_last_accepting_cpos; extern int scdoc_flex_debug; int scdoc_flex_debug = 0; /* The intent behind this definition is that it'll catch * any uses of REJECT which flex missed. */ #define REJECT reject_used_but_not_detected #define yymore() yymore_used_but_not_detected #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET char *scdoctext; #line 1 "SCDoc.l" #line 2 "SCDoc.l" /************************************************************************ * * Copyright 2012 Jonatan Liljedahl * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ************************************************************************/ #include #include "SCDoc.h" #include "SCDoc.tab.hpp" int scdoc_start_token = 0; //int colnum; //#define YY_USER_ACTION { scdoclloc.first_column = colnum; colnum=colnum+scdocleng; scdoclloc.last_column=colnum; if(scdoclloc.first_line!=scdoclineno) colnum=1; scdoclloc.first_line = scdoclloc.last_line = scdoclineno;} static int method_caller; #define YY_NO_UNISTD_H 1 #line 1845 "lex.scdoc.cpp" #define INITIAL 0 #define verbatim 1 #define verbatim2 2 #define metadata 3 #define eat 4 #define eat2 5 #define eat3 6 #define method 7 #ifndef YY_NO_UNISTD_H /* Special case for "unistd.h", since it is non-ANSI. We include it way * down here because we want the user's section 1 to have been scanned first. * The user has a chance to override it with an option. */ #include #endif #ifndef YY_EXTRA_TYPE #define YY_EXTRA_TYPE void * #endif static int yy_init_globals (void ); /* Accessor methods to globals. These are made visible to non-reentrant scanners for convenience. */ int scdoclex_destroy (void ); int scdocget_debug (void ); void scdocset_debug (int debug_flag ); YY_EXTRA_TYPE scdocget_extra (void ); void scdocset_extra (YY_EXTRA_TYPE user_defined ); FILE *scdocget_in (void ); void scdocset_in (FILE * in_str ); FILE *scdocget_out (void ); void scdocset_out (FILE * out_str ); int scdocget_leng (void ); char *scdocget_text (void ); int scdocget_lineno (void ); void scdocset_lineno (int line_number ); /* Macros after this point can all be overridden by user definitions in * section 1. */ #ifndef YY_SKIP_YYWRAP #ifdef __cplusplus extern "C" int scdocwrap (void ); #else extern int scdocwrap (void ); #endif #endif static void yyunput (int c,char *buf_ptr ); #ifndef yytext_ptr static void yy_flex_strncpy (char *,yyconst char *,int ); #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * ); #endif #ifndef YY_NO_INPUT #ifdef __cplusplus static int yyinput (void ); #else static int input (void ); #endif #endif /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE #ifdef __ia64__ /* On IA-64, the buffer size is 16k, not 8k */ #define YY_READ_BUF_SIZE 16384 #else #define YY_READ_BUF_SIZE 8192 #endif /* __ia64__ */ #endif /* Copy whatever the last rule matched to the standard output. */ #ifndef ECHO /* This used to be an fputs(), but since the string might contain NUL's, * we now use fwrite(). */ #define ECHO do { if (fwrite( scdoctext, scdocleng, 1, scdocout )) {} } while (0) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, * is returned in "result". */ #ifndef YY_INPUT #define YY_INPUT(buf,result,max_size) \ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ { \ int c = '*'; \ size_t n; \ for ( n = 0; n < max_size && \ (c = getc( scdocin )) != EOF && c != '\n'; ++n ) \ buf[n] = (char) c; \ if ( c == '\n' ) \ buf[n++] = (char) c; \ if ( c == EOF && ferror( scdocin ) ) \ YY_FATAL_ERROR( "input in flex scanner failed" ); \ result = n; \ } \ else \ { \ errno=0; \ while ( (result = fread(buf, 1, max_size, scdocin))==0 && ferror(scdocin)) \ { \ if( errno != EINTR) \ { \ YY_FATAL_ERROR( "input in flex scanner failed" ); \ break; \ } \ errno=0; \ clearerr(scdocin); \ } \ }\ \ #endif /* No semi-colon after return; correct usage is to write "yyterminate();" - * we don't want an extra ';' after the "return" because that will cause * some compilers to complain about unreachable statements. */ #ifndef yyterminate #define yyterminate() return YY_NULL #endif /* Number of entries by which start-condition stack grows. */ #ifndef YY_START_STACK_INCR #define YY_START_STACK_INCR 25 #endif /* Report a fatal error. */ #ifndef YY_FATAL_ERROR #define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) #endif /* end tables serialization structures and prototypes */ /* Default declaration of generated scanner - a define so the user can * easily add parameters. */ #ifndef YY_DECL #define YY_DECL_IS_OURS 1 extern int scdoclex (void); #define YY_DECL int scdoclex (void) #endif /* !YY_DECL */ /* Code executed at the beginning of each rule, after scdoctext and scdocleng * have been set up. */ #ifndef YY_USER_ACTION #define YY_USER_ACTION #endif /* Code executed at the end of each rule. */ #ifndef YY_BREAK #define YY_BREAK break; #endif #define YY_RULE_SETUP \ YY_USER_ACTION /** The main scanner function which does all the work. */ YY_DECL { register yy_state_type yy_current_state; register char *yy_cp, *yy_bp; register int yy_act; #line 45 "SCDoc.l" if (scdoc_start_token) { int t = scdoc_start_token; scdoc_start_token = 0; // colnum = 1; if(t==START_METADATA) BEGIN(eat); return t; } #line 2054 "lex.scdoc.cpp" if ( !(yy_init) ) { (yy_init) = 1; #ifdef YY_USER_INIT YY_USER_INIT; #endif if ( ! (yy_start) ) (yy_start) = 1; /* first start state */ if ( ! scdocin ) scdocin = stdin; if ( ! scdocout ) scdocout = stdout; if ( ! YY_CURRENT_BUFFER ) { scdocensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = scdoc_create_buffer(scdocin,YY_BUF_SIZE ); } scdoc_load_buffer_state( ); } while ( 1 ) /* loops until end-of-file is reached */ { yy_cp = (yy_c_buf_p); /* Support of scdoctext. */ *yy_cp = (yy_hold_char); /* yy_bp points to the position in yy_ch_buf of the start of * the current run. */ yy_bp = yy_cp; yy_current_state = (yy_start); yy_match: do { register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 1261 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; ++yy_cp; } while ( yy_current_state != 1260 ); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); yy_find_action: yy_act = yy_accept[yy_current_state]; YY_DO_BEFORE_ACTION; if ( yy_act != YY_END_OF_BUFFER && yy_rule_can_match_eol[yy_act] ) { int yyl; for ( yyl = 0; yyl < scdocleng; ++yyl ) if ( scdoctext[yyl] == '\n' ) scdoclineno++; ; } do_action: /* This label is used only to access EOF actions. */ switch ( yy_act ) { /* beginning of action switch */ case 0: /* must back up */ /* undo the effects of YY_DO_BEFORE_ACTION */ *yy_cp = (yy_hold_char); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); goto yy_find_action; case 1: YY_RULE_SETUP #line 59 "SCDoc.l" return CLASS; YY_BREAK case 2: YY_RULE_SETUP #line 60 "SCDoc.l" return TITLE; YY_BREAK case 3: YY_RULE_SETUP #line 61 "SCDoc.l" return SUMMARY; YY_BREAK case 4: YY_RULE_SETUP #line 62 "SCDoc.l" return RELATED; YY_BREAK case 5: YY_RULE_SETUP #line 63 "SCDoc.l" return CATEGORIES; YY_BREAK case 6: YY_RULE_SETUP #line 64 "SCDoc.l" return REDIRECT; YY_BREAK case 7: YY_RULE_SETUP #line 66 "SCDoc.l" return CLASSTREE; YY_BREAK case 8: YY_RULE_SETUP #line 67 "SCDoc.l" return KEYWORD; YY_BREAK case 9: YY_RULE_SETUP #line 69 "SCDoc.l" return PRIVATE; YY_BREAK case 10: YY_RULE_SETUP #line 70 "SCDoc.l" return SECTION; YY_BREAK case 11: YY_RULE_SETUP #line 71 "SCDoc.l" return SUBSECTION; YY_BREAK case 12: YY_RULE_SETUP #line 72 "SCDoc.l" return COPYMETHOD; YY_BREAK case 13: YY_RULE_SETUP #line 73 "SCDoc.l" method_caller = YY_START; BEGIN(method); return METHOD; YY_BREAK case 14: YY_RULE_SETUP #line 74 "SCDoc.l" return ARGUMENT; YY_BREAK case 15: /* rule 15 can match eol */ YY_RULE_SETUP #line 76 "SCDoc.l" return DESCRIPTION; YY_BREAK case 16: /* rule 16 can match eol */ YY_RULE_SETUP #line 77 "SCDoc.l" return CLASSMETHODS; YY_BREAK case 17: /* rule 17 can match eol */ YY_RULE_SETUP #line 78 "SCDoc.l" return INSTANCEMETHODS; YY_BREAK case 18: /* rule 18 can match eol */ YY_RULE_SETUP #line 79 "SCDoc.l" return EXAMPLES; YY_BREAK case 19: /* rule 19 can match eol */ YY_RULE_SETUP #line 81 "SCDoc.l" return RETURNS; YY_BREAK case 20: /* rule 20 can match eol */ YY_RULE_SETUP #line 82 "SCDoc.l" return DISCUSSION; YY_BREAK case 21: /* rule 21 can match eol */ YY_RULE_SETUP #line 84 "SCDoc.l" return LIST; YY_BREAK case 22: /* rule 22 can match eol */ YY_RULE_SETUP #line 85 "SCDoc.l" return TREE; YY_BREAK case 23: /* rule 23 can match eol */ YY_RULE_SETUP #line 86 "SCDoc.l" return NUMBEREDLIST; YY_BREAK case 24: /* rule 24 can match eol */ YY_RULE_SETUP #line 87 "SCDoc.l" return DEFINITIONLIST; YY_BREAK case 25: /* rule 25 can match eol */ YY_RULE_SETUP #line 88 "SCDoc.l" return TABLE; YY_BREAK case 26: /* rule 26 can match eol */ YY_RULE_SETUP #line 89 "SCDoc.l" return FOOTNOTE; YY_BREAK case 27: /* rule 27 can match eol */ YY_RULE_SETUP #line 90 "SCDoc.l" return WARNING; YY_BREAK case 28: /* rule 28 can match eol */ YY_RULE_SETUP #line 91 "SCDoc.l" return NOTE; YY_BREAK case 29: YY_RULE_SETUP #line 93 "SCDoc.l" BEGIN(verbatim); return LINK; YY_BREAK case 30: YY_RULE_SETUP #line 94 "SCDoc.l" BEGIN(verbatim); return ANCHOR; YY_BREAK case 31: YY_RULE_SETUP #line 95 "SCDoc.l" BEGIN(verbatim); return IMAGE; YY_BREAK case 32: /* rule 32 can match eol */ YY_RULE_SETUP #line 96 "SCDoc.l" BEGIN(verbatim); return SOFT; YY_BREAK case 33: /* rule 33 can match eol */ YY_RULE_SETUP #line 97 "SCDoc.l" BEGIN(verbatim); return STRONG; YY_BREAK case 34: /* rule 34 can match eol */ YY_RULE_SETUP #line 98 "SCDoc.l" BEGIN(verbatim); return EMPHASIS; YY_BREAK case 35: YY_RULE_SETUP #line 99 "SCDoc.l" BEGIN(verbatim); return CODE; YY_BREAK case 36: YY_RULE_SETUP #line 100 "SCDoc.l" BEGIN(verbatim); return TELETYPE; YY_BREAK case 37: YY_RULE_SETUP #line 101 "SCDoc.l" BEGIN(verbatim); return MATH; YY_BREAK case 38: /* rule 38 can match eol */ YY_RULE_SETUP #line 103 "SCDoc.l" BEGIN(verbatim2); return CODEBLOCK; YY_BREAK case 39: /* rule 39 can match eol */ YY_RULE_SETUP #line 104 "SCDoc.l" BEGIN(verbatim2); return TELETYPEBLOCK; YY_BREAK case 40: /* rule 40 can match eol */ YY_RULE_SETUP #line 105 "SCDoc.l" BEGIN(verbatim2); return MATHBLOCK; YY_BREAK case 41: /* rule 41 can match eol */ YY_RULE_SETUP #line 107 "SCDoc.l" BEGIN(0); return TAGSYM; YY_BREAK case 42: /* rule 42 can match eol */ YY_RULE_SETUP #line 108 "SCDoc.l" BEGIN(0); return TAGSYM; YY_BREAK case 43: /* rule 43 can match eol */ YY_RULE_SETUP #line 109 "SCDoc.l" scdoclval.str = strdup("\n::"); return TEXT; YY_BREAK case 44: /* rule 44 can match eol */ YY_RULE_SETUP #line 110 "SCDoc.l" return BARS; YY_BREAK case 45: /* rule 45 can match eol */ YY_RULE_SETUP #line 111 "SCDoc.l" return HASHES; YY_BREAK case 46: /* rule 46 can match eol */ YY_RULE_SETUP #line 113 "SCDoc.l" scdoclval.str = strdup("\n"); return TEXT; YY_BREAK case 47: /* rule 47 can match eol */ YY_RULE_SETUP #line 114 "SCDoc.l" scdoclval.str = strdup(" "); return TEXT; YY_BREAK case 48: /* rule 48 can match eol */ YY_RULE_SETUP #line 115 "SCDoc.l" return NEWLINE; YY_BREAK case 49: /* rule 49 can match eol */ YY_RULE_SETUP #line 116 "SCDoc.l" return EMPTYLINES; YY_BREAK case 50: YY_RULE_SETUP #line 118 "SCDoc.l" scdoclval.str = strdup(scdoctext); return COMMA; YY_BREAK case 51: YY_RULE_SETUP #line 120 "SCDoc.l" scdoclval.str = strdup("||"); return TEXT; YY_BREAK case 52: YY_RULE_SETUP #line 121 "SCDoc.l" scdoclval.str = strdup("##"); return TEXT; YY_BREAK case 53: YY_RULE_SETUP #line 122 "SCDoc.l" scdoclval.str = strdup("::"); return TEXT; YY_BREAK case 54: YY_RULE_SETUP #line 123 "SCDoc.l" scdoclval.str = strdup(" "); return TEXT; YY_BREAK case 55: YY_RULE_SETUP #line 124 "SCDoc.l" scdoclval.str = strdup(" "); return TEXT; YY_BREAK case 56: YY_RULE_SETUP #line 126 "SCDoc.l" /* eat this */ YY_BREAK case 57: YY_RULE_SETUP #line 128 "SCDoc.l" scdoclval.str = strdup(scdoctext); return URL; YY_BREAK case 58: YY_RULE_SETUP #line 129 "SCDoc.l" scdoclval.str = strdup(scdoctext); return METHODNAME; YY_BREAK case 59: /* rule 59 can match eol */ YY_RULE_SETUP #line 130 "SCDoc.l" scdoclval.str = strdup(scdoctext); return METHODARGS; YY_BREAK case 60: YY_RULE_SETUP #line 131 "SCDoc.l" /* eat this */ YY_BREAK case 61: /* rule 61 can match eol */ YY_RULE_SETUP #line 132 "SCDoc.l" BEGIN(method_caller); return NEWLINE; YY_BREAK case 62: YY_RULE_SETUP #line 133 "SCDoc.l" return BAD_METHODNAME; YY_BREAK case 63: #line 136 "SCDoc.l" case 64: #line 137 "SCDoc.l" case 65: #line 138 "SCDoc.l" case 66: #line 139 "SCDoc.l" case 67: YY_RULE_SETUP #line 139 "SCDoc.l" scdoclval.str = strdup(scdoctext); return TEXT; YY_BREAK case 68: YY_RULE_SETUP #line 141 "SCDoc.l" BEGIN(metadata); return CLASS; YY_BREAK case 69: YY_RULE_SETUP #line 142 "SCDoc.l" BEGIN(metadata); return TITLE; YY_BREAK case 70: YY_RULE_SETUP #line 143 "SCDoc.l" BEGIN(metadata); return SUMMARY; YY_BREAK case 71: YY_RULE_SETUP #line 144 "SCDoc.l" BEGIN(metadata); return RELATED; YY_BREAK case 72: YY_RULE_SETUP #line 145 "SCDoc.l" BEGIN(metadata); return CATEGORIES; YY_BREAK case 73: YY_RULE_SETUP #line 146 "SCDoc.l" BEGIN(metadata); return REDIRECT; YY_BREAK case 74: YY_RULE_SETUP #line 147 "SCDoc.l" BEGIN(metadata); return CLASSTREE; YY_BREAK case 75: YY_RULE_SETUP #line 148 "SCDoc.l" BEGIN(metadata); return KEYWORD; YY_BREAK case 76: YY_RULE_SETUP #line 149 "SCDoc.l" BEGIN(metadata); return PRIVATE; YY_BREAK case 77: YY_RULE_SETUP #line 150 "SCDoc.l" BEGIN(metadata); return SECTION; YY_BREAK case 78: YY_RULE_SETUP #line 151 "SCDoc.l" BEGIN(metadata); return SUBSECTION; YY_BREAK case 79: YY_RULE_SETUP #line 152 "SCDoc.l" BEGIN(metadata); return COPYMETHOD; YY_BREAK case 80: YY_RULE_SETUP #line 153 "SCDoc.l" method_caller = YY_START; BEGIN(method); return METHOD; YY_BREAK case 81: /* rule 81 can match eol */ YY_RULE_SETUP #line 154 "SCDoc.l" BEGIN(eat); return DESCRIPTION; YY_BREAK case 82: /* rule 82 can match eol */ YY_RULE_SETUP #line 155 "SCDoc.l" BEGIN(eat); return CLASSMETHODS; YY_BREAK case 83: /* rule 83 can match eol */ YY_RULE_SETUP #line 156 "SCDoc.l" BEGIN(eat); return INSTANCEMETHODS; YY_BREAK case 84: /* rule 84 can match eol */ YY_RULE_SETUP #line 157 "SCDoc.l" BEGIN(eat); return EXAMPLES; YY_BREAK case 85: /* rule 85 can match eol */ YY_RULE_SETUP #line 158 "SCDoc.l" BEGIN(eat); return NEWLINE; YY_BREAK case 86: YY_RULE_SETUP #line 159 "SCDoc.l" scdoclval.str = strdup(scdoctext); return COMMA; YY_BREAK case 87: #line 161 "SCDoc.l" case 88: #line 162 "SCDoc.l" case 89: #line 163 "SCDoc.l" case 90: YY_RULE_SETUP #line 163 "SCDoc.l" scdoclval.str = strdup(scdoctext); return TEXT; YY_BREAK case 91: YY_RULE_SETUP #line 164 "SCDoc.l" scdoclval.str = strdup("::"); return TEXT; YY_BREAK case 92: YY_RULE_SETUP #line 165 "SCDoc.l" BEGIN(eat2); YY_BREAK case 93: YY_RULE_SETUP #line 166 "SCDoc.l" BEGIN(eat2); YY_BREAK case 94: YY_RULE_SETUP #line 167 "SCDoc.l" BEGIN(eat2); YY_BREAK case 95: /* rule 95 can match eol */ YY_RULE_SETUP #line 168 "SCDoc.l" BEGIN(eat2); YY_BREAK case 96: /* rule 96 can match eol */ YY_RULE_SETUP #line 169 "SCDoc.l" BEGIN(eat2); YY_BREAK case 97: /* rule 97 can match eol */ YY_RULE_SETUP #line 170 "SCDoc.l" BEGIN(eat2); YY_BREAK case 98: YY_RULE_SETUP #line 171 "SCDoc.l" BEGIN(eat2); YY_BREAK case 99: YY_RULE_SETUP #line 172 "SCDoc.l" BEGIN(eat2); YY_BREAK case 100: YY_RULE_SETUP #line 173 "SCDoc.l" BEGIN(eat2); YY_BREAK case 101: /* rule 101 can match eol */ YY_RULE_SETUP #line 174 "SCDoc.l" BEGIN(eat3); YY_BREAK case 102: /* rule 102 can match eol */ YY_RULE_SETUP #line 175 "SCDoc.l" BEGIN(eat3); YY_BREAK case 103: /* rule 103 can match eol */ YY_RULE_SETUP #line 176 "SCDoc.l" BEGIN(eat3); YY_BREAK case 104: /* rule 104 can match eol */ YY_RULE_SETUP #line 177 "SCDoc.l" BEGIN(eat); YY_BREAK case 105: /* rule 105 can match eol */ YY_RULE_SETUP #line 178 "SCDoc.l" BEGIN(eat); YY_BREAK case 106: /* rule 106 can match eol */ YY_RULE_SETUP #line 179 "SCDoc.l" /* empty */ YY_BREAK case 107: YY_RULE_SETUP #line 180 "SCDoc.l" ECHO; YY_BREAK #line 2702 "lex.scdoc.cpp" case YY_STATE_EOF(INITIAL): case YY_STATE_EOF(verbatim): case YY_STATE_EOF(verbatim2): case YY_STATE_EOF(metadata): case YY_STATE_EOF(eat): case YY_STATE_EOF(eat2): case YY_STATE_EOF(eat3): case YY_STATE_EOF(method): yyterminate(); case YY_END_OF_BUFFER: { /* Amount of text matched not including the EOB char. */ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; /* Undo the effects of YY_DO_BEFORE_ACTION. */ *yy_cp = (yy_hold_char); YY_RESTORE_YY_MORE_OFFSET if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) { /* We're scanning a new file or input source. It's * possible that this happened because the user * just pointed scdocin at a new source and called * scdoclex(). If so, then we have to assure * consistency between YY_CURRENT_BUFFER and our * globals. Here is the right place to do so, because * this is the first action (other than possibly a * back-up) that will match for the new input source. */ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; YY_CURRENT_BUFFER_LVALUE->yy_input_file = scdocin; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; } /* Note that here we test for yy_c_buf_p "<=" to the position * of the first EOB in the buffer, since yy_c_buf_p will * already have been incremented past the NUL character * (since all states make transitions on EOB to the * end-of-buffer state). Contrast this with the test * in input(). */ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) { /* This was really a NUL. */ yy_state_type yy_next_state; (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); /* Okay, we're now positioned to make the NUL * transition. We couldn't have * yy_get_previous_state() go ahead and do it * for us because it doesn't know how to deal * with the possibility of jamming (and we don't * want to build jamming into it because then it * will run more slowly). */ yy_next_state = yy_try_NUL_trans( yy_current_state ); yy_bp = (yytext_ptr) + YY_MORE_ADJ; if ( yy_next_state ) { /* Consume the NUL. */ yy_cp = ++(yy_c_buf_p); yy_current_state = yy_next_state; goto yy_match; } else { yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); goto yy_find_action; } } else switch ( yy_get_next_buffer( ) ) { case EOB_ACT_END_OF_FILE: { (yy_did_buffer_switch_on_eof) = 0; if ( scdocwrap( ) ) { /* Note: because we've taken care in * yy_get_next_buffer() to have set up * scdoctext, we can now set up * yy_c_buf_p so that if some total * hoser (like flex itself) wants to * call the scanner after we return the * YY_NULL, it'll still work - another * YY_NULL will get returned. */ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; yy_act = YY_STATE_EOF(YY_START); goto do_action; } else { if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; } break; } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_match; case EOB_ACT_LAST_MATCH: (yy_c_buf_p) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_find_action; } break; } default: YY_FATAL_ERROR( "fatal flex scanner internal error--no action found" ); } /* end of action switch */ } /* end of scanning one token */ } /* end of scdoclex */ /* yy_get_next_buffer - try to read in a new buffer * * Returns a code representing an action: * EOB_ACT_LAST_MATCH - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position * EOB_ACT_END_OF_FILE - end of file */ static int yy_get_next_buffer (void) { register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; register char *source = (yytext_ptr); register int number_to_move, i; int ret_val; if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) YY_FATAL_ERROR( "fatal flex scanner internal error--end of buffer missed" ); if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) { /* Don't try to fill the buffer, so this is an EOF. */ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) { /* We matched a single character, the EOB, so * treat this as a final EOF. */ return EOB_ACT_END_OF_FILE; } else { /* We matched some text prior to the EOB, first * process it. */ return EOB_ACT_LAST_MATCH; } } /* Try to read more data. */ /* First move last chars to start of buffer. */ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) /* don't do the read, it's not guaranteed to return an EOF, * just force an EOF */ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; else { int num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; while ( num_to_read <= 0 ) { /* Not enough room in the buffer - grow it. */ /* just a shorter name for the current buffer */ YY_BUFFER_STATE b = YY_CURRENT_BUFFER; int yy_c_buf_p_offset = (int) ((yy_c_buf_p) - b->yy_ch_buf); if ( b->yy_is_our_buffer ) { int new_size = b->yy_buf_size * 2; if ( new_size <= 0 ) b->yy_buf_size += b->yy_buf_size / 8; else b->yy_buf_size *= 2; b->yy_ch_buf = (char *) /* Include room in for 2 EOB chars. */ scdocrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); } else /* Can't grow it, we don't own it. */ b->yy_ch_buf = 0; if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "fatal error - scanner input buffer overflow" ); (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; } if ( num_to_read > YY_READ_BUF_SIZE ) num_to_read = YY_READ_BUF_SIZE; /* Read in more data. */ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), (yy_n_chars), (size_t) num_to_read ); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } if ( (yy_n_chars) == 0 ) { if ( number_to_move == YY_MORE_ADJ ) { ret_val = EOB_ACT_END_OF_FILE; scdocrestart(scdocin ); } else { ret_val = EOB_ACT_LAST_MATCH; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_EOF_PENDING; } } else ret_val = EOB_ACT_CONTINUE_SCAN; if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { /* Extend the array by 50%, plus the number we really need. */ yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) scdocrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); } (yy_n_chars) += number_to_move; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; return ret_val; } /* yy_get_previous_state - get the state just before the EOB char was reached */ static yy_state_type yy_get_previous_state (void) { register yy_state_type yy_current_state; register char *yy_cp; yy_current_state = (yy_start); for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) { register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 1261 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; } return yy_current_state; } /* yy_try_NUL_trans - try to make a transition on the NUL character * * synopsis * next_state = yy_try_NUL_trans( current_state ); */ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) { register int yy_is_jam; register char *yy_cp = (yy_c_buf_p); register YY_CHAR yy_c = 1; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 1261 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; yy_is_jam = (yy_current_state == 1260); return yy_is_jam ? 0 : yy_current_state; } static void yyunput (int c, register char * yy_bp ) { register char *yy_cp; yy_cp = (yy_c_buf_p); /* undo effects of setting up scdoctext */ *yy_cp = (yy_hold_char); if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) { /* need to shift things up to make room */ /* +2 for EOB chars. */ register int number_to_move = (yy_n_chars) + 2; register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; register char *source = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) *--dest = *--source; yy_cp += (int) (dest - source); yy_bp += (int) (dest - source); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) YY_FATAL_ERROR( "flex scanner push-back overflow" ); } *--yy_cp = (char) c; if ( c == '\n' ){ --scdoclineno; } (yytext_ptr) = yy_bp; (yy_hold_char) = *yy_cp; (yy_c_buf_p) = yy_cp; } #ifndef YY_NO_INPUT #ifdef __cplusplus static int yyinput (void) #else static int input (void) #endif { int c; *(yy_c_buf_p) = (yy_hold_char); if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) { /* yy_c_buf_p now points to the character we want to return. * If this occurs *before* the EOB characters, then it's a * valid NUL; if not, then we've hit the end of the buffer. */ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) /* This was really a NUL. */ *(yy_c_buf_p) = '\0'; else { /* need more input */ int offset = (yy_c_buf_p) - (yytext_ptr); ++(yy_c_buf_p); switch ( yy_get_next_buffer( ) ) { case EOB_ACT_LAST_MATCH: /* This happens because yy_g_n_b() * sees that we've accumulated a * token and flags that we need to * try matching the token before * proceeding. But for input(), * there's no matching to consider. * So convert the EOB_ACT_LAST_MATCH * to EOB_ACT_END_OF_FILE. */ /* Reset buffer status. */ scdocrestart(scdocin ); /*FALLTHROUGH*/ case EOB_ACT_END_OF_FILE: { if ( scdocwrap( ) ) return EOF; if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; #ifdef __cplusplus return yyinput(); #else return input(); #endif } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + offset; break; } } } c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ *(yy_c_buf_p) = '\0'; /* preserve scdoctext */ (yy_hold_char) = *++(yy_c_buf_p); if ( c == '\n' ) scdoclineno++; ; return c; } #endif /* ifndef YY_NO_INPUT */ /** Immediately switch to a different input stream. * @param input_file A readable stream. * * @note This function does not reset the start condition to @c INITIAL . */ void scdocrestart (FILE * input_file ) { if ( ! YY_CURRENT_BUFFER ){ scdocensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = scdoc_create_buffer(scdocin,YY_BUF_SIZE ); } scdoc_init_buffer(YY_CURRENT_BUFFER,input_file ); scdoc_load_buffer_state( ); } /** Switch to a different input buffer. * @param new_buffer The new input buffer. * */ void scdoc_switch_to_buffer (YY_BUFFER_STATE new_buffer ) { /* TODO. We should be able to replace this entire function body * with * scdocpop_buffer_state(); * scdocpush_buffer_state(new_buffer); */ scdocensure_buffer_stack (); if ( YY_CURRENT_BUFFER == new_buffer ) return; if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } YY_CURRENT_BUFFER_LVALUE = new_buffer; scdoc_load_buffer_state( ); /* We don't actually know whether we did this switch during * EOF (scdocwrap()) processing, but the only time this flag * is looked at is after scdocwrap() is called, so it's safe * to go ahead and always set it. */ (yy_did_buffer_switch_on_eof) = 1; } static void scdoc_load_buffer_state (void) { (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; scdocin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; (yy_hold_char) = *(yy_c_buf_p); } /** Allocate and initialize an input buffer state. * @param file A readable stream. * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. * * @return the allocated buffer state. */ YY_BUFFER_STATE scdoc_create_buffer (FILE * file, int size ) { YY_BUFFER_STATE b; b = (YY_BUFFER_STATE) scdocalloc(sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in scdoc_create_buffer()" ); b->yy_buf_size = size; /* yy_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ b->yy_ch_buf = (char *) scdocalloc(b->yy_buf_size + 2 ); if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in scdoc_create_buffer()" ); b->yy_is_our_buffer = 1; scdoc_init_buffer(b,file ); return b; } /** Destroy the buffer. * @param b a buffer created with scdoc_create_buffer() * */ void scdoc_delete_buffer (YY_BUFFER_STATE b ) { if ( ! b ) return; if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; if ( b->yy_is_our_buffer ) scdocfree((void *) b->yy_ch_buf ); scdocfree((void *) b ); } /* Initializes or reinitializes a buffer. * This function is sometimes called more than once on the same buffer, * such as during a scdocrestart() or at EOF. */ static void scdoc_init_buffer (YY_BUFFER_STATE b, FILE * file ) { int oerrno = errno; scdoc_flush_buffer(b ); b->yy_input_file = file; b->yy_fill_buffer = 1; /* If b is the current buffer, then scdoc_init_buffer was _probably_ * called from scdocrestart() or through yy_get_next_buffer. * In that case, we don't want to reset the lineno or column. */ if (b != YY_CURRENT_BUFFER){ b->yy_bs_lineno = 1; b->yy_bs_column = 0; } b->yy_is_interactive = 0; errno = oerrno; } /** Discard all buffered characters. On the next scan, YY_INPUT will be called. * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. * */ void scdoc_flush_buffer (YY_BUFFER_STATE b ) { if ( ! b ) return; b->yy_n_chars = 0; /* We always need two end-of-buffer characters. The first causes * a transition to the end-of-buffer state. The second causes * a jam in that state. */ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; b->yy_buf_pos = &b->yy_ch_buf[0]; b->yy_at_bol = 1; b->yy_buffer_status = YY_BUFFER_NEW; if ( b == YY_CURRENT_BUFFER ) scdoc_load_buffer_state( ); } /** Pushes the new state onto the stack. The new state becomes * the current state. This function will allocate the stack * if necessary. * @param new_buffer The new state. * */ void scdocpush_buffer_state (YY_BUFFER_STATE new_buffer ) { if (new_buffer == NULL) return; scdocensure_buffer_stack(); /* This block is copied from scdoc_switch_to_buffer. */ if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } /* Only push if top exists. Otherwise, replace top. */ if (YY_CURRENT_BUFFER) (yy_buffer_stack_top)++; YY_CURRENT_BUFFER_LVALUE = new_buffer; /* copied from scdoc_switch_to_buffer. */ scdoc_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } /** Removes and deletes the top of the stack, if present. * The next element becomes the new top. * */ void scdocpop_buffer_state (void) { if (!YY_CURRENT_BUFFER) return; scdoc_delete_buffer(YY_CURRENT_BUFFER ); YY_CURRENT_BUFFER_LVALUE = NULL; if ((yy_buffer_stack_top) > 0) --(yy_buffer_stack_top); if (YY_CURRENT_BUFFER) { scdoc_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } } /* Allocates the stack if it does not exist. * Guarantees space for at least one push. */ static void scdocensure_buffer_stack (void) { int num_to_alloc; if (!(yy_buffer_stack)) { /* First allocation is just for 2 elements, since we don't know if this * scanner will even need a stack. We use 2 instead of 1 to avoid an * immediate realloc on the next call. */ num_to_alloc = 1; (yy_buffer_stack) = (struct yy_buffer_state**)scdocalloc (num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in scdocensure_buffer_stack()" ); memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; (yy_buffer_stack_top) = 0; return; } if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ /* Increase the buffer to prepare for a possible push. */ int grow_size = 8 /* arbitrary grow size */; num_to_alloc = (yy_buffer_stack_max) + grow_size; (yy_buffer_stack) = (struct yy_buffer_state**)scdocrealloc ((yy_buffer_stack), num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in scdocensure_buffer_stack()" ); /* zero only the new slots.*/ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; } } /** Setup the input buffer state to scan directly from a user-specified character buffer. * @param base the character buffer * @param size the size in bytes of the character buffer * * @return the newly allocated buffer state object. */ YY_BUFFER_STATE scdoc_scan_buffer (char * base, yy_size_t size ) { YY_BUFFER_STATE b; if ( size < 2 || base[size-2] != YY_END_OF_BUFFER_CHAR || base[size-1] != YY_END_OF_BUFFER_CHAR ) /* They forgot to leave room for the EOB's. */ return 0; b = (YY_BUFFER_STATE) scdocalloc(sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in scdoc_scan_buffer()" ); b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ b->yy_buf_pos = b->yy_ch_buf = base; b->yy_is_our_buffer = 0; b->yy_input_file = 0; b->yy_n_chars = b->yy_buf_size; b->yy_is_interactive = 0; b->yy_at_bol = 1; b->yy_fill_buffer = 0; b->yy_buffer_status = YY_BUFFER_NEW; scdoc_switch_to_buffer(b ); return b; } /** Setup the input buffer state to scan a string. The next call to scdoclex() will * scan from a @e copy of @a str. * @param yystr a NUL-terminated string to scan * * @return the newly allocated buffer state object. * @note If you want to scan bytes that may contain NUL values, then use * scdoc_scan_bytes() instead. */ YY_BUFFER_STATE scdoc_scan_string (yyconst char * yystr ) { return scdoc_scan_bytes(yystr,strlen(yystr) ); } /** Setup the input buffer state to scan the given bytes. The next call to scdoclex() will * scan from a @e copy of @a bytes. * @param yybytes the byte buffer to scan * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes. * * @return the newly allocated buffer state object. */ YY_BUFFER_STATE scdoc_scan_bytes (yyconst char * yybytes, int _yybytes_len ) { YY_BUFFER_STATE b; char *buf; yy_size_t n; int i; /* Get memory for full buffer, including space for trailing EOB's. */ n = _yybytes_len + 2; buf = (char *) scdocalloc(n ); if ( ! buf ) YY_FATAL_ERROR( "out of dynamic memory in scdoc_scan_bytes()" ); for ( i = 0; i < _yybytes_len; ++i ) buf[i] = yybytes[i]; buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; b = scdoc_scan_buffer(buf,n ); if ( ! b ) YY_FATAL_ERROR( "bad buffer in scdoc_scan_bytes()" ); /* It's okay to grow etc. this buffer, and we should throw it * away when we're done. */ b->yy_is_our_buffer = 1; return b; } #ifndef YY_EXIT_FAILURE #define YY_EXIT_FAILURE 2 #endif static void yy_fatal_error (yyconst char* msg ) { (void) fprintf( stderr, "%s\n", msg ); exit( YY_EXIT_FAILURE ); } /* Redefine yyless() so it works in section 3 code. */ #undef yyless #define yyless(n) \ do \ { \ /* Undo effects of setting up scdoctext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ scdoctext[scdocleng] = (yy_hold_char); \ (yy_c_buf_p) = scdoctext + yyless_macro_arg; \ (yy_hold_char) = *(yy_c_buf_p); \ *(yy_c_buf_p) = '\0'; \ scdocleng = yyless_macro_arg; \ } \ while ( 0 ) /* Accessor methods (get/set functions) to struct members. */ /** Get the current line number. * */ int scdocget_lineno (void) { return scdoclineno; } /** Get the input stream. * */ FILE *scdocget_in (void) { return scdocin; } /** Get the output stream. * */ FILE *scdocget_out (void) { return scdocout; } /** Get the length of the current token. * */ int scdocget_leng (void) { return scdocleng; } /** Get the current token. * */ char *scdocget_text (void) { return scdoctext; } /** Set the current line number. * @param line_number * */ void scdocset_lineno (int line_number ) { scdoclineno = line_number; } /** Set the input stream. This does not discard the current * input buffer. * @param in_str A readable stream. * * @see scdoc_switch_to_buffer */ void scdocset_in (FILE * in_str ) { scdocin = in_str ; } void scdocset_out (FILE * out_str ) { scdocout = out_str ; } int scdocget_debug (void) { return scdoc_flex_debug; } void scdocset_debug (int bdebug ) { scdoc_flex_debug = bdebug ; } static int yy_init_globals (void) { /* Initialization is the same as for the non-reentrant scanner. * This function is called from scdoclex_destroy(), so don't allocate here. */ /* We do not touch scdoclineno unless the option is enabled. */ scdoclineno = 1; (yy_buffer_stack) = 0; (yy_buffer_stack_top) = 0; (yy_buffer_stack_max) = 0; (yy_c_buf_p) = (char *) 0; (yy_init) = 0; (yy_start) = 0; /* Defined in main.c */ #ifdef YY_STDINIT scdocin = stdin; scdocout = stdout; #else scdocin = (FILE *) 0; scdocout = (FILE *) 0; #endif /* For future reference: Set errno on error, since we are called by * scdoclex_init() */ return 0; } /* scdoclex_destroy is for both reentrant and non-reentrant scanners. */ int scdoclex_destroy (void) { /* Pop the buffer stack, destroying each element. */ while(YY_CURRENT_BUFFER){ scdoc_delete_buffer(YY_CURRENT_BUFFER ); YY_CURRENT_BUFFER_LVALUE = NULL; scdocpop_buffer_state(); } /* Destroy the stack itself. */ scdocfree((yy_buffer_stack) ); (yy_buffer_stack) = NULL; /* Reset the globals. This is important in a non-reentrant scanner so the next time * scdoclex() is called, initialization will occur. */ yy_init_globals( ); return 0; } /* * Internal utility routines. */ #ifndef yytext_ptr static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) { register int i; for ( i = 0; i < n; ++i ) s1[i] = s2[i]; } #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * s ) { register int n; for ( n = 0; s[n]; ++n ) ; return n; } #endif void *scdocalloc (yy_size_t size ) { return (void *) malloc( size ); } void *scdocrealloc (void * ptr, yy_size_t size ) { /* The cast to (char *) in the following accommodates both * implementations that use char* generic pointers, and those * that use void* generic pointers. It works with the latter * because both ANSI C and C++ allow castless assignment from * any pointer type to void*, and deal with argument conversions * as though doing an assignment. */ return (void *) realloc( (char *) ptr, size ); } void scdocfree (void * ptr ) { free( (char *) ptr ); /* see scdocrealloc() for (char *) cast */ } #define YYTABLES_NAME "yytables" #line 180 "SCDoc.l" SuperCollider-3.6.3-Source-linux~repack/SCDoc/SCDoc.l0000664000175000017500000001722512106676016020425 0ustar dandan%{ /************************************************************************ * * Copyright 2012 Jonatan Liljedahl * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ************************************************************************/ #include #include "SCDoc.h" #include "SCDoc.tab.hpp" int scdoc_start_token = 0; //int colnum; //#define YY_USER_ACTION { scdoclloc.first_column = colnum; colnum=colnum+yyleng; scdoclloc.last_column=colnum; if(scdoclloc.first_line!=yylineno) colnum=1; scdoclloc.first_line = scdoclloc.last_line = yylineno;} static int method_caller; %} %option noyywrap never-interactive nounistd yylineno %x verbatim %x verbatim2 %x metadata %x eat %x eat2 %x eat3 %x method %% %{ if (scdoc_start_token) { int t = scdoc_start_token; scdoc_start_token = 0; // colnum = 1; if(t==START_METADATA) BEGIN(eat); return t; } %} (?i:[ \t]*class::[ \t]*) return CLASS; (?i:[ \t]*title::[ \t]*) return TITLE; (?i:[ \t]*summary::[ \t]*) return SUMMARY; (?i:[ \t]*related::[ \t]*) return RELATED; (?i:[ \t]*categories::[ \t]*) return CATEGORIES; (?i:[ \t]*redirect::[ \t]*) return REDIRECT; (?i:[ \t]*classtree::[ \t]*) return CLASSTREE; (?i:[ \t]*keyword::[ \t]*) return KEYWORD; (?i:[ \t]*private::[ \t]*) return PRIVATE; (?i:[ \t]*section::[ \t]*) return SECTION; (?i:[ \t]*subsection::[ \t]*) return SUBSECTION; (?i:[ \t]*copymethod::[ \t]*) return COPYMETHOD; (?i:[ \t]*method::[ \t]*) method_caller = YY_START; BEGIN(method); return METHOD; (?i:[ \t]*argument::[ \t]*) return ARGUMENT; (?i:[ \t]*description::[ \t\n\r]*) return DESCRIPTION; (?i:[ \t]*classmethods::[ \t\n\r]*) return CLASSMETHODS; (?i:[ \t]*instancemethods::[ \t\n\r]*) return INSTANCEMETHODS; (?i:[ \t]*examples::[ \t\n\r]*) return EXAMPLES; (?i:[ \t]*returns::[ \t\n\r]*) return RETURNS; (?i:[ \t]*discussion::[ \t\n\r]*) return DISCUSSION; (?i:[ \t]*list::[ \t\n\r]*) return LIST; (?i:[ \t]*tree::[ \t\n\r]*) return TREE; (?i:[ \t]*numberedlist::[ \t\n\r]*) return NUMBEREDLIST; (?i:[ \t]*definitionlist::[ \t\n\r]*) return DEFINITIONLIST; (?i:[ \t]*table::[ \t\n\r]*) return TABLE; (?i:[ \t]*footnote::[ \t\n\r]*) return FOOTNOTE; (?i:[ \t]*warning::[ \t\n\r]*) return WARNING; (?i:[ \t]*note::[ \t\n\r]*) return NOTE; (?i:link::[ \t]*) BEGIN(verbatim); return LINK; (?i:anchor::[ \t]*) BEGIN(verbatim); return ANCHOR; (?i:image::[ \t]*) BEGIN(verbatim); return IMAGE; (?i:soft::[ \t\n\r]*) BEGIN(verbatim); return SOFT; (?i:strong::[ \t\n\r]*) BEGIN(verbatim); return STRONG; (?i:emphasis::[ \t\n\r]*) BEGIN(verbatim); return EMPHASIS; (?i:code::[ \t]*) BEGIN(verbatim); return CODE; (?i:teletype::[ \t]*) BEGIN(verbatim); return TELETYPE; (?i:math::[ \t]*) BEGIN(verbatim); return MATH; (?i:[ \t]*code::[ \t]*\n+) BEGIN(verbatim2); return CODEBLOCK; (?i:[ \t]*teletype::[ \t]*\n+) BEGIN(verbatim2); return TELETYPEBLOCK; (?i:[ \t]*math::[ \t]*\n+) BEGIN(verbatim2); return MATHBLOCK; [ \t\n\r]*:: BEGIN(0); return TAGSYM; \n[ \t\n\r]*:: BEGIN(0); return TAGSYM; \n[ \t]*\\:: scdoclval.str = strdup("\n::"); return TEXT; [ \t]*\|\|[ \t\n\r]* return BARS; [ \t]*\#\#[ \t\n\r]* return HASHES; \n scdoclval.str = strdup("\n"); return TEXT; \n+ scdoclval.str = strdup(" "); return TEXT; \n return NEWLINE; \n([ \t\r]*\n)+ return EMPTYLINES; [ \t]*,[ \t]* scdoclval.str = strdup(scdoctext); return COMMA; \\\|\| scdoclval.str = strdup("||"); return TEXT; \\\#\# scdoclval.str = strdup("##"); return TEXT; \\:: scdoclval.str = strdup("::"); return TEXT; \t scdoclval.str = strdup(" "); return TEXT; [ \t]+ scdoclval.str = strdup(" "); return TEXT; <*>\r /* eat this */ [a-zA-Z]+:\/\/[^ \t\n\r:,]+ scdoclval.str = strdup(scdoctext); return URL; [a-z][a-zA-Z0-9_]*|[-<>@|&%*+/!?=]+ scdoclval.str = strdup(scdoctext); return METHODNAME; \([^()]+\) scdoclval.str = strdup(scdoctext); return METHODARGS; [ \r\t]+ /* eat this */ \n BEGIN(method_caller); return NEWLINE; . return BAD_METHODNAME; [a-zA-Z]+ | [.!?(){}\[\]'"0-9]+ | [^:\\\t\n\r ]+ | [^:\\\n\r] | . scdoclval.str = strdup(scdoctext); return TEXT; (?i:[ \t]*class::[ \t]*) BEGIN(metadata); return CLASS; (?i:[ \t]*title::[ \t]*) BEGIN(metadata); return TITLE; (?i:[ \t]*summary::[ \t]*) BEGIN(metadata); return SUMMARY; (?i:[ \t]*related::[ \t]*) BEGIN(metadata); return RELATED; (?i:[ \t]*categories::[ \t]*) BEGIN(metadata); return CATEGORIES; (?i:[ \t]*redirect::[ \t]*) BEGIN(metadata); return REDIRECT; (?i:[ \t]*classtree::[ \t]*) BEGIN(metadata); return CLASSTREE; (?i:[ \t]*keyword::[ \t]*) BEGIN(metadata); return KEYWORD; (?i:[ \t]*private::[ \t]*) BEGIN(metadata); return PRIVATE; (?i:[ \t]*section::[ \t]*) BEGIN(metadata); return SECTION; (?i:[ \t]*subsection::[ \t]*) BEGIN(metadata); return SUBSECTION; (?i:[ \t]*copymethod::[ \t]*) BEGIN(metadata); return COPYMETHOD; (?i:[ \t]*method::[ \t]*) method_caller = YY_START; BEGIN(method); return METHOD; (?i:[ \t]*description::[ \t\n\r]*) BEGIN(eat); return DESCRIPTION; (?i:[ \t]*classmethods::[ \t\n\r]*) BEGIN(eat); return CLASSMETHODS; (?i:[ \t]*instancemethods::[ \t\n\r]*) BEGIN(eat); return INSTANCEMETHODS; (?i:[ \t]*examples::[ \t\n\r]*) BEGIN(eat); return EXAMPLES; \n BEGIN(eat); return NEWLINE; [ \t]*,[ \t]* scdoclval.str = strdup(scdoctext); return COMMA; [a-zA-Z]+ | [0-9]+ | [^:\\\n\r,]+ | . scdoclval.str = strdup(scdoctext); return TEXT; \\:: scdoclval.str = strdup("::"); return TEXT; (?i:link::[ \t]*) BEGIN(eat2); (?i:anchor::[ \t]*) BEGIN(eat2); (?i:image::[ \t]*) BEGIN(eat2); (?i:soft::[ \t\n\r]*) BEGIN(eat2); (?i:strong::[ \t\n\r]*) BEGIN(eat2); (?i:emphasis::[ \t\n\r]*) BEGIN(eat2); (?i:code::[ \t]*) BEGIN(eat2); (?i:teletype::[ \t]*) BEGIN(eat2); (?i:math::[ \t]*) BEGIN(eat2); (?i:[ \t]*code::[ \t]*\n+) BEGIN(eat3); (?i:[ \t]*teletype::[ \t]*\n+) BEGIN(eat3); (?i:[ \t]*math::[ \t]*\n+) BEGIN(eat3); [ \t\n\r]*:: BEGIN(eat); \n[ \t\n\r]*:: BEGIN(eat); .|\n /* empty */ %% SuperCollider-3.6.3-Source-linux~repack/SCDoc/SCDoc.cpp0000664000175000017500000001272012106676016020747 0ustar dandan/************************************************************************ * * Copyright 2012 Jonatan Liljedahl * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ************************************************************************/ #include #include #include #include #include "SCDoc.h" DocNode * scdoc_parse_run(int partial); void scdocrestart (FILE *input_file); int scdoclex_destroy(void); char * scdoc_current_file = NULL; const char * NODE_TEXT = "TEXT"; const char * NODE_NL = "NL"; static int doc_node_dump_level_done[32] = {0,}; // merge a+b and free b char *strmerge(char *a, char *b) { if(a==NULL) return b; if(b==NULL) return a; char *s = (char *)realloc(a,strlen(a)+strlen(b)+1); strcat(s,b); free(b); return s; } static char *striptrailingws(char *s) { char *s2 = strchr(s,0); while(--s2 > s && isspace(*s2)) { *s2 = 0; } return s; } DocNode * doc_node_create(const char *id) { DocNode *n = (DocNode *)malloc(sizeof(DocNode)); n->id = id; n->text = NULL; n->n_childs = 0; n->children = NULL; return n; } // takes ownership of child DocNode * doc_node_add_child(DocNode *n, DocNode *child) { if(child) { n->children = (DocNode **)realloc(n->children, (n->n_childs+1) * sizeof(DocNode*)); n->children[n->n_childs] = child; n->n_childs++; } return n; } // takes ownership of text /*DocNode * doc_node_add_text(DocNode *n, char *text) { if(n->text) { char *str = strmergefree(n->text,text); n->text = str; printf("NODE: Adding text '%s'\n",text); } else { n->text = text; } return n; }*/ // moves the childs from src doc_node to n void doc_node_move_children(DocNode *n, DocNode *src) { if(src) { free(n->children); n->children = src->children; n->n_childs = src->n_childs; // src->children = NULL; // src->n_childs = 0; free(src->text); free(src); } } DocNode * doc_node_make(const char *id, char *text, DocNode *child) { DocNode *n = doc_node_create(id); n->text = text; doc_node_add_child(n, child); return n; } DocNode * doc_node_make_take_children(const char *id, char *text, DocNode *src) { DocNode *n = doc_node_make(id, text, NULL); doc_node_move_children(n, src); return n; } void doc_node_free_tree(DocNode *n) { int i; if(!n) return; free(n->text); for(i=0;in_childs;i++) { doc_node_free_tree(n->children[i]); } free(n->children); free(n); } void doc_node_fixup_tree(DocNode *n) { int i; if(n->id != NODE_TEXT && n->text) { n->text = striptrailingws(n->text); } if(n->n_childs) { DocNode *last = n->children[n->n_childs-1]; if(last->id==NODE_NL) { free(last); // NL has no text or children n->n_childs--; } last = NULL; for(i = 0; i < n->n_childs; i++) { DocNode *child = n->children[i]; if((child->id==NODE_TEXT || child->id==NODE_NL) && last && last->id==NODE_TEXT) { if(child->id==NODE_NL) { last->text = (char*)realloc(last->text,strlen(last->text)+2); strcat(last->text," "); } else { last->text = strmerge(last->text,child->text); } free(child); // we took childs text and it has no children n->children[i] = NULL; } else { doc_node_fixup_tree(child); last = child; } } int j = 0; for(i = 0; i < n->n_childs; i++) { if(n->children[i]) { n->children[j++] = n->children[i]; } } n->n_childs = j; } } static void _doc_node_dump(DocNode *n, int level, int last) { int i; for(i=0;iid); if(n->text) printf(" \"%s\"",n->text); printf("\n"); for(i = 0; i < n->n_childs; i++) { _doc_node_dump(n->children[i], level+1, i==n->n_childs-1); } doc_node_dump_level_done[level] = 0; } void doc_node_dump(DocNode *n) { _doc_node_dump(n,0,1); } extern void error(const char *fmt, ...); DocNode * scdoc_parse_file(char *fn, int mode) { FILE *fp; DocNode *n; fp = fopen(fn,"r"); if(!fp) { error("scdoc_parse_file: could not open '%s'\n",fn); return NULL; } scdoc_current_file = fn; scdocrestart(fp); n = scdoc_parse_run(mode); if(n) { doc_node_fixup_tree(n); } fclose(fp); scdoclex_destroy(); scdoc_current_file = NULL; return n; } SuperCollider-3.6.3-Source-linux~repack/SCDoc/main.cpp0000664000175000017500000000177111743774635020760 0ustar dandan#include #include #include #include #include "SCDoc.h" void error(const char *fmt, ...) { fprintf(stderr, "ERROR: "); va_list vargs; va_start(vargs, fmt); vfprintf(stderr, fmt, vargs); fflush(stderr); } void post(const char *fmt, ...) { va_list vargs; va_start(vargs, fmt); vfprintf(stderr, fmt, vargs); fflush(stderr); } int main(int argc, char **argv) { if(argc>1) { DocNode *n; if(argc>2 && strcmp(argv[1],"--partial")==0) n = scdoc_parse_file(argv[2], SCDOC_PARSE_PARTIAL); else if(argc>2 && strcmp(argv[1],"--metadata")==0) n = scdoc_parse_file(argv[2], SCDOC_PARSE_METADATA); else n = scdoc_parse_file(argv[1], SCDOC_PARSE_FULL); if(n) { doc_node_dump(n); doc_node_free_tree(n); } else return 1; } else { fprintf(stderr, "Usage: %s inputfile.schelp\n",argv[0]); } return 0; } SuperCollider-3.6.3-Source-linux~repack/SCDoc/SCDocPrim.h0000664000175000017500000000012611743774635021255 0ustar dandan#ifndef _SCDOCPRIM_H_ #define _SCDOCPRIM_H_ void initSCDocPrimitives(void); #endif SuperCollider-3.6.3-Source-linux~repack/SCDoc/SCDocPrim.cpp0000664000175000017500000000562212106676016021602 0ustar dandan/************************************************************************ * * Copyright 2012 Jonatan Liljedahl * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ************************************************************************/ #include "GC.h" #include "PyrKernel.h" #include "PyrPrimitive.h" #include "PyrSymbol.h" #include "SCBase.h" #include "SC_DirUtils.h" #include #include #include #include //extern "C" { #include "SCDoc.h" //} PyrSymbol *s_scdoc_node; static void _doc_traverse(struct VMGlobals* g, DocNode *n, PyrObject *parent, PyrSlot *slot) { PyrObject *result = instantiateObject( g->gc, s_scdoc_node->u.classobj, 0, false, false ); result->size = 0; SetObject(slot, result); if(parent) g->gc->GCWrite(parent, result); PyrSymbol *id = getsym(n->id); SetSymbol(result->slots+result->size++, id); if(n->text) { PyrObject *str = (PyrObject*) newPyrString(g->gc, n->text, 0, true); SetObject(result->slots+result->size++, str); g->gc->GCWrite(result, str); } else { SetNil(result->slots+result->size++); } if(n->n_childs) { PyrObject *array = newPyrArray(g->gc, n->n_childs, 0, true); array->size = 0; SetObject(result->slots+result->size++, array); g->gc->GCWrite(result, array); for(int i=0; in_childs; i++) { array->size++; _doc_traverse(g, n->children[i], array, array->slots+i); } } else { SetNil(result->slots+result->size++); } result->size += 3; // makeDiv, notPrivOnly, sort } int prSCDoc_ParseFile(struct VMGlobals* g, int numArgsPushed) { PyrSlot *a, *b, *c; char filename[PATH_MAX]; int mode, err; a = g->sp - 2; b = g->sp - 1; c = g->sp; err = slotStrVal(b, filename, PATH_MAX); if (err) return err; err = slotIntVal(c, &mode); if (err) return err; DocNode *n = scdoc_parse_file(filename, mode); if(n) { // doc_node_dump(n); _doc_traverse(g, n, NULL, a); doc_node_free_tree(n); } else { SetNil(a); } return errNone; } void initSCDocPrimitives() { int base, index = 0; s_scdoc_node = getsym("SCDocNode"); base = nextPrimitiveIndex(); definePrimitive(base, index++, "_SCDoc_ParseFile", prSCDoc_ParseFile, 3, 0); } SuperCollider-3.6.3-Source-linux~repack/SCDoc/CMakeLists.txt0000664000175000017500000000033511743774635022063 0ustar dandanset(SCDOC_DIR ${CMAKE_SOURCE_DIR}/SCDoc) set(SCDOC_SRCS ${SCDOC_DIR}/SCDoc.cpp ${SCDOC_DIR}/SCDoc.tab.cpp ${SCDOC_DIR}/lex.scdoc.cpp ${SCDOC_DIR}/SCDocPrim.cpp ) include_directories( ${SCDOC_DIR} ) SuperCollider-3.6.3-Source-linux~repack/SCDoc/SCDoc.y0000664000175000017500000003367012106676016020444 0ustar dandan%{ /************************************************************************ * * Copyright 2012 Jonatan Liljedahl * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ************************************************************************/ #include #include #include #include "SCDoc.h" //#define YYLEX_PARAM &yylval, &yylloc int scdocparse(); extern int scdoclineno; extern char *scdoctext; extern int scdoc_start_token; extern FILE *scdocin; //extern struct YYLTYPE scdoclloc; //int scdoc_metadata_mode; static const char * method_type = NULL; static DocNode * topnode; void scdocerror(const char *str); extern void error(const char *fmt, ...); extern void post(const char *fmt, ...); static inline bool stringEqual(const char * a, const char * b) { return strcmp(a, b) == 0; } %} %locations %error-verbose %union { int i; const char *id; char *str; DocNode *doc_node; } // single line header tags that take text %token CLASS TITLE SUMMARY RELATED CATEGORIES REDIRECT // single line body tags that take text %token CLASSTREE COPYMETHOD KEYWORD PRIVATE // single line structural tags that take text, with children %token SECTION SUBSECTION METHOD ARGUMENT // single line structural tags with no text, with children %token DESCRIPTION CLASSMETHODS INSTANCEMETHODS EXAMPLES RETURNS DISCUSSION // nestable range tags with no text, with children %token LIST TREE NUMBEREDLIST DEFINITIONLIST TABLE FOOTNOTE NOTE WARNING // modal range tags that take multi-line text %token CODE LINK ANCHOR SOFT IMAGE TELETYPE MATH STRONG EMPHASIS %token CODEBLOCK "CODE block" TELETYPEBLOCK "TELETYPE block" MATHBLOCK "MATH block" // symbols %token TAGSYM "::" BARS "||" HASHES "##" // text and whitespace %token TEXT "text" URL COMMA METHODNAME "method name" METHODARGS "arguments string" %token NEWLINE "newline" EMPTYLINES "empty lines" %token BAD_METHODNAME "bad method name" %token END 0 "end of file" %type headtag sectiontag listtag rangetag inlinetag blocktag %type anyword words anywordnl wordsnl anywordurl words2 nocommawords optMETHODARGS methodname %type document arg optreturns optdiscussion body bodyelem %type optsubsections optsubsubsections methodbody %type dochead headline optsections sections section %type subsections subsection subsubsection subsubsections %type optbody optargs args listbody tablebody tablecells tablerow %type prose proseelem blockA blockB commalist %type deflistbody deflistrow defterms methnames %token START_FULL START_PARTIAL START_METADATA %start start %destructor { doc_node_free_tree($$); } %destructor { free($$); } %{ //int scdoclex (YYSTYPE * yylval_param, struct YYLTYPE * yylloc_param ); int scdoclex (void); %} %% start: document { topnode = $1; } | document error { topnode = NULL; doc_node_free_tree($1); } ; document: START_FULL eateol dochead optsections { $$ = doc_node_create("DOCUMENT"); doc_node_add_child($$, $3); doc_node_add_child($$, $4); } | START_PARTIAL sections { $$ = doc_node_make_take_children("BODY",NULL,$2); } | START_METADATA dochead optsections { $$ = doc_node_create("DOCUMENT"); doc_node_add_child($$, $2); doc_node_add_child($$, $3); } ; eateol: eol | /* empty */ ; dochead: dochead headline { $$ = doc_node_add_child($1,$2); } | headline { $$ = doc_node_make("HEADER",NULL,$1); } ; headline: headtag words2 eol { $$ = doc_node_make($1,$2,NULL); } | CATEGORIES commalist eol { $$ = doc_node_make_take_children("CATEGORIES",NULL,$2); } | RELATED commalist eol { $$ = doc_node_make_take_children("RELATED",NULL,$2); } ; headtag: CLASS { $$ = "TITLE"; } /* no need for the separate class:: tag actually. */ | TITLE { $$ = "TITLE"; } | SUMMARY { $$ = "SUMMARY"; } | REDIRECT { $$ = "REDIRECT"; } ; sectiontag: CLASSMETHODS { $$ = "CLASSMETHODS"; method_type = "CMETHOD"; } | INSTANCEMETHODS { $$ = "INSTANCEMETHODS"; method_type = "IMETHOD"; } | DESCRIPTION { $$ = "DESCRIPTION"; method_type = "METHOD"; } | EXAMPLES { $$ = "EXAMPLES"; method_type = "METHOD"; } ; optsections: sections | { $$ = doc_node_make("BODY",NULL,NULL); } ; sections: sections section { $$ = doc_node_add_child($1,$2); } | section { $$ = doc_node_make("BODY",NULL,$1); } | subsubsections { $$ = doc_node_make_take_children("BODY",NULL,$1); } /* allow text before first section */ ; section: SECTION { method_type = "METHOD"; } words2 eol optsubsections { $$ = doc_node_make_take_children("SECTION",$3,$5); } | sectiontag optsubsections { $$ = doc_node_make_take_children($1, NULL,$2); } ; optsubsections: subsections | { $$ = NULL; } ; subsections: subsections subsection { $$ = doc_node_add_child($1,$2); } | subsection { $$ = doc_node_make("(SUBSECTIONS)",NULL,$1); } | subsubsections ; subsection: SUBSECTION words2 eol optsubsubsections { $$ = doc_node_make_take_children("SUBSECTION", $2, $4); } ; optsubsubsections: subsubsections | { $$ = NULL; } ; subsubsections: subsubsections subsubsection { $$ = doc_node_add_child($1,$2); } | subsubsection { $$ = doc_node_make("(SUBSUBSECTIONS)",NULL,$1); } | body { $$ = doc_node_make_take_children("(SUBSUBSECTIONS)",NULL,$1); } ; subsubsection: METHOD methnames optMETHODARGS eol methodbody { $2->id = "METHODNAMES"; $$ = doc_node_make(method_type,$3,$2); doc_node_add_child($$, $5); // doc_node_add_child($2, $3); } | COPYMETHOD words eol { $$ = doc_node_make( stringEqual(method_type, "CMETHOD") ? "CCOPYMETHOD" : (stringEqual(method_type, "IMETHOD") ? "ICOPYMETHOD" : "COPYMETHOD"), $2, NULL ); } | PRIVATE commalist eoleof { $$ = doc_node_make_take_children( stringEqual(method_type, "CMETHOD") ? "CPRIVATE" : "IPRIVATE", NULL, $2); } ; optMETHODARGS: { $$ = NULL; } | METHODARGS { // $$ = doc_node_make("ARGSTRING",$1,NULL); $$ = $1; if(!stringEqual(method_type, "METHOD")) { yyerror("METHOD argument string is not allowed inside CLASSMETHODS or INSTANCEMETHODS"); YYERROR; } } ; methodname: METHODNAME { char *p = $1+strlen($1)-1; if(*p=='_') { post("WARNING: SCDoc: In %s\n Property setter %s should be documented without underscore.\n", scdoc_current_file, $1); *p = '\0'; }; $$ = $1; } ; methnames: methnames COMMA methodname { free($2); $2 = NULL; $$ = doc_node_add_child($1, doc_node_make("STRING",$3,NULL)); } | methodname { $$ = doc_node_make("(METHODNAMES)",NULL,doc_node_make("STRING",$1,NULL)); } ; methodbody: optbody optargs optreturns optdiscussion { $$ = doc_node_make_take_children("METHODBODY",NULL,$1); doc_node_add_child($$, $2); doc_node_add_child($$, $3); doc_node_add_child($$, $4); } ; optbody: body | { $$ = NULL; } ; optargs: args | { $$ = NULL; } ; args: args arg { $$ = doc_node_add_child($1,$2); } | arg { $$ = doc_node_make("ARGUMENTS",NULL,$1); } ; arg: ARGUMENT words eol optbody { $$ = doc_node_make_take_children("ARGUMENT", $2, $4); } | ARGUMENT eol body { $$ = doc_node_make_take_children("ARGUMENT", NULL, $3); } ; optreturns: RETURNS body { $$ = doc_node_make_take_children("RETURNS",NULL,$2); } | { $$ = NULL; } ; optdiscussion: DISCUSSION body { $$ = doc_node_make_take_children("DISCUSSION",NULL,$2); } | { $$ = NULL; } ; /* body contains a list of bodyelem's (A) and prose (B) such that the list can start and end with either A or B, and A can repeat while B can not */ body: blockA | blockB ; blockA: blockB bodyelem { $$ = doc_node_add_child($1,$2); } | blockA bodyelem { $$ = doc_node_add_child($1,$2); } | bodyelem { $$ = doc_node_make("(SECTIONBODY)",NULL,$1); } ; blockB: blockA prose { $$ = doc_node_add_child($1,$2); } | prose { $$ = doc_node_make("(SECTIONBODY)",NULL,$1); } ; bodyelem: rangetag body TAGSYM { $$ = doc_node_make_take_children($1,NULL,$2); } | listtag listbody TAGSYM { $$ = doc_node_make_take_children($1,NULL,$2); } | TABLE tablebody TAGSYM { $$ = doc_node_make_take_children("TABLE",NULL,$2); } | DEFINITIONLIST deflistbody TAGSYM { $$ = doc_node_make_take_children("DEFINITIONLIST",NULL,$2); } | blocktag wordsnl TAGSYM { $$ = doc_node_make($1,$2,NULL); } | CLASSTREE words eoleof { $$ = doc_node_make("CLASSTREE",$2,NULL); } | KEYWORD commalist eoleof { $$ = doc_node_make_take_children("KEYWORD",NULL,$2); // printf("keyword '%s'\n",$2->children[0]->text); } | EMPTYLINES { $$ = NULL; } | IMAGE words2 TAGSYM { $$ = doc_node_make("IMAGE",$2,NULL); } ; prose: prose proseelem { $$ = doc_node_add_child($1, $2); } | proseelem { $$ = doc_node_make("PROSE",NULL,$1); } ; proseelem: anyword { $$ = doc_node_make(NODE_TEXT,$1,NULL); } // one TEXT for each word | URL { $$ = doc_node_make("LINK",$1,NULL); } | inlinetag words TAGSYM { $$ = doc_node_make($1,$2,NULL); } | FOOTNOTE body TAGSYM { $$ = doc_node_make_take_children("FOOTNOTE",NULL,$2); } | NEWLINE { $$ = doc_node_create(NODE_NL); } ; inlinetag: LINK { $$ = "LINK"; } | STRONG { $$ = "STRONG"; } | SOFT { $$ = "SOFT"; } | EMPHASIS { $$ = "EMPHASIS"; } | CODE { $$ = "CODE"; } | TELETYPE { $$ = "TELETYPE"; } | MATH { $$ = "MATH"; } | ANCHOR { $$ = "ANCHOR"; } ; blocktag: CODEBLOCK { $$ = "CODEBLOCK"; } | TELETYPEBLOCK { $$ = "TELETYPEBLOCK"; } | MATHBLOCK { $$ = "MATHBLOCK"; } ; listtag: LIST { $$ = "LIST"; } | TREE { $$ = "TREE"; } | NUMBEREDLIST { $$ = "NUMBEREDLIST"; } ; rangetag: WARNING { $$ = "WARNING"; } | NOTE { $$ = "NOTE"; } ; listbody: listbody HASHES body { $$ = doc_node_add_child($1, doc_node_make_take_children("ITEM",NULL,$3)); } | HASHES body { $$ = doc_node_make("(LISTBODY)",NULL, doc_node_make_take_children("ITEM",NULL,$2)); } ; tablerow: HASHES tablecells { $$ = doc_node_make_take_children("TABROW",NULL,$2); } ; tablebody: tablebody tablerow { $$ = doc_node_add_child($1,$2); } | tablerow { $$ = doc_node_make("(TABLEBODY)",NULL,$1); } ; tablecells: tablecells BARS optbody { $$ = doc_node_add_child($1, doc_node_make_take_children("TABCOL",NULL,$3)); } | optbody { $$ = doc_node_make("(TABLECELLS)",NULL, doc_node_make_take_children("TABCOL",NULL,$1)); } ; defterms: defterms HASHES body { $$ = doc_node_add_child($1,doc_node_make_take_children("TERM",NULL,$3)); } | HASHES body { $$ = doc_node_make("(TERMS)",NULL,doc_node_make_take_children("TERM",NULL,$2)); } ; deflistrow: defterms BARS optbody { $$ = doc_node_make_take_children("DEFLISTITEM", NULL, $1); doc_node_add_child($$, doc_node_make_take_children("DEFINITION", NULL, $3)); } ; deflistbody: deflistbody deflistrow { $$ = doc_node_add_child($1,$2); } | deflistrow { $$ = doc_node_make("(DEFLISTBODY)",NULL,$1); } ; anywordurl: anyword | URL ; anyword: TEXT | COMMA ; words: words anyword { $$ = strmerge($1,$2); } | anyword ; words2: words2 anywordurl { $$ = strmerge($1,$2); } | anywordurl ; eol: NEWLINE | EMPTYLINES ; eoleof: eol | END ; anywordnl: anyword | eol { $$ = strdup("\n"); } ; wordsnl: wordsnl anywordnl { $$ = strmerge($1,$2); } | anywordnl ; nocommawords: nocommawords TEXT { $$ = strmerge($1,$2); } | nocommawords URL { $$ = strmerge($1,$2); } | TEXT | URL ; commalist: commalist COMMA nocommawords { free($2); $2=NULL; $$ = doc_node_add_child($1,doc_node_make("STRING",$3,NULL)); } | nocommawords { $$ = doc_node_make("(COMMALIST)",NULL,doc_node_make("STRING",$1,NULL)); } ; %% DocNode * scdoc_parse_run(int mode) { int modes[] = {START_FULL, START_PARTIAL, START_METADATA}; if(mode<0 || mode>=sizeof(modes)) { error("scdoc_parse_run(): unknown mode: %d\n",mode); } scdoc_start_token = modes[mode]; /* scdoc_start_token = START_FULL; scdoc_metadata_mode = 0; if(mode==SCDOC_PARSE_PARTIAL) { scdoc_start_token = START_PARTIAL; } else if(mode==SCDOC_PARSE_METADATA) { scdoc_metadata_mode = 1; }*/ topnode = NULL; method_type = "METHOD"; if(scdocparse()!=0) { return NULL; } return topnode; } void scdocerror(const char *str) { error("In %s:\n At line %d: %s\n\n",scdoc_current_file,scdoclineno,str); /* FIXME: this does not work well, since the reported linenumber is often *after* the actual error line fseek(scdocin, 0, SEEK_SET); int line = 1; char buf[256],*txt; while(line!=scdoclineno && !feof(scdocin)) { int c = fgetc(scdocin); if(c=='\n') line++; } txt = fgets(buf, 256, scdocin); if(txt) fprintf(stderr," %s\n-------------------\n", txt); */ } SuperCollider-3.6.3-Source-linux~repack/SCDoc/SCDoc.h0000664000175000017500000000136012057624166020416 0ustar dandan#ifndef SCDOC_H #define SCDOC_H #define SCDOC_PARSE_FULL 0 #define SCDOC_PARSE_PARTIAL 1 #define SCDOC_PARSE_METADATA 2 extern const char * NODE_TEXT; extern const char * NODE_NL; typedef struct DocNode { const char *id; char *text; int n_childs; struct DocNode **children; } DocNode; char *strmerge(char *a, char *b); DocNode * doc_node_make_take_children(const char *id, char *text, DocNode *src); DocNode * doc_node_make(const char *id, char *text, DocNode *child); DocNode * doc_node_add_child(DocNode *n, DocNode *child); DocNode * doc_node_create(const char *id); void doc_node_free_tree(DocNode *n); DocNode * scdoc_parse_file(char *fn, int mode); void doc_node_dump(DocNode *n); extern char * scdoc_current_file; #endif SuperCollider-3.6.3-Source-linux~repack/COPYING0000644000175000017500000010451311562456101017404 0ustar dandan GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . SuperCollider-3.6.3-Source-linux~repack/README_OS_X.txt0000664000175000017500000001375612106676016020755 0ustar dandan------------------------------------------------------------------------ Introduction ------------------------------------------------------------------------ This is the Mac OS X version of James McCartney's SuperCollider synthesis engine (scsynth) and programming language (sclang). Supercollider's main homepage is at: http://supercollider.sourceforge.net/ The help files contain a lot of useful information and tutorials for getting started - see the file "Help.html" for a starting point. To get further information on SuperCollider usage or development, you should subscribe to the mailing lists: http://swiki.hfbk-hamburg.de/MusicTechnology/880 SPECIAL CHARACTERS ON MAC: Please do not use non-ASCII characters (above code point 127) in your SuperCollider program path (i.e. the names of the folders containing SuperCollider). Doing so will break options to open class or method files automatically. ------------------------------------------------------------------------ Compiling SuperCollider from the source code ------------------------------------------------------------------------ Requirements: * Mac OS X 10.4.9 or greater * Cmake 2.7 or greater * Xcode Tools 2.4.1 or greater * Qt libraries 4.7 or greater: http://qt-project.org/downloads To build SuperCollider with Cmake, it is recommended to create a "build" folder (to keep the built files neatly all together) in the root of the SuperCollider source, then run "cmake" from within that folder. Like this: cd ~/SuperCollider3/ mkdir build cd build cmake .. Then to run the build process run: make install This will build the software, then "install" it to a folder "SuperCollider" under CMAKE_INSTALL_PREFIX, which defaults to "/Install", with the finished products in. You might like to move the "SuperCollider" folder into your /Applications folder or install it there directly by passing "-DCMAKE_INSTALL_PREFIX=/Applications" to cmake. The build process can be configured using the cmake program, cmake frontends like "ccmake" or "cmake-gui", or by simply editing the build/CMakeCache.txt file. For example, by default cmake will create a "release" build, but if you want a "debug" build (with optimisations turned off etc), configure cmake like this: cmake -DCMAKE_BUILD_TYPE=Debug .. By default the SCClassLibrary is copied into place. There is a cmake option to create symlinks of the SCClassLibrary instead so that changes to code in the class library are reflected in git. To turn on the symlinking do: cmake -DSC_SYMLINK_CLASSLIB=ON .. For a 32bit build on a 64bit machine (i.e. recent Mac systems), you need to configure cmake like this: cmake -DCMAKE_OSX_ARCHITECTURES='i386' .. For the BIG universal binary (on 10.6), use: cmake -DCMAKE_OSX_ARCHITECTURES='i386;x86_64' .. cmake -DCMAKE_OSX_SYSROOT=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.7.sdk/ -DCMAKE_OSX_DEPLOYMENT_TARGET=10.6 -GXcode **** 10.8 warning **** On 10.8 you need to: compile against the 10.7 SDK build with the Xcode generator (add -GXcode to your cmake flags). Then, build the install target in Xcode. I started working on the bluetooth issues today actually, but the changes aren't trivial. For some reason, the 10.7 SDK choice doesn't seem to percolate into the makefile version created by cmake. You can either build with an Xcode file: (an example from josh on 10.8 with Xcode 4.5: cmake -DCMAKE_OSX_SYSROOT=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.7.sdk/ -DCMAKE_OSX_DEPLOYMENT_TARGET=10.6 -GXcode ) your build will be in the "Install" folder in the build directory. or add the following flags for isysroot: -DCMAKE_CXX_FLAGS="-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.7.sdk/" -DCMAKE_C_FLAGS="-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.7.sdk/" Finally - a cmake command that builds on 10.8 currently: cmake -DCMAKE_OSX_SYSROOT=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.7.sdk/ -DCMAKE_OSX_DEPLOYMENT_TARGET=10.7 -DCMAKE_CXX_FLAGS="-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.7.sdk/" -DCMAKE_C_FLAGS="-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.7.sdk/" -DCMAKE_BUILD_TYPE="Release" .. Qt GUI: ------- By default the new Qt GUI support will be built into sclang and SuperCollider application. If you want to build without it, configure cmake like this: cmake -DSC_QT=OFF .. Standalones: ------------ To create a "standalone" app using cmake, you need to use the "standalone" flag. For example, to create a standalone whose name is MyFabApp: cmake -D standalone="MyFabApp" .. This builds like normal but names the finished program "MyFabApp" and includes any special resources you might have created in the folder "platform/mac/MyFabApp Resources" (or, if that doesn't exist, it just uses "platform/mac/Standalone Resources"). If you've built a standalone and want to go back to normal build mode, just set that value as an empty string: cmake -D standalone="" .. ------------------------------------------------------------------------ On libsndfile ------------------------------------------------------------------------ Compiling a universal binary of libsndfile requires access to both a i386 and PPC Mac. The reasons for this are described here: http://www.mega-nerd.com/libsndfile/FAQ.html#Q018 Because of this, libsndfile is included with the source as a precompiled universal binary. This UB contains ppc, i386 and x86_64 archs. ------------------------------------------------------------------------ Outro ------------------------------------------------------------------------ Thanks to James McCartney, for making this great piece of audio software publicly and freely available. ------------------------------------------------------------------------ SuperCollider-3.6.3-Source-linux~repack/README_JAILBROKEN_IPHONE.txt0000644000175000017500000000471511644340035022613 0ustar dandanInstalling SuperCollider in a Jailbroken iDevice. January 2011 1 - jailbreak your iDevice (both blackrain on iphone and redsn0w for iOS 4.1 on 2nd gen iPod Touch are reported to work) 2 - install OpenSSH and ldid from Cydia. You probably also want to install SBSettings for a convenient way to among other things switch SSH on and off. It's a must-have app for jailbroken iDevices. You should have SSH turned off at all times except when you really need it 3 - Change the SSH password! Running around with SSH on and the default password is a Major Security Problem 4 - Get a free developer account from Apple and download and install XCode 5 - Disable code signing. For sdk 3.0 and above you need to disable code signing by editing the file /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/SDKSettings.plist . Follow the instructions at http://thebigboss.org/hosting-repository/submit-your-app/compile-for-cydia-submission/. 6 - Open the iphone xcode projects, in the project and in the SuperCollider target settings -> build, set code signing to “Don’t code signâ€. 7 - Find the architecture settings also in the build tab of the project's and the targets SuperCollider info window and set it to the architecture of the device your iDevice (armv6 or armv7) 7a - Alternatively, you can also build a "fat" binary that contains builds for both architectures and "thin" it afterwards: cd into you SuperCollider.app directory and type lipo SuperCollider -thin [yourArchitecture] -output [newFileName] Then replace the SuperCollider executable inside your app folder with the "thinned" one. Of course, you have to also name it SuperCollider. And I'm sure there's also a lipo command that automatically replaces the original file. 8 - Get the App on the iDevice. You can either use Cyberduck or follow these directions: http://blog.paulbetts.org/index.php/2008/07/22/running-your-iphone-sdk-app-on-iphone-without-the-app-store/ 9 - follow the instructions in the link above to code sign the app. That will be: chmod 755 /Applications/SuperCollider.app ldid -S /Applications/SuperCollider.app/SuperCollider 10 - logout of your device and close SSH 11 - restart the springboard: killall SpringBoard 11a - You can also tap respring in SBSettings If the codesigning has worked correctly (remember to only use non-fat binaries), (and if there's no cold wind blowing from the northwest) you can now start SuperCollider.app from the Springboard and take the world by storm.SuperCollider-3.6.3-Source-linux~repack/external_libraries/0000775000175000017500000000000012112505363022222 5ustar dandanSuperCollider-3.6.3-Source-linux~repack/external_libraries/oscpack_build.cpp0000644000175000017500000000060211562456103025531 0ustar dandan#include #ifdef BOOST_LITTLE_ENDIAN #define OSC_HOST_LITTLE_ENDIAN #elif defined(BOOST_BIG_ENDIAN) #define OSC_HOST_BIG_ENDIAN #else #error please define endianness #endif #include "oscpack/osc/OscOutboundPacketStream.cpp" #include "oscpack/osc/OscPrintReceivedElements.cpp" #include "oscpack/osc/OscReceivedElements.cpp" #include "oscpack/osc/OscTypes.cpp" SuperCollider-3.6.3-Source-linux~repack/external_libraries/threadpool/0000775000175000017500000000000012110505246024361 5ustar dandanSuperCollider-3.6.3-Source-linux~repack/external_libraries/threadpool/COPYING0000644000175000017500000000033511644340035025417 0ustar dandanCopyright (c) 2005-2007 Philipp Henkel Use, modification, and distribution are subject to the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)SuperCollider-3.6.3-Source-linux~repack/external_libraries/threadpool/CHANGE_LOG0000644000175000017500000000721311644340035025737 0ustar dandanChange Log 0.2.5 - Made threadpool compatible to boost::thread 1.37 - Fixed hang problem in shutdown method (Thanks to Sohail Somani) - Adapted repository layout to boost (Thanks to Alex Ott) 0.2.4 (Stable) - Made threadpool compatible to boost::thread 1.35.x code base - Fixed compiler warning in scope_guard.hpp 0.2.3 (Development) - Implemented workaround for Sun C++ Pro compiler bug in pool_core - Removed subtask implementation (there was no demand for this feature) - Improved shutdown policies 0.2.2 (Development) - Refactored SizePolicy and added SizePolicyController - Moved policies into separate files - Fixed some compiler problems (GCC) - Implemented size_controller handling - Implemented two size policies: static_size and fixed_size - Refactored worker_thread handling, moved policies from pool_core to pool - Specialized schedule function for usage with futures - Added compile test project - Improved constness in pool core class - Fixed timed wait - Implemented futures (in progress) - Added result_type to all functors 0.2.1 (Development) - Pool base class (thread_pool) has now reference semantics - Large refactorings: Removed scoped_pool, reimplemented worker (now worker_thread) - Fixed odd resize behaviour. Now resize changes the number of threads immediately - Apply pimpl idiom on pool core class (to make the ugly scoped_pool class needless) - Introduced scheduling policies - Switched to policy-based design (PBD), inspired by Scott Meyers C++ workshop - Cosmetic code change: Replaced keyword 'class' with 'typename' in template definitions - Revised tutorials - New requirements: tasks functions should not and schedulers shall not throw exceptions 0.2.0 (Development) - Moved threadpool into the boost namespace: boost::threadpool - Used keyword volatile to indicate thread-safe member functions - Used volatile on primitve types were appropriate - Moved worker to detail directory - Fixed thread deletion - Extended wait functionality (waiting for idle threads was implemented) - Renamed 'join()' to 'wait()' as 'join' indicates the termination of thread. That was not the case in pool::join. - Changed internal container of lifo and fifo schedulers to improve efficiency. - Improved code reference documentation (source code browser) - Renamed thread_func into task_func - Added += operator to scoped_pool to ease scheduling of tasks - Refactored file structures and class names - Added a new task concept (named subtask) which allows the combination of sequential and parallel execution - Added new task adaptor for looped or timed tasks: looped_task_func - Introduced function clear() which can be used to remove all tasks from the pool and schedulers - New function pool::active() which returns the number of active tasks 0.1.8 (Development) - Fixed some compile errors which were reported by gcc - Wrote tutorial "Prioritized Tasks" 0.1.7 (Development) - Added Visual Studio 2005 project files for tutorial and examples 0.1.6 (Development) - Replaced task adaptor 'task' with boost::bind - Workers are unregistered from thread_group when they are terminated - Working on example boost::iostreams packet_filter 0.1.5 (Development) - Finished threadpool reference - Class pool_adaptor was replaced by smart_pool - Minor pool improvements - First tutorial page online 0.1.4 (Development) - Created the pool's homepage: http://threadpool.sourceforge.net - Improved documentation - Added build scripts 0.1.3 (Development) - First public release - Added mergesort example - Added tutorial - Implementation of threadpool core and related classesSuperCollider-3.6.3-Source-linux~repack/external_libraries/threadpool/README0000644000175000017500000000042711644340035025246 0ustar dandanthreadpool Copyright (c) 2005-2007 Philipp Henkel threadpool is a cross-platform C++ thread pool library and released under the Boost Software License. See doc/index.html for information on: - API documentation and a tutorial - External dependencies - Using threadpool SuperCollider-3.6.3-Source-linux~repack/external_libraries/threadpool/TODO0000644000175000017500000000210011644340035025044 0ustar dandanthreadpool to-do items ====================== Documentation -------------------------------------------- - Source code documentation - Design rationale - Tutorial - Finish Quickstart Tutorial/Example Functionality -------------------------------------------- - Implement a size policy which dynamically increase/decrease the pool's size: - init with min/max threads - auto increase - auto decrease (using timed cleanup tasks) - Add some kind of deadline scheduler - Add futures to pool Examples -------------------------------------------- - Buffering Client Requests: Handle 'bursty' client traffic Some applications need more buffering than is provided by OS I/O subsystem Working on 'active' buffer for boost::iostreams buffer_filter which provides a dynamic amount of buffer objects. buffer_filter uses a threadpool with one thread which provides the buffers to consumer. (TODO Philipp) 2nd implemention step: Flexbile configuration: Buffer capacities can be configured according to - maximum number of requests - maximum number of bytes SuperCollider-3.6.3-Source-linux~repack/external_libraries/threadpool/boost/0000775000175000017500000000000012110505246025507 5ustar dandanSuperCollider-3.6.3-Source-linux~repack/external_libraries/threadpool/boost/threadpool/0000775000175000017500000000000012110505246027650 5ustar dandan././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/threadpool/boost/threadpool/size_policies.hppSuperCollider-3.6.3-Source-linux~repack/external_libraries/threadpool/boost/threadpool/size_policies0000644000175000017500000000453411644340035032444 0ustar dandan/*! \file * \brief Size policies. * * This file contains size policies for thread_pool. A size * policy controls the number of worker threads in the pool. * * Copyright (c) 2005-2007 Philipp Henkel * * Use, modification, and distribution are subject to the * Boost Software License, Version 1.0. (See accompanying file * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) * * http://threadpool.sourceforge.net * */ #ifndef THREADPOOL_SIZE_POLICIES_HPP_INCLUDED #define THREADPOOL_SIZE_POLICIES_HPP_INCLUDED /// The namespace threadpool contains a thread pool and related utility classes. namespace boost { namespace threadpool { /*! \brief SizePolicyController which provides no functionality. * * \param Pool The pool's core type. */ template struct empty_controller { empty_controller(typename Pool::size_policy_type&, shared_ptr) {} }; /*! \brief SizePolicyController which allows resizing. * * \param Pool The pool's core type. */ template< typename Pool > class resize_controller { typedef typename Pool::size_policy_type size_policy_type; reference_wrapper m_policy; shared_ptr m_pool; //!< to make sure that the pool is alive (the policy pointer is valid) as long as the controller exists public: resize_controller(size_policy_type& policy, shared_ptr pool) : m_policy(policy) , m_pool(pool) { } bool resize(size_t worker_count) { return m_policy.get().resize(worker_count); } }; /*! \brief SizePolicy which preserves the thread count. * * \param Pool The pool's core type. */ template class static_size { reference_wrapper m_pool; public: static void init(Pool& pool, size_t const worker_count) { pool.resize(worker_count); } static_size(Pool volatile & pool) : m_pool(pool) {} bool resize(size_t const worker_count) { return m_pool.get().resize(worker_count); } void worker_died_unexpectedly(size_t const new_worker_count) { m_pool.get().resize(new_worker_count + 1); } // TODO this functions are not called yet void task_scheduled() {} void task_finished() {} }; } } // namespace boost::threadpool #endif // THREADPOOL_SIZE_POLICIES_HPP_INCLUDED ././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/threadpool/boost/threadpool/pool_adaptors.hppSuperCollider-3.6.3-Source-linux~repack/external_libraries/threadpool/boost/threadpool/pool_adaptors0000644000175000017500000000372011644340035032445 0ustar dandan/*! \file * \brief Pool adaptors. * * This file contains an easy-to-use adaptor similar to a smart * pointer for the pool class. * * Copyright (c) 2005-2007 Philipp Henkel * * Use, modification, and distribution are subject to the * Boost Software License, Version 1.0. (See accompanying file * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) * * http://threadpool.sourceforge.net * */ #ifndef THREADPOOL_POOL_ADAPTORS_HPP_INCLUDED #define THREADPOOL_POOL_ADAPTORS_HPP_INCLUDED #include namespace boost { namespace threadpool { // TODO convenience scheduling function /*! Schedules a Runnable for asynchronous execution. A Runnable is an arbitrary class with a run() * member function. This a convenience shorthand for pool->schedule(bind(&Runnable::run, task_object)). * \param * \param obj The Runnable object. The member function run() will be exectued and should not throw execeptions. * \return true, if the task could be scheduled and false otherwise. */ template bool schedule(Pool& pool, shared_ptr const & obj) { return pool->schedule(bind(&Runnable::run, obj)); } /*! Schedules a task for asynchronous execution. The task will be executed once only. * \param task The task function object. */ template typename enable_if < is_void< typename result_of< typename Pool::task_type() >::type >, bool >::type schedule(Pool& pool, typename Pool::task_type const & task) { return pool.schedule(task); } template typename enable_if < is_void< typename result_of< typename Pool::task_type() >::type >, bool >::type schedule(shared_ptr const pool, typename Pool::task_type const & task) { return pool->schedule(task); } } } // namespace boost::threadpool #endif // THREADPOOL_POOL_ADAPTORS_HPP_INCLUDED ././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/threadpool/boost/threadpool/task_adaptors.hppSuperCollider-3.6.3-Source-linux~repack/external_libraries/threadpool/boost/threadpool/task_adaptors0000664000175000017500000001037312106676016032447 0ustar dandan/*! \file * \brief Task adaptors. * * This file contains adaptors for task function objects. * * Copyright (c) 2005-2007 Philipp Henkel * * Use, modification, and distribution are subject to the * Boost Software License, Version 1.0. (See accompanying file * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) * * http://threadpool.sourceforge.net * */ #ifndef THREADPOOL_TASK_ADAPTERS_HPP_INCLUDED #define THREADPOOL_TASK_ADAPTERS_HPP_INCLUDED #include #include #include namespace boost { namespace threadpool { /*! \brief Standard task function object. * * This function object wraps a nullary function which returns void. * The wrapped function is invoked by calling the operator (). * * \see boost function library * */ typedef function0 task_func; /*! \brief Prioritized task function object. * * This function object wraps a task_func object and binds a priority to it. * prio_task_funcs can be compared using the operator < which realises a partial ordering. * The wrapped task function is invoked by calling the operator (). * * \see prio_scheduler * */ class prio_task_func { private: unsigned int m_priority; //!< The priority of the task's function. task_func m_function; //!< The task's function. public: typedef void result_type; //!< Indicates the functor's result type. public: /*! Constructor. * \param priority The priority of the task. * \param function The task's function object. */ prio_task_func(unsigned int const priority, task_func const & function) : m_priority(priority) , m_function(function) { } /*! Executes the task function. */ void operator() (void) const { if(m_function) { m_function(); } } /*! Comparison operator which realises a partial ordering based on priorities. * \param rhs The object to compare with. * \return true if the priority of *this is less than right hand side's priority, false otherwise. */ bool operator< (const prio_task_func& rhs) const { return m_priority < rhs.m_priority; } }; // prio_task_func /*! \brief Looped task function object. * * This function object wraps a boolean thread function object. * The wrapped task function is invoked by calling the operator () and it is executed in regular * time intervals until false is returned. The interval length may be zero. * Please note that a pool's thread is engaged as long as the task is looped. * */ class looped_task_func { private: function0 m_function; //!< The task's function. unsigned int m_break_s; //!< Duration of breaks in seconds. unsigned int m_break_ns; //!< Duration of breaks in nano seconds. public: typedef void result_type; //!< Indicates the functor's result type. public: /*! Constructor. * \param function The task's function object which is looped until false is returned. * \param interval The minimum break time in milli seconds before the first execution of the task function and between the following ones. */ looped_task_func(function0 const & function, unsigned int const interval = 0) : m_function(function) { m_break_s = interval / 1000; m_break_ns = (interval - m_break_s * 1000) * 1000 * 1000; } /*! Executes the task function. */ void operator() (void) const { if(m_function) { if(m_break_s > 0 || m_break_ns > 0) { // Sleep some time before first execution xtime xt; xtime_get(&xt, TIME_UTC_); xt.nsec += m_break_ns; xt.sec += m_break_s; thread::sleep(xt); } while(m_function()) { if(m_break_s > 0 || m_break_ns > 0) { xtime xt; xtime_get(&xt, TIME_UTC_); xt.nsec += m_break_ns; xt.sec += m_break_s; thread::sleep(xt); } else { thread::yield(); // Be fair to other threads } } } } }; // looped_task_func } } // namespace boost::threadpool #endif // THREADPOOL_TASK_ADAPTERS_HPP_INCLUDED SuperCollider-3.6.3-Source-linux~repack/external_libraries/threadpool/boost/threadpool/detail/0000775000175000017500000000000012110505246031112 5ustar dandan././@LongLink0000000000000000000000000000015600000000000011567 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/threadpool/boost/threadpool/detail/scope_guard.hppSuperCollider-3.6.3-Source-linux~repack/external_libraries/threadpool/boost/threadpool/detail/scope_0000644000175000017500000000175611644340035032320 0ustar dandan/*! \file * \brief TODO. * * TODO. * * Copyright (c) 2005-2007 Philipp Henkel * * Use, modification, and distribution are subject to the * Boost Software License, Version 1.0. (See accompanying file * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) * * http://threadpool.sourceforge.net * */ #ifndef THREADPOOL_DETAIL_SCOPE_GUARD_HPP_INCLUDED #define THREADPOOL_DETAIL_SCOPE_GUARD_HPP_INCLUDED #include namespace boost { namespace threadpool { namespace detail { // TODO documentation class scope_guard : private boost::noncopyable { function0 const m_function; bool m_is_active; public: scope_guard(function0 const & call_on_exit) : m_function(call_on_exit) , m_is_active(true) { } ~scope_guard() { if(m_is_active && m_function) { m_function(); } } void disable() { m_is_active = false; } }; } } } // namespace boost::threadpool::detail #endif // THREADPOOL_DETAIL_SCOPE_GUARD_HPP_INCLUDED ././@LongLink0000000000000000000000000000016000000000000011562 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/threadpool/boost/threadpool/detail/worker_thread.hppSuperCollider-3.6.3-Source-linux~repack/external_libraries/threadpool/boost/threadpool/detail/worker0000644000175000017500000000540111644340035032350 0ustar dandan/*! \file * \brief Thread pool worker. * * The worker thread instance is attached to a pool * and executes tasks of this pool. * * Copyright (c) 2005-2007 Philipp Henkel * * Use, modification, and distribution are subject to the * Boost Software License, Version 1.0. (See accompanying file * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) * * http://threadpool.sourceforge.net * */ #ifndef THREADPOOL_DETAIL_WORKER_THREAD_HPP_INCLUDED #define THREADPOOL_DETAIL_WORKER_THREAD_HPP_INCLUDED #include "scope_guard.hpp" #include #include #include #include #include namespace boost { namespace threadpool { namespace detail { /*! \brief Thread pool worker. * * A worker_thread represents a thread of execution. The worker is attached to a * thread pool and processes tasks of that pool. The lifetime of the worker and its * internal boost::thread is managed automatically. * * This class is a helper class and cannot be constructed or accessed directly. * * \see pool_core */ template class worker_thread : public enable_shared_from_this< worker_thread > , private noncopyable { public: typedef Pool pool_type; //!< Indicates the pool's type. private: shared_ptr m_pool; //!< Pointer to the pool which created the worker. shared_ptr m_thread; //!< Pointer to the thread which executes the run loop. /*! Constructs a new worker. * \param pool Pointer to it's parent pool. * \see function create_and_attach */ worker_thread(shared_ptr const & pool) : m_pool(pool) { assert(pool); } /*! Notifies that an exception occurred in the run loop. */ void died_unexpectedly() { m_pool->worker_died_unexpectedly(this->shared_from_this()); } public: /*! Executes pool's tasks sequentially. */ void run() { scope_guard notify_exception(bind(&worker_thread::died_unexpectedly, this)); while(m_pool->execute_task()) {} notify_exception.disable(); m_pool->worker_destructed(this->shared_from_this()); } /*! Joins the worker's thread. */ void join() { m_thread->join(); } /*! Constructs a new worker thread and attaches it to the pool. * \param pool Pointer to the pool. */ static void create_and_attach(shared_ptr const & pool) { shared_ptr worker(new worker_thread(pool)); if(worker) { worker->m_thread.reset(new boost::thread(bind(&worker_thread::run, worker))); } } }; } } } // namespace boost::threadpool::detail #endif // THREADPOOL_DETAIL_WORKER_THREAD_HPP_INCLUDED ././@LongLink0000000000000000000000000000015600000000000011567 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/threadpool/boost/threadpool/detail/locking_ptr.hppSuperCollider-3.6.3-Source-linux~repack/external_libraries/threadpool/boost/threadpool/detail/lockin0000644000175000017500000000405011644340035032315 0ustar dandan/*! \file * \brief The locking_ptr is smart pointer with a scoped locking mechanism. * * The class is a wrapper for a volatile pointer. It enables synchronized access to the * internal pointer by locking the passed mutex. * locking_ptr is based on Andrei Alexandrescu's LockingPtr. For more information * see article "volatile - Multithreaded Programmer's Best Friend" by A. Alexandrescu. * * * Copyright (c) 2005-2007 Philipp Henkel * * Use, modification, and distribution are subject to the * Boost Software License, Version 1.0. (See accompanying file * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) * * http://threadpool.sourceforge.net * */ #ifndef THREADPOOL_DETAIL_LOCKING_PTR_HPP_INCLUDED #define THREADPOOL_DETAIL_LOCKING_PTR_HPP_INCLUDED #include #include namespace boost { namespace threadpool { namespace detail { /*! \brief Smart pointer with a scoped locking mechanism. * * This class is a wrapper for a volatile pointer. It enables synchronized access to the * internal pointer by locking the passed mutex. */ template class locking_ptr : private noncopyable { T* m_obj; //!< The instance pointer. Mutex & m_mutex; //!< Mutex is used for scoped locking. public: /// Constructor. locking_ptr(volatile T& obj, const volatile Mutex& mtx) : m_obj(const_cast(&obj)) , m_mutex(*const_cast(&mtx)) { // Lock mutex m_mutex.lock(); } /// Destructor. ~locking_ptr() { // Unlock mutex m_mutex.unlock(); } /*! Returns a reference to the stored instance. * \return The instance's reference. */ T& operator*() const { return *m_obj; } /*! Returns a pointer to the stored instance. * \return The instance's pointer. */ T* operator->() const { return m_obj; } }; } } } // namespace boost::threadpool::detail #endif // THREADPOOL_DETAIL_LOCKING_PTR_HPP_INCLUDED ././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/threadpool/boost/threadpool/detail/future.hppSuperCollider-3.6.3-Source-linux~repack/external_libraries/threadpool/boost/threadpool/detail/future0000644000175000017500000001056111644340035032354 0ustar dandan/*! \file * \brief TODO. * * TODO. * * Copyright (c) 2005-2007 Philipp Henkel * * Use, modification, and distribution are subject to the * Boost Software License, Version 1.0. (See accompanying file * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) * * http://threadpool.sourceforge.net * */ #ifndef THREADPOOL_DETAIL_FUTURE_IMPL_HPP_INCLUDED #define THREADPOOL_DETAIL_FUTURE_IMPL_HPP_INCLUDED #include "locking_ptr.hpp" #include #include #include #include #include #include #include #include namespace boost { namespace threadpool { namespace detail { template class future_impl { public: typedef Result const & result_type; //!< Indicates the functor's result type. typedef Result future_result_type; //!< Indicates the future's result type. typedef future_impl future_type; private: volatile bool m_ready; volatile future_result_type m_result; mutable mutex m_monitor; mutable condition m_condition_ready; volatile bool m_is_cancelled; volatile bool m_executing; public: public: future_impl() : m_ready(false) , m_is_cancelled(false) { } bool ready() const volatile { return m_ready; } void wait() const volatile { const future_type* self = const_cast(this); mutex::scoped_lock lock(self->m_monitor); while(!m_ready) { self->m_condition_ready.wait(lock); } } bool timed_wait(boost::xtime const & timestamp) const { const future_type* self = const_cast(this); mutex::scoped_lock lock(self->m_monitor); while(!m_ready) { if(!self->m_condition_ready.timed_wait(lock, timestamp)) return false; } return true; } result_type operator()() const volatile { wait(); /* if( throw_exception_ != 0 ) { throw_exception_( this ); } */ return *(const_cast(&m_result)); } void set_value(future_result_type const & r) volatile { locking_ptr lockedThis(*this, m_monitor); if(!m_ready && !m_is_cancelled) { lockedThis->m_result = r; lockedThis->m_ready = true; lockedThis->m_condition_ready.notify_all(); } } /* template void set_exception() // throw() { m_impl->template set_exception(); } template void set_exception( char const * what ) // throw() { m_impl->template set_exception( what ); } */ bool cancel() volatile { if(!m_ready || m_executing) { m_is_cancelled = true; return true; } else { return false; } } bool is_cancelled() const volatile { return m_is_cancelled; } void set_execution_status(bool executing) volatile { m_executing = executing; } }; template< template class Future, typename Function > class future_impl_task_func { public: typedef void result_type; //!< Indicates the functor's result type. typedef Function function_type; //!< Indicates the function's type. typedef typename result_of::type future_result_type; //!< Indicates the future's result type. typedef Future future_type; //!< Indicates the future's type. // The task is required to be a nullary function. BOOST_STATIC_ASSERT(function_traits::arity == 0); // The task function's result type is required not to be void. BOOST_STATIC_ASSERT(!is_void::value); private: function_type m_function; shared_ptr m_future; public: future_impl_task_func(function_type const & function, shared_ptr const & future) : m_function(function) , m_future(future) { } void operator()() { if(m_function) { m_future->set_execution_status(true); if(!m_future->is_cancelled()) { // TODO future exeception handling m_future->set_value(m_function()); } m_future->set_execution_status(false); // TODO consider exceptions } } }; } } } // namespace boost::threadpool::detail #endif // THREADPOOL_DETAIL_FUTURE_IMPL_HPP_INCLUDED ././@LongLink0000000000000000000000000000015400000000000011565 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/threadpool/boost/threadpool/detail/pool_core.hppSuperCollider-3.6.3-Source-linux~repack/external_libraries/threadpool/boost/threadpool/detail/pool_c0000644000175000017500000003315011644340035032314 0ustar dandan/*! \file * \brief Thread pool core. * * This file contains the threadpool's core class: pool. * * Thread pools are a mechanism for asynchronous and parallel processing * within the same process. The pool class provides a convenient way * for dispatching asynchronous tasks as functions objects. The scheduling * of these tasks can be easily controlled by using customized schedulers. * * Copyright (c) 2005-2007 Philipp Henkel * * Use, modification, and distribution are subject to the * Boost Software License, Version 1.0. (See accompanying file * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) * * http://threadpool.sourceforge.net * */ #ifndef THREADPOOL_POOL_CORE_HPP_INCLUDED #define THREADPOOL_POOL_CORE_HPP_INCLUDED #include "locking_ptr.hpp" #include "worker_thread.hpp" #include "../task_adaptors.hpp" #include #include #include #include #include #include #include #include #include /// The namespace threadpool contains a thread pool and related utility classes. namespace boost { namespace threadpool { namespace detail { /*! \brief Thread pool. * * Thread pools are a mechanism for asynchronous and parallel processing * within the same process. The pool class provides a convenient way * for dispatching asynchronous tasks as functions objects. The scheduling * of these tasks can be easily controlled by using customized schedulers. * A task must not throw an exception. * * A pool_impl is DefaultConstructible and NonCopyable. * * \param Task A function object which implements the operator 'void operator() (void) const'. The operator () is called by the pool to execute the task. Exceptions are ignored. * \param Scheduler A task container which determines how tasks are scheduled. It is guaranteed that this container is accessed only by one thread at a time. The scheduler shall not throw exceptions. * * \remarks The pool class is thread-safe. * * \see Tasks: task_func, prio_task_func * \see Scheduling policies: fifo_scheduler, lifo_scheduler, prio_scheduler */ template < typename Task, template class SchedulingPolicy, template class SizePolicy, template class SizePolicyController, template class ShutdownPolicy > class pool_core : public enable_shared_from_this< pool_core > , private noncopyable { public: // Type definitions typedef Task task_type; //!< Indicates the task's type. typedef SchedulingPolicy scheduler_type; //!< Indicates the scheduler's type. typedef pool_core pool_type; //!< Indicates the thread pool's type. typedef SizePolicy size_policy_type; //!< Indicates the sizer's type. //typedef typename size_policy_type::size_controller size_controller_type; typedef SizePolicyController size_controller_type; // typedef SizePolicy::size_controller size_controller_type; typedef ShutdownPolicy shutdown_policy_type;//!< Indicates the shutdown policy's type. typedef worker_thread worker_type; // The task is required to be a nullary function. BOOST_STATIC_ASSERT(function_traits::arity == 0); // The task function's result type is required to be void. BOOST_STATIC_ASSERT(is_void::type >::value); private: // Friends friend class worker_thread; #if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x580) // Tested with CC: Sun C++ 5.8 Patch 121018-08 2006/12/06 friend class SizePolicy; friend class ShutdownPolicy; #else friend class SizePolicy; friend class ShutdownPolicy; #endif private: // The following members may be accessed by _multiple_ threads at the same time: volatile size_t m_worker_count; volatile size_t m_target_worker_count; volatile size_t m_active_worker_count; private: // The following members are accessed only by _one_ thread at the same time: scheduler_type m_scheduler; scoped_ptr m_size_policy; // is never null bool m_terminate_all_workers; // Indicates if termination of all workers was triggered. std::vector > m_terminated_workers; // List of workers which are terminated but not fully destructed. private: // The following members are implemented thread-safe: mutable recursive_mutex m_monitor; mutable condition m_worker_idle_or_terminated_event; // A worker is idle or was terminated. mutable condition m_task_or_terminate_workers_event; // Task is available OR total worker count should be reduced. public: /// Constructor. pool_core() : m_worker_count(0) , m_target_worker_count(0) , m_active_worker_count(0) , m_terminate_all_workers(false) { pool_type volatile & self_ref = *this; m_size_policy.reset(new size_policy_type(self_ref)); m_scheduler.clear(); } /// Destructor. ~pool_core() { } /*! Gets the size controller which manages the number of threads in the pool. * \return The size controller. * \see SizePolicy */ size_controller_type size_controller() { return size_controller_type(*m_size_policy, this->shared_from_this()); } /*! Gets the number of threads in the pool. * \return The number of threads. */ size_t size() const volatile { return m_worker_count; } // TODO is only called once void shutdown() { ShutdownPolicy::shutdown(*this); } /*! Schedules a task for asynchronous execution. The task will be executed once only. * \param task The task function object. It should not throw execeptions. * \return true, if the task could be scheduled and false otherwise. */ bool schedule(task_type const & task) volatile { locking_ptr lockedThis(*this, m_monitor); if(lockedThis->m_scheduler.push(task)) { lockedThis->m_task_or_terminate_workers_event.notify_one(); return true; } else { return false; } } /*! Returns the number of tasks which are currently executed. * \return The number of active tasks. */ size_t active() const volatile { return m_active_worker_count; } /*! Returns the number of tasks which are ready for execution. * \return The number of pending tasks. */ size_t pending() const volatile { locking_ptr lockedThis(*this, m_monitor); return lockedThis->m_scheduler.size(); } /*! Removes all pending tasks from the pool's scheduler. */ void clear() volatile { locking_ptr lockedThis(*this, m_monitor); lockedThis->m_scheduler.clear(); } /*! Indicates that there are no tasks pending. * \return true if there are no tasks ready for execution. * \remarks This function is more efficient that the check 'pending() == 0'. */ bool empty() const volatile { locking_ptr lockedThis(*this, m_monitor); return lockedThis->m_scheduler.empty(); } /*! The current thread of execution is blocked until the sum of all active * and pending tasks is equal or less than a given threshold. * \param task_threshold The maximum number of tasks in pool and scheduler. */ void wait(size_t const task_threshold = 0) const volatile { const pool_type* self = const_cast(this); recursive_mutex::scoped_lock lock(self->m_monitor); if(0 == task_threshold) { while(0 != self->m_active_worker_count || !self->m_scheduler.empty()) { self->m_worker_idle_or_terminated_event.wait(lock); } } else { while(task_threshold < self->m_active_worker_count + self->m_scheduler.size()) { self->m_worker_idle_or_terminated_event.wait(lock); } } } /*! The current thread of execution is blocked until the timestamp is met * or the sum of all active and pending tasks is equal or less * than a given threshold. * \param timestamp The time when function returns at the latest. * \param task_threshold The maximum number of tasks in pool and scheduler. * \return true if the task sum is equal or less than the threshold, false otherwise. */ bool wait(xtime const & timestamp, size_t const task_threshold = 0) const volatile { const pool_type* self = const_cast(this); recursive_mutex::scoped_lock lock(self->m_monitor); if(0 == task_threshold) { while(0 != self->m_active_worker_count || !self->m_scheduler.empty()) { if(!self->m_worker_idle_or_terminated_event.timed_wait(lock, timestamp)) return false; } } else { while(task_threshold < self->m_active_worker_count + self->m_scheduler.size()) { if(!self->m_worker_idle_or_terminated_event.timed_wait(lock, timestamp)) return false; } } return true; } private: void terminate_all_workers(bool const wait) volatile { pool_type* self = const_cast(this); recursive_mutex::scoped_lock lock(self->m_monitor); self->m_terminate_all_workers = true; m_target_worker_count = 0; self->m_task_or_terminate_workers_event.notify_all(); if(wait) { while(m_active_worker_count > 0) { self->m_worker_idle_or_terminated_event.wait(lock); } for(typename std::vector >::iterator it = self->m_terminated_workers.begin(); it != self->m_terminated_workers.end(); ++it) { (*it)->join(); } self->m_terminated_workers.clear(); } } /*! Changes the number of worker threads in the pool. The resizing * is handled by the SizePolicy. * \param threads The new number of worker threads. * \return true, if pool will be resized and false if not. */ bool resize(size_t const worker_count) volatile { locking_ptr lockedThis(*this, m_monitor); if(!m_terminate_all_workers) { m_target_worker_count = worker_count; } else { return false; } if(m_worker_count <= m_target_worker_count) { // increase worker count while(m_worker_count < m_target_worker_count) { try { worker_thread::create_and_attach(lockedThis->shared_from_this()); m_worker_count++; m_active_worker_count++; } catch(thread_resource_error) { return false; } } } else { // decrease worker count lockedThis->m_task_or_terminate_workers_event.notify_all(); // TODO: Optimize number of notified workers } return true; } // worker died with unhandled exception void worker_died_unexpectedly(shared_ptr worker) volatile { locking_ptr lockedThis(*this, m_monitor); m_worker_count--; m_active_worker_count--; lockedThis->m_worker_idle_or_terminated_event.notify_all(); if(m_terminate_all_workers) { lockedThis->m_terminated_workers.push_back(worker); } else { lockedThis->m_size_policy->worker_died_unexpectedly(m_worker_count); } } void worker_destructed(shared_ptr worker) volatile { locking_ptr lockedThis(*this, m_monitor); m_worker_count--; m_active_worker_count--; lockedThis->m_worker_idle_or_terminated_event.notify_all(); if(m_terminate_all_workers) { lockedThis->m_terminated_workers.push_back(worker); } } bool execute_task() volatile { function0 task; { // fetch task pool_type* lockedThis = const_cast(this); recursive_mutex::scoped_lock lock(lockedThis->m_monitor); // decrease number of threads if necessary if(m_worker_count > m_target_worker_count) { return false; // terminate worker } // wait for tasks while(lockedThis->m_scheduler.empty()) { // decrease number of workers if necessary if(m_worker_count > m_target_worker_count) { return false; // terminate worker } else { m_active_worker_count--; lockedThis->m_worker_idle_or_terminated_event.notify_all(); lockedThis->m_task_or_terminate_workers_event.wait(lock); m_active_worker_count++; } } task = lockedThis->m_scheduler.top(); lockedThis->m_scheduler.pop(); } // call task function if(task) { task(); } //guard->disable(); return true; } }; } } } // namespace boost::threadpool::detail #endif // THREADPOOL_POOL_CORE_HPP_INCLUDED SuperCollider-3.6.3-Source-linux~repack/external_libraries/threadpool/boost/threadpool/future.hpp0000644000175000017500000000513111644340035031675 0ustar dandan/*! \file * \brief TODO. * * TODO. * * Copyright (c) 2005-2007 Philipp Henkel * * Use, modification, and distribution are subject to the * Boost Software License, Version 1.0. (See accompanying file * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) * * http://threadpool.sourceforge.net * */ #ifndef THREADPOOL_FUTURE_HPP_INCLUDED #define THREADPOOL_FUTURE_HPP_INCLUDED #include "./detail/future.hpp" #include //#include "pool.hpp" //#include //#include namespace boost { namespace threadpool { /*! \brief Experimental. Do not use in production code. TODO. * * TODO Future * * \see TODO * */ template class future { private: shared_ptr > m_impl; public: typedef Result const & result_type; //!< Indicates the functor's result type. typedef Result future_result_type; //!< Indicates the future's result type. public: future() : m_impl(new detail::future_impl()) // TODO remove this { } // only for internal usage future(shared_ptr > const & impl) : m_impl(impl) { } bool ready() const { return m_impl->ready(); } void wait() const { m_impl->wait(); } bool timed_wait(boost::xtime const & timestamp) const { return m_impl->timed_wait(timestamp); } result_type operator()() // throw( thread::cancelation_exception, ... ) { return (*m_impl)(); } result_type get() // throw( thread::cancelation_exception, ... ) { return (*m_impl)(); } bool cancel() { return m_impl->cancel(); } bool is_cancelled() const { return m_impl->is_cancelled(); } }; template typename disable_if < is_void< typename result_of< Function() >::type >, future< typename result_of< Function() >::type > >::type schedule(Pool& pool, const Function& task) { typedef typename result_of< Function() >::type future_result_type; // create future impl and future shared_ptr > impl(new detail::future_impl); future res(impl); // schedule future impl pool.schedule(detail::future_impl_task_func(task, impl)); // return future return res; /* TODO if(pool->schedule(bind(&Future::run, future))) { return future; } else { // construct empty future return error_future; } */ } } } // namespace boost::threadpool #endif // THREADPOOL_FUTURE_HPP_INCLUDED ././@LongLink0000000000000000000000000000015700000000000011570 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/threadpool/boost/threadpool/scheduling_policies.hppSuperCollider-3.6.3-Source-linux~repack/external_libraries/threadpool/boost/threadpool/scheduling_po0000644000175000017500000001462611644340035032431 0ustar dandan/*! \file * \brief Task scheduling policies. * * This file contains some fundamental scheduling policies for the pool class. * A scheduling policy is realized by a task container which controls the access to * the tasks. Fundamentally the container determines the order the tasks are processed * by the thread pool. * The task containers need not to be thread-safe because they are used by the pool * in thread-safe way. * * Copyright (c) 2005-2007 Philipp Henkel * * Use, modification, and distribution are subject to the * Boost Software License, Version 1.0. (See accompanying file * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) * * http://threadpool.sourceforge.net * */ #ifndef THREADPOOL_SCHEDULING_POLICIES_HPP_INCLUDED #define THREADPOOL_SCHEDULING_POLICIES_HPP_INCLUDED #include #include #include "task_adaptors.hpp" namespace boost { namespace threadpool { /*! \brief SchedulingPolicy which implements FIFO ordering. * * This container implements a FIFO scheduling policy. * The first task to be added to the scheduler will be the first to be removed. * The processing proceeds sequentially in the same order. * FIFO stands for "first in, first out". * * \param Task A function object which implements the operator()(void). * */ template class fifo_scheduler { public: typedef Task task_type; //!< Indicates the scheduler's task type. protected: std::deque m_container; //!< Internal task container. public: /*! Adds a new task to the scheduler. * \param task The task object. * \return true, if the task could be scheduled and false otherwise. */ bool push(task_type const & task) { m_container.push_back(task); return true; } /*! Removes the task which should be executed next. */ void pop() { m_container.pop_front(); } /*! Gets the task which should be executed next. * \return The task object to be executed. */ task_type const & top() const { return m_container.front(); } /*! Gets the current number of tasks in the scheduler. * \return The number of tasks. * \remarks Prefer empty() to size() == 0 to check if the scheduler is empty. */ size_t size() const { return m_container.size(); } /*! Checks if the scheduler is empty. * \return true if the scheduler contains no tasks, false otherwise. * \remarks Is more efficient than size() == 0. */ bool empty() const { return m_container.empty(); } /*! Removes all tasks from the scheduler. */ void clear() { m_container.clear(); } }; /*! \brief SchedulingPolicy which implements LIFO ordering. * * This container implements a LIFO scheduling policy. * The last task to be added to the scheduler will be the first to be removed. * LIFO stands for "last in, first out". * * \param Task A function object which implements the operator()(void). * */ template class lifo_scheduler { public: typedef Task task_type; //!< Indicates the scheduler's task type. protected: std::deque m_container; //!< Internal task container. public: /*! Adds a new task to the scheduler. * \param task The task object. * \return true, if the task could be scheduled and false otherwise. */ bool push(task_type const & task) { m_container.push_front(task); return true; } /*! Removes the task which should be executed next. */ void pop() { m_container.pop_front(); } /*! Gets the task which should be executed next. * \return The task object to be executed. */ task_type const & top() const { return m_container.front(); } /*! Gets the current number of tasks in the scheduler. * \return The number of tasks. * \remarks Prefer empty() to size() == 0 to check if the scheduler is empty. */ size_t size() const { return m_container.size(); } /*! Checks if the scheduler is empty. * \return true if the scheduler contains no tasks, false otherwise. * \remarks Is more efficient than size() == 0. */ bool empty() const { return m_container.empty(); } /*! Removes all tasks from the scheduler. */ void clear() { m_container.clear(); } }; /*! \brief SchedulingPolicy which implements prioritized ordering. * * This container implements a scheduling policy based on task priorities. * The task with highest priority will be the first to be removed. * It must be possible to compare two tasks using operator<. * * \param Task A function object which implements the operator() and operator<. operator< must be a partial ordering. * * \see prio_thread_func * */ template class prio_scheduler { public: typedef Task task_type; //!< Indicates the scheduler's task type. protected: std::priority_queue m_container; //!< Internal task container. public: /*! Adds a new task to the scheduler. * \param task The task object. * \return true, if the task could be scheduled and false otherwise. */ bool push(task_type const & task) { m_container.push(task); return true; } /*! Removes the task which should be executed next. */ void pop() { m_container.pop(); } /*! Gets the task which should be executed next. * \return The task object to be executed. */ task_type const & top() const { return m_container.top(); } /*! Gets the current number of tasks in the scheduler. * \return The number of tasks. * \remarks Prefer empty() to size() == 0 to check if the scheduler is empty. */ size_t size() const { return m_container.size(); } /*! Checks if the scheduler is empty. * \return true if the scheduler contains no tasks, false otherwise. * \remarks Is more efficient than size() == 0. */ bool empty() const { return m_container.empty(); } /*! Removes all tasks from the scheduler. */ void clear() { while(!m_container.empty()) { m_container.pop(); } } }; } } // namespace boost::threadpool #endif // THREADPOOL_SCHEDULING_POLICIES_HPP_INCLUDED ././@LongLink0000000000000000000000000000015500000000000011566 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/threadpool/boost/threadpool/shutdown_policies.hppSuperCollider-3.6.3-Source-linux~repack/external_libraries/threadpool/boost/threadpool/shutdown_poli0000644000175000017500000000364511644340035032503 0ustar dandan/*! \file * \brief Shutdown policies. * * This file contains shutdown policies for thread_pool. * A shutdown policy controls the pool's behavior from the time * when the pool is not referenced any longer. * * Copyright (c) 2005-2007 Philipp Henkel * * Use, modification, and distribution are subject to the * Boost Software License, Version 1.0. (See accompanying file * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) * * http://threadpool.sourceforge.net * */ #ifndef THREADPOOL_SHUTDOWN_POLICIES_HPP_INCLUDED #define THREADPOOL_SHUTDOWN_POLICIES_HPP_INCLUDED /// The namespace threadpool contains a thread pool and related utility classes. namespace boost { namespace threadpool { /*! \brief ShutdownPolicy which waits for the completion of all tasks * and the worker termination afterwards. * * \param Pool The pool's core type. */ template class wait_for_all_tasks { public: static void shutdown(Pool& pool) { pool.wait(); pool.terminate_all_workers(true); } }; /*! \brief ShutdownPolicy which waits for the completion of all active tasks * and the worker termination afterwards. * * \param Pool The pool's core type. */ template class wait_for_active_tasks { public: static void shutdown(Pool& pool) { pool.clear(); pool.wait(); pool.terminate_all_workers(true); } }; /*! \brief ShutdownPolicy which does not wait for any tasks or worker termination. * * This policy does not wait for any tasks. Nevertheless all active tasks will be processed completely. * * \param Pool The pool's core type. */ template class immediately { public: static void shutdown(Pool& pool) { pool.clear(); pool.terminate_all_workers(false); } }; } } // namespace boost::threadpool #endif // THREADPOOL_SHUTDOWN_POLICIES_HPP_INCLUDED SuperCollider-3.6.3-Source-linux~repack/external_libraries/threadpool/boost/threadpool/pool.hpp0000644000175000017500000001672011644340035031342 0ustar dandan/*! \file * \brief Thread pool core. * * This file contains the threadpool's core class: pool. * * Thread pools are a mechanism for asynchronous and parallel processing * within the same process. The pool class provides a convenient way * for dispatching asynchronous tasks as functions objects. The scheduling * of these tasks can be easily controlled by using customized schedulers. * * Copyright (c) 2005-2007 Philipp Henkel * * Use, modification, and distribution are subject to the * Boost Software License, Version 1.0. (See accompanying file * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) * * http://threadpool.sourceforge.net * */ #ifndef THREADPOOL_POOL_HPP_INCLUDED #define THREADPOOL_POOL_HPP_INCLUDED #include #include "./detail/pool_core.hpp" #include "task_adaptors.hpp" #include "./detail/locking_ptr.hpp" #include "scheduling_policies.hpp" #include "size_policies.hpp" #include "shutdown_policies.hpp" /// The namespace threadpool contains a thread pool and related utility classes. namespace boost { namespace threadpool { /*! \brief Thread pool. * * Thread pools are a mechanism for asynchronous and parallel processing * within the same process. The pool class provides a convenient way * for dispatching asynchronous tasks as functions objects. The scheduling * of these tasks can be easily controlled by using customized schedulers. * A task must not throw an exception. * * A pool is DefaultConstructible, CopyConstructible and Assignable. * It has reference semantics; all copies of the same pool are equivalent and interchangeable. * All operations on a pool except assignment are strongly thread safe or sequentially consistent; * that is, the behavior of concurrent calls is as if the calls have been issued sequentially in an unspecified order. * * \param Task A function object which implements the operator 'void operator() (void) const'. The operator () is called by the pool to execute the task. Exceptions are ignored. * \param SchedulingPolicy A task container which determines how tasks are scheduled. It is guaranteed that this container is accessed only by one thread at a time. The scheduler shall not throw exceptions. * * \remarks The pool class is thread-safe. * * \see Tasks: task_func, prio_task_func * \see Scheduling policies: fifo_scheduler, lifo_scheduler, prio_scheduler */ template < typename Task = task_func, template class SchedulingPolicy = fifo_scheduler, template class SizePolicy = static_size, template class SizePolicyController = resize_controller, template class ShutdownPolicy = wait_for_all_tasks > class thread_pool { typedef detail::pool_core pool_core_type; shared_ptr m_core; // pimpl idiom shared_ptr m_shutdown_controller; // If the last pool holding a pointer to the core is deleted the controller shuts the pool down. public: // Type definitions typedef Task task_type; //!< Indicates the task's type. typedef SchedulingPolicy scheduler_type; //!< Indicates the scheduler's type. /* typedef thread_pool pool_type; //!< Indicates the thread pool's type. */ typedef SizePolicy size_policy_type; typedef SizePolicyController size_controller_type; public: /*! Constructor. * \param initial_threads The pool is immediately resized to set the specified number of threads. The pool's actual number threads depends on the SizePolicy. */ thread_pool(size_t initial_threads = 0) : m_core(new pool_core_type) , m_shutdown_controller(static_cast(0), bind(&pool_core_type::shutdown, m_core)) { size_policy_type::init(*m_core, initial_threads); } /*! Gets the size controller which manages the number of threads in the pool. * \return The size controller. * \see SizePolicy */ size_controller_type size_controller() { return m_core->size_controller(); } /*! Gets the number of threads in the pool. * \return The number of threads. */ size_t size() const { return m_core->size(); } /*! Schedules a task for asynchronous execution. The task will be executed once only. * \param task The task function object. It should not throw execeptions. * \return true, if the task could be scheduled and false otherwise. */ bool schedule(task_type const & task) { return m_core->schedule(task); } /*! Returns the number of tasks which are currently executed. * \return The number of active tasks. */ size_t active() const { return m_core->active(); } /*! Returns the number of tasks which are ready for execution. * \return The number of pending tasks. */ size_t pending() const { return m_core->pending(); } /*! Removes all pending tasks from the pool's scheduler. */ void clear() { m_core->clear(); } /*! Indicates that there are no tasks pending. * \return true if there are no tasks ready for execution. * \remarks This function is more efficient that the check 'pending() == 0'. */ bool empty() const { return m_core->empty(); } /*! The current thread of execution is blocked until the sum of all active * and pending tasks is equal or less than a given threshold. * \param task_threshold The maximum number of tasks in pool and scheduler. */ void wait(size_t task_threshold = 0) const { m_core->wait(task_threshold); } /*! The current thread of execution is blocked until the timestamp is met * or the sum of all active and pending tasks is equal or less * than a given threshold. * \param timestamp The time when function returns at the latest. * \param task_threshold The maximum number of tasks in pool and scheduler. * \return true if the task sum is equal or less than the threshold, false otherwise. */ bool wait(xtime const & timestamp, size_t task_threshold = 0) const { return m_core->wait(timestamp, task_threshold); } }; /*! \brief Fifo pool. * * The pool's tasks are fifo scheduled task_func functors. * */ typedef thread_pool fifo_pool; /*! \brief Lifo pool. * * The pool's tasks are lifo scheduled task_func functors. * */ typedef thread_pool lifo_pool; /*! \brief Pool for prioritized task. * * The pool's tasks are prioritized prio_task_func functors. * */ typedef thread_pool prio_pool; /*! \brief A standard pool. * * The pool's tasks are fifo scheduled task_func functors. * */ typedef fifo_pool pool; } } // namespace boost::threadpool #endif // THREADPOOL_POOL_HPP_INCLUDED SuperCollider-3.6.3-Source-linux~repack/external_libraries/threadpool/boost/threadpool.hpp0000644000175000017500000000122711644340035030365 0ustar dandan/*! \file * \brief Main include. * * This is the only file you have to include in order to use the * complete threadpool library. * * Copyright (c) 2005-2007 Philipp Henkel * * Use, modification, and distribution are subject to the * Boost Software License, Version 1.0. (See accompanying file * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) * * http://threadpool.sourceforge.net * */ #ifndef THREADPOOL_HPP_INCLUDED #define THREADPOOL_HPP_INCLUDED #include "./threadpool/future.hpp" #include "./threadpool/pool.hpp" #include "./threadpool/pool_adaptors.hpp" #include "./threadpool/task_adaptors.hpp" #endif // THREADPOOL_HPP_INCLUDED SuperCollider-3.6.3-Source-linux~repack/external_libraries/threadpool/LICENSE_1_0.txt0000644000175000017500000000247211644340035026652 0ustar dandanBoost Software License - Version 1.0 - August 17th, 2003 Permission is hereby granted, free of charge, to any person or organization obtaining a copy of the software and accompanying documentation covered by this license (the "Software") to use, reproduce, display, distribute, execute, and transmit the Software, and to prepare derivative works of the Software, and to permit third-parties to whom the Software is furnished to do so, all subject to the following: The copyright notices in the Software and this entire statement, including the above license grant, this restriction and the following disclaimer, must be included in all copies of the Software, in whole or in part, and all derivative works of the Software, unless such copies or derivative works are solely in the form of machine-executable object code generated by a source language processor. 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, TITLE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. SuperCollider-3.6.3-Source-linux~repack/external_libraries/TLSF-2.4.6/0000775000175000017500000000000012110505246023435 5ustar dandanSuperCollider-3.6.3-Source-linux~repack/external_libraries/TLSF-2.4.6/LGPL-2.1.txt0000644000175000017500000006363711562456103025256 0ustar dandan GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! SuperCollider-3.6.3-Source-linux~repack/external_libraries/TLSF-2.4.6/COPYING0000644000175000017500000000243311562456103024477 0ustar dandan LICENSE INFORMATION TLSF is released as LGPL and GPL. A copy of both licences can be found in this directoy. For the GPL licence, the following exception applies. TLSF is free software; you can redistribute it and/or modify it under terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. TLSF is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with TLSF; see file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. As a special exception, including TLSF header files in a file, or linking with other files objects to produce an executable application, is merely considered normal use of the library, and does *not* fall under the heading of "derived work". Therfore does not by itself cause the resulting executable application to be covered by the GNU General Public License. This exception does not however invalidate any other reasons why the executable file might be covered by the GNU Public License. SuperCollider-3.6.3-Source-linux~repack/external_libraries/TLSF-2.4.6/README0000644000175000017500000001015411562456103024323 0ustar dandan TLSF Memory Storage allocator implementation. Version 2.4.6 Sept 2009 Authors: Miguel Masmano, Ismael Ripoll & Alfons Crespo. Copyright UPVLC, OCERA Consortium. TLSF is released in the GPL/LGPL licence. The exact terms of the licence are described in the COPYING file. This component provides basic memory allocation functions: malloc and free, as defined in the standard "C" library. This allocator was designed to provide real-time performance, that is: 1.- Bounded time malloc and free. 2.- Fast response time. 3.- Efficient memory management, that is low fragmentation. The worst response time for both malloc and free is O(1). How to use it: This code is prepared to be used as a stand-alone code that can be linked with a regular application or it can be compiled to be a Linux module (which required the BigPhysicalArea patch). Initially the module was designed to work jointly with RTLinux-GPL, but it can be used as a stand alone Linux module. When compiled as a regular linux process the API is: Initialisation and destruction functions ---------------------------------------- init_memory_pool may be called before any request or release call: - size_t init_memory_pool(size_t, void *); - void destroy_memory_pool(void *); Request and release functions ----------------------------- As can be seen, there are two functions for each traditional memory allocation function (malloc, free, realloc, and calloc). One with the prefix "tlsf_" and the other with the suffix "_ex". The versions with the prefix "tlsf_" provides the expected behaviour, that is, allocating/releasing memory from the default memory pool. The default memory pool is the last pool initialised by the init_memory_pool function. On the other hand, the functions with the prefix "_ex" enable the use of several memory pools. - void *tlsf_malloc(size_t); - void *malloc_ex(size_t, void *); - void tlsf_free(void *ptr); - void free_ex(void *, void *); - void *tlsf_realloc(void *ptr, size_t size); - void *realloc_ex(void *, size_t, void *); - void *tlsf_calloc(size_t nelem, size_t elem_size); - void *calloc_ex(size_t, size_t, void *); EXAMPLE OF USE: char memory_pool[1024*1024]; { ... init_memory_pool(1024*1024, memory_pool); ... ptr1=malloc_ex(100, memory_pool); ptr2=tlsf_malloc(100); // This function will use memory_pool ... tlsf_free(ptr2); free_ex(ptr1, memory_pool); } Growing the memory pool ----------------------- Starting from the version 2.4, the function add_new_area adds an memory area to an existing memory pool. - size_t add_new_area(void *, size_t, void *); This feature is pretty useful when an existing memory pool is running low and we want to add more free memory to it. EXAMPLE OF USE: char memory_pool[1024*1024]; char memory_pool2[1024*1024]; { ... init_memory_pool(1024*1024, memory_pool); ... ptr[0]=malloc_ex(1024*256 memory_pool); ptr[1]=malloc_ex(1024*512, memory_pool); add_new_area(memory_pool2, 1024*1024, memory_pool); // Now we have an extra free memory area of 1Mb // The next malloc may not fail ptr[2]=malloc_ex(1024*512, memory_pool); ... } SBRK and MMAP support --------------------- The version 2.4 can use the functions SBRK and MMAP to _automatically_ growing the memory pool, before running out of memory. So, when this feature is enabled, unless the operating system were out of memory, a malloc operation would not fail due to an "out-of-memory" error. To enable this support, compile tlsf.c with the FLAGS -DUSE_MMAP=1 or -DUSE_SBRK=1 depending on whether you want to use "mmap" or "sbrk" or both. ** By default (default Makefile) this feature is enabled. EXAMPLE OF USE: gcc -o tlsf.o -O2 -Wall -DUSE_MMAP=1 -DUSE_SBRK=1 --- If the sbrk/mmap support is enabled and we are _only_ going to use one memory pool, it is not necessary to call init_memory_pool EXAMPLE OF USE (with MMAP/SBRK support enabled): { ... ptr2=tlsf_malloc(100); // This function will use memory_pool ... tlsf_free(ptr2); } This work has been supported by the followin projects: EUROPEAN: IST-2001-35102(OCERA) http://www.ocera.org. SPANISH: TIN2005-08665-C3-03 SuperCollider-3.6.3-Source-linux~repack/external_libraries/TLSF-2.4.6/TODO0000644000175000017500000000044211562456103024132 0ustar dandanTo do list ========== * Add mmap/sbrk support (DONE - V2.4). * TLSF rounds-up request size to the head of a free list. It has been shown to be a good policy for small blocks (<2048). But for larger blocks this policy may cause excesive fragmentation. A deeper analisys should be done. SuperCollider-3.6.3-Source-linux~repack/external_libraries/TLSF-2.4.6/GPL.txt0000644000175000017500000003544511562456103024640 0ustar dandan GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS SuperCollider-3.6.3-Source-linux~repack/external_libraries/TLSF-2.4.6/src/0000775000175000017500000000000012110505246024224 5ustar dandanSuperCollider-3.6.3-Source-linux~repack/external_libraries/TLSF-2.4.6/src/tlsf.h0000644000175000017500000000224011562456103025350 0ustar dandan/* * Two Levels Segregate Fit memory allocator (TLSF) * Version 2.4.6 * * Written by Miguel Masmano Tello * * Thanks to Ismael Ripoll for his suggestions and reviews * * Copyright (C) 2008, 2007, 2006, 2005, 2004 * * This code is released using a dual license strategy: GPL/LGPL * You can choose the licence that better fits your requirements. * * Released under the terms of the GNU General Public License Version 2.0 * Released under the terms of the GNU Lesser General Public License Version 2.1 * */ #ifndef _TLSF_H_ #define _TLSF_H_ #include extern size_t init_memory_pool(size_t, void *); extern size_t get_used_size(void *); extern size_t get_max_size(void *); extern void destroy_memory_pool(void *); extern size_t add_new_area(void *, size_t, void *); extern void *malloc_ex(size_t, void *); extern void free_ex(void *, void *); extern void *realloc_ex(void *, size_t, void *); extern void *calloc_ex(size_t, size_t, void *); extern void *tlsf_malloc(size_t size); extern void tlsf_free(void *ptr); extern void *tlsf_realloc(void *ptr, size_t size); extern void *tlsf_calloc(size_t nelem, size_t elem_size); #endif SuperCollider-3.6.3-Source-linux~repack/external_libraries/TLSF-2.4.6/src/Makefile0000644000175000017500000000070011562456103025666 0ustar dandanWARNINGS = -Wextra -Wall -Wwrite-strings -Wstrict-prototypes \ -Wmissing-prototypes -Wno-long-long -Wstrict-aliasing=2 CFLAGS+= -g -O2 -I$(TLSF_PATH) $(WARNINGS) CFLAGS+= -DTLSF_USE_LOCKS=1 CFLAGS+= -DUSE_MMAP=1 CFLAGS+= -DUSE_SBRK=1 # CFLAGS+=-ftest-coverage -fprofile-arcs CC=gcc all: tlsf.o tlsf.o: tlsf.h tlsf.c Makefile clean: $(RM) -rf *.o *~ *.c.gcov *.gcda *.gcno indent: indent -kr -l120 -br -ce -npsl -nut -i4 *.[hc] SuperCollider-3.6.3-Source-linux~repack/external_libraries/TLSF-2.4.6/src/tlsf.c0000664000175000017500000007335612110501517025353 0ustar dandan/* * Two Levels Segregate Fit memory allocator (TLSF) * Version 2.4.6 * * Written by Miguel Masmano Tello * * Thanks to Ismael Ripoll for his suggestions and reviews * * Copyright (C) 2008, 2007, 2006, 2005, 2004 * * This code is released using a dual license strategy: GPL/LGPL * You can choose the licence that better fits your requirements. * * Released under the terms of the GNU General Public License Version 2.0 * Released under the terms of the GNU Lesser General Public License Version 2.1 * */ /* * Code contributions: * * (Jul 28 2007) Herman ten Brugge : * * - Add 64 bit support. It now runs on x86_64 and solaris64. * - I also tested this on vxworks/32and solaris/32 and i386/32 processors. * - Remove assembly code. I could not measure any performance difference * on my core2 processor. This also makes the code more portable. * - Moved defines/typedefs from tlsf.h to tlsf.c * - Changed MIN_BLOCK_SIZE to sizeof (free_ptr_t) and BHDR_OVERHEAD to * (sizeof (bhdr_t) - MIN_BLOCK_SIZE). This does not change the fact * that the minumum size is still sizeof * (bhdr_t). * - Changed all C++ comment style to C style. (// -> /.* ... *./) * - Used ls_bit instead of ffs and ms_bit instead of fls. I did this to * avoid confusion with the standard ffs function which returns * different values. * - Created set_bit/clear_bit fuctions because they are not present * on x86_64. * - Added locking support + extra file target.h to show how to use it. * - Added get_used_size function (REMOVED in 2.4) * - Added rtl_realloc and rtl_calloc function * - Implemented realloc clever support. * - Added some test code in the example directory. * - Bug fixed (discovered by the rockbox project: www.rockbox.org). * * (Oct 23 2006) Adam Scislowicz: * * - Support for ARMv5 implemented * */ /*#define USE_SBRK (0) */ /*#define USE_MMAP (0) */ #ifndef USE_PRINTF #define USE_PRINTF (1) #endif #include #ifndef TLSF_USE_LOCKS #define TLSF_USE_LOCKS (0) #endif #ifndef TLSF_STATISTIC #define TLSF_STATISTIC (0) #endif #ifndef USE_MMAP #define USE_MMAP (0) #endif #ifndef USE_SBRK #define USE_SBRK (0) #endif #if TLSF_USE_LOCKS #include "target.h" #else #define TLSF_CREATE_LOCK(_unused_) do{}while(0) #define TLSF_DESTROY_LOCK(_unused_) do{}while(0) #define TLSF_ACQUIRE_LOCK(_unused_) do{}while(0) #define TLSF_RELEASE_LOCK(_unused_) do{}while(0) #endif #if TLSF_STATISTIC #define TLSF_ADD_SIZE(tlsf, b) do { \ tlsf->used_size += (b->size & BLOCK_SIZE) + BHDR_OVERHEAD; \ if (tlsf->used_size > tlsf->max_size) \ tlsf->max_size = tlsf->used_size; \ } while(0) #define TLSF_REMOVE_SIZE(tlsf, b) do { \ tlsf->used_size -= (b->size & BLOCK_SIZE) + BHDR_OVERHEAD; \ } while(0) #else #define TLSF_ADD_SIZE(tlsf, b) do{}while(0) #define TLSF_REMOVE_SIZE(tlsf, b) do{}while(0) #endif #if USE_MMAP || USE_SBRK #include #endif #if USE_MMAP #include #endif #include "tlsf.h" #if !defined(__GNUC__) #ifndef __inline__ #define __inline__ #endif #endif /* The debug functions only can be used when _DEBUG_TLSF_ is set. */ #ifndef _DEBUG_TLSF_ #define _DEBUG_TLSF_ (0) #endif /*************************************************************************/ /* Definition of the structures used by TLSF */ /* Some IMPORTANT TLSF parameters */ /* Unlike the preview TLSF versions, now they are statics */ #define BLOCK_ALIGN (sizeof(void *) * 2) // adapted for supercollider: align by 32 bytes, sufficient for avx instructions #undef BLOCK_ALIGN #define BLOCK_ALIGN 32 #define MAX_FLI (30) #define MAX_LOG2_SLI (5) #define MAX_SLI (1 << MAX_LOG2_SLI) /* MAX_SLI = 2^MAX_LOG2_SLI */ #define FLI_OFFSET (6) /* tlsf structure just will manage blocks bigger */ /* than 128 bytes */ #define SMALL_BLOCK (128) #define REAL_FLI (MAX_FLI - FLI_OFFSET) #define MIN_BLOCK_SIZE (sizeof (free_ptr_t)) #define BHDR_OVERHEAD (sizeof (bhdr_t) - MIN_BLOCK_SIZE) #define TLSF_SIGNATURE (0x2A59FA59) #define PTR_MASK (sizeof(void *) - 1) #define BLOCK_SIZE (0xFFFFFFFF - PTR_MASK) #define GET_NEXT_BLOCK(_addr, _r) ((bhdr_t *) ((char *) (_addr) + (_r))) #define MEM_ALIGN ((BLOCK_ALIGN) - 1) #define ROUNDUP_SIZE(_r) (((_r) + MEM_ALIGN) & ~MEM_ALIGN) #define ROUNDDOWN_SIZE(_r) ((_r) & ~MEM_ALIGN) #define ROUNDUP(_x, _v) ((((~(_x)) + 1) & ((_v)-1)) + (_x)) #define BLOCK_STATE (0x1) #define PREV_STATE (0x2) /* bit 0 of the block size */ #define FREE_BLOCK (0x1) #define USED_BLOCK (0x0) /* bit 1 of the block size */ #define PREV_FREE (0x2) #define PREV_USED (0x0) #define DEFAULT_AREA_SIZE (1024*10) #ifdef USE_MMAP #define PAGE_SIZE (getpagesize()) #endif #ifdef USE_PRINTF #include # define PRINT_MSG(fmt, args...) printf(fmt, ## args) # define ERROR_MSG(fmt, args...) printf(fmt, ## args) #else # if !defined(PRINT_MSG) # define PRINT_MSG(fmt, args...) # endif # if !defined(ERROR_MSG) # define ERROR_MSG(fmt, args...) # endif #endif typedef unsigned int u32_t; /* NOTE: Make sure that this type is 4 bytes long on your computer */ typedef unsigned char u8_t; /* NOTE: Make sure that this type is 1 byte on your computer */ typedef struct free_ptr_struct { struct bhdr_struct *prev; struct bhdr_struct *next; } free_ptr_t; typedef struct bhdr_struct { /* This pointer is just valid if the first bit of size is set */ struct bhdr_struct *prev_hdr; /* The size is stored in bytes */ size_t size; /* bit 0 indicates whether the block is used and */ /* bit 1 allows to know whether the previous block is free */ union { struct free_ptr_struct free_ptr; u8_t buffer[1]; /*sizeof(struct free_ptr_struct)]; */ } ptr; } bhdr_t; /* This structure is embedded at the beginning of each area, giving us * enough information to cope with a set of areas */ typedef struct area_info_struct { bhdr_t *end; struct area_info_struct *next; } area_info_t; typedef struct TLSF_struct { /* the TLSF's structure signature */ u32_t tlsf_signature; #if TLSF_USE_LOCKS TLSF_MLOCK_T lock; #endif #if TLSF_STATISTIC /* These can not be calculated outside tlsf because we * do not know the sizes when freeing/reallocing memory. */ size_t used_size; size_t max_size; #endif /* A linked list holding all the existing areas */ area_info_t *area_head; /* the first-level bitmap */ /* This array should have a size of REAL_FLI bits */ u32_t fl_bitmap; /* the second-level bitmap */ u32_t sl_bitmap[REAL_FLI]; bhdr_t *matrix[REAL_FLI][MAX_SLI]; } tlsf_t; /******************************************************************/ /************** Helping functions **************************/ /******************************************************************/ static __inline__ void set_bit(int nr, u32_t * addr); static __inline__ void clear_bit(int nr, u32_t * addr); static __inline__ int ls_bit(int x); static __inline__ int ms_bit(int x); static __inline__ void MAPPING_SEARCH(size_t * _r, int *_fl, int *_sl); static __inline__ void MAPPING_INSERT(size_t _r, int *_fl, int *_sl); static __inline__ bhdr_t *FIND_SUITABLE_BLOCK(tlsf_t * _tlsf, int *_fl, int *_sl); static __inline__ bhdr_t *process_area(void *area, size_t size); #if USE_SBRK || USE_MMAP static __inline__ void *get_new_area(size_t * size); #endif static const int table[] = { -1, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7 }; static __inline__ int ls_bit(int i) { unsigned int a; unsigned int x = i & -i; a = x <= 0xffff ? (x <= 0xff ? 0 : 8) : (x <= 0xffffff ? 16 : 24); return table[x >> a] + a; } static __inline__ int ms_bit(int i) { unsigned int a; unsigned int x = (unsigned int) i; a = x <= 0xffff ? (x <= 0xff ? 0 : 8) : (x <= 0xffffff ? 16 : 24); return table[x >> a] + a; } static __inline__ void set_bit(int nr, u32_t * addr) { addr[nr >> 5] |= 1 << (nr & 0x1f); } static __inline__ void clear_bit(int nr, u32_t * addr) { addr[nr >> 5] &= ~(1 << (nr & 0x1f)); } static __inline__ void MAPPING_SEARCH(size_t * _r, int *_fl, int *_sl) { int _t; if (*_r < SMALL_BLOCK) { *_fl = 0; *_sl = *_r / (SMALL_BLOCK / MAX_SLI); } else { _t = (1 << (ms_bit(*_r) - MAX_LOG2_SLI)) - 1; *_r = *_r + _t; *_fl = ms_bit(*_r); *_sl = (*_r >> (*_fl - MAX_LOG2_SLI)) - MAX_SLI; *_fl -= FLI_OFFSET; /*if ((*_fl -= FLI_OFFSET) < 0) // FL wil be always >0! *_fl = *_sl = 0; */ *_r &= ~_t; } } static __inline__ void MAPPING_INSERT(size_t _r, int *_fl, int *_sl) { if (_r < SMALL_BLOCK) { *_fl = 0; *_sl = _r / (SMALL_BLOCK / MAX_SLI); } else { *_fl = ms_bit(_r); *_sl = (_r >> (*_fl - MAX_LOG2_SLI)) - MAX_SLI; *_fl -= FLI_OFFSET; } } static __inline__ bhdr_t *FIND_SUITABLE_BLOCK(tlsf_t * _tlsf, int *_fl, int *_sl) { u32_t _tmp = _tlsf->sl_bitmap[*_fl] & (~0 << *_sl); bhdr_t *_b = NULL; if (_tmp) { *_sl = ls_bit(_tmp); _b = _tlsf->matrix[*_fl][*_sl]; } else { *_fl = ls_bit(_tlsf->fl_bitmap & (~0 << (*_fl + 1))); if (*_fl > 0) { /* likely */ *_sl = ls_bit(_tlsf->sl_bitmap[*_fl]); _b = _tlsf->matrix[*_fl][*_sl]; } } return _b; } #define EXTRACT_BLOCK_HDR(_b, _tlsf, _fl, _sl) do { \ _tlsf -> matrix [_fl] [_sl] = _b -> ptr.free_ptr.next; \ if (_tlsf -> matrix[_fl][_sl]) \ _tlsf -> matrix[_fl][_sl] -> ptr.free_ptr.prev = NULL; \ else { \ clear_bit (_sl, &_tlsf -> sl_bitmap [_fl]); \ if (!_tlsf -> sl_bitmap [_fl]) \ clear_bit (_fl, &_tlsf -> fl_bitmap); \ } \ _b -> ptr.free_ptr.prev = NULL; \ _b -> ptr.free_ptr.next = NULL; \ }while(0) #define EXTRACT_BLOCK(_b, _tlsf, _fl, _sl) do { \ if (_b -> ptr.free_ptr.next) \ _b -> ptr.free_ptr.next -> ptr.free_ptr.prev = _b -> ptr.free_ptr.prev; \ if (_b -> ptr.free_ptr.prev) \ _b -> ptr.free_ptr.prev -> ptr.free_ptr.next = _b -> ptr.free_ptr.next; \ if (_tlsf -> matrix [_fl][_sl] == _b) { \ _tlsf -> matrix [_fl][_sl] = _b -> ptr.free_ptr.next; \ if (!_tlsf -> matrix [_fl][_sl]) { \ clear_bit (_sl, &_tlsf -> sl_bitmap[_fl]); \ if (!_tlsf -> sl_bitmap [_fl]) \ clear_bit (_fl, &_tlsf -> fl_bitmap); \ } \ } \ _b -> ptr.free_ptr.prev = NULL; \ _b -> ptr.free_ptr.next = NULL; \ } while(0) #define INSERT_BLOCK(_b, _tlsf, _fl, _sl) do { \ _b -> ptr.free_ptr.prev = NULL; \ _b -> ptr.free_ptr.next = _tlsf -> matrix [_fl][_sl]; \ if (_tlsf -> matrix [_fl][_sl]) \ _tlsf -> matrix [_fl][_sl] -> ptr.free_ptr.prev = _b; \ _tlsf -> matrix [_fl][_sl] = _b; \ set_bit (_sl, &_tlsf -> sl_bitmap [_fl]); \ set_bit (_fl, &_tlsf -> fl_bitmap); \ } while(0) #if USE_SBRK || USE_MMAP static __inline__ void *get_new_area(size_t * size) { void *area; #if USE_SBRK area = (void *)sbrk(0); if (((void *)sbrk(*size)) != ((void *) -1)) return area; #endif #ifndef MAP_ANONYMOUS /* https://dev.openwrt.org/ticket/322 */ # define MAP_ANONYMOUS MAP_ANON #endif #if USE_MMAP *size = ROUNDUP(*size, PAGE_SIZE); if ((area = mmap(0, *size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0)) != MAP_FAILED) return area; #endif return ((void *) ~0); } #endif static __inline__ bhdr_t *process_area(void *area, size_t size) { bhdr_t *b, *lb, *ib; area_info_t *ai; ib = (bhdr_t *) area; ib->size = (sizeof(area_info_t) < MIN_BLOCK_SIZE) ? MIN_BLOCK_SIZE : ROUNDUP_SIZE(sizeof(area_info_t)) | USED_BLOCK | PREV_USED; b = (bhdr_t *) GET_NEXT_BLOCK(ib->ptr.buffer, ib->size & BLOCK_SIZE); b->size = ROUNDDOWN_SIZE(size - 3 * BHDR_OVERHEAD - (ib->size & BLOCK_SIZE)) | USED_BLOCK | PREV_USED; b->ptr.free_ptr.prev = b->ptr.free_ptr.next = 0; lb = GET_NEXT_BLOCK(b->ptr.buffer, b->size & BLOCK_SIZE); lb->prev_hdr = b; lb->size = 0 | USED_BLOCK | PREV_FREE; ai = (area_info_t *) ib->ptr.buffer; ai->next = 0; ai->end = lb; return ib; } /******************************************************************/ /******************** Begin of the allocator code *****************/ /******************************************************************/ static char *mp = NULL; /* Default memory pool. */ /******************************************************************/ size_t init_memory_pool(size_t mem_pool_size, void *mem_pool) { /******************************************************************/ tlsf_t *tlsf; bhdr_t *b, *ib; if (!mem_pool || !mem_pool_size || mem_pool_size < sizeof(tlsf_t) + BHDR_OVERHEAD * 8) { ERROR_MSG("init_memory_pool (): memory_pool invalid\n"); return -1; } if (((unsigned long) mem_pool & PTR_MASK)) { ERROR_MSG("init_memory_pool (): mem_pool must be aligned to a word\n"); return -1; } tlsf = (tlsf_t *) mem_pool; /* Check if already initialised */ if (tlsf->tlsf_signature == TLSF_SIGNATURE) { mp = mem_pool; b = GET_NEXT_BLOCK(mp, ROUNDUP_SIZE(sizeof(tlsf_t))); return b->size & BLOCK_SIZE; } mp = mem_pool; /* Zeroing the memory pool */ memset(mem_pool, 0, sizeof(tlsf_t)); tlsf->tlsf_signature = TLSF_SIGNATURE; TLSF_CREATE_LOCK(&tlsf->lock); ib = process_area(GET_NEXT_BLOCK (mem_pool, ROUNDUP_SIZE(sizeof(tlsf_t))), ROUNDDOWN_SIZE(mem_pool_size - sizeof(tlsf_t))); b = GET_NEXT_BLOCK(ib->ptr.buffer, ib->size & BLOCK_SIZE); free_ex(b->ptr.buffer, tlsf); tlsf->area_head = (area_info_t *) ib->ptr.buffer; #if TLSF_STATISTIC tlsf->used_size = mem_pool_size - (b->size & BLOCK_SIZE); tlsf->max_size = tlsf->used_size; #endif return (b->size & BLOCK_SIZE); } /******************************************************************/ size_t add_new_area(void *area, size_t area_size, void *mem_pool) { /******************************************************************/ tlsf_t *tlsf = (tlsf_t *) mem_pool; area_info_t *ptr, *ptr_prev, *ai; bhdr_t *ib0, *b0, *lb0, *ib1, *b1, *lb1, *next_b; memset(area, 0, area_size); ptr = tlsf->area_head; ptr_prev = 0; ib0 = process_area(area, area_size); b0 = GET_NEXT_BLOCK(ib0->ptr.buffer, ib0->size & BLOCK_SIZE); lb0 = GET_NEXT_BLOCK(b0->ptr.buffer, b0->size & BLOCK_SIZE); /* Before inserting the new area, we have to merge this area with the already existing ones */ while (ptr) { ib1 = (bhdr_t *) ((char *) ptr - BHDR_OVERHEAD); b1 = GET_NEXT_BLOCK(ib1->ptr.buffer, ib1->size & BLOCK_SIZE); lb1 = ptr->end; /* Merging the new area with the next physically contigous one */ if ((unsigned long) ib1 == (unsigned long) lb0 + BHDR_OVERHEAD) { if (tlsf->area_head == ptr) { tlsf->area_head = ptr->next; ptr = ptr->next; } else { ptr_prev->next = ptr->next; ptr = ptr->next; } b0->size = ROUNDDOWN_SIZE((b0->size & BLOCK_SIZE) + (ib1->size & BLOCK_SIZE) + 2 * BHDR_OVERHEAD) | USED_BLOCK | PREV_USED; b1->prev_hdr = b0; lb0 = lb1; continue; } /* Merging the new area with the previous physically contigous one */ if ((unsigned long) lb1->ptr.buffer == (unsigned long) ib0) { if (tlsf->area_head == ptr) { tlsf->area_head = ptr->next; ptr = ptr->next; } else { ptr_prev->next = ptr->next; ptr = ptr->next; } lb1->size = ROUNDDOWN_SIZE((b0->size & BLOCK_SIZE) + (ib0->size & BLOCK_SIZE) + 2 * BHDR_OVERHEAD) | USED_BLOCK | (lb1->size & PREV_STATE); next_b = GET_NEXT_BLOCK(lb1->ptr.buffer, lb1->size & BLOCK_SIZE); next_b->prev_hdr = lb1; b0 = lb1; ib0 = ib1; continue; } ptr_prev = ptr; ptr = ptr->next; } /* Inserting the area in the list of linked areas */ ai = (area_info_t *) ib0->ptr.buffer; ai->next = tlsf->area_head; ai->end = lb0; tlsf->area_head = ai; free_ex(b0->ptr.buffer, mem_pool); return (b0->size & BLOCK_SIZE); } /******************************************************************/ size_t get_used_size(void *mem_pool) { /******************************************************************/ #if TLSF_STATISTIC return ((tlsf_t *) mem_pool)->used_size; #else return 0; #endif } /******************************************************************/ size_t get_max_size(void *mem_pool) { /******************************************************************/ #if TLSF_STATISTIC return ((tlsf_t *) mem_pool)->max_size; #else return 0; #endif } /******************************************************************/ void destroy_memory_pool(void *mem_pool) { /******************************************************************/ tlsf_t *tlsf = (tlsf_t *) mem_pool; tlsf->tlsf_signature = 0; TLSF_DESTROY_LOCK(&tlsf->lock); } /******************************************************************/ void *tlsf_malloc(size_t size) { /******************************************************************/ void *ret; #if USE_MMAP || USE_SBRK if (!mp) { size_t area_size; void *area; area_size = sizeof(tlsf_t) + BHDR_OVERHEAD * 8; /* Just a safety constant */ area_size = (area_size > DEFAULT_AREA_SIZE) ? area_size : DEFAULT_AREA_SIZE; area = get_new_area(&area_size); if (area == ((void *) ~0)) return NULL; /* Not enough system memory */ init_memory_pool(area_size, area); } #endif TLSF_ACQUIRE_LOCK(&((tlsf_t *)mp)->lock); ret = malloc_ex(size, mp); TLSF_RELEASE_LOCK(&((tlsf_t *)mp)->lock); return ret; } /******************************************************************/ void tlsf_free(void *ptr) { /******************************************************************/ TLSF_ACQUIRE_LOCK(&((tlsf_t *)mp)->lock); free_ex(ptr, mp); TLSF_RELEASE_LOCK(&((tlsf_t *)mp)->lock); } /******************************************************************/ void *tlsf_realloc(void *ptr, size_t size) { /******************************************************************/ void *ret; #if USE_MMAP || USE_SBRK if (!mp) { return tlsf_malloc(size); } #endif TLSF_ACQUIRE_LOCK(&((tlsf_t *)mp)->lock); ret = realloc_ex(ptr, size, mp); TLSF_RELEASE_LOCK(&((tlsf_t *)mp)->lock); return ret; } /******************************************************************/ void *tlsf_calloc(size_t nelem, size_t elem_size) { /******************************************************************/ void *ret; TLSF_ACQUIRE_LOCK(&((tlsf_t *)mp)->lock); ret = calloc_ex(nelem, elem_size, mp); TLSF_RELEASE_LOCK(&((tlsf_t *)mp)->lock); return ret; } /******************************************************************/ void *malloc_ex(size_t size, void *mem_pool) { /******************************************************************/ tlsf_t *tlsf = (tlsf_t *) mem_pool; bhdr_t *b, *b2, *next_b; int fl, sl; size_t tmp_size; size = (size < MIN_BLOCK_SIZE) ? MIN_BLOCK_SIZE : ROUNDUP_SIZE(size); /* Rounding up the requested size and calculating fl and sl */ MAPPING_SEARCH(&size, &fl, &sl); /* Searching a free block, recall that this function changes the values of fl and sl, so they are not longer valid when the function fails */ b = FIND_SUITABLE_BLOCK(tlsf, &fl, &sl); #if USE_MMAP || USE_SBRK if (!b) { size_t area_size; void *area; /* Growing the pool size when needed */ area_size = size + BHDR_OVERHEAD * 8; /* size plus enough room for the requered headers. */ area_size = (area_size > DEFAULT_AREA_SIZE) ? area_size : DEFAULT_AREA_SIZE; area = get_new_area(&area_size); /* Call sbrk or mmap */ if (area == ((void *) ~0)) return NULL; /* Not enough system memory */ add_new_area(area, area_size, mem_pool); /* Rounding up the requested size and calculating fl and sl */ MAPPING_SEARCH(&size, &fl, &sl); /* Searching a free block */ b = FIND_SUITABLE_BLOCK(tlsf, &fl, &sl); } #endif if (!b) return NULL; /* Not found */ EXTRACT_BLOCK_HDR(b, tlsf, fl, sl); /*-- found: */ next_b = GET_NEXT_BLOCK(b->ptr.buffer, b->size & BLOCK_SIZE); /* Should the block be split? */ tmp_size = (b->size & BLOCK_SIZE) - size; if (tmp_size >= sizeof(bhdr_t)) { tmp_size -= BHDR_OVERHEAD; b2 = GET_NEXT_BLOCK(b->ptr.buffer, size); b2->size = tmp_size | FREE_BLOCK | PREV_USED; next_b->prev_hdr = b2; MAPPING_INSERT(tmp_size, &fl, &sl); INSERT_BLOCK(b2, tlsf, fl, sl); b->size = size | (b->size & PREV_STATE); } else { next_b->size &= (~PREV_FREE); b->size &= (~FREE_BLOCK); /* Now it's used */ } TLSF_ADD_SIZE(tlsf, b); return (void *) b->ptr.buffer; } /******************************************************************/ void free_ex(void *ptr, void *mem_pool) { /******************************************************************/ tlsf_t *tlsf = (tlsf_t *) mem_pool; bhdr_t *b, *tmp_b; int fl = 0, sl = 0; if (!ptr) { return; } b = (bhdr_t *) ((char *) ptr - BHDR_OVERHEAD); b->size |= FREE_BLOCK; TLSF_REMOVE_SIZE(tlsf, b); b->ptr.free_ptr.prev = NULL; b->ptr.free_ptr.next = NULL; tmp_b = GET_NEXT_BLOCK(b->ptr.buffer, b->size & BLOCK_SIZE); if (tmp_b->size & FREE_BLOCK) { MAPPING_INSERT(tmp_b->size & BLOCK_SIZE, &fl, &sl); EXTRACT_BLOCK(tmp_b, tlsf, fl, sl); b->size += (tmp_b->size & BLOCK_SIZE) + BHDR_OVERHEAD; } if (b->size & PREV_FREE) { tmp_b = b->prev_hdr; MAPPING_INSERT(tmp_b->size & BLOCK_SIZE, &fl, &sl); EXTRACT_BLOCK(tmp_b, tlsf, fl, sl); tmp_b->size += (b->size & BLOCK_SIZE) + BHDR_OVERHEAD; b = tmp_b; } MAPPING_INSERT(b->size & BLOCK_SIZE, &fl, &sl); INSERT_BLOCK(b, tlsf, fl, sl); tmp_b = GET_NEXT_BLOCK(b->ptr.buffer, b->size & BLOCK_SIZE); tmp_b->size |= PREV_FREE; tmp_b->prev_hdr = b; } /******************************************************************/ void *realloc_ex(void *ptr, size_t new_size, void *mem_pool) { /******************************************************************/ tlsf_t *tlsf = (tlsf_t *) mem_pool; void *ptr_aux; unsigned int cpsize; bhdr_t *b, *tmp_b, *next_b; int fl, sl; size_t tmp_size; if (!ptr) { if (new_size) return (void *) malloc_ex(new_size, mem_pool); if (!new_size) return NULL; } else if (!new_size) { free_ex(ptr, mem_pool); return NULL; } b = (bhdr_t *) ((char *) ptr - BHDR_OVERHEAD); next_b = GET_NEXT_BLOCK(b->ptr.buffer, b->size & BLOCK_SIZE); new_size = (new_size < MIN_BLOCK_SIZE) ? MIN_BLOCK_SIZE : ROUNDUP_SIZE(new_size); tmp_size = (b->size & BLOCK_SIZE); if (new_size <= tmp_size) { TLSF_REMOVE_SIZE(tlsf, b); if (next_b->size & FREE_BLOCK) { MAPPING_INSERT(next_b->size & BLOCK_SIZE, &fl, &sl); EXTRACT_BLOCK(next_b, tlsf, fl, sl); tmp_size += (next_b->size & BLOCK_SIZE) + BHDR_OVERHEAD; next_b = GET_NEXT_BLOCK(next_b->ptr.buffer, next_b->size & BLOCK_SIZE); /* We allways reenter this free block because tmp_size will be greater then sizeof (bhdr_t) */ } tmp_size -= new_size; if (tmp_size >= sizeof(bhdr_t)) { tmp_size -= BHDR_OVERHEAD; tmp_b = GET_NEXT_BLOCK(b->ptr.buffer, new_size); tmp_b->size = tmp_size | FREE_BLOCK | PREV_USED; next_b->prev_hdr = tmp_b; next_b->size |= PREV_FREE; MAPPING_INSERT(tmp_size, &fl, &sl); INSERT_BLOCK(tmp_b, tlsf, fl, sl); b->size = new_size | (b->size & PREV_STATE); } TLSF_ADD_SIZE(tlsf, b); return (void *) b->ptr.buffer; } if ((next_b->size & FREE_BLOCK)) { if (new_size <= (tmp_size + (next_b->size & BLOCK_SIZE))) { TLSF_REMOVE_SIZE(tlsf, b); MAPPING_INSERT(next_b->size & BLOCK_SIZE, &fl, &sl); EXTRACT_BLOCK(next_b, tlsf, fl, sl); b->size += (next_b->size & BLOCK_SIZE) + BHDR_OVERHEAD; next_b = GET_NEXT_BLOCK(b->ptr.buffer, b->size & BLOCK_SIZE); next_b->prev_hdr = b; next_b->size &= ~PREV_FREE; tmp_size = (b->size & BLOCK_SIZE) - new_size; if (tmp_size >= sizeof(bhdr_t)) { tmp_size -= BHDR_OVERHEAD; tmp_b = GET_NEXT_BLOCK(b->ptr.buffer, new_size); tmp_b->size = tmp_size | FREE_BLOCK | PREV_USED; next_b->prev_hdr = tmp_b; next_b->size |= PREV_FREE; MAPPING_INSERT(tmp_size, &fl, &sl); INSERT_BLOCK(tmp_b, tlsf, fl, sl); b->size = new_size | (b->size & PREV_STATE); } TLSF_ADD_SIZE(tlsf, b); return (void *) b->ptr.buffer; } } if (!(ptr_aux = malloc_ex(new_size, mem_pool))){ return NULL; } cpsize = ((b->size & BLOCK_SIZE) > new_size) ? new_size : (b->size & BLOCK_SIZE); memcpy(ptr_aux, ptr, cpsize); free_ex(ptr, mem_pool); return ptr_aux; } /******************************************************************/ void *calloc_ex(size_t nelem, size_t elem_size, void *mem_pool) { /******************************************************************/ void *ptr; if (nelem <= 0 || elem_size <= 0) return NULL; if (!(ptr = malloc_ex(nelem * elem_size, mem_pool))) return NULL; memset(ptr, 0, nelem * elem_size); return ptr; } #if _DEBUG_TLSF_ /*************** DEBUG FUNCTIONS **************/ /* The following functions have been designed to ease the debugging of */ /* the TLSF structure. For non-developing purposes, it may be they */ /* haven't too much worth. To enable them, _DEBUG_TLSF_ must be set. */ extern void dump_memory_region(unsigned char *mem_ptr, unsigned int size); extern void print_block(bhdr_t * b); extern void print_tlsf(tlsf_t * tlsf); void print_all_blocks(tlsf_t * tlsf); void dump_memory_region(unsigned char *mem_ptr, unsigned int size) { unsigned long begin = (unsigned long) mem_ptr; unsigned long end = (unsigned long) mem_ptr + size; int column = 0; begin >>= 2; begin <<= 2; end >>= 2; end++; end <<= 2; PRINT_MSG("\nMemory region dumped: 0x%lx - 0x%lx\n\n", begin, end); column = 0; PRINT_MSG("0x%lx ", begin); while (begin < end) { if (((unsigned char *) begin)[0] == 0) PRINT_MSG("00"); else PRINT_MSG("%02x", ((unsigned char *) begin)[0]); if (((unsigned char *) begin)[1] == 0) PRINT_MSG("00 "); else PRINT_MSG("%02x ", ((unsigned char *) begin)[1]); begin += 2; column++; if (column == 8) { PRINT_MSG("\n0x%lx ", begin); column = 0; } } PRINT_MSG("\n\n"); } void print_block(bhdr_t * b) { if (!b) return; PRINT_MSG(">> [%p] (", b); if ((b->size & BLOCK_SIZE)) PRINT_MSG("%lu bytes, ", (unsigned long) (b->size & BLOCK_SIZE)); else PRINT_MSG("sentinel, "); if ((b->size & BLOCK_STATE) == FREE_BLOCK) PRINT_MSG("free [%p, %p], ", b->ptr.free_ptr.prev, b->ptr.free_ptr.next); else PRINT_MSG("used, "); if ((b->size & PREV_STATE) == PREV_FREE) PRINT_MSG("prev. free [%p])\n", b->prev_hdr); else PRINT_MSG("prev used)\n"); } void print_tlsf(tlsf_t * tlsf) { bhdr_t *next; int i, j; PRINT_MSG("\nTLSF at %p\n", tlsf); PRINT_MSG("FL bitmap: 0x%x\n\n", (unsigned) tlsf->fl_bitmap); for (i = 0; i < REAL_FLI; i++) { if (tlsf->sl_bitmap[i]) PRINT_MSG("SL bitmap 0x%x\n", (unsigned) tlsf->sl_bitmap[i]); for (j = 0; j < MAX_SLI; j++) { next = tlsf->matrix[i][j]; if (next) PRINT_MSG("-> [%d][%d]\n", i, j); while (next) { print_block(next); next = next->ptr.free_ptr.next; } } } } void print_all_blocks(tlsf_t * tlsf) { area_info_t *ai; bhdr_t *next; PRINT_MSG("\nTLSF at %p\nALL BLOCKS\n\n", tlsf); ai = tlsf->area_head; while (ai) { next = (bhdr_t *) ((char *) ai - BHDR_OVERHEAD); while (next) { print_block(next); if ((next->size & BLOCK_SIZE)) next = GET_NEXT_BLOCK(next->ptr.buffer, next->size & BLOCK_SIZE); else next = NULL; } ai = ai->next; } } #endif SuperCollider-3.6.3-Source-linux~repack/external_libraries/TLSF-2.4.6/src/target.h0000644000175000017500000000053111562456103025667 0ustar dandan#ifndef _TARGET_H_ #define _TARGET_H_ #include #define TLSF_MLOCK_T pthread_mutex_t #define TLSF_CREATE_LOCK(l) pthread_mutex_init (l, NULL) #define TLSF_DESTROY_LOCK(l) pthread_mutex_destroy(l) #define TLSF_ACQUIRE_LOCK(l) pthread_mutex_lock(l) #define TLSF_RELEASE_LOCK(l) pthread_mutex_unlock(l) #endif SuperCollider-3.6.3-Source-linux~repack/external_libraries/TLSF-2.4.6/examples/0000775000175000017500000000000012110505246025253 5ustar dandanSuperCollider-3.6.3-Source-linux~repack/external_libraries/TLSF-2.4.6/examples/test1.c0000644000175000017500000000706411562456103026473 0ustar dandan#include #include #include #include #include #include #include #include #include "tlsf.h" #define NUM_MALLOC (10000) #define SIZE_MALLOC (10000) #define POOL_SIZE (NUM_MALLOC*SIZE_MALLOC) #define FILL_MEM (0) typedef struct { const char *name; double min; double max; double n; double sum; double sumquad; } minmax; static double getcurtime (void) { struct timeval tv; struct timezone tz; gettimeofday (&tv, &tz); return ((tv.tv_usec / 1000000.0) + (1.0 * tv.tv_sec)); } static void init (minmax * data) { data->name = ""; data->min = 1e37; data->max = 0.0; data->n = 0.0; data->sum = 0.0; data->sumquad = 0.0; } static void update (int print, const char *n, double s, double e, minmax * data) { double d = e - s; double mean, sigma; if (n) { data->name = n; data->n++; data->sum += d; data->sumquad += d * d; mean = data->sum / data->n; sigma = sqrt ((data->sumquad - ((data->sum * data->sum) / data->n)) / (data->n)); if (d < data->min) { data->min = d; } if (d > data->max) { data->max = d; } } else { mean = data->sum / data->n; sigma = sqrt ((data->sumquad - ((data->sum * data->sum) / data->n)) / (data->n)); } if (print) { printf ("%s min=%.9f, max=%.9f, mean=%.9f, sigma=%.9f\n", n ? n : data->name, data->min, data->max, mean, sigma); if (n == NULL) { data->min = 1e37; data->max = 0.0; } } } static char pool[POOL_SIZE]; int main (void) { int i, free_mem; int j; size_t t; int n = 0; double s, first, last_h; void **m; minmax maldata, raldata, freedata; free_mem = init_memory_pool (POOL_SIZE, pool); printf ("Total free memory = %d\n", free_mem); init (&maldata); init (&raldata); init (&freedata); m = (void **) tlsf_malloc (NUM_MALLOC * sizeof (void *)); for (i = 0; i < NUM_MALLOC; i++) { m[i] = NULL; } first = last_h = getcurtime (); for (i = 0; i < NUM_MALLOC; i++) { t = (size_t) (1 + drand48 () * SIZE_MALLOC); m[i] = tlsf_calloc (t, 1); if (((unsigned long) m[i] & (sizeof(void *) * 2 - 1)) != 0) { fprintf(stderr,"Alignment error %p\n", m[i]); } #if FILL_MEM memset (m[i], -1, t); #endif } for (j = 0; j < 1000; j++) { for (i = 0; i < NUM_MALLOC; i++) { if (m[i]) { t = (size_t) (1 + drand48 () * SIZE_MALLOC); s = getcurtime (); m[i] = tlsf_realloc (m[i], t); update (0, "realloc", s, getcurtime (), &raldata); if (((unsigned long) m[i] & (sizeof(void *) * 2 - 1)) != 0) { fprintf(stderr,"Alignment error %p\n", m[i]); } #if FILL_MEM memset (m[i], -1, t); #endif } if (m[i]) { s = getcurtime (); tlsf_free (m[i]); update (0, "free ", s, getcurtime (), &freedata); } t = (size_t) (1 + drand48 () * SIZE_MALLOC); s = getcurtime (); m[i] = tlsf_malloc (t); update (0, "malloc ", s, getcurtime (), &maldata); if (((unsigned long) m[i] & (sizeof(void *) * 2 - 1)) != 0) { fprintf(stderr,"Alignment error %p\n", m[i]); } #if FILL_MEM memset (m[i], -1, t); #endif } n++; s = getcurtime (); if ((s - last_h) > 10) { last_h = s; printf ("Count = %d %f\n", n * NUM_MALLOC, last_h - first); update (1, NULL, 0.0, getcurtime (), &maldata); update (1, NULL, 0.0, getcurtime (), &raldata); update (1, NULL, 0.0, getcurtime (), &freedata); } } for (i = 0; i < NUM_MALLOC; i++) { tlsf_free (m[i]); } tlsf_free (m); return 0; } SuperCollider-3.6.3-Source-linux~repack/external_libraries/TLSF-2.4.6/examples/Makefile0000644000175000017500000000173211562456103026723 0ustar dandanall: test test1 test2 test3 test4 TLSF_PATH=../src WARNINGS = -Wextra -Wall -Wwrite-strings -Wstrict-prototypes \ -Wmissing-prototypes -Wno-long-long -Wstrict-aliasing=2 CFLAGS+=-g -O2 -I$(TLSF_PATH) $(WARNINGS) # CFLAGS+=-ftest-coverage -fprofile-arcs CC = gcc test: test.o $(TLSF_PATH)/tlsf.h $(CC) $(CFLAGS) -o test test.o $(TLSF_PATH)/tlsf.o test.o: test.c $(TLSF_PATH)/tlsf.h test1: test1.o $(TLSF_PATH)/tlsf.h $(CC) $(CFLAGS) -o test1 test1.o $(TLSF_PATH)/tlsf.o -lm test1.o: test1.c $(TLSF_PATH)/tlsf.h test2: test2.o $(TLSF_PATH)/tlsf.h $(CC) $(CFLAGS) -o test2 test2.o $(TLSF_PATH)/tlsf.o -lm test2.o: test2.c $(TLSF_PATH)/tlsf.h test3: test3.o $(TLSF_PATH)/tlsf.h $(CC) $(CFLAGS) -o test3 test3.o $(TLSF_PATH)/tlsf.o -lm test3.o: test3.c $(TLSF_PATH)/tlsf.h test4: test4.o $(TLSF_PATH)/tlsf.h $(CC) $(CFLAGS) -o test4 test4.o $(TLSF_PATH)/tlsf.o -lm test4.o: test4.c $(TLSF_PATH)/tlsf.h clean: $(RM) -rf *.o test test? *~ *.c.gcov *.gcda *.gcno SuperCollider-3.6.3-Source-linux~repack/external_libraries/TLSF-2.4.6/examples/test4.c0000644000175000017500000000046311562456103026472 0ustar dandan#include #include #include "tlsf.h" int main(void){ int *ptr[100]; int i; for (i=0; i< 100; i++) if (!(ptr[i]=tlsf_malloc(1024))){ printf("Error\n"); exit(-1); } for (i=0; i< 100; i++) tlsf_free(ptr[i]); printf("Test OK\n"); exit(0); } SuperCollider-3.6.3-Source-linux~repack/external_libraries/TLSF-2.4.6/examples/test2.c0000644000175000017500000000713111562456103026467 0ustar dandan#include #include #include #include #include #include #include #include #include #define NUM_MALLOC (10000) #define SIZE_MALLOC (10000) #define FILL_MEM (0) typedef struct { const char *name; double min; double max; double n; double sum; double sumquad; } minmax; static double getcurtime (void) { struct timeval tv; struct timezone tz; gettimeofday (&tv, &tz); return ((tv.tv_usec / 1000000.0) + (1.0 * tv.tv_sec)); } static void init (minmax * data) { data->name = ""; data->min = 1e37; data->max = 0.0; data->n = 0.0; data->sum = 0.0; data->sumquad = 0.0; } static void update (int print, const char *n, double s, double e, minmax * data) { double d = e - s; double mean, sigma; if (n) { data->name = n; data->n++; data->sum += d; data->sumquad += d * d; mean = data->sum / data->n; sigma = sqrt ((data->sumquad - ((data->sum * data->sum) / data->n)) / (data->n)); if (d < data->min) { data->min = d; } if (d > data->max) { data->max = d; } } else { mean = data->sum / data->n; sigma = sqrt ((data->sumquad - ((data->sum * data->sum) / data->n)) / (data->n)); } if (print) { printf ("%s min=%.9f, max=%.9f, mean=%.9f, sigma=%.9f\n", n ? n : data->name, data->min, data->max, mean, sigma); if (n == NULL) { data->min = 1e37; data->max = 0.0; } } } int main (void) { int i; int j; size_t t; int n = 0; int max_size = 0; double s, first, last_h; void **m; minmax maldata, raldata, freedata; init (&maldata); init (&raldata); init (&freedata); m = (void **) malloc (NUM_MALLOC * sizeof (void *)); for (i = 0; i < NUM_MALLOC; i++) { m[i] = NULL; } first = last_h = getcurtime (); for (i = 0; i < NUM_MALLOC; i++) { t = (size_t) (1 + drand48 () * SIZE_MALLOC); m[i] = calloc (t, 1); if (((unsigned long) m[i] & (sizeof(void *) * 2 - 1)) != 0) { fprintf(stderr,"Alignment error %p\n", m[i]); } #if FILL_MEM memset (m[i], -1, t); #endif } for (j = 0; j < 1000; j++) { for (i = 0; i < NUM_MALLOC; i++) { if (m[i]) { t = (size_t) (1 + drand48 () * SIZE_MALLOC); s = getcurtime (); m[i] = realloc (m[i], t); update (0, "realloc", s, getcurtime (), &raldata); if (((unsigned long) m[i] & (sizeof(void *) * 2 - 1)) != 0) { fprintf(stderr,"Alignment error %p\n", m[i]); } #if FILL_MEM memset (m[i], -1, t); #endif } if (m[i]) { s = getcurtime (); free (m[i]); update (0, "free ", s, getcurtime (), &freedata); } t = (size_t) (1 + drand48 () * SIZE_MALLOC); s = getcurtime (); m[i] = malloc (t); update (0, "malloc ", s, getcurtime (), &maldata); if (((unsigned long) m[i] & (sizeof(void *) * 2 - 1)) != 0) { fprintf(stderr,"Alignment error %p\n", m[i]); } #if FILL_MEM memset (m[i], -1, t); #endif } if (mallinfo().uordblks > max_size) { max_size = mallinfo().uordblks; } n++; s = getcurtime (); if ((s - last_h) > 10) { last_h = s; printf ("Count = %d %f, max memory %d\n", n * NUM_MALLOC, last_h - first, mallinfo().uordblks); update (1, NULL, 0.0, getcurtime (), &maldata); update (1, NULL, 0.0, getcurtime (), &raldata); update (1, NULL, 0.0, getcurtime (), &freedata); } } for (i = 0; i < NUM_MALLOC; i++) { free (m[i]); } free (m); printf ("Total used memory = %d, max memory %d\n", mallinfo().uordblks, max_size); return 0; } SuperCollider-3.6.3-Source-linux~repack/external_libraries/TLSF-2.4.6/examples/test.c0000644000175000017500000000102211562456103026376 0ustar dandan#include #include #include "tlsf.h" #define POOL_SIZE 1024 * 1024 // Pool size is in bytes. char pool[POOL_SIZE]; int main(void){ int *ptr[100]; int i, free_mem; free_mem = init_memory_pool(POOL_SIZE, pool); printf("Total free memory= %d\n", free_mem); for (i=0; i< 100; i++) if (!(ptr[i]=malloc_ex(1024, pool))){ printf("Error\n"); exit(-1); } for (i=0; i< 100; i++) free_ex(ptr[i], pool); destroy_memory_pool(pool); printf("Test OK\n"); exit(0); } SuperCollider-3.6.3-Source-linux~repack/external_libraries/TLSF-2.4.6/examples/test3.c0000644000175000017500000000115711562456103026472 0ustar dandan#include #include #include "tlsf.h" #define POOL_SIZE 1024 * 10 // Pool size is in bytes. char p0[POOL_SIZE]; char p1[POOL_SIZE]; char p2[POOL_SIZE]; char p3[POOL_SIZE]; int main(void){ char *ptr; printf("Pools' addresses: (0) %p (1) %p (2) %p (3) %p\n", p0, p1, p2, p3); init_memory_pool(POOL_SIZE, p0); add_new_area(p3, POOL_SIZE, p0); add_new_area(p1, POOL_SIZE, p0); add_new_area(p2, POOL_SIZE, p0); if (!(ptr=malloc_ex(POOL_SIZE*2, p0))){ printf("Error\n"); exit(-1); } free_ex(ptr, p0); destroy_memory_pool(p0); printf("Test OK\n"); exit(0); } SuperCollider-3.6.3-Source-linux~repack/external_libraries/TLSF-2.4.6/Changelog0000644000175000017500000001302511562456103025255 0ustar dandan Version History --------------- -v2.4.6 (September 10 2009) * Fixed a bug in the realloc func (discovered by the rockbox project: www.rockbox.org). -v2.4.5 (November 24 2008) * Working on OSX/FreeBSD (may be for OpenBSD/NetBSD too). Reported by Younès HAFRI. printf (and stdio.h include) is now optional. Reported by Masaki Muranaka -v2.4.4 (October 13 2008) * Corrected minor syntactic bug on statistic gathering code. Reported by Tim Cussins and P. Mantegazza. -v2.4.3 (July 30 2008) * Minor fixes to compile with the greenhills compiler. Reported by "Kaya, Sinan SEA" * Small change in the license in order to include TLSF in the RTEMS project. -v2.4.2 (May 16 2008) (Herman ten Brugge) * Memory usage statistics added again, with cleaner and more compacted code. -v2.4.1 (April 30 2008) * Fixed a bug in the tlsf_realloc function: init the pool automatically on the first call. Reported by: Alejandro Mery -v2.4 (Feb 19 2008) * "rtl_*" functions renamed to "tlsf_*". * Added the add_new_area function to insert new memory areas to an existing memory pool. * A single TLSF pool can manage non-contiguous memory areas. * Support for mmap and sbrk added. * The init_memory_pool is not longer needed when used on a system with mmap or sbrk. * Removed the get_used_size counting.The same functionality can be implemented outside the TLSF code. -v2.3.2 (Sep 27 2007) * Minor cosmetic code improvements. -v2.3.1 (Jul 30 2007) * Fixed some minor bugs in the version 2.3. Herman ten Brugge -v2.3 (Jul 28 2007) Released a new version with all the contributions received from Herman ten Brugge (This is his summary of changes in the TLSF's code): * Add 64 bit support. It now runs on x86_64 and solaris64. * I also tested this on vxworks/32 and solaris/32 and i386/32 processors. * Remove assembly code. I could not measure any performance difference on my core2 processor. This also makes the code more portable. * Moved defines/typedefs from tlsf.h to tlsf.c * Changed MIN_BLOCK_SIZE to sizeof (free_ptr_t) and BHDR_OVERHEAD to (sizeof (bhdr_t) - MIN_BLOCK_SIZE). This does not change the fact that the minumum size is still sizeof (bhdr_t). * Changed all C++ comment style to C style. (// -> /* ... *./) * Used ls_bit instead of ffs and ms_bit instead of fls. I did this to avoid confusion with the standard ffs function which returns different values. * Created set_bit/clear_bit fuctions because they are not present on x86_64. * Added locking support + extra file target.h to show how to use it. * Added get_used_size function * Added rtl_realloc and rtl_calloc function * Implemented realloc clever support. * Added some test code in the example directory. -- Thank you very much for your help Herman! -v2.2.1 (Oct 23 2006) * Support for ARMv5 implemented by Adam Scislowicz . Thank you for your contribution. - v2.2.0 (Jun 30 2006) Miguel Masmano & Ismael Ripoll. * Blocks smaller than 128 bytes are stored on a single segregated list. The already existing bits maps and data structures are used. * Minor code speed-up improvements. * Worst case response time both on malloc and free improved. * External fragmantation also improved!. * Segragared lists are AGAIN sorted by LIFO order. Version 2.1b was proven to be no better than 2.1. - v2.1b: Allocation policy has been always a LIFO Good-Fit, that is, between several free blocks in the same range, TLSF will always allocate the most recently released. In this version of TLSF, we have implemented a FIFO Good-Fit. However, fragmentation doesn't seems to be altered so is it worth it?. - v2.1: Realloc and calloc included again in TLSF 2.0. - v2.0: In this version, TLSF has been programmed from scratch. Now the allocator is provided as an unique file. Realloc and calloc are not longer implemented. - v1.4: Created the section "Version History". Studied real behaviour of actual applications (regular applications tend to require small memory blocks (less than 16 bytes) whereas TLSF is optimised to be used with blocks larger than 16 bytes: Added special lists to deal with blocks smaller than 16 bytes. - v1.3: Change of concept, now the main TLSF structure is created inside of the beginning of the block instead of being an static structure, allowing multiple TLSFs working at the same time. Now, TLSF uses specific processor instructions to deal with bitmaps. TLSF sanity functions added to find TLSF overflows. The TLSF code will not be RTLinux-oriented any more. - v1.1 ... v1.2: Many little bugs fixed, code cleaned and splitted in several files because of cosmetic requirements. Starting from TLSF v1.1, MaRTE OS (http://marte.unican.es) uses the TLSF allocator as its default memory allocator. - v0.1 ... v1.0: First implementations were created for testing and research purposes. Basically TLSF is implemented to be used by RTLinux-GPL (www.rtlinux-gpl.org), so it is RTLinux-oriented. SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/0000775000175000017500000000000012110505246024115 5ustar dandanSuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/vec_sse.hpp0000664000175000017500000003644312110473257026275 0ustar dandan// sse vector class // // Copyright (C) 2010 Tim Blechmann // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; see the file COPYING. If not, write to // the Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. #ifndef VEC_SSE_HPP #define VEC_SSE_HPP #include #ifdef __SSE2__ #include #include "vec_int_sse2.hpp" #endif #ifdef __SSE3__ #include #endif #ifdef __SSE4_1__ #include #endif #include "detail/vec_math.hpp" #include "vec_base.hpp" #if defined(__GNUC__) && defined(NDEBUG) #define always_inline inline __attribute__((always_inline)) #else #define always_inline inline #endif namespace nova { template <> struct vec: vec_base { typedef __m128 internal_vector_type; typedef float float_type; typedef vec_base base; #ifdef __SSE2__ static inline __m128 gen_sign_mask(void) { __m128i ones = (__m128i)gen_ones(); return (__m128)_mm_slli_epi32 (_mm_srli_epi32(ones, 31), 31); } static inline __m128 gen_abs_mask(void) { __m128i ones = (__m128i)gen_ones(); return (__m128)_mm_srli_epi32 (_mm_slli_epi32(ones, 1), 1); } static inline __m128 gen_one(void) { __m128i ones = (__m128i)gen_ones(); return (__m128)_mm_slli_epi32 (_mm_srli_epi32(ones, 25), 23); } static inline __m128 gen_05(void) { __m128i ones = (__m128i)gen_ones(); return (__m128)_mm_slli_epi32 (_mm_srli_epi32(ones, 26), 24); } #else /* SSE fallback */ static inline __m128 gen_sign_mask(void) { return set_bitmask(0x80000000); } static inline __m128 gen_abs_mask(void) { return set_bitmask(0x7fffffff); } static inline __m128 gen_one(void) { return _mm_set_ps1(1.f); } static inline __m128 gen_05(void) { return _mm_set_ps1(0.5f); } #endif static inline __m128 set_bitmask(unsigned int mask) { union { unsigned int i; float f; } u; u.i = mask; return _mm_set_ps1(u.f); } static inline __m128 gen_exp_mask(void) { return set_bitmask(0x7F800000); } static inline __m128 gen_exp_mask_1(void) { return set_bitmask(0x3F000000); } static inline __m128 gen_ones(void) { __m128 x = gen_zero(); __m128 ones = _mm_cmpeq_ps(x, x); return ones; } static inline __m128 gen_zero(void) { return _mm_setzero_ps(); } vec(__m128 const & arg): base(arg) {} public: static const int size = 4; static const int objects_per_cacheline = 64/sizeof(float); static const bool has_compare_bitmask = true; static bool is_aligned(float* ptr) { return ((intptr_t)(ptr) & (intptr_t)(size * sizeof(float) - 1)) == 0; } /* @{ */ /** constructors */ vec(void) {} vec(float f) { set_vec(f); } vec(vec const & rhs): base(rhs) { } /* @} */ /* @{ */ /** io */ void load(const float * data) { data_ = _mm_loadu_ps(data); } void load_aligned(const float * data) { data_ = _mm_load_ps(data); } void load_first(const float * data) { data_ = _mm_load_ss(data); } void store(float * dest) const { _mm_storeu_ps(dest, data_); } void store_aligned(float * dest) const { _mm_store_ps(dest, data_); } void store_aligned_stream(float * dest) const { _mm_stream_ps(dest, data_); } void clear(void) { data_ = gen_zero(); } operator __m128 (void) const { return data_; } /* @} */ /* @{ */ /** element access */ #ifdef __SSE4_1__ void set (std::size_t index, float value) { __m128 tmp = _mm_set_ss(value); switch (index) { case 0: data_ = _mm_insert_ps(data_, tmp, 0 << 4); break; case 1: data_ = _mm_insert_ps(data_, tmp, 1 << 4); break; case 2: data_ = _mm_insert_ps(data_, tmp, 2 << 4); break; case 3: data_ = _mm_insert_ps(data_, tmp, 3 << 4); break; } } #endif void set_vec (float value) { data_ = _mm_set_ps1(value); } float set_slope(float start, float slope) { float slope2 = slope + slope; float v1 = start + slope; float v2 = start + slope2; float v3 = start + slope2 + slope; data_ = _mm_set_ps(v3, v2, v1, start); return slope2 + slope2; } float set_exp(float start, float curve) { float v1 = start * curve; float v2 = v1 * curve; float v3 = v2 * curve; data_ = _mm_set_ps(v3, v2, v1, start); return v3 * curve; } float get (std::size_t index) const { #ifdef __SSE4_1__ union { int32_t i; float f; } cu; switch (index) { case 0: cu.i = _mm_extract_ps(data_, 0); break; case 1: cu.i = _mm_extract_ps(data_, 1); break; case 2: cu.i = _mm_extract_ps(data_, 2); break; case 3: cu.i = _mm_extract_ps(data_, 3); break; } return cu.f; #else __m128 ret; switch (index) { case 0: ret = data_; break; case 1: ret = _mm_shuffle_ps(data_, data_, _MM_SHUFFLE(1, 1, 1, 1)); break; case 2: ret = _mm_shuffle_ps(data_, data_, _MM_SHUFFLE(2, 2, 2, 2)); break; case 3: ret = _mm_shuffle_ps(data_, data_, _MM_SHUFFLE(3, 3, 3, 3)); break; } return _mm_cvtss_f32(ret); #endif } /* @} */ /* @{ */ /** arithmetic operators */ #define OPERATOR_ASSIGNMENT(op, opcode) \ vec & operator op(vec const & rhs) \ { \ data_ = opcode(data_, rhs.data_);\ return *this;\ } OPERATOR_ASSIGNMENT(+=, _mm_add_ps) OPERATOR_ASSIGNMENT(-=, _mm_sub_ps) OPERATOR_ASSIGNMENT(*=, _mm_mul_ps) OPERATOR_ASSIGNMENT(/=, _mm_div_ps) #define ARITHMETIC_OPERATOR(op, opcode) \ vec operator op(vec const & rhs) const \ { \ return opcode(data_, rhs.data_); \ } \ \ friend vec operator op(vec const & lhs, float f) \ { \ return opcode(lhs.data_, vec(f).data_); \ } \ \ friend vec operator op(float f, vec const & rhs) \ { \ return opcode(vec(f).data_, rhs.data_); \ } ARITHMETIC_OPERATOR(+, _mm_add_ps) ARITHMETIC_OPERATOR(-, _mm_sub_ps) ARITHMETIC_OPERATOR(*, _mm_mul_ps) ARITHMETIC_OPERATOR(/, _mm_div_ps) friend vec operator -(const vec & arg) { return _mm_xor_ps(arg.data_, gen_sign_mask()); } friend vec fast_reciprocal(const vec & arg) { return _mm_rcp_ps(arg.data_); } friend vec reciprocal(const vec & arg) { return detail::vec_reciprocal_newton(arg); } NOVA_SIMD_DEFINE_MADD #define RELATIONAL_OPERATOR(op, opcode) \ vec operator op(vec const & rhs) const \ { \ const __m128 one = gen_one(); \ return _mm_and_ps(opcode(data_, rhs.data_), one); \ } RELATIONAL_OPERATOR(<, _mm_cmplt_ps) RELATIONAL_OPERATOR(<=, _mm_cmple_ps) RELATIONAL_OPERATOR(>, _mm_cmpgt_ps) RELATIONAL_OPERATOR(>=, _mm_cmpge_ps) RELATIONAL_OPERATOR(==, _mm_cmpeq_ps) RELATIONAL_OPERATOR(!=, _mm_cmpneq_ps) /* @{ */ #define BITWISE_OPERATOR(op, opcode) \ vec operator op(vec const & rhs) const \ { \ return opcode(data_, rhs.data_); \ } BITWISE_OPERATOR(&, _mm_and_ps) BITWISE_OPERATOR(|, _mm_or_ps) BITWISE_OPERATOR(^, _mm_xor_ps) friend inline vec andnot(vec const & lhs, vec const & rhs) { return _mm_andnot_ps(lhs.data_, rhs.data_); } #undef BITWISE_OPERATOR #define RELATIONAL_MASK_OPERATOR(op, opcode) \ friend vec mask_##op(vec const & lhs, vec const & rhs) \ { \ return opcode(lhs.data_, rhs.data_); \ } RELATIONAL_MASK_OPERATOR(lt, _mm_cmplt_ps) RELATIONAL_MASK_OPERATOR(le, _mm_cmple_ps) RELATIONAL_MASK_OPERATOR(gt, _mm_cmpgt_ps) RELATIONAL_MASK_OPERATOR(ge, _mm_cmpge_ps) RELATIONAL_MASK_OPERATOR(eq, _mm_cmpeq_ps) RELATIONAL_MASK_OPERATOR(neq, _mm_cmpneq_ps) #undef RELATIONAL_MASK_OPERATOR friend inline vec select(vec lhs, vec rhs, vec bitmask) { /* if bitmask is set, return value in rhs, else value in lhs */ #ifdef __SSE4_1__ return _mm_blendv_ps(lhs.data_, rhs.data_, bitmask.data_); #else return detail::vec_select(lhs, rhs, bitmask); #endif } /* @} */ /* @{ */ /** unary functions */ friend inline vec abs(vec const & arg) { return _mm_and_ps(gen_abs_mask(), arg.data_); } friend always_inline vec sign(vec const & arg) { return detail::vec_sign(arg); } friend inline vec square(vec const & arg) { return _mm_mul_ps(arg.data_, arg.data_); } friend inline vec sqrt(vec const & arg) { return _mm_sqrt_ps(arg.data_); } friend inline vec cube(vec const & arg) { return _mm_mul_ps(arg.data_, _mm_mul_ps(arg.data_, arg.data_)); } /* @} */ /* @{ */ /** binary functions */ friend inline vec max_(vec const & lhs, vec const & rhs) { return _mm_max_ps(lhs.data_, rhs.data_); } friend inline vec min_(vec const & lhs, vec const & rhs) { return _mm_min_ps(lhs.data_, rhs.data_); } /* @} */ /* @{ */ /** rounding functions */ friend inline vec round(vec const & arg) { #ifdef __SSE4_1__ return _mm_round_ps(arg.data_, _MM_FROUND_TO_NEAREST_INT); #else return detail::vec_round_float(arg); #endif } friend inline vec frac(vec const & arg) { vec floor_result = floor(arg); return arg - floor_result; } friend inline vec floor(vec const & arg) { #ifdef __SSE4_1__ return _mm_round_ps(arg.data_, _MM_FROUND_TO_NEG_INF); #else return detail::vec_floor_float(arg); #endif } friend inline vec ceil(vec const & arg) { #ifdef __SSE4_1__ return _mm_round_ps(arg.data_, _MM_FROUND_TO_POS_INF); #else return detail::vec_ceil_float(arg); #endif } friend inline vec trunc(vec const & arg) { #ifdef __SSE4_1__ return _mm_round_ps(arg.data_, _MM_FROUND_TO_ZERO); #else return vec::trunc(arg); #endif } /* @} */ /* @{ */ /** mathematical functions */ friend inline vec signed_sqrt(vec const & arg) { return detail::vec_signed_sqrt(arg); } #ifdef __SSE2__ typedef nova::detail::int_vec_sse2 int_vec; friend inline vec exp(vec const & arg) { return detail::vec_exp_float(arg); } friend inline vec log(vec const & arg) { return detail::vec_log_float(arg); } friend inline vec pow(vec const & arg1, vec const & arg2) { return detail::vec_pow(arg1, arg2); } friend inline vec sin(vec const & arg) { return detail::vec_sin_float(arg); } friend inline vec cos(vec const & arg) { return detail::vec_cos_float(arg); } friend inline vec tan(vec const & arg) { return detail::vec_tan_float(arg); } friend inline vec asin(vec const & arg) { return detail::vec_asin_float(arg); } friend inline vec acos(vec const & arg) { return detail::vec_acos_float(arg); } friend inline vec atan(vec const & arg) { return detail::vec_atan_float(arg); } friend inline vec tanh(vec const & arg) { return detail::vec_tanh_float(arg); } friend inline vec signed_pow(vec const & lhs, vec const & rhs) { return detail::vec_signed_pow(lhs, rhs); } friend inline vec log2(vec const & arg) { return detail::vec_log2(arg); } friend inline vec log10(vec const & arg) { return detail::vec_log10(arg); } #else NOVA_SIMD_DELEGATE_BINARY_TO_BASE(pow) NOVA_SIMD_DELEGATE_BINARY_TO_BASE(signed_pow) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(log) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(log2) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(log10) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(exp) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(sin) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(cos) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(tan) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(asin) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(acos) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(atan) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(tanh) #endif friend inline vec undenormalize(vec const & arg) { return detail::vec_undenormalize(arg); } /* @} */ /* @{ */ #define HORIZONTAL_OP(PAR_FN, SCAL_FN) \ __m128 data = data_; /* [0, 1, 2, 3] */ \ __m128 low = _mm_movehl_ps(data, data); /* [2, 3, 2, 3] */ \ __m128 low_accum = PAR_FN(low, data); /* [0|2, 1|3, 2|2, 3|3] */ \ __m128 elem1 = _mm_shuffle_ps(low_accum, low_accum, \ _MM_SHUFFLE(1,1,1,1)); /* [1|3, 1|3, 1|3, 1|3] */ \ __m128 accum = SCAL_FN(low_accum, elem1); \ return _mm_cvtss_f32(accum); /** horizontal functions */ inline float horizontal_min(void) const { HORIZONTAL_OP(_mm_min_ps, _mm_min_ss); } inline float horizontal_max(void) const { HORIZONTAL_OP(_mm_max_ps, _mm_max_ss); } inline float horizontal_sum(void) const { #ifdef __SSE3__ __m128 accum1 = _mm_hadd_ps(data_, data_); /* [0+1, 2+3, 0+1, 2+3] */ __m128 elem1 = _mm_shuffle_ps(accum1, accum1, _MM_SHUFFLE(1, 1, 1, 1)); /* [2+3, 2+3, 2+3, 2+3,] */ __m128 result = _mm_add_ps(accum1, elem1); return _mm_cvtss_f32(result); #else HORIZONTAL_OP(_mm_add_ps, _mm_add_ss) #endif } #undef HORIZONTAL_OP /* @} */ #ifdef __SSE2__ /* @{ */ vec (int_vec const & rhs): base((__m128)rhs.data_) {} int_vec truncate_to_int(void) const { __m128i int_val = _mm_cvttps_epi32(data_); return int_vec(int_val); } /* @} */ #endif // __SSE2__ }; } /* namespace nova */ #undef OPERATOR_ASSIGNMENT #undef ARITHMETIC_OPERATOR #undef RELATIONAL_OPERATOR #undef always_inline #endif /* VEC_SSE_HPP */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/COPYING0000644000175000017500000000135711512512273025157 0ustar dandanCopyright (C) 2009 Tim Blechmann This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; see the file COPYING. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/simd_peakmeter.hpp0000644000175000017500000001012511512512273027617 0ustar dandan// simd functions for peak metering // Copyright (C) 2010 Tim Blechmann // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; see the file COPYING. If not, write to // the Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. #ifndef SIMD_PEAKMETER_HPP #define SIMD_PEAKMETER_HPP #include "vec.hpp" #include /* for abs */ #include /* for max */ #if defined(__GNUC__) && defined(NDEBUG) #define always_inline inline __attribute__((always_inline)) #else #define always_inline inline #endif namespace nova { /* updates peak, returns last abs(in[n-1]) */ template inline F peak_vec(const F * in, F * peak, unsigned int n) { F last; F local_peak = *peak; using namespace std; do { last = std::fabs(*in++); local_peak = max(local_peak, last); } while(--n); *peak = local_peak; return last; } template inline F peak_vec_simd(const F * in, F * peak, unsigned int n) { vec maximum, abs3; maximum.load_first(peak); /* loop */ const size_t vec_size = vec::size; const size_t unroll = 4 * vec_size; n /= unroll; do { vec in0, in1, in2, in3; in0.load_aligned(in); in1.load_aligned(in+vec_size); in2.load_aligned(in+2*vec_size); in3.load_aligned(in+3*vec_size); vec abs0 = abs(in0); vec abs1 = abs(in1); vec abs2 = abs(in2); abs3 = abs(in3); vec local_max = max_(max_(abs0, abs1), max_(abs2, abs3)); maximum = max_(maximum, local_max); in += unroll; } while(--n); /* horizonal accumulation */ *peak = maximum.horizontal_max(); /* return absolute of last sample */ return abs3.get(vec::size - 1); } /* updates peak and squared sum */ template inline void peak_rms_vec(const F * in, F * peak, F * squared_sum, unsigned int n) { F local_peak = *peak; F local_squared_sum = *squared_sum; using namespace std; do { F in_sample = *in++; F last = std::fabs(in_sample); local_peak = max(local_peak, last); local_squared_sum += in_sample * in_sample; } while(--n); *peak = local_peak; *squared_sum = local_squared_sum; } template inline void peak_rms_vec_simd(const F * in, F * peak, F * squared_sum, unsigned int n) { vec maximum; maximum.load_first(peak); vec local_squared_sum; local_squared_sum.load_first(squared_sum); /* loop */ const size_t vec_size = vec::size; const size_t unroll = 4 * vec_size; n /= unroll; do { vec in0, in1, in2, in3; in0.load_aligned(in); in1.load_aligned(in+vec_size); in2.load_aligned(in+2*vec_size); in3.load_aligned(in+3*vec_size); vec abs0 = abs(in0); vec sqr0 = square(in0); vec abs1 = abs(in1); vec sqr1 = square(in1); vec abs2 = abs(in2); vec sqr2 = square(in2); vec abs3 = abs(in3); vec sqr3 = square(in3); vec local_max = max_(max_(abs0, abs1), max_(abs2, abs3)); maximum = max_(maximum, local_max); local_squared_sum += sqr0 + sqr1 + sqr2 + sqr3; in += unroll; } while(--n); /* horizonal accumulation */ *peak = maximum.horizontal_max(); *squared_sum = local_squared_sum.horizontal_sum(); } } /* namespace nova */ #undef always_inline #endif /* SIMD_PEAKMETER_HPP */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/wrap_arguments.hpp0000664000175000017500000001036212110473257027674 0ustar dandan// scalar signal argument wrappers // Copyright (C) 2010 Tim Blechmann // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; see the file COPYING. If not, write to // the Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. #ifndef NOVA_SIMD_WRAP_ARGUMENTS_HPP #define NOVA_SIMD_WRAP_ARGUMENTS_HPP #if defined(__GNUC__) && defined(NDEBUG) #define always_inline inline __attribute__((always_inline)) #else #define always_inline inline #endif namespace nova { namespace detail { template struct scalar_pointer_argument { always_inline explicit scalar_pointer_argument(const FloatType * arg): data(arg) {} always_inline void increment(void) { data += 1; } always_inline FloatType get(void) const { return *data; } always_inline FloatType consume(void) { FloatType ret = *data; increment(); return ret; } const FloatType * data; }; template struct scalar_scalar_argument { always_inline explicit scalar_scalar_argument(FloatType const & arg): data(arg) {} always_inline void increment(void) {} always_inline FloatType get(void) const { return data; } always_inline FloatType consume(void) { return data; } FloatType data; }; template struct scalar_ramp_argument { always_inline scalar_ramp_argument(FloatType const & base, FloatType const & slope): data(base), slope_(slope) {} always_inline void increment(void) { data += slope_; } always_inline FloatType get(void) const { return data; } always_inline FloatType consume(void) { FloatType ret = data; increment(); return ret; } FloatType data; const FloatType slope_; }; } always_inline detail::scalar_scalar_argument wrap_argument(float arg) { return detail::scalar_scalar_argument(arg); } always_inline detail::scalar_scalar_argument wrap_argument(double arg) { return detail::scalar_scalar_argument(arg); } always_inline detail::scalar_pointer_argument wrap_argument(const float * arg) { return detail::scalar_pointer_argument(arg); } always_inline detail::scalar_pointer_argument wrap_argument(const double * arg) { return detail::scalar_pointer_argument(arg); } template always_inline detail::scalar_ramp_argument wrap_argument(FloatType base, FloatType slope) { return detail::scalar_ramp_argument(base, slope); } template always_inline detail::scalar_scalar_argument wrap_argument(detail::scalar_scalar_argument const & f) { return f; } template always_inline detail::scalar_pointer_argument wrap_argument(detail::scalar_pointer_argument const & f) { return f; } template always_inline detail::scalar_ramp_argument wrap_argument(detail::scalar_ramp_argument const & f) { return f; } template always_inline detail::scalar_scalar_argument scalar_argument(FloatType const & f) { return wrap_argument(f); } template always_inline detail::scalar_pointer_argument vector_argument(const FloatType * f) { return wrap_argument(f); } template always_inline detail::scalar_ramp_argument slope_argument(FloatType const & value, FloatType const & slope) { return wrap_argument(value, slope); } } #undef always_inline #endif /* NOVA_SIMD_WRAP_ARGUMENTS_HPP */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/vec_int_avx.hpp0000664000175000017500000001024212110473257027140 0ustar dandan// avx int vector class // // Copyright (C) 2011 Tim Blechmann // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; see the file COPYING. If not, write to // the Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. #ifndef VEC_AVX_INT_HPP #define VEC_AVX_INT_HPP #include #include "vec_int_sse2.hpp" #include namespace nova { namespace detail { struct int_vec_avx { __m256i data_; /* cast */ explicit int_vec_avx(int arg): data_(_mm256_set1_epi32(arg)) {} int_vec_avx(__m256i arg): data_(arg) {} int_vec_avx(__m256 arg): data_(_mm256_castps_si256(arg)) {} int_vec_avx(int_vec_avx const & arg): data_(arg.data_) {} int_vec_avx(void) {} #define APPLY_SSE_FUNCTION(op, function) \ friend int_vec_avx op(int_vec_avx const & lhs, int_vec_avx const & rhs) \ { \ __m256 lhs_data = _mm256_castsi256_ps(lhs.data_); \ __m256 rhs_data = _mm256_castsi256_ps(rhs.data_); \ __m128 lhs_low = _mm256_castps256_ps128(lhs_data); \ __m128 lhs_hi = _mm256_extractf128_ps(lhs_data, 1); \ __m128 rhs_low = _mm256_castps256_ps128(rhs_data); \ __m128 rhs_hi = _mm256_extractf128_ps(rhs_data, 1); \ \ __m128i newlow = function(int_vec_sse2(lhs_low), int_vec_sse2(rhs_low)); \ __m128i newhi = function(int_vec_sse2(lhs_hi), int_vec_sse2(rhs_hi)); \ \ __m256i result = _mm256_castsi128_si256(newlow); \ result = _mm256_insertf128_si256(result, newhi, 1); \ return result; \ } APPLY_SSE_FUNCTION(operator +, std::plus()); APPLY_SSE_FUNCTION(operator -, std::minus()); APPLY_SSE_FUNCTION(mask_lt, mask_lt) APPLY_SSE_FUNCTION(mask_gt, mask_gt) APPLY_SSE_FUNCTION(mask_eq, mask_eq) #undef APPLY_SSE_FUNCTION friend int_vec_avx operator&(int_vec_avx const & lhs, int_vec_avx const & rhs) { return int_vec_avx(_mm256_and_ps(_mm256_castsi256_ps(lhs.data_), _mm256_castsi256_ps(rhs.data_))); } friend inline int_vec_avx andnot(int_vec_avx const & lhs, int_vec_avx const & rhs) { return int_vec_avx(_mm256_andnot_ps(_mm256_castsi256_ps(lhs.data_), _mm256_castsi256_ps(rhs.data_))); } // shift in zeros friend inline int_vec_avx slli(int_vec_avx const & arg, int count) { __m256 arg_data = _mm256_castsi256_ps(arg.data_); __m128 arg_low = _mm256_castps256_ps128(arg_data); __m128 arg_hi = _mm256_extractf128_ps(arg_data, 1); __m128 newlow = (__m128)_mm_slli_epi32((__m128i)arg_low, count); __m128 newhi = (__m128)_mm_slli_epi32((__m128i)arg_hi, count); __m256 result = _mm256_castps128_ps256(newlow); result = _mm256_insertf128_ps(result, newhi, 1); return result; } // shift in zeros friend inline int_vec_avx srli(int_vec_avx const & arg, int count) { __m256 arg_data = _mm256_castsi256_ps(arg.data_); __m128 arg_low = _mm256_castps256_ps128(arg_data); __m128 arg_hi = _mm256_extractf128_ps(arg_data, 1); __m128 newlow = (__m128)_mm_srli_epi32((__m128i)arg_low, count); __m128 newhi = (__m128)_mm_srli_epi32((__m128i)arg_hi, count); __m256 result = _mm256_castps128_ps256(newlow); result = _mm256_insertf128_ps(result, newhi, 1); return result; } __m256 convert_to_float(void) const { return _mm256_cvtepi32_ps(data_); } }; } } #endif /* VEC_AVX_INT_HPP */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/vec_sse2.hpp0000664000175000017500000002405312110473257026351 0ustar dandan// sse2 vector class // // Copyright (C) 2010 Tim Blechmann // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; see the file COPYING. If not, write to // the Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. #ifndef VEC_SSE2_HPP #define VEC_SSE2_HPP #include #include #include #ifdef __SSE4_1__ #include #endif #include "detail/vec_math.hpp" #include "vec_base.hpp" #if defined(__GNUC__) && defined(NDEBUG) #define always_inline inline __attribute__((always_inline)) #else #define always_inline inline #endif namespace nova { template <> struct vec: vec_base { typedef vec_base base; typedef double float_type; typedef __m128d internal_vector_type; static inline __m128d gen_sign_mask(void) { __m128i x = _mm_setzero_si128(); #ifdef __SSE4_1__ __m128i ones = _mm_cmpeq_epi64(x, x); #else __m128i ones = _mm_cmpeq_epi32(x, x); #endif return (__m128d)_mm_slli_epi64 (_mm_srli_epi64(ones, 63), 63); } static inline __m128d gen_abs_mask(void) { __m128i x = _mm_setzero_si128(); #ifdef __SSE4_1__ __m128i ones = _mm_cmpeq_epi64(x, x); #else __m128i ones = _mm_cmpeq_epi32(x, x); #endif return (__m128d)_mm_srli_epi64 (_mm_slli_epi64(ones, 1), 1); } static inline __m128d gen_one(void) { return _mm_set1_pd(1.f); } static inline __m128d gen_05(void) { return _mm_set1_pd(0.5f); } static inline __m128d gen_zero(void) { return _mm_setzero_pd(); } static inline __m128d gen_ones(void) { __m128d x = gen_zero(); __m128d ones = _mm_cmpeq_pd(x, x); return ones; } vec(__m128d const & arg): base(arg) {} public: static const int size = 2; static const int objects_per_cacheline = 64/sizeof(double); static const bool has_compare_bitmask = true; static bool is_aligned(double* ptr) { return ((intptr_t)(ptr) & (intptr_t)(size * sizeof(double) - 1)) == 0; } /* @{ */ /** constructors */ vec(void) {} vec(double f) { set_vec(f); } vec(float f) { set_vec((double)f); } vec(vec const & rhs) { data_ = rhs.data_; } /* @} */ /* @{ */ /** io */ void load(const double * data) { data_ = _mm_loadu_pd(data); } void load_aligned(const double * data) { data_ = _mm_load_pd(data); } void load_first(const double * data) { data_ = _mm_load_sd(data); } void store(double * dest) const { _mm_storeu_pd(dest, data_); } void store_aligned(double * dest) const { _mm_store_pd(dest, data_); } void store_aligned_stream(double * dest) const { _mm_stream_pd(dest, data_); } void clear(void) { data_ = gen_zero(); } /* @} */ /* @{ */ /** element access */ void set_vec (double value) { data_ = _mm_set1_pd(value); } double set_slope(double start, double slope) { double v1 = start + slope; data_ = _mm_set_pd(v1, start); return slope + slope; } double set_exp(double start, double curve) { double v1 = start * curve; data_ = _mm_set_pd(v1, start); return v1 * curve; } double get (std::size_t index) const { __m128d ret; switch (index) { case 0: ret = data_; break; case 1: ret = _mm_shuffle_pd(data_, data_, _MM_SHUFFLE2(1, 1)); break; } return _mm_cvtsd_f64(ret); } /* @} */ /* @{ */ /** arithmetic operators */ #define OPERATOR_ASSIGNMENT(op, opcode) \ vec & operator op(vec const & rhs) \ { \ data_ = opcode(data_, rhs.data_);\ return *this;\ } OPERATOR_ASSIGNMENT(+=, _mm_add_pd) OPERATOR_ASSIGNMENT(-=, _mm_sub_pd) OPERATOR_ASSIGNMENT(*=, _mm_mul_pd) OPERATOR_ASSIGNMENT(/=, _mm_div_pd) #define ARITHMETIC_OPERATOR(op, opcode) \ vec operator op(vec const & rhs) const \ { \ return opcode(data_, rhs.data_); \ } ARITHMETIC_OPERATOR(+, _mm_add_pd) ARITHMETIC_OPERATOR(-, _mm_sub_pd) ARITHMETIC_OPERATOR(*, _mm_mul_pd) ARITHMETIC_OPERATOR(/, _mm_div_pd) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(reciprocal) NOVA_SIMD_DEFINE_MADD #define RELATIONAL_OPERATOR(op, opcode) \ vec operator op(vec const & rhs) const \ { \ const __m128d one = gen_one(); \ return _mm_and_pd(opcode(data_, rhs.data_), one); \ } RELATIONAL_OPERATOR(<, _mm_cmplt_pd) RELATIONAL_OPERATOR(<=, _mm_cmple_pd) RELATIONAL_OPERATOR(>, _mm_cmpgt_pd) RELATIONAL_OPERATOR(>=, _mm_cmpge_pd) RELATIONAL_OPERATOR(==, _mm_cmpeq_pd) RELATIONAL_OPERATOR(!=, _mm_cmpneq_pd) /* @{ */ #define BITWISE_OPERATOR(op, opcode) \ vec operator op(vec const & rhs) const \ { \ return opcode(data_, rhs.data_); \ } BITWISE_OPERATOR(&, _mm_and_pd) BITWISE_OPERATOR(|, _mm_or_pd) BITWISE_OPERATOR(^, _mm_xor_pd) friend vec andnot(vec const & lhs, vec const & rhs) { return _mm_andnot_pd(lhs.data_, rhs.data_); } #define RELATIONAL_MASK_OPERATOR(op, opcode) \ friend vec mask_##op(vec const & lhs, vec const & rhs) \ { \ return opcode(lhs.data_, rhs.data_); \ } RELATIONAL_MASK_OPERATOR(lt, _mm_cmplt_pd) RELATIONAL_MASK_OPERATOR(le, _mm_cmple_pd) RELATIONAL_MASK_OPERATOR(gt, _mm_cmpgt_pd) RELATIONAL_MASK_OPERATOR(ge, _mm_cmpge_pd) RELATIONAL_MASK_OPERATOR(eq, _mm_cmpeq_pd) RELATIONAL_MASK_OPERATOR(neq, _mm_cmpneq_pd) #undef RELATIONAL_MASK_OPERATOR friend inline vec select(vec lhs, vec rhs, vec bitmask) { /* if bitmask is set, return value in rhs, else value in lhs */ #ifdef __SSE4_1__ return _mm_blendv_pd(lhs.data_, rhs.data_, bitmask.data_); #else return detail::vec_select(lhs, rhs, bitmask); #endif } /* @} */ /* @{ */ /** unary functions */ friend inline vec abs(vec const & arg) { return _mm_and_pd(gen_abs_mask(), arg.data_); } friend always_inline vec sign(vec const & arg) { return detail::vec_sign(arg); } friend inline vec square(vec const & arg) { return _mm_mul_pd(arg.data_, arg.data_); } friend inline vec sqrt(vec const & arg) { return _mm_sqrt_pd(arg.data_); } friend inline vec cube(vec const & arg) { return _mm_mul_pd(arg.data_, _mm_mul_pd(arg.data_, arg.data_)); } /* @} */ /* @{ */ /** binary functions */ friend inline vec max_(vec const & lhs, vec const & rhs) { return _mm_max_pd(lhs.data_, rhs.data_); } friend inline vec min_(vec const & lhs, vec const & rhs) { return _mm_min_pd(lhs.data_, rhs.data_); } /* @} */ /* @{ */ /** rounding functions */ friend inline vec round(vec const & arg) { #ifdef __SSE4_1__ return _mm_round_pd(arg.data_, _MM_FROUND_TO_NEAREST_INT); #else return vec::round(arg); #endif } friend inline vec frac(vec const & arg) { vec floor_result = floor(arg); return arg - floor_result; } friend inline vec floor(vec const & arg) { #ifdef __SSE4_1__ return _mm_round_pd(arg.data_, _MM_FROUND_TO_NEG_INF); #else return vec::floor(arg); #endif } friend inline vec ceil(vec const & arg) { #ifdef __SSE4_1__ return _mm_round_pd(arg.data_, _MM_FROUND_TO_POS_INF); #else return vec::ceil(arg); #endif } friend inline vec trunc(vec const & arg) { #ifdef __SSE4_1__ return _mm_round_pd(arg.data_, _MM_FROUND_TO_ZERO); #else return vec::trunc(arg); #endif } /* @} */ /* @{ */ /** mathematical functions */ NOVA_SIMD_DELEGATE_BINARY_TO_BASE(pow) NOVA_SIMD_DELEGATE_BINARY_TO_BASE(signed_pow) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(sin) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(cos) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(tan) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(asin) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(acos) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(atan) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(log) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(log2) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(log10) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(exp) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(tanh) friend inline vec signed_sqrt(vec const & arg) { return detail::vec_signed_sqrt(arg); } friend inline vec undenormalize(vec const & arg) { return detail::vec_undenormalize(arg); } /* @} */ /* @{ */ /** horizontal functions */ #define HORIZONTAL_OP(OP) \ __m128d data = data_; /* [0, 1] */ \ __m128d high = _mm_unpackhi_pd(data, data); /* [1, 1] */ \ __m128d accum = OP(data, high); \ return _mm_cvtsd_f64(accum); inline double horizontal_min(void) const { HORIZONTAL_OP(_mm_min_sd); } inline double horizontal_max(void) const { HORIZONTAL_OP(_mm_max_sd); } inline double horizontal_sum(void) const { HORIZONTAL_OP(_mm_add_sd); } /* @} */ #undef HORIZONTAL_OP }; } /* namespace nova */ #undef OPERATOR_ASSIGNMENT #undef ARITHMETIC_OPERATOR #undef RELATIONAL_OPERATOR #undef always_inline #endif /* VEC_SSE2_HPP */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/simd_memory.hpp0000664000175000017500000002756212110473257027174 0ustar dandan// templated memory simd functions // Copyright (C) 2010 Tim Blechmann // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; see the file COPYING. If not, write to // the Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. #ifndef SIMD_MEMORY_HPP #define SIMD_MEMORY_HPP #include #include #include "vec.hpp" #if defined(__GNUC__) && defined(NDEBUG) #define always_inline inline __attribute__((always_inline)) #else #define always_inline inline #endif namespace nova { template inline void zerovec(F * dest, unsigned int n) { std::memset(dest, 0, n*sizeof(F)); } template inline void setvec(F * dest, F f, unsigned int n) { assert(n); do *dest++ = f; while (--n); } namespace detail { template inline void store_aligned(vec const & value, F * dest) { if (aligned) value.store_aligned(dest); else value.store(dest); } template struct setvec { static const int offset = vec::size; static always_inline void mp_iteration(F * dst, vec const & val) { store_aligned(val, dst); setvec::mp_iteration(dst+offset, val); } }; template struct setvec { static always_inline void mp_iteration(F * dst, vec const & val) {} }; template inline void setvec_simd(F * dest, vec const & val, unsigned int n) { const unsigned int offset = vec::objects_per_cacheline; unsigned int unroll = n / offset; do { setvec::mp_iteration(dest, val); dest += offset; } while (--unroll); } } /* namespace detail */ template inline void zerovec_simd(F * dest, unsigned int n) { vec zero; zero.clear(); detail::setvec_simd(dest, zero, n); } template inline void zerovec_simd(F *dest) { vec zero; zero.clear(); detail::setvec::mp_iteration(dest, zero); } template inline void zerovec_na_simd(F * dest, unsigned int n) { vec zero; zero.clear(); detail::setvec_simd(dest, zero, n); } template inline void zerovec_na_simd(F *dest) { vec zero; zero.clear(); detail::setvec::mp_iteration(dest, zero); } template inline void setvec_simd(F * dest, F f, unsigned int n) { vec val(f); detail::setvec_simd(dest, val, n); } template inline void setvec_simd(F *dest, F f) { vec val(f); detail::setvec::mp_iteration(dest, val); } template inline void setvec_na_simd(F * dest, F f, unsigned int n) { vec val(f); detail::setvec_simd(dest, val, n); } template inline void setvec_na_simd(F *dest, F f) { vec val(f); detail::setvec::mp_iteration(dest, val); } namespace detail { template struct set_ramp { static const int offset = vec::size; static always_inline void slope_mp_iteration(F * dst, vec & vbase, vec const & vslope) { vbase.store_aligned(dst); vbase += vslope; set_ramp::slope_mp_iteration(dst+offset, vbase, vslope); } static always_inline void exp_mp_iteration(F * dst, vec & vbase, vec const & vcurve) { vbase.store_aligned(dst); vbase *= vcurve; set_ramp::exp_mp_iteration(dst+offset, vbase, vcurve); } }; template struct set_ramp { static always_inline void slope_mp_iteration(F * dst, vec & vbase, vec const & vslope) {} static always_inline void exp_mp_iteration(F * dst, vec & vbase, vec const & curve) {} }; } /* namespace detail */ template inline void set_slope_vec(F * dest, F f, F slope, unsigned int n) { assert(n); do { *dest++ = f; f += slope; } while (--n); } template inline void set_slope_vec_simd(F * dest, F f, F slope, unsigned int n) { vec vbase, vslope; vbase.set_slope(f, slope); vslope.set_vec(vec::size * slope); unsigned int unroll = n / vec::objects_per_cacheline; do { detail::set_ramp::objects_per_cacheline>::slope_mp_iteration(dest, vbase, vslope); dest += vec::objects_per_cacheline; } while(--unroll); } template inline void set_exp_vec(F * dest, F f, F curve, unsigned int n) { assert(n); do { *dest++ = f; f *= curve; } while (--n); } namespace detail { template class pow_i { public: static Type run(Type const & base) { return base * pow_i::run(base); } }; template class pow_i<1, Type> { public: static Type run(Type const & base) { return base; } }; template Type ipow(Type const & base) { return pow_i::run(base); } } template inline void set_exp_vec_simd(F * dest, F f, F curve, unsigned int n) { vec vbase, vcurve(detail::ipow::size, F>(curve)); vbase.set_exp(f, curve); unsigned int unroll = n / vec::objects_per_cacheline; do { detail::set_ramp::objects_per_cacheline>::exp_mp_iteration(dest, vbase, vcurve); dest += vec::objects_per_cacheline; } while(--unroll); } template inline void copyvec(F * dest, const F * src, unsigned int n) { std::memcpy(dest, src, n*sizeof(F)); } namespace detail { template struct copyvec { static const int offset = vec::size; static always_inline void mp_iteration(F * dst, const F * src) { vec val; if (src_aligned) val.load_aligned(src); else val.load(src); store_aligned(val, dst); copyvec::mp_iteration(dst+offset, src+offset); } }; template struct copyvec { static always_inline void mp_iteration(F * dst, const F * src) {} }; } #define COPYVEC_FUNCTION(name, src_aligned, dst_aligned) \ template \ inline void name##_simd(F * dest, const F * src, unsigned int n) \ { \ const int per_loop = vec::objects_per_cacheline; \ n /= per_loop; \ do \ { \ detail::copyvec::mp_iteration(dest, src); \ dest += per_loop; src += per_loop; \ } \ while (--n); \ } \ \ template \ inline void name##_simd(F * dest, const F * src) \ { \ detail::copyvec::mp_iteration(dest, src); \ } COPYVEC_FUNCTION(copyvec_aa, true, true) COPYVEC_FUNCTION(copyvec_na, false, true) COPYVEC_FUNCTION(copyvec_an, true, false) COPYVEC_FUNCTION(copyvec_nn, false, false) template inline void copyvec_simd(F * dest, const F * src, unsigned int n) { copyvec_aa_simd(dest, src, n); } template inline void copyvec_simd(F * dest, const F * src) { copyvec_aa_simd(dest, src); } template inline void addvec(F * out, const F * in, unsigned int n) { do { *out++ += *in++; } while (--n); } template inline void addvec(F * out, const F in, unsigned int n) { do { *out++ += in; } while (--n); } template inline void addvec(F * out, const F in, const F slope, unsigned int n) { do { *out++ += in; in += slope; } while (--n); } namespace detail { template struct addvec { static const int offset = vec::size; static always_inline void mp_iteration(F * dst, const F * src) { vec v1, v2; v1.load_aligned(dst); v2.load_aligned(src); v1 += v2; v1.store_aligned(dst); addvec::mp_iteration(dst+offset, src+offset); } static always_inline void mp_iteration(F * dst, vec const & in) { vec v1; v1.load_aligned(dst); v1 += in; v1.store_aligned(dst); addvec::mp_iteration(dst+offset, in); } static always_inline void mp_iteration(F * dst, vec & in, vec const & vslope) { vec v1; v1.load_aligned(dst); v1 += in; v1.store_aligned(dst); in += vslope; addvec::mp_iteration(dst+offset, in, vslope); } }; template struct addvec { static always_inline void mp_iteration(F * dst, const F * src) {} static always_inline void mp_iteration(F * dst, vec const & in) {} static always_inline void mp_iteration(F * dst, vec & in, vec const & vslope) {} }; } template inline void addvec_simd(F * out, const F * in, unsigned int n) { const int per_loop = vec::objects_per_cacheline; n /= per_loop; do { detail::addvec::mp_iteration(out, in); out += per_loop; in += per_loop; } while (--n); } template inline void addvec_simd(F * out, const F in, unsigned int n) { const int per_loop = vec::objects_per_cacheline; vec vin(in); n /= per_loop; do { detail::addvec::mp_iteration(out, vin); out += per_loop; } while (--n); } template inline void addvec_simd(F * out, const F in, const F slope, unsigned int n) { const int per_loop = vec::objects_per_cacheline; vec vin; vin.set_slope(in, slope); vec vslope; vslope.set(slope * vec::size); n /= per_loop; do { detail::addvec::mp_iteration(out, vin, vslope); out += per_loop; } while (--n); } template inline void addvec_simd(F * out, const F * in) { detail::addvec::mp_iteration(out, in); } template inline void addvec_simd(F * out, const F in) { vec vin(in); detail::addvec::mp_iteration(out, vin); } template inline void addvec_simd(F * out, const F in, const F slope) { vec vin; vin.set_slope(in, slope); vec vslope; vslope.set(slope * vec::size); detail::addvec::mp_iteration(out, vin, vslope); } } /* namespace nova */ #undef always_inline #endif /* SIMD_MEMORY_HPP */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/README0000644000175000017500000001323711532066166025013 0ustar dandannova simd nova simd provides a framework of simdfied vector functions, designed mainly for computer music applications. it currently supports the following instruction sets: - sse/sse2 family - ppc/altivec - avx - arm/neon vec class: the simd functionality is built around a templated vec class. it usually maps to a simd vector. the vec class can be used to compose more specific algorithms, hiding different implementations under a common API. template class vec { public: typedef FloatType float_type; static const int size; // number of samples per vector static const int objects_per_cacheline; // typical number of objects per cacheline /* constructors */ vec(void); vec(double f); vec(float f); vec(vec const & rhs); /* element access */ FloatType get (int index) const; /* set vector */ void set (int index, FloatType arg); void set_vec (FloatType value); FloatType set_slope(FloatType start, FloatType slope); FloatType set_exp(FloatType start, FloatType curve); /* load and store */ void load(const WrappedType * src); void load_first(const WrappedType * src); void load_aligned(const WrappedType * data); void store(WrappedType * dest) const; void store_aligned(WrappedType * dest) const; void store_aligned_stream(WrappedType * dest) const; void clear(void); vec_base operator+(vec_base const & rhs) const vec_base operator-(vec_base const & rhs) const vec_base operator*(vec_base const & rhs) const vec_base operator/(vec_base const & rhs) const vec_base & operator+=(vec_base const & rhs) vec_base & operator-=(vec_base const & rhs) vec_base & operator*=(vec_base const & rhs) vec_base & operator/=(vec_base const & rhs) vec_base operator<(vec_base const & rhs) const vec_base operator<=(vec_base const & rhs) const vec_base operator==(vec_base const & rhs) const vec_base operator!=(vec_base const & rhs) const vec_base operator>(vec_base const & rhs) const vec_base operator>=(vec_base const & rhs) const friend vec madd(vec const & arg1, vec const & arg2, vec const & arg3); friend vec sin(vec const & arg); friend vec cos(vec const & arg); friend vec tan(vec const & arg); friend vec asin(vec const & arg); friend vec acos(vec const & arg); friend vec atan(vec const & arg); friend vec tanh(vec const & arg); friend vec log(vec const & arg); friend vec log2(vec const & arg); friend vec log10(vec const & arg); friend vec exp(vec const & arg); friend vec pow(vec const & lhs, vec const & rhs); friend vec abs(vec const & arg); friend vec sign(vec const & arg); friend vec square(vec const & arg); friend vec cube(vec const & arg); friend vec signed_sqrt(vec const & arg); friend vec signed_pow(vec const & lhs, vec const & rhs); friend vec min_(vec const & lhs, vec const & rhs); friend vec max_(vec const & lhs, vec const & rhs); friend vec round(vec const & arg); friend vec ceil(vec const & arg); friend vec floor(vec const & arg); friend vec frac(vec const & arg); friend vec trunc(vec const & arg); }; vector functions: this vec class has been used as building block for a number of vector functions, which provides a traditional c++-style interface to perform a specific operation on buffers. (for details consult the simd_*.hpp files) for an unary operation `foo', the following functions must be: /* arbitrary number of iterations */ template inline void foo_vec(float_type * out, const float_type * in, unsigned int n); /* number of iterations must be a multiple of * unroll_constraints::samples_per_loop */ template inline void foo_vec_simd(float_type * out, const float_type * in, unsigned int n); /* number of iterations must be a multiple of * unroll_constraints::samples_per_loop */ template inline void foo_vec_simd(FloatType * out, const FloatType * in); for binary and ternary operations, instances are provided for mixed vector and scalar arguments. using the suffix _simd provides versions for compile-time and run-time unrolled code: template inline void foo_vec(float_type * out, Arg1 arg1, Arg2 arg2, unsigned int n); template inline void foo_vec_simd(float_type * out, Arg1 arg1, Arg2 arg2, unsigned int n); template inline void foo_vec_simd(float_type * out, Arg1 arg1, Arg2 arg2); for scalar arguments, an extension is provided to support ramping by adding a slope to the scalar after each iteration. for binary functions, c++ function overloading is used. compile-time unrolled versions of these functions are also provided. argument wrapper: to support different kinds of arguments with a generic interface, nova-simd provides argument wrappers. these can be generated with the following functions: /* wrap a scalar argument */ template /unspecified/ nova::wrap_arguments(FloatType f); /* wrap a vector argument */ template /unspecified/ nova::wrap_arguments(const FloatType * f); /* wrap a ramp argument */ template /unspecified/ nova::wrap_arguments(FloatType base, FloatType slope); building and testing: nova simd is a header-only library, so it cannot be compiled as standalone libray. however some benchmark and test programs are provided, using a cmake build system. SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/vec_int_neon.hpp0000664000175000017500000000575512110473257027316 0ustar dandan// neon integer vector helper class // // Copyright (C) 2011 Tim Blechmann // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; see the file COPYING. If not, write to // the Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. #ifndef VEC_INT_NEON_HPP #define VEC_INT_NEON_HPP #include namespace nova { namespace detail { struct int_vec_neon { uint32x4_t data_; explicit int_vec_neon(int arg): data_(vdupq_n_u32(arg)) {} int_vec_neon(float32x4_t arg): data_(vreinterpretq_u32_f32(arg)) {} int_vec_neon(uint32x4_t arg): data_(arg) {} int_vec_neon(int_vec_neon const & arg): data_(arg.data_) {} int_vec_neon(void) {} operator uint32x4_t (void) const { return data_; } friend int_vec_neon operator+(int_vec_neon const & lhs, int_vec_neon const & rhs) { return vaddq_u32(lhs.data_, rhs.data_); } friend int_vec_neon operator-(int_vec_neon const & lhs, int_vec_neon const & rhs) { return vsubq_u32(lhs.data_, rhs.data_); } #define RELATIONAL_MASK_OPERATOR(op, opcode) \ friend inline int_vec_neon mask_##op(int_vec_neon const & lhs, int_vec_neon const & rhs) \ { \ return opcode(lhs.data_, rhs.data_); \ } RELATIONAL_MASK_OPERATOR(lt, vcltq_u32) RELATIONAL_MASK_OPERATOR(gt, vcgtq_u32) RELATIONAL_MASK_OPERATOR(eq, vceqq_u32) #undef RELATIONAL_MASK_OPERATOR friend int_vec_neon operator&(int_vec_neon const & lhs, int_vec_neon const & rhs) { return vandq_u32(lhs.data_, rhs.data_); } friend inline int_vec_neon andnot(int_vec_neon const & lhs, int_vec_neon const & rhs) { return vandq_u32(lhs.data_, vmvnq_u32(rhs.data_)); } // shift in zeros friend inline int_vec_neon slli(int_vec_neon const & arg, int count) { return vshlq_u32(arg.data_, vdupq_n_s32(count)); } // shift in zeros friend inline int_vec_neon srli(int_vec_neon const & arg, int count) { return vshlq_u32(arg.data_, vdupq_n_s32(-count)); } inline float32x4_t convert_to_float(void) const { return vcvtq_f32_s32(vreinterpretq_s32_u32(data_)); } }; } } #endif /* VEC_INT_NEON_HPP */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/softclip.hpp0000664000175000017500000000601512110473257026461 0ustar dandan// softclip // Copyright (C) 2008, 2009 Tim Blechmann // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; see the file COPYING. If not, write to // the Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. #ifndef SIMD_SOFTCLIP_HPP #define SIMD_SOFTCLIP_HPP #include #include #include "vec.hpp" #include "detail/unroll_helpers.hpp" #if defined(__GNUC__) && defined(NDEBUG) #define always_inline inline __attribute__((always_inline)) #else #define always_inline inline #endif namespace nova { namespace detail { template struct softclip { always_inline FloatType operator()(FloatType arg) const { FloatType abs = fabs(arg); if (abs < FloatType(0.5)) return arg; else return (abs - FloatType(0.25)) / arg; } }; #ifdef SSE /* this computes both parts of the branch * * benchmarks (core2) showed: * 6.5 seconds for simdfied code * 5.3 seconds for non-simd code for samples with abs(sample) < 0.5 * 17 seconds when 50% of the samples have abs(sample) < 0.5 * 26 seconds for samples with abs(sample) > 0.5 * * on intel nethalem cpus, the simdfied code is faster than all non-simd code * */ template <> struct softclip > { typedef vec vec_type; always_inline vec_type operator()(vec_type arg) const { const vec_type const05 = vec_type::gen_05(); const vec_type const025 = vec_type::gen_025(); vec_type abs = abs(arg); vec_type selecter = mask_lt(abs, const05); vec_type alt_ret = (abs - const025) / arg; return select(alt_ret, arg, selecter); } }; #endif } template inline void softclip_vec(float_type * out, const float_type * in, unsigned int n) { detail::apply_on_vector(out, in, n, detail::softclip()); } template inline void softclip_vec_simd(float_type * out, const float_type * in, unsigned int n) { softclip_vec(out, in, n); } template inline void softclip_vec_simd(float_type * out, const float_type * in) { softclip_vec_simd(out, in, n); } #ifdef SSE template <> inline void softclip_vec_simd(float_type * out, const float_type * in, unsigned int n) { detail::generate_simd_loop(out, in, n, detail::softclip >()); } #endif } /* namespace nova */ #undef always_inline #endif /* SIMD_SOFTCLIP_HPP */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/testsuite/0000775000175000017500000000000012110505246026146 5ustar dandanSuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/testsuite/simd_round_tests.cpp0000644000175000017500000000437611523013245032247 0ustar dandan#include #define BOOST_TEST_MAIN #include #include #include #include "../simd_unary_arithmetic.hpp" #include "test_helper.hpp" #include "../benchmarks/cache_aligned_array.hpp" using namespace nova; using namespace std; static const int size = 1024; #define COMPARE_TEST(name) \ template \ void test_##name(void) \ { \ aligned_array sseval, mpval, generic, args; \ randomize_buffer(args.c_array(), size); \ \ name##_vec(generic.c_array(), args.c_array(), size); \ name##_vec_simd(sseval.c_array(), args.c_array(), size); \ name##_vec_simd(mpval.c_array(), args.c_array()); \ \ for (int i = 0; i != size; ++i) \ BOOST_CHECK_CLOSE( sseval[i], generic[i], 0.0001 ); \ for (int i = 0; i != size; ++i) \ BOOST_CHECK_CLOSE( mpval[i], generic[i], 0.0001 ); \ } \ \ BOOST_AUTO_TEST_CASE( name##_tests_float ) \ { \ test_##name(); \ } \ \ BOOST_AUTO_TEST_CASE( name##_tests_double ) \ { \ test_##name(); \ } COMPARE_TEST(round) COMPARE_TEST(ceil) COMPARE_TEST(floor) COMPARE_TEST(frac) COMPARE_TEST(trunc)SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/testsuite/test_helper.hpp0000644000175000017500000000343311536471155031212 0ustar dandan#include #include template float_type randomize_float(void) { static boost::mt19937 rng; static boost::uniform_real dist(0.1, 1); static boost::variate_generator > gen(rng, dist); return gen(); } template float_type randomize_float_slope(void) { static boost::mt19937 rng; static boost::uniform_real dist(0.0, 0.01); static boost::variate_generator > gen(rng, dist); return gen(); } template void randomize_buffer(float_type * buffer, std::size_t size) { for (std::size_t i = 0; i != size; ++i) buffer[i] = randomize_float(); } template void randomize_buffer(float_type * buffer, std::size_t size, float_type offset) { for (std::size_t i = 0; i != size; ++i) buffer[i] = randomize_float() + offset; } template void randomize_buffer(float_type * buffer, std::size_t size, float_type scale, float_type offset) { for (std::size_t i = 0; i != size; ++i) buffer[i] = randomize_float() * scale + offset; } template void compare_buffers(const float_type * ref, const float_type * test, std::size_t size, float difference = 2e-7) { for (std::size_t i = 0; i != size; ++i) BOOST_REQUIRE_CLOSE_FRACTION( ref[i], test[i], difference ); } template void compare_buffers_relative(const float_type * ref, const float_type * test, std::size_t size) { for (std::size_t i = 0; i != size; ++i) BOOST_REQUIRE_CLOSE_FRACTION( ref[i], test[i], 1 ); } SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/testsuite/vec_test.cpp0000664000175000017500000000714612110473257030504 0ustar dandan#include #define BOOST_TEST_MAIN #include #include #include #include "../vec.hpp" using namespace nova; using namespace std; template void test_get_set(void) { vec v; for (int i = 0; i != v.size; ++i) v.set(i, (F)1.0*i); for (int i = 0; i != v.size; ++i) BOOST_REQUIRE_EQUAL( v.get(i), F(1.0*i)); vec w; w.set_slope(0, 1.0); for (int i = 0; i != v.size; ++i) BOOST_REQUIRE_EQUAL( w.get(i), F(1.0*i)); } template void compare_float_mask(VecType const & v, unsigned int mask) { for (int i = 0; i != v.size; ++i) { union { float f; unsigned int i; } x; x.f = v.get(i); BOOST_REQUIRE_EQUAL( x.i, mask); } } void test_gen_float(void) { typedef vec vec_t; vec_t zero = vec_t::gen_zero(); for (int i = 0; i != zero.size; ++i) BOOST_REQUIRE_EQUAL( zero.get(i), 0.f); vec_t one = vec_t::gen_one(); for (int i = 0; i != one.size; ++i) BOOST_REQUIRE_EQUAL( one.get(i), 1.f); vec_t half = vec_t::gen_05(); for (int i = 0; i != one.size; ++i) BOOST_REQUIRE_EQUAL( half.get(i), 0.5f); vec_t sign_mask = vec_t::gen_sign_mask(); compare_float_mask(sign_mask, 0x80000000); vec_t abs_mask = vec_t::gen_abs_mask(); compare_float_mask(abs_mask, 0x7fffffff); vec_t exp_mask = vec_t::gen_exp_mask(); compare_float_mask(exp_mask, 0x7F800000); vec_t exp1_mask = vec_t::gen_exp_mask_1(); compare_float_mask(exp1_mask, 0x3F000000); } BOOST_AUTO_TEST_CASE( get_set ) { test_get_set(); test_get_set(); test_gen_float(); } template void test_slope(void) { typedef vec vec_t; vec_t vec; T increment = vec.set_slope(0, 1); T expected_increment = vec_t::size * 1; BOOST_REQUIRE_CLOSE_FRACTION( increment, expected_increment, 0.001); for (int i = 0; i != vec_t::size; ++i) BOOST_REQUIRE_CLOSE_FRACTION( vec.get(i), i, 0.001); } BOOST_AUTO_TEST_CASE( slope ) { test_slope(); test_slope(); } template void test_select(void) { typedef vec vec_t; vec_t a(1.0), b(2.0); vec_t zero = vec_t::gen_zero(); vec_t ones = vec_t::gen_ones(); vec_t select_a = select(a, b, zero); vec_t select_b = select(a, b, ones); BOOST_REQUIRE(select_a.get(0) == 1); BOOST_REQUIRE(select_b.get(0) == 2); } BOOST_AUTO_TEST_CASE( select_tester ) { test_select(); test_select(); } BOOST_AUTO_TEST_CASE( align ) { BOOST_REQUIRE(vec::is_aligned(NULL)); BOOST_REQUIRE(vec::is_aligned(NULL)); BOOST_REQUIRE(!vec::is_aligned((double*)(NULL+1))); BOOST_REQUIRE(!vec::is_aligned((float*)(NULL+1))); } template void test_undenormalize(void) { const T min_positive_value = std::numeric_limits::min(); typedef vec vec_t; vec_t denormal(min_positive_value/2); vec_t fixed = undenormalize(denormal); BOOST_REQUIRE(fixed.get(0) == 0); vec_t normal(min_positive_value); BOOST_REQUIRE(normal.get(0) == min_positive_value); } BOOST_AUTO_TEST_CASE( undenormalize_tester ) { test_undenormalize(); test_undenormalize(); } template void test_reciprocal(void) { typedef vec vec_t; vec_t four(4.0); T result = reciprocal(four).get(0); BOOST_REQUIRE_CLOSE(result, 0.25, 1e-5); } BOOST_AUTO_TEST_CASE( reciprocal_tester ) { test_reciprocal(); test_reciprocal(); } SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/testsuite/simd_pan_tests.cpp0000644000175000017500000000470311512512273031673 0ustar dandan#include #define BOOST_TEST_MAIN #include #include #include #include "../simd_pan.hpp" #include "test_helper.hpp" #include "../benchmarks/cache_aligned_array.hpp" using namespace nova; using namespace std; static const int size = 512; template void test_pan2(void) { aligned_array sseval0, mpval0, generic0, args; aligned_array sseval1, mpval1, generic1; randomize_buffer(args.c_array(), size); float_type factor0 = 0.4; float_type factor1 = 0.6; pan2_vec(generic0.c_array(), generic1.c_array(), args.c_array(), factor0, factor1, size); pan2_vec_simd(sseval0.c_array(), sseval1.c_array(), args.c_array(), factor0, factor1, size); pan2_vec_simd(mpval0.c_array(), mpval1.c_array(), args.c_array(), factor0, factor1); for (int i = 0; i != size; ++i) { BOOST_CHECK_CLOSE( sseval0[i], generic0[i], 0.0001 ); BOOST_CHECK_CLOSE( mpval0[i], generic0[i], 0.0001 ); BOOST_CHECK_CLOSE( sseval1[i], generic1[i], 0.0001 ); BOOST_CHECK_CLOSE( mpval1[i], generic1[i], 0.0001 ); } } BOOST_AUTO_TEST_CASE( pan2_tests ) { test_pan2(); test_pan2(); } template void test_pan2_ramp(void) { aligned_array sseval0, mpval0, generic0, args; aligned_array sseval1, mpval1, generic1; randomize_buffer(args.c_array(), size); float_type factor0 = 0.4; float_type factor1 = 0.6; pan2_vec(generic0.c_array(), generic1.c_array(), args.c_array(), factor0, float_type(size*0.1), factor1, -float_type(size*0.1), size); pan2_vec_simd(sseval0.c_array(), sseval1.c_array(), args.c_array(), factor0, float_type(size*0.1), factor1, -float_type(size*0.1), size); pan2_vec_simd(mpval0.c_array(), mpval1.c_array(), args.c_array(), factor0, float_type(size*0.1), factor1, -float_type(size*0.1)); for (int i = 0; i != size; ++i) { BOOST_CHECK_CLOSE( sseval0[i], generic0[i], 0.01 ); BOOST_CHECK_CLOSE( mpval0[i], generic0[i], 0.01 ); BOOST_CHECK_CLOSE( sseval1[i], generic1[i], 0.01 ); BOOST_CHECK_CLOSE( mpval1[i], generic1[i], 0.01 ); } } BOOST_AUTO_TEST_CASE( pan2_ramp_tests ) { test_pan2_ramp(); test_pan2_ramp(); } SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/testsuite/simd_math_tests.cpp0000664000175000017500000000756711747572246032103 0ustar dandan#include #define BOOST_TEST_MAIN #include #include #include #include "../simd_math.hpp" #include "../benchmarks/cache_aligned_array.hpp" #include "test_helper.hpp" using namespace nova; using namespace std; static const int size = 10000; #define COMPARE_TEST(name, low, high) \ template \ void test_##name(void) \ { \ aligned_array sseval, mpval, libmval, args; \ \ float_type init = low; \ float_type diff = (float_type(high) - float_type(low)) / float_type(size); \ \ for (int i = 0; i != size; ++i) \ { \ args[i] = init; \ init += diff; \ } \ \ name##_vec(libmval.begin(), args.begin(), size); \ name##_vec_simd(sseval.begin(), args.begin(), size); \ /*name##_vec_simd(mpval.begin(), args.begin())*/; \ \ compare_buffers(sseval.begin(), libmval.begin(), size, 5e-6f); \ /*compare_buffers(mpval.begin(), libmval.begin(), size, 5e-6f)*/; \ } \ \ BOOST_AUTO_TEST_CASE( name##_tests) \ { \ test_##name(); \ test_##name(); \ } COMPARE_TEST(sin, -3.2, 3.2) COMPARE_TEST(cos, -3.2, 3.2) COMPARE_TEST(tan, -1.5, 1.5) COMPARE_TEST(asin, -1, 1) COMPARE_TEST(acos, -0.9, 0.9) COMPARE_TEST(atan, -10, 10) COMPARE_TEST(tanh, -10, 10) COMPARE_TEST(signed_sqrt, -20, 20) /* test range: 0, 20 */ BOOST_AUTO_TEST_CASE( pow_tests_float_1 ) { for (float exponent = 0.1; exponent < 2; exponent += 0.1) { aligned_array sseval, libmval, args; float init = 0; for (int i = 0; i != size; ++i) { args[i] = init; init += 20.f/size; } pow_vec(libmval.begin(), args.begin(), exponent, size); pow_vec_simd(sseval.begin(), args.begin(), exponent, size); compare_buffers(sseval.begin(), libmval.begin(), 1e-4f); } } /* test range: -10, 10 */ BOOST_AUTO_TEST_CASE( spow_tests_float_1 ) { for (float exponent = 0.1; exponent < 2; exponent += 0.1) { aligned_array sseval, libmval, args; aligned_array exparray; exparray.assign(exponent); float init = -10; for (int i = 0; i != size; ++i) { args[i] = init; init += 20.f/size; } spow_vec(libmval.begin(), args.begin(), exponent, size); spow_vec_simd(sseval.begin(), args.begin(), exponent, size); compare_buffers(sseval.begin(), libmval.begin(), 1e-4f); } vec zero(0.f); vec exponent(1.1f); vec result = pow(zero, exponent); BOOST_REQUIRE_EQUAL(result.get(0), 0.f); } COMPARE_TEST(log, 0.01, 100) COMPARE_TEST(log2, 0.01, 100) COMPARE_TEST(log10, 0.01, 100) COMPARE_TEST(exp, -10, 10) ././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/testsuite/simd_horizontal_tests.cppSuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/testsuite/simd_horizontal_tests0000644000175000017500000000325711643070235032532 0ustar dandan#define BOOST_TEST_MAIN #include #include #include #include "../simd_horizontal_functions.hpp" #include "../benchmarks/cache_aligned_array.hpp" #include "test_helper.hpp" using namespace nova; using namespace std; BOOST_AUTO_TEST_CASE( horizontal_tests_float ) { aligned_array arguments; float init = 0; for (int i = 0; i != 10000; ++i) { arguments[i] = init; init += 10/10000.f; } float non_simd_min = horizontal_min_vec(arguments.begin(), 10000); float simd_min = horizontal_min_vec_simd(arguments.begin(), 10000); BOOST_REQUIRE_CLOSE_FRACTION(non_simd_min, simd_min, 0); float non_simd_max = horizontal_max_vec(arguments.begin(), 10000); float simd_max = horizontal_max_vec_simd(arguments.begin(), 10000); BOOST_REQUIRE_CLOSE_FRACTION(non_simd_max, simd_max, 0); float non_simd_sum = horizontal_sum_vec(arguments.begin(), 10000); float simd_sum = horizontal_sum_vec_simd(arguments.begin(), 10000); BOOST_REQUIRE_CLOSE_FRACTION(non_simd_sum, simd_sum, 1e-6); horizontal_maxsum_vec(non_simd_max, non_simd_sum, arguments.begin(), 10000); horizontal_maxsum_vec_simd(simd_max, simd_sum, arguments.begin(), 10000); BOOST_REQUIRE_CLOSE_FRACTION(non_simd_max, simd_max, 0); BOOST_REQUIRE_CLOSE_FRACTION(non_simd_sum, simd_sum, 1e-6); horizontal_minmax_vec(non_simd_min, non_simd_max, arguments.begin(), 10000); horizontal_minmax_vec_simd(simd_min, simd_max, arguments.begin(), 10000); BOOST_REQUIRE_CLOSE_FRACTION(non_simd_min, simd_min, 0); BOOST_REQUIRE_CLOSE_FRACTION(non_simd_max, simd_max, 0); } SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/testsuite/simd_memory_tests.cpp0000664000175000017500000000653711706322620032436 0ustar dandan#include #define BOOST_TEST_MAIN #include #include #include #include "../simd_memory.hpp" #include "../benchmarks/cache_aligned_array.hpp" #include "test_helper.hpp" using namespace nova; using namespace std; static const unsigned int size = 64; template void zero_tests(void) { aligned_array out, out_simd, out_mp; randomize_buffer(out.c_array(), size); randomize_buffer(out_simd.c_array(), size); randomize_buffer(out_mp.c_array(), size); zerovec(out.c_array(), size); zerovec_simd(out_simd.c_array(), size); zerovec_simd(out_mp.c_array()); compare_buffers(out.c_array(), out_simd.c_array(), size); compare_buffers(out.c_array(), out_mp.c_array(), size); } BOOST_AUTO_TEST_CASE( zero_test ) { zero_tests(); zero_tests(); } template void set_tests(void) { aligned_array out, out_simd, out_mp; randomize_buffer(out.c_array(), size); randomize_buffer(out_simd.c_array(), size); randomize_buffer(out_mp.c_array(), size); float_type f = randomize_float(); setvec(out.c_array(), f, size); setvec_simd(out_simd.c_array(), f, size); setvec_simd(out_mp.c_array(), f); compare_buffers(out.c_array(), out_simd.c_array(), size); compare_buffers(out.c_array(), out_mp.c_array(), size); } BOOST_AUTO_TEST_CASE( set_test ) { set_tests(); set_tests(); } template void add_tests(void) { aligned_array out, out_simd, out_mp, in; randomize_buffer(in.c_array(), size); randomize_buffer(out.c_array(), size); out_simd = out; out_mp = out; addvec(out.c_array(), in.c_array(), size); addvec_simd(out_simd.c_array(), in.c_array(), size); addvec_simd(out_mp.c_array(), in.c_array()); compare_buffers(out.c_array(), out_simd.c_array(), size); compare_buffers(out.c_array(), out_mp.c_array(), size); } BOOST_AUTO_TEST_CASE( add_test ) { add_tests(); add_tests(); } template void slope_tests(void) { aligned_array out, out_simd; float_type base = randomize_float(); float_type slope = randomize_float() * 0.01; set_slope_vec(out.c_array(), base, slope, size); set_slope_vec_simd(out_simd.c_array(), base, slope, size); compare_buffers(out.c_array(), out_simd.c_array(), size); } BOOST_AUTO_TEST_CASE( slope_test ) { slope_tests(); slope_tests(); } template void exp_tests(void) { aligned_array out, out_simd; float_type base = std::abs(randomize_float()); float_type slope = std::abs(randomize_float() * 0.01) + 1; set_exp_vec(out.c_array(), base, slope, size); set_exp_vec_simd(out_simd.c_array(), base, slope, size); compare_buffers(out.c_array(), out_simd.c_array(), size, 1e-5); } BOOST_AUTO_TEST_CASE( exp_test ) { exp_tests(); exp_tests(); } SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/testsuite/simd_tests.cpp0000644000175000017500000000117611533651435031045 0ustar dandan#include #define BOOST_TEST_MAIN #include #include #include #ifdef __SSE__ #include "../simd_utils.hpp" using namespace nova; using namespace std; void test_register(__m128 arg, float f) { float data[4]; _mm_storeu_ps(data, arg); for (int i = 0; i != 4; ++ i) BOOST_REQUIRE_EQUAL(data[i], f); } BOOST_AUTO_TEST_CASE( utils_test ) { test_register(detail::gen_one(), 1.f); test_register(detail::gen_05(), 0.5f); test_register(detail::gen_025(), 0.25f); } #endif BOOST_AUTO_TEST_CASE( dummy_test ) { } ././@LongLink0000000000000000000000000000015600000000000011567 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/testsuite/simd_unit_conversion_tests.cppSuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/testsuite/simd_unit_conversion_0000644000175000017500000000376411512512273032503 0ustar dandan#include #define BOOST_TEST_MAIN #include #include #include #include "../simd_unit_conversion.hpp" #include "test_helper.hpp" #include "../benchmarks/cache_aligned_array.hpp" using namespace nova; using namespace std; static const int size = 1024; #define CONVERSION_TEST(name, offset, scale) \ template \ void test_##name(void) \ { \ aligned_array sseval, generic, args0; \ randomize_buffer(args0.c_array(), size, offset, scale); \ \ name##_vec(generic.c_array(), args0.c_array(), size); \ name##_vec_simd(sseval.c_array(), args0.c_array(), size); \ \ for (int i = 0; i != size; ++i) { \ BOOST_CHECK_CLOSE( sseval[i], generic[i], 0.001 ); \ } \ } \ \ BOOST_AUTO_TEST_CASE( name##_tests ) \ { \ test_##name(); \ test_##name(); \ } CONVERSION_TEST(midi2freq, 127, 0) CONVERSION_TEST(freq2midi, 16000, 0) CONVERSION_TEST(midi2ratio, 127, 0) CONVERSION_TEST(ratio2midi, 1, 0) CONVERSION_TEST(oct2freq, 10, 0) CONVERSION_TEST(freq2oct, 16000, 0) CONVERSION_TEST(db2amp, 127, -127) CONVERSION_TEST(amp2db, 1, 0) SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/testsuite/ampmod_test.cpp0000644000175000017500000000367211512512273031177 0ustar dandan#include #define BOOST_TEST_MAIN #include #include #include #include "../simd_ternary_arithmetic.hpp" #include "../benchmarks/cache_aligned_array.hpp" #include "test_helper.hpp" using namespace nova; using namespace std; static const unsigned int size = 64; template void vv_tests(void) { aligned_array out, out_simd, in0, in1, amount; randomize_buffer(in0.c_array(), size); randomize_buffer(in1.c_array(), size); randomize_buffer(amount.c_array(), size); ampmod_vec(out.c_array(), wrap_argument(in0.c_array()), wrap_argument(in1.c_array()), wrap_argument(amount.c_array()), size); ampmod_vec_simd(out_simd.c_array(), wrap_argument(in0.c_array()), wrap_argument(in1.c_array()), wrap_argument(amount.c_array()), size); compare_buffers(out.c_array(), out_simd.c_array(), size, 1e-6); } BOOST_AUTO_TEST_CASE( vv_test ) { vv_tests(); vv_tests(); } template void vs_tests(void) { aligned_array out, out_simd, in0, in1; float_type amount; randomize_buffer(in0.c_array(), size); randomize_buffer(in1.c_array(), size); amount = randomize_float(); ampmod_vec(out.c_array(), wrap_argument(in0.c_array()), wrap_argument(in1.c_array()), wrap_argument(amount), size); ampmod_vec_simd(out_simd.c_array(), wrap_argument(in0.c_array()), wrap_argument(in1.c_array()), wrap_argument(amount), size); compare_buffers(out.c_array(), out_simd.c_array(), size, 1e-6); } BOOST_AUTO_TEST_CASE( vs_test ) { vs_tests(); vs_tests(); } SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/testsuite/simd_unary_tests.cpp0000664000175000017500000001242412013456043032253 0ustar dandan#include #define BOOST_TEST_MAIN #include #include #include #include "test_helper.hpp" #include "../benchmarks/cache_aligned_array.hpp" #include "../simd_unary_arithmetic.hpp" using namespace nova; using namespace std; static const unsigned int size = 64; #define COMPARE_TEST(function) \ template \ void function##_compare(void) \ { \ aligned_array out, out_simd, out_mp, in; \ randomize_buffer(in.c_array(), size); \ \ nova::function##_vec(out.c_array(), in.c_array(), size); \ nova::function##_vec_simd(out_simd.c_array(), in.c_array(), size); \ nova::function##_vec_simd(out_mp.c_array(), in.c_array());\ \ compare_buffers(out.c_array(), out_simd.c_array(), size, 1e-6f);\ compare_buffers(out.c_array(), out_mp.c_array(), size, 1e-6f); \ } \ \ BOOST_AUTO_TEST_CASE( function##_comparer ) \ { \ function##_compare(); \ function##_compare(); \ } template void run_sign_test(void) { aligned_array in; aligned_array out; in[0] = -2; in[1] = in[2] = 0; in[3] = 2; nova::sgn_vec_simd(out.begin(), in.begin(), size); BOOST_REQUIRE_EQUAL( out[0], -1 ); BOOST_REQUIRE_EQUAL( out[1], 0 ); BOOST_REQUIRE_EQUAL( out[2], 0 ); BOOST_REQUIRE_EQUAL( out[3], 1 ); } BOOST_AUTO_TEST_CASE( sign_test2 ) { run_sign_test(); run_sign_test(); } COMPARE_TEST(sgn) template void run_abs_test(void) { aligned_array in; aligned_array out; in[0] = -2; in[1] = in[2] = 0; in[3] = 2; nova::abs_vec_simd(out.begin(), in.begin(), size); BOOST_REQUIRE_EQUAL( out[0], 2 ); BOOST_REQUIRE_EQUAL( out[1], 0 ); BOOST_REQUIRE_EQUAL( out[2], 0 ); BOOST_REQUIRE_EQUAL( out[3], 2 ); } BOOST_AUTO_TEST_CASE( abs_test2 ) { run_abs_test(); run_abs_test(); } COMPARE_TEST(abs) template void run_square_test(void) { aligned_array in; aligned_array out; in[0] = -2; in[1] = in[2] = 0; in[3] = 2; nova::square_vec_simd(out.begin(), in.begin(), size); BOOST_REQUIRE_EQUAL( out[0], 4 ); BOOST_REQUIRE_EQUAL( out[1], 0 ); BOOST_REQUIRE_EQUAL( out[2], 0 ); BOOST_REQUIRE_EQUAL( out[3], 4 ); } BOOST_AUTO_TEST_CASE( square_test2 ) { run_square_test(); run_square_test(); } COMPARE_TEST(square) template void run_cube_test(void) { aligned_array in; aligned_array out; in[0] = -2; in[1] = in[2] = 0; in[3] = 2; nova::cube_vec_simd(out.begin(), in.begin(), size); BOOST_REQUIRE_EQUAL( out[0], -8 ); BOOST_REQUIRE_EQUAL( out[1], 0 ); BOOST_REQUIRE_EQUAL( out[2], 0 ); BOOST_REQUIRE_EQUAL( out[3], 8 ); } BOOST_AUTO_TEST_CASE( cube_test2 ) { run_cube_test(); run_cube_test(); } COMPARE_TEST(cube) template void undenormalize_compare(void) { aligned_array out, out_simd, out_mp, in; const float_type min_positive_value = std::numeric_limits::min(); for (int i = 0; i != size; ++i) in [i] = (i * min_positive_value * 2.0)/(float_type)size; nova::undenormalize_vec(out.c_array(), in.c_array(), size); nova::undenormalize_vec_simd(out_simd.c_array(), in.c_array(), size); nova::undenormalize_vec_simd(out_mp.c_array(), in.c_array()); compare_buffers(out.c_array(), out_simd.c_array(), size, 1e-6f); compare_buffers(out.c_array(), out_mp.c_array(), size, 1e-6f); } BOOST_AUTO_TEST_CASE( undenormalize_tester ) { undenormalize_compare(); undenormalize_compare(); } template void reciprical_compare(void) { aligned_array out, out_simd, out_mp, in; for (int i = 0; i != size; ++i) in [i] = (i * 100)/(float_type)size + 1; nova::reciprocal_vec(out.c_array(), in.c_array(), size); nova::reciprocal_vec_simd(out_simd.c_array(), in.c_array(), size); nova::reciprocal_vec_simd(out_mp.c_array(), in.c_array()); compare_buffers(out.c_array(), out_simd.c_array(), size, 1e-6f); compare_buffers(out.c_array(), out_mp.c_array(), size, 1e-6f); } BOOST_AUTO_TEST_CASE( reciprocal_tester ) { reciprical_compare(); reciprical_compare(); } SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/testsuite/simd_peak_tests.cpp0000644000175000017500000000247711512512273032043 0ustar dandan#include #define BOOST_TEST_MAIN #include #include #include #include "../benchmarks/cache_aligned_array.hpp" #include "../simd_peakmeter.hpp" using namespace nova; using namespace std; static const int size = 64; template void run_peak(void) { aligned_array in; in.assign(0); in[63] = -0.5; in[40] = 1; { F peak = 0; F last = nova::peak_vec_simd(in.begin(), &peak, size); BOOST_REQUIRE_EQUAL( peak, 1 ); BOOST_REQUIRE_EQUAL( last, 0.5 ); } { F peak = 0; F last = nova::peak_vec(in.begin(), &peak, size); BOOST_REQUIRE_EQUAL( peak, 1 ); BOOST_REQUIRE_EQUAL( last, 0.5 ); } { F peak = 0; F rms = 0; nova::peak_rms_vec_simd(in.begin(), &peak, &rms, size); BOOST_REQUIRE_EQUAL( peak, 1 ); BOOST_REQUIRE_EQUAL( rms, 1.25 ); } { F peak = 0; F rms = 0; nova::peak_rms_vec(in.begin(), &peak, &rms, size); BOOST_REQUIRE_EQUAL( peak, 1 ); BOOST_REQUIRE_EQUAL( rms, 1.25 ); } } BOOST_AUTO_TEST_CASE( peak_test_float ) { run_peak(); } BOOST_AUTO_TEST_CASE( peak_test_double ) { run_peak(); } SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/testsuite/simd_binary_tests.cpp0000664000175000017500000002330211676566014032414 0ustar dandan#include #define BOOST_TEST_MAIN #include #include #include #include "test_helper.hpp" #include "../benchmarks/cache_aligned_array.hpp" #include "../simd_binary_arithmetic.hpp" using namespace nova; using namespace std; static const unsigned int size = 64; #define COMPARE_TEST(function) \ template \ void function##_compare_vv(void) \ { \ aligned_array out, out_simd, out_mp, \ in0, in1; \ randomize_buffer(in0.c_array(), size); \ randomize_buffer(in1.c_array(), size); \ \ function##_vec(out.c_array(), in0.c_array(), \ in1.c_array(), size); \ function##_vec_simd(out_simd.c_array(), \ in0.c_array(), \ in1.c_array(), size); \ function##_vec_simd(out_mp.c_array(), in0.c_array(), \ in1.c_array()); \ \ compare_buffers(out.c_array(), out_simd.c_array(), size); \ compare_buffers(out.c_array(), out_mp.c_array(), size); \ } \ \ template \ void function##_compare_vs(void) \ { \ aligned_array out, out_simd, out_mp, in0; \ randomize_buffer(in0.c_array(), size); \ float_type in1 = randomize_float(); \ \ function##_vec(out.c_array(), in0.c_array(), \ in1, size); \ function##_vec_simd(out_simd.c_array(), \ in0.c_array(), \ in1, size); \ function##_vec_simd(out_mp.c_array(), in0.c_array(), \ in1); \ \ compare_buffers(out.c_array(), out_simd.c_array(), size); \ compare_buffers(out.c_array(), out_mp.c_array(), size); \ } \ \ template \ void function##_compare_sv(void) \ { \ aligned_array out, out_simd, out_mp, in0; \ randomize_buffer(in0.c_array(), size); \ float_type in1 = randomize_float(); \ \ function##_vec(out.c_array(), in1, \ in0.c_array(), size); \ function##_vec_simd(out_simd.c_array(), in1, \ in0.c_array(), size); \ function##_vec_simd(out_mp.c_array(), in1, in0.c_array()); \ \ compare_buffers(out.c_array(), out_simd.c_array(), size); \ compare_buffers(out.c_array(), out_mp.c_array(), size); \ } \ \ template \ void function##_compare_vr(void) \ { \ aligned_array out, out_simd, out_mp, in0; \ randomize_buffer(in0.c_array(), size); \ float_type in1 = randomize_float(); \ float_type in1_slope = randomize_float_slope(); \ \ function##_vec(out.c_array(), in0.c_array(), \ slope_argument(in1, in1_slope), size); \ function##_vec_simd(out_simd.c_array(), \ in0.c_array(), \ slope_argument(in1, in1_slope), size); \ function##_vec_simd(out_mp.c_array(), in0.c_array(), \ slope_argument(in1, in1_slope)); \ \ compare_buffers(out.c_array(), out_simd.c_array(), size, 5e-4); \ compare_buffers(out.c_array(), out_mp.c_array(), size, 5e-4); \ } \ \ template \ void function##_compare_rv(void) \ { \ aligned_array out, out_simd, out_mp, in0; \ randomize_buffer(in0.c_array(), size); \ float_type in1 = randomize_float(); \ float_type in1_slope = randomize_float_slope(); \ \ function##_vec(out.c_array(), slope_argument(in1, in1_slope), \ in0.c_array(), size); \ function##_vec_simd(out_simd.c_array(), \ slope_argument(in1, in1_slope), \ in0.c_array(), size); \ function##_vec_simd(out_mp.c_array(), slope_argument(in1, in1_slope), \ in0.c_array()); \ \ compare_buffers(out.c_array(), out_simd.c_array(), size, 5e-4); \ compare_buffers(out.c_array(), out_mp.c_array(), size, 5e-4); \ } \ \ BOOST_AUTO_TEST_CASE( function##_comparer_vv ) \ { \ function##_compare_vv(); \ function##_compare_vv(); \ } \ \ BOOST_AUTO_TEST_CASE( function##_comparer_vs ) \ { \ function##_compare_vs(); \ function##_compare_vs(); \ } \ \ BOOST_AUTO_TEST_CASE( function##_comparer_vr ) \ { \ function##_compare_vr(); \ function##_compare_vr(); \ } \ \ BOOST_AUTO_TEST_CASE( function##_comparer_sv ) \ { \ function##_compare_sv(); \ function##_compare_sv(); \ } \ \ BOOST_AUTO_TEST_CASE( function##_comparer_rv ) \ { \ function##_compare_rv(); \ function##_compare_rv(); \ } COMPARE_TEST(plus) COMPARE_TEST(minus) COMPARE_TEST(times) COMPARE_TEST(over) COMPARE_TEST(min) COMPARE_TEST(max) COMPARE_TEST(less) COMPARE_TEST(less_equal) COMPARE_TEST(greater) COMPARE_TEST(greater_equal) COMPARE_TEST(equal) COMPARE_TEST(notequal) COMPARE_TEST(clip2) SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/testsuite/softclip_test.cpp0000644000175000017500000000135511512512273031541 0ustar dandan#include #define BOOST_TEST_MAIN #include #include #include #include "../softclip.hpp" #include "../benchmarks/cache_aligned_array.hpp" #include "test_helper.hpp" using namespace nova; using namespace std; BOOST_AUTO_TEST_CASE( softclip_tests_float ) { aligned_array simd_val, normal_val, arguments; float init = 0; for (int i = 0; i != 10000; ++i) { arguments[i] = init; init += 10/10000.f; } softclip_vec_simd(simd_val.begin(), arguments.begin(), 10000); softclip_vec (normal_val.begin(), arguments.begin(), 10000); compare_buffers(normal_val.begin(), simd_val.begin(), 1e-8f); } SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/testsuite/CMakeLists.txt0000664000175000017500000000141512110473257030715 0ustar dandanset(tests ampmod_test.cpp simd_binary_tests.cpp simd_horizontal_tests.cpp simd_math_tests.cpp simd_memory_tests.cpp simd_mix_tests.cpp simd_pan_tests.cpp simd_peak_tests.cpp simd_round_tests.cpp simd_ternary_tests.cpp simd_tests.cpp simd_unary_tests.cpp simd_unit_conversion_tests.cpp softclip_test.cpp vec_test.cpp ) SET(EMULATOR "" CACHE STRING "use CPU emulator") separate_arguments(EMULATOR UNIX_COMMAND "${EMULATOR}") foreach(test ${tests}) string(REPLACE .cpp "" test_name ${test} ) add_executable(${test_name} ${test}) if(EMULATOR) add_test(NAME ${test_name}_run COMMAND ${EMULATOR} ${CMAKE_CURRENT_BINARY_DIR}/${test_name}) else() add_test(${test_name}_run ${EXECUTABLE_OUTPUT_PATH}/${test_name}) endif() endforeach(test) SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/testsuite/simd_mix_tests.cpp0000664000175000017500000001106111676566014031724 0ustar dandan#include #define BOOST_TEST_MAIN #include #include #include #include "../simd_mix.hpp" #include "test_helper.hpp" #include "../benchmarks/cache_aligned_array.hpp" using namespace nova; using namespace std; static const int size = 512; template void test_mix(void) { aligned_array sseval, mpval, generic, args0, args1; randomize_buffer(args0.c_array(), size); randomize_buffer(args1.c_array(), size); float_type factor0 = 0.4; float_type factor1 = 0.6; mix_vec(generic.c_array(), args0.c_array(), factor0, args1.c_array(), factor1, size); mix_vec_simd(sseval.c_array(), args0.c_array(), factor0, args1.c_array(), factor1, size); mix_vec_simd(mpval.c_array(), args0.c_array(), factor0, args1.c_array(), factor1); for (int i = 0; i != size; ++i) { BOOST_CHECK_CLOSE( sseval[i], generic[i], 0.0001 ); BOOST_CHECK_CLOSE( mpval[i], generic[i], 0.0001 ); } } BOOST_AUTO_TEST_CASE( mix_tests ) { test_mix(); test_mix(); } template void test_mix_ramp(void) { aligned_array sseval, mpval, generic, args0, args1; randomize_buffer(args0.c_array(), size); randomize_buffer(args1.c_array(), size); float_type factor0 = 0.4; float_type slope0 = 0.1/size; float_type factor1 = 0.6; float_type slope1 = -0.1/size; mix_vec(generic.c_array(), args0.c_array(), slope_argument(factor0, slope0), args1.c_array(), slope_argument(factor1, slope1), size); mix_vec_simd(sseval.c_array(), args0.c_array(), slope_argument(factor0, slope0), args1.c_array(), slope_argument(factor1, slope1), size); mix_vec_simd(mpval.c_array(), args0.c_array(), slope_argument(factor0, slope0), args1.c_array(), slope_argument(factor1, slope1)); for (int i = 0; i != size; ++i) { BOOST_CHECK_CLOSE( sseval[i], generic[i], 0.5 ); BOOST_CHECK_CLOSE( mpval[i], generic[i], 0.5 ); } } BOOST_AUTO_TEST_CASE( mix_ramp_tests ) { test_mix_ramp(); test_mix_ramp(); } template void test_sum(void) { aligned_array sseval, mpval, generic, args0, args1; randomize_buffer(args0.c_array(), size); randomize_buffer(args1.c_array(), size); sum_vec(generic.c_array(), args0.c_array(), args1.c_array(), size); sum_vec_simd(sseval.c_array(), args0.c_array(), args1.c_array(), size); sum_vec_simd(mpval.c_array(), args0.c_array(), args1.c_array()); for (int i = 0; i != size; ++i) { BOOST_CHECK_CLOSE( sseval[i], generic[i], 0.0001 ); BOOST_CHECK_CLOSE( mpval[i], generic[i], 0.0001 ); } } template void test_sum3(void) { aligned_array sseval, mpval, generic, args0, args1, args2; randomize_buffer(args0.c_array(), size); randomize_buffer(args1.c_array(), size); randomize_buffer(args2.c_array(), size); sum_vec(generic.c_array(), args0.c_array(), args1.c_array(), args2.c_array(), size); sum_vec_simd(sseval.c_array(), args0.c_array(), args1.c_array(), args2.c_array(), size); sum_vec_simd(mpval.c_array(), args0.c_array(), args1.c_array(), args2.c_array()); for (int i = 0; i != size; ++i) { BOOST_CHECK_CLOSE( sseval[i], generic[i], 0.0001 ); BOOST_CHECK_CLOSE( mpval[i], generic[i], 0.0001 ); } } template void test_sum4(void) { aligned_array sseval, mpval, generic, args0, args1, args2, args3; randomize_buffer(args0.c_array(), size); randomize_buffer(args1.c_array(), size); randomize_buffer(args2.c_array(), size); randomize_buffer(args3.c_array(), size); sum_vec(generic.c_array(), args0.c_array(), args1.c_array(), args2.c_array(), args3.c_array(), size); sum_vec_simd(sseval.c_array(), args0.c_array(), args1.c_array(), args2.c_array(), args3.c_array(), size); sum_vec_simd(mpval.c_array(), args0.c_array(), args1.c_array(), args2.c_array(), args3.c_array()); for (int i = 0; i != size; ++i) { BOOST_CHECK_CLOSE( sseval[i], generic[i], 0.0001 ); BOOST_CHECK_CLOSE( mpval[i], generic[i], 0.0001 ); } } BOOST_AUTO_TEST_CASE( sum_tests ) { test_sum(); test_sum(); test_sum3(); test_sum3(); test_sum4(); test_sum4(); } ././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/testsuite/simd_ternary_tests.cppSuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/testsuite/simd_ternary_tests.cp0000644000175000017500000001642211512512273032422 0ustar dandan#include #define BOOST_TEST_MAIN #include #include #include #include "test_helper.hpp" #include "../benchmarks/cache_aligned_array.hpp" #include "../simd_ternary_arithmetic.hpp" using namespace nova; using namespace std; static const int unsigned size = 64; #define COMPARE_TEST(function) \ template \ void function##_compare_vvv(void) \ { \ aligned_array out, out_simd, out_mp, \ in0, in1, in2; \ randomize_buffer(in0.c_array(), size); \ randomize_buffer(in1.c_array(), size, -1); \ randomize_buffer(in2.c_array(), size, +1); \ \ function##_vec(out.c_array(), \ wrap_argument(in0.c_array()), \ wrap_argument(in1.c_array()), \ wrap_argument(in2.c_array()), \ size); \ \ function##_vec_simd(out_simd.c_array(), \ wrap_argument(in0.c_array()), \ wrap_argument(in1.c_array()), \ wrap_argument(in2.c_array()), \ size); \ \ function##_vec_simd(out_mp.c_array(), \ wrap_argument(in0.c_array()), \ wrap_argument(in1.c_array()), \ wrap_argument(in2.c_array())); \ \ compare_buffers(out.c_array(), out_simd.c_array(), size, 1e-4f); \ compare_buffers(out.c_array(), out_mp.c_array(), size, 1e-4f); \ } \ template \ void function##_compare_vvs(void) \ { \ aligned_array out, out_simd, out_mp, \ in0, in1; \ randomize_buffer(in0.c_array(), size); \ randomize_buffer(in1.c_array(), size, -1); \ float_type in2 = randomize_float(); \ \ function##_vec(out.c_array(), \ wrap_argument(in0.c_array()), \ wrap_argument(in1.c_array()), \ wrap_argument(in2), size); \ function##_vec_simd(out_simd.c_array(), \ wrap_argument(in0.c_array()), \ wrap_argument(in1.c_array()), \ wrap_argument(in2), \ size); \ function##_vec_simd(out_mp.c_array(), \ wrap_argument(in0.c_array()), \ wrap_argument(in1.c_array()), \ wrap_argument(in2)); \ \ compare_buffers(out.c_array(), out_simd.c_array(), size, 1e-4f); \ compare_buffers(out.c_array(), out_mp.c_array(), size, 1e-4f); \ } \ template \ void function##_compare_vvr(void) \ { \ aligned_array out, out_simd, out_mp, \ in0, in1; \ randomize_buffer(in0.c_array(), size); \ randomize_buffer(in1.c_array(), size, -1); \ float_type in2 = randomize_float() + 2; \ float_type in2_slope = randomize_float() * 0.0001; \ \ function##_vec(out.c_array(), \ wrap_argument(in0.c_array()), \ wrap_argument(in1.c_array()), \ wrap_argument(in2, in2_slope), \ size); \ function##_vec_simd(out_simd.c_array(), \ wrap_argument(in0.c_array()), \ wrap_argument(in1.c_array()), \ wrap_argument(in2, in2_slope), \ size); \ function##_vec_simd(out_mp.c_array(), \ wrap_argument(in0.c_array()), \ wrap_argument(in1.c_array()), \ wrap_argument(in2, in2_slope)); \ \ compare_buffers_relative(out.c_array(), out_simd.c_array(), \ size); \ compare_buffers_relative(out.c_array(), out_mp.c_array(), \ size); \ } \ \ BOOST_AUTO_TEST_CASE( function##_comparer ) \ { \ function##_compare_vvv(); \ function##_compare_vvv(); \ function##_compare_vvs(); \ function##_compare_vvs(); \ function##_compare_vvr(); \ function##_compare_vvr(); \ } COMPARE_TEST(clip) COMPARE_TEST(muladd) SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/detail/0000775000175000017500000000000012110505246025357 5ustar dandanSuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/detail/wrap_argument_vector.hpp0000664000175000017500000000706612110473257032344 0ustar dandan// vector signal argument wrappers // Copyright (C) 2010 Tim Blechmann // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; see the file COPYING. If not, write to // the Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. #ifndef NOVA_SIMD_DETAIL_WRAP_ARGUMENT_VECTOR_HPP #define NOVA_SIMD_DETAIL_WRAP_ARGUMENT_VECTOR_HPP #include "../vec.hpp" #include "../wrap_arguments.hpp" #if defined(__GNUC__) && defined(NDEBUG) #define always_inline inline __attribute__((always_inline)) #else #define always_inline inline #endif namespace nova { namespace detail { template struct vector_pointer_argument { always_inline explicit vector_pointer_argument(const FloatType * arg): data(arg) {} always_inline void increment(void) { data += vec::size; } always_inline vec get(void) const { vec ret; ret.load_aligned(data); return ret; } always_inline vec consume(void) { vec ret; ret.load_aligned(data); increment(); return ret; } const FloatType * data; }; template struct vector_scalar_argument { always_inline explicit vector_scalar_argument(FloatType const & arg): data(arg) {} always_inline void increment(void) {} always_inline vec get(void) const { return vec(data); } always_inline vec consume(void) { return vec(data); } FloatType data; }; template struct vector_ramp_argument { always_inline vector_ramp_argument(FloatType const & base, FloatType const & slope) { float vSlope = data.set_slope(base, slope); slope_.set_vec(vSlope); } always_inline void increment(void) { data += slope_; } always_inline vec get(void) const { return data; } always_inline vec consume(void) { vec ret(data); increment(); return ret; } vec data; vec slope_; }; /* convert scalar args to vector args */ template always_inline detail::vector_scalar_argument wrap_vector_arg(detail::scalar_scalar_argument const & arg) { return detail::vector_scalar_argument(arg.data); } template always_inline detail::vector_pointer_argument wrap_vector_arg(detail::scalar_pointer_argument const & arg) { return detail::vector_pointer_argument(arg.data); } template always_inline detail::vector_ramp_argument wrap_vector_arg(detail::scalar_ramp_argument const & arg) { return detail::vector_ramp_argument(arg.data, arg.slope_); } } /* namespace detail */ } /* namespace nova */ #undef always_inline #endif /* NOVA_SIMD_DETAIL_WRAP_ARGUMENT_VECTOR_HPP */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/detail/define_macros.hpp0000664000175000017500000003655611774551513030722 0ustar dandan// helper macros for defining the external interface functions // Copyright (C) 2010-2012 Tim Blechmann // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; see the file COPYING. If not, write to // the Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. #ifndef NOVA_SIMD_DETAIL_DEFINE_MACROS_HPP #define NOVA_SIMD_DETAIL_DEFINE_MACROS_HPP #include "wrap_argument_vector.hpp" #include "unroll_helpers.hpp" #if defined(__GNUC__) && defined(NDEBUG) #define always_inline inline __attribute__((always_inline)) #else #define always_inline inline #endif namespace nova { namespace detail { template struct unary_functor { template static always_inline void perform_vec(FloatType * out, const FloatType * arg, unsigned int n) { nova::detail::apply_on_vector(out, arg, n, Functor()); } template static always_inline void perform_vec_simd(FloatType * out, const FloatType * arg, unsigned int n) { nova::detail::generate_simd_loop(out, nova::detail::wrap_vector_arg(wrap_argument(arg)), n, Functor()); } template static always_inline void perform_vec_simd(FloatType * out, const FloatType * arg) { nova::detail::vector_pointer_argument varg(arg); nova::detail::compile_time_unroller::run(out, varg, Functor()); } }; template struct binary_functor { template static always_inline void perform_vec(FloatType * out, Arg1Type arg1, Arg2Type arg2, unsigned int n) { nova::detail::apply_on_vector(out, wrap_argument(arg1), wrap_argument(arg2), n, Functor()); } template static always_inline void perform_vec_simd(FloatType * out, Arg1Type arg1, Arg2Type arg2, unsigned int n) { nova::detail::generate_simd_loop(out, nova::detail::wrap_vector_arg(wrap_argument(arg1)), nova::detail::wrap_vector_arg(wrap_argument(arg2)), n, Functor()); } template static always_inline void perform_vec_simd(FloatType * out, Arg1Type arg1, Arg2Type arg2) { perform_vec_simd_(out, nova::detail::wrap_vector_arg(wrap_argument(arg1)), nova::detail::wrap_vector_arg(wrap_argument(arg2))); } private: template static always_inline void perform_vec_simd_(FloatType * out, Arg1Type arg1, Arg2Type arg2) { nova::detail::compile_time_unroller::run(out, arg1, arg2, Functor()); } }; template struct ternary_functor { template static always_inline void perform_vec(FloatType * out, Arg1Type arg1, Arg2Type arg2, Arg3Type arg3, unsigned int n) { nova::detail::apply_on_vector(out, wrap_argument(arg1), wrap_argument(arg2), wrap_argument(arg3), n, Functor()); } template static always_inline void perform_vec_simd(FloatType * out, Arg1Type arg1, Arg2Type arg2, Arg3Type arg3, unsigned int n) { nova::detail::generate_simd_loop(out, nova::detail::wrap_vector_arg(wrap_argument(arg1)), nova::detail::wrap_vector_arg(wrap_argument(arg2)), nova::detail::wrap_vector_arg(wrap_argument(arg3)), n, Functor()); } template static always_inline void perform_vec_simd(FloatType * out, Arg1Type arg1, Arg2Type arg2, Arg3Type arg3) { perform_vec_simd_(out, nova::detail::wrap_vector_arg(wrap_argument(arg1)), nova::detail::wrap_vector_arg(wrap_argument(arg2)), nova::detail::wrap_vector_arg(wrap_argument(arg3))); } private: template static always_inline void perform_vec_simd_(FloatType * out, Arg1Type arg1, Arg2Type arg2, Arg3Type arg3) { nova::detail::compile_time_unroller::run(out, arg1, arg2, arg3, Functor()); } }; template struct quarternary_functor { template static always_inline void perform_vec(FloatType * out, Arg1Type arg1, Arg2Type arg2, Arg3Type arg3, Arg4Type arg4, unsigned int n) { nova::detail::apply_on_vector(out, wrap_argument(arg1), wrap_argument(arg2), wrap_argument(arg3), wrap_argument(arg4), n, Functor()); } template static always_inline void perform_vec_simd(FloatType * out, Arg1Type arg1, Arg2Type arg2, Arg3Type arg3, Arg4Type arg4, unsigned int n) { nova::detail::generate_simd_loop(out, nova::detail::wrap_vector_arg(wrap_argument(arg1)), nova::detail::wrap_vector_arg(wrap_argument(arg2)), nova::detail::wrap_vector_arg(wrap_argument(arg3)), nova::detail::wrap_vector_arg(wrap_argument(arg4)), n, Functor()); } template static always_inline void perform_vec_simd(FloatType * out, Arg1Type arg1, Arg2Type arg2, Arg3Type arg3, Arg4Type arg4) { perform_vec_simd_(out, nova::detail::wrap_vector_arg(wrap_argument(arg1)), nova::detail::wrap_vector_arg(wrap_argument(arg2)), nova::detail::wrap_vector_arg(wrap_argument(arg3)), nova::detail::wrap_vector_arg(wrap_argument(arg4))); } private: template static always_inline void perform_vec_simd_(FloatType * out, Arg1Type arg1, Arg2Type arg2, Arg3Type arg3, Arg4Type arg4) { nova::detail::compile_time_unroller::run(out, arg1, arg2, arg3, arg4, Functor()); } }; } // namespace detail } // namespace nova #define NOVA_SIMD_DEFINE_UNARY_WRAPPER(NAME, FUNCTOR) \ \ template \ inline void NAME##_vec(FloatType * out, const FloatType * arg, unsigned int n) \ { \ nova::detail::unary_functor::perform_vec(out, arg, n); \ } \ \ template \ inline void NAME##_vec_simd(FloatType * out, const FloatType * arg, unsigned int n) \ { \ nova::detail::unary_functor::perform_vec_simd(out, arg, n); \ } \ \ template \ inline void NAME##_vec_simd(FloatType * out, const FloatType * arg) \ { \ nova::detail::unary_functor::perform_vec_simd(out, arg); \ } #define NOVA_SIMD_DEFINE_BINARY_WRAPPER(NAME, FUNCTOR) \ \ template \ inline void NAME##_vec(FloatType * out, Arg1Type arg1, Arg2Type arg2, unsigned int n) \ { \ nova::detail::binary_functor::perform_vec(out, arg1, arg2, n); \ } \ \ template \ inline void NAME##_vec_simd(FloatType * out, Arg1Type arg1, Arg2Type arg2, unsigned int n) \ { \ nova::detail::binary_functor::perform_vec_simd(out, arg1, arg2, n); \ } \ \ template \ inline void NAME##_vec_simd(FloatType * out, Arg1Type arg1, Arg2Type arg2) \ { \ nova::detail::binary_functor::perform_vec_simd(out, arg1, arg2); \ } #define NOVA_SIMD_DEFINE_TERNARY_WRAPPER(NAME, FUNCTOR) \ template \ inline void NAME##_vec(FloatType * out, Arg1 arg1, Arg2 arg2, Arg3 arg3, unsigned int n) \ { \ nova::detail::ternary_functor::perform_vec(out, arg1, arg2, arg3, n); \ } \ \ template \ inline void NAME##_vec_simd(FloatType * out, Arg1 arg1, Arg2 arg2, Arg3 arg3, unsigned int n) \ { \ nova::detail::ternary_functor::perform_vec_simd(out, arg1, arg2, arg3, n); \ } \ \ template \ inline void NAME##_vec_simd(FloatType * out, Arg1 arg1, Arg2 arg2, Arg3 arg3) \ { \ nova::detail::ternary_functor::perform_vec_simd(out, arg1, arg2, arg3); \ } #define NOVA_SIMD_DEFINE_4ARY_WRAPPER(NAME, FUNCTOR) \ template \ inline void NAME##_vec(FloatType * out, Arg1 arg1, Arg2 arg2, \ Arg3 arg3, Arg4 arg4, unsigned int n) \ { \ nova::detail::quarternary_functor::perform_vec(out, arg1, arg2, arg3, arg4, n); \ } \ \ template \ inline void NAME##_vec_simd(FloatType * out, Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, unsigned int n) \ { \ nova::detail::quarternary_functor::perform_vec_simd(out, arg1, arg2, arg3, arg4, n); \ } \ \ template \ inline void NAME##_vec_simd(FloatType * out, Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4) \ { \ nova::detail::quarternary_functor::perform_vec_simd(out, arg1, arg2, arg3, arg4); \ } #undef always_inline #endif /* NOVA_SIMD_DETAIL_DEFINE_MACROS_HPP */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/detail/vec_math.hpp0000664000175000017500000004625512050170041027664 0ustar dandan// genertic vectorized math functions // Copyright (C) 2010 Tim Blechmann // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; see the file COPYING. If not, write to // the Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. #ifndef NOVA_SIMD_DETAIL_VECMATH_HPP #define NOVA_SIMD_DETAIL_VECMATH_HPP #include #if defined(__GNUC__) && defined(NDEBUG) #define always_inline inline __attribute__((always_inline)) #else #define always_inline inline #endif #include /* the approximation of mathematical functions should have a maximum relative error of below 5e-7f */ namespace nova { namespace detail { template always_inline VecType vec_sign(VecType const & arg) { typedef VecType vec; const vec zero = vec::gen_zero(); const vec one = vec::gen_one(); const vec sign_mask = vec::gen_sign_mask(); const vec nonzero = mask_neq(arg, zero); const vec sign = arg & sign_mask; const vec abs_ret = nonzero & one; return sign | abs_ret; } template always_inline VecType vec_round_float(VecType const & arg) { typedef VecType vec; const vec sign = arg & vec::gen_sign_mask(); const vec abs_arg = sign ^ arg; const vec two_to_23_ps (0x1.0p23f); const vec rounded = (abs_arg + two_to_23_ps) - two_to_23_ps; return sign ^ rounded; } template always_inline VecType vec_floor_float(VecType const & arg) { typedef VecType vec; const vec rounded = vec_round_float(arg); const vec rounded_larger = mask_gt(rounded, arg); const vec add = rounded_larger & vec::gen_one(); return rounded - add; } template always_inline VecType vec_ceil_float(VecType const & arg) { typedef VecType vec; const vec rounded = vec_round_float(arg); const vec rounded_smaller = mask_lt(rounded, arg); const vec add = rounded_smaller & vec::gen_one(); return rounded + add; } template always_inline VecFloat ldexp_float(VecFloat const & x, typename VecFloat::int_vec const & n) { typedef typename VecFloat::int_vec int_vec; const VecFloat exponent_mask = VecFloat::gen_exp_mask(); const VecFloat exponent = exponent_mask & x; const VecFloat x_wo_x = andnot(exponent_mask, x); // clear exponent int_vec new_exp = slli(n, 16+7) + int_vec(exponent); // new exponent VecFloat new_exp_float(new_exp); VecFloat ret = x_wo_x | new_exp_float; return ret; } template always_inline VecFloat frexp_float(VecFloat const & x, typename VecFloat::int_vec & exp) { typedef typename VecFloat::int_vec int_vec; const VecFloat exponent_mask = VecFloat::gen_exp_mask(); const VecFloat exponent = exponent_mask & x; const VecFloat x_wo_x = andnot(exponent_mask, x); // clear exponent const int_vec exp_int(exponent); exp = srli(exp_int, 16+7) - int_vec(126); return x_wo_x | VecFloat::gen_exp_mask_1(); } /* adapted from cephes, approximation polynomial generated by sollya */ template always_inline VecType vec_exp_float(VecType const & arg) { typedef typename VecType::int_vec int_vec; /* Express e**x = e**g 2**n * = e**g e**( n loge(2) ) * = e**( g + n loge(2) ) */ // black magic VecType x = arg; VecType z = round(VecType(1.44269504088896341f) * x); int_vec n = z.truncate_to_int(); x -= z*VecType(0.693359375f); x -= z*VecType(-2.12194440e-4f); /* Theoretical peak relative error in [-0.5, +0.5] is 3.5e-8. */ VecType p = VecType(VecType::gen_one()) + x * (1.00000035762786865234375f + x * (0.4999996721744537353515625f + x * (0.16665561497211456298828125f + x * (4.167006909847259521484375e-2f + x * (8.420792408287525177001953125e-3f + x * 1.386119984090328216552734375e-3f))))); /* multiply by power of 2 */ VecType approx = ldexp_float(p, n); /* handle min/max boundaries */ const VecType maxlogf(88.72283905206835f); // const VecType minlogf(-103.278929903431851103f); const VecType minlogf = -maxlogf; const VecType max_float(std::numeric_limits::max()); const VecType zero = VecType::gen_zero(); VecType too_large = mask_gt(arg, maxlogf); VecType too_small = mask_lt(arg, minlogf); VecType ret = select(approx, max_float, too_large); ret = select(ret, zero, too_small); return ret; } /* adapted from cephes */ template always_inline VecType vec_log_float(VecType x) { typedef typename VecType::int_vec int_vec; int_vec e; x = frexp_float( x, e ); const VecType sqrt_05 = 0.707106781186547524f; const VecType x_smaller_sqrt_05 = mask_lt(x, sqrt_05); e = e + int_vec(x_smaller_sqrt_05); VecType x_add = x; x_add = x_add & x_smaller_sqrt_05; x += x_add - VecType(VecType::gen_one()); VecType y = (((((((( 7.0376836292E-2 * x - 1.1514610310E-1) * x + 1.1676998740E-1) * x - 1.2420140846E-1) * x + 1.4249322787E-1) * x - 1.6668057665E-1) * x + 2.0000714765E-1) * x - 2.4999993993E-1) * x + 3.3333331174E-1) * x * x*x; VecType fe = e.convert_to_float(); y += fe * -2.12194440e-4; y -= 0.5 * x*x; /* y - 0.5 x^2 */ VecType z = x + y; /* ... + x */ return z + 0.693359375 * fe; } /* exp function for vec_tanh_float. similar to vec_exp_tanh, but without boundary checks */ template always_inline VecType vec_exp_tanh_float(VecType const & arg) { typedef typename VecType::int_vec int_vec; /* Express e**x = e**g 2**n * = e**g e**( n loge(2) ) * = e**( g + n loge(2) ) */ // black magic VecType x = arg; VecType z = round(VecType(1.44269504088896341f) * x); int_vec n = z.truncate_to_int(); x -= z*VecType(0.693359375f); x -= z*VecType(-2.12194440e-4f); /* Theoretical peak relative error in [-0.5, +0.5] is 3.5e-8. */ VecType p = 1.f + x * (1.00000035762786865234375f + x * (0.4999996721744537353515625f + x * (0.16665561497211456298828125f + x * (4.167006909847259521484375e-2f + x * (8.420792408287525177001953125e-3f + x * 1.386119984090328216552734375e-3f))))); /* multiply by power of 2 */ VecType approx = ldexp_float(p, n); return approx; } /* adapted from Julien Pommier's sse_mathfun.h, itself based on cephes */ template always_inline VecType vec_sin_float(VecType const & arg) { typedef typename VecType::int_vec int_vec; const typename VecType::float_type four_over_pi = 1.27323954473516268615107010698011489627567716592367; VecType sign = arg & VecType::gen_sign_mask(); VecType abs_arg = arg & VecType::gen_abs_mask(); VecType y = abs_arg * four_over_pi; int_vec j = y.truncate_to_int(); /* cephes: j=(j+1) & (~1) */ j = (j + int_vec(1)) & int_vec(~1); y = j.convert_to_float(); /* sign based on quadrant */ VecType swap_sign_bit = slli(j & int_vec(4), 29); sign = sign ^ swap_sign_bit; /* polynomial mask */ VecType poly_mask = VecType (mask_eq(j & int_vec(2), int_vec(0))); /* black magic */ static float DP1 = 0.78515625; static float DP2 = 2.4187564849853515625e-4; static float DP3 = 3.77489497744594108e-8; VecType base = ((abs_arg - y * DP1) - y * DP2) - y * DP3; /* [0..pi/4] */ VecType z = base * base; VecType p1 = (( 2.443315711809948E-005 * z - 1.388731625493765E-003) * z + 4.166664568298827E-002) * z * z -0.5f * z + 1.0 ; /* [pi/4..pi/2] */ VecType p2 = ((-1.9515295891E-4 * z + 8.3321608736E-3) * z - 1.6666654611E-1) * z * base + base; VecType approximation = select(p1, p2, poly_mask); return approximation ^ sign; } /* adapted from Julien Pommier's sse_mathfun.h, itself based on cephes */ template always_inline VecType vec_cos_float(VecType const & arg) { typedef typename VecType::int_vec int_vec; const typename VecType::float_type four_over_pi = 1.27323954473516268615107010698011489627567716592367; VecType abs_arg = arg & VecType::gen_abs_mask(); VecType y = abs_arg * four_over_pi; int_vec j = y.truncate_to_int(); /* cephes: j=(j+1) & (~1) */ j = (j + int_vec(1)) & int_vec(~1); y = j.convert_to_float(); /* sign based on quadrant */ int_vec jm2 = j - int_vec(2); VecType sign = slli(andnot(jm2, int_vec(4)), 29); /* polynomial mask */ VecType poly_mask = VecType (mask_eq(jm2 & int_vec(2), int_vec(0))); /* black magic */ static float DP1 = 0.78515625; static float DP2 = 2.4187564849853515625e-4; static float DP3 = 3.77489497744594108e-8; VecType base = ((abs_arg - y * DP1) - y * DP2) - y * DP3; /* [0..pi/4] */ VecType z = base * base; VecType p1 = (( 2.443315711809948E-005 * z - 1.388731625493765E-003) * z + 4.166664568298827E-002) * z * z -0.5f * z + 1 ; /* [pi/4..pi/2] */ VecType p2 = ((-1.9515295891E-4 * z + 8.3321608736E-3) * z - 1.6666654611E-1) * z * base + base; VecType approximation = select(p1, p2, poly_mask); return approximation ^ sign; } /* adapted from cephes, approximation polynomial generted by sollya */ template always_inline VecType vec_tan_float(VecType const & arg) { typedef typename VecType::int_vec int_vec; const typename VecType::float_type four_over_pi = 1.27323954473516268615107010698011489627567716592367; VecType sign = arg & VecType::gen_sign_mask(); VecType abs_arg = arg & VecType::gen_abs_mask(); VecType y = abs_arg * four_over_pi; int_vec j = y.truncate_to_int(); /* cephes: j=(j+1) & (~1) */ j = (j + int_vec(1)) & int_vec(~1); y = j.convert_to_float(); /* approximation mask */ VecType poly_mask = VecType (mask_eq(j & int_vec(2), int_vec(0))); /* black magic */ static float DP1 = 0.78515625; static float DP2 = 2.4187564849853515625e-4; static float DP3 = 3.77489497744594108e-8; VecType base = ((abs_arg - y * DP1) - y * DP2) - y * DP3; VecType x = base; VecType x2 = x*x; // sollya: fpminimax(tan(x), [|3,5,7,9,11,13|], [|24...|], [-pi/4,pi/4], x); VecType approx = x + x * x2 * (0.3333315551280975341796875 + x2 * (0.1333882510662078857421875 + x2 * (5.3409568965435028076171875e-2 + x2 * (2.443529665470123291015625e-2 + x2 * (3.1127030961215496063232421875e-3 + x2 * 9.3892104923725128173828125e-3))))); //VecType recip = -reciprocal(approx); VecType recip = -1.0 / approx; VecType approximation = select(recip, approx, poly_mask); return approximation ^ sign; } /* adapted from cephes, approximation polynomial generted by sollya */ template always_inline VecType vec_asin_float(VecType const & arg) { VecType abs_arg = arg & VecType::gen_abs_mask(); VecType sign = arg & VecType::gen_sign_mask(); VecType one = VecType::gen_one(); VecType half = VecType::gen_05(); VecType zero = VecType::gen_zero(); // range redution: asin(x) = pi/2 - 2 asin( sqrt( (1-x)/2 ) ). for |arg| > 0.5 VecType arg_greater_05 = mask_gt(abs_arg, 0.5); VecType arg_reduced_sqr = (one - abs_arg) * half; VecType arg_reduced = sqrt((one - abs_arg) * half); VecType approx_arg = select(abs_arg, arg_reduced, arg_greater_05); VecType z = select(abs_arg*abs_arg, arg_reduced_sqr, arg_greater_05); VecType x = approx_arg; VecType x2 = x*x; // sollya: fpminimax(asin(x), [|3,5,7,9,11|], [|24...|], [0.000000000000000000001,0.5], x); VecType approx_poly = x + x * x2 * (0.166667520999908447265625 + x2 * (7.4953101575374603271484375e-2 + x2 * (4.54690195620059967041015625e-2 + x2 * (2.418550290167331695556640625e-2 + x2 * 4.21570129692554473876953125e-2)))); VecType approx_poly_reduced = 1.57079637050628662109375 - approx_poly - approx_poly; VecType approx = select(approx_poly, approx_poly_reduced, arg_greater_05); approx = approx ^ sign; // |arg| > 1: return 0 VecType ret = select(approx, zero, mask_gt(abs_arg, one)); return ret; } /* based on asin approximation: * * x < -0.5: acos(x) = pi - 2.0 * asin( sqrt((1+x)/2) ); * -0.5 < x < 0.5 acos(x) = pi/2 - asin(x) * x > 0.5 acos(x) = 2.0 * asin( sqrt((1-x)/2) ). * */ template always_inline VecType vec_acos_float(VecType const & arg) { VecType abs_arg = arg & VecType::gen_abs_mask(); VecType one = VecType::gen_one(); VecType half = VecType::gen_05(); VecType zero = VecType::gen_zero(); VecType arg_greater_05 = mask_gt(abs_arg, half); VecType asin_arg_greater_05 = sqrt((one - abs_arg) * half); VecType asin_arg = select(arg, asin_arg_greater_05, arg_greater_05); VecType asin = vec_asin_float(asin_arg); VecType two_asin = asin + asin; VecType ret_m1_m05 = 3.1415927410125732421875 - two_asin; VecType ret_m05_05 = 1.57079637050628662109375 - asin; VecType ret_05_1 = two_asin; VecType ret_m05_1 = select(ret_m05_05, ret_05_1, mask_gt(arg, half)); VecType ret = select(ret_m1_m05, ret_m05_1, mask_gt(arg, -0.5)); // |arg| > 1: return 0 ret = select(ret, zero, mask_gt(abs_arg, one)); return ret; } /* adapted from cephes */ template always_inline VecType vec_atan_float(VecType const & arg) { const VecType sign_arg = arg & VecType::gen_sign_mask(); const VecType abs_arg = arg & VecType::gen_abs_mask(); const VecType one = VecType::gen_one(); VecType zero = VecType::gen_zero(); VecType arg_range0 = abs_arg; VecType arg_range1 = (abs_arg - one) / (abs_arg + one); VecType arg_range2 = -one / abs_arg; VecType offset_range0 = zero; VecType offset_range1 = 0.78539816339744830961566084581987572104929234984377; VecType offset_range2 = 1.57079632679489661923132169163975144209858469968754; VecType mask_range_01 = mask_gt(abs_arg, 0.41421356237309504880168872420969807856967187537695); VecType mask_range_12 = mask_gt(abs_arg, 2.41421356237309504880168872420969807856967187537698); VecType approx_arg = select(arg_range0, select(arg_range1, arg_range2, mask_range_12), mask_range_01); VecType approx_offset = select(offset_range0, select(offset_range1, offset_range2, mask_range_12), mask_range_01); VecType x = approx_arg; VecType x2 = x*x; VecType approx = approx_offset + x + x * x2 * (-0.333329498767852783203125 + x2 * (0.19977732002735137939453125 + x2 * (-0.1387787759304046630859375 + x2 * 8.054284751415252685546875e-2))); return approx ^ sign_arg; } template always_inline VecType vec_tanh_float(VecType const & arg) { /* this order of computation (large->small->medium) seems to be the most efficient on sse*/ const VecType sign_arg = arg & VecType::gen_sign_mask(); const VecType abs_arg = arg ^ sign_arg; const VecType one = VecType::gen_one(); const VecType two (2.f); const VecType maxlogf_2 (22.f); const VecType limit_small (0.625f); /* medium values */ const VecType result_medium_abs = one - two / (vec_exp_tanh_float(abs_arg + abs_arg) + one); /* large values */ const VecType abs_big = mask_gt(abs_arg, maxlogf_2); const VecType result_limit_abs = one; /* small values */ const VecType f1((float)-5.70498872745e-3); const VecType f2((float) 2.06390887954e-2); const VecType f3((float)-5.37397155531e-2); const VecType f4((float) 1.33314422036e-1); const VecType f5((float)-3.33332819422e-1); const VecType arg_sqr = abs_arg * abs_arg; const VecType result_small = ((((f1 * arg_sqr + f2) * arg_sqr + f3) * arg_sqr + f4) * arg_sqr + f5) * arg_sqr * arg + arg; const VecType abs_small = mask_lt(abs_arg, limit_small); /* select from large and medium branches and set sign */ const VecType result_lm_abs = select(result_medium_abs, result_limit_abs, abs_big); const VecType result_lm = result_lm_abs | sign_arg; const VecType result = select(result_lm, result_small, abs_small); return result; } template always_inline VecType vec_signed_pow(VecType arg1, VecType arg2) { const VecType sign_arg1 = arg1 & VecType::gen_sign_mask(); const VecType abs_arg1 = arg1 ^ sign_arg1; const VecType result = pow(abs_arg1, arg2); return sign_arg1 | result; } /* compute pow using exp and log. seems to be faster than table-based algorithms */ template always_inline VecType vec_pow(VecType arg1, VecType arg2) { const VecType zero = VecType::gen_zero(); const VecType arg1_zero = mask_eq(arg1, zero); const VecType result = exp(arg2 * log(arg1)); return select(result, zero, arg1_zero); } template always_inline VecType vec_signed_sqrt(VecType arg) { const VecType sign_arg1 = arg & VecType::gen_sign_mask(); const VecType abs_arg1 = arg ^ sign_arg1; const VecType result = sqrt(abs_arg1); return sign_arg1 | result; } template always_inline VecType vec_log2(VecType arg) { const double rlog2 = 1.0/std::log(2.0); return log(arg) * VecType((typename VecType::float_type)rlog2); } template always_inline VecType vec_log10(VecType arg) { const double rlog10 = 1.0/std::log(10.0); return log(arg) * VecType((typename VecType::float_type)rlog10); } template always_inline VecType vec_select(VecType lhs, VecType rhs, VecType bitmask) { const VecType result = andnot(bitmask, lhs) | (bitmask & rhs); return result; } template always_inline VecType vec_undenormalize(VecType arg) { typedef typename VecType::float_type float_type; const float_type min_positive_value = std::numeric_limits::min(); const VecType abs_arg = abs(arg); const VecType abs_arg_lt_min = mask_lt(abs_arg, min_positive_value); const VecType zero = VecType::gen_zero(); const VecType result = select(arg, zero, abs_arg_lt_min); return result; } template always_inline VecType vec_reciprocal_newton(VecType arg) { const VecType one = VecType::gen_one(); const VecType approx = fast_reciprocal(arg); // One round of Newton-Raphson refinement const VecType diff = one - approx * arg; const VecType result = madd(diff, approx, approx); return result; } } } #undef always_inline #endif /* NOVA_SIMD_DETAIL_VECMATH_HPP */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/detail/math.hpp0000664000175000017500000001746111774551513027047 0ustar dandan// genertic math functions // Copyright (C) 2010 Tim Blechmann // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; see the file COPYING. If not, write to // the Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. #ifndef NOVA_SIMD_DETAIL_MATH_HPP #define NOVA_SIMD_DETAIL_MATH_HPP #include #include #include #include namespace nova { namespace detail { ///@{ template inline void apply_on_vector(FloatType * out, Arg1Type in1, Functor f) { for (int i = 0; i != VectorSize; ++i) { *out++ = f(in1.get()); in1.increment(); } } template inline void apply_on_vector(FloatType * out, Arg1Type in1, Arg2Type in2, Functor f) { for (int i = 0; i != VectorSize; ++i) { *out++ = f(in1.get(), in2.get()); in1.increment(); in2.increment(); } } template inline void apply_on_vector(FloatType * out, Arg1Type in1, Arg2Type in2, Arg3Type in3, Functor f) { for (int i = 0; i != VectorSize; ++i) { *out++ = f(in1.get(), in2.get(), in3.get()); in1.increment(); in2.increment(); in3.increment(); } } template inline void apply_on_vector(FloatType * out, Arg1Type in1, Arg2Type in2, Arg3Type in3, Arg4Type in4, Functor f) { for (int i = 0; i != VectorSize; ++i) { *out++ = f(in1.get(), in2.get(), in3.get(), in4.get()); in1.increment(); in2.increment(); in3.increment(); in4.increment(); } } ///@} ///@{ template inline void apply_on_vector(FloatType * out, const FloatType * in, unsigned int n, Functor f) { do *out++ = f(*in++); while (--n); } template inline void apply_on_vector(FloatType * out, Arg1Type in1, Arg2Type in2, unsigned int n, Functor f) { do { *out++ = f(in1.get(), in2.get()); in1.increment(); in2.increment(); } while (--n); } template inline void apply_on_vector(FloatType * out, Arg1Type in1, Arg2Type in2, Arg3Type in3, unsigned int n, Functor f) { do { *out++ = f(in1.get(), in2.get(), in3.get()); in1.increment(); in2.increment(); in3.increment(); } while (--n); } template inline void apply_on_vector(FloatType * out, Arg1Type in1, Arg2Type in2, Arg3Type in3, Arg4Type in4, unsigned int n, Functor f) { do { *out++ = f(in1.get(), in2.get(), in3.get(), in4.get()); in1.increment(); in2.increment(); in3.increment(); in4.increment(); } while (--n); } ///@} #define DEFINE_STD_UNARY_WRAPPER(NAME) \ template \ inline float_type NAME(float_type const & x) \ { \ return std::NAME(x); \ } DEFINE_STD_UNARY_WRAPPER(fabs) DEFINE_STD_UNARY_WRAPPER(floor) DEFINE_STD_UNARY_WRAPPER(ceil) DEFINE_STD_UNARY_WRAPPER(sin) DEFINE_STD_UNARY_WRAPPER(cos) DEFINE_STD_UNARY_WRAPPER(tan) DEFINE_STD_UNARY_WRAPPER(asin) DEFINE_STD_UNARY_WRAPPER(acos) DEFINE_STD_UNARY_WRAPPER(atan) DEFINE_STD_UNARY_WRAPPER(tanh) DEFINE_STD_UNARY_WRAPPER(log) DEFINE_STD_UNARY_WRAPPER(log10) DEFINE_STD_UNARY_WRAPPER(exp) #define DEFINE_STD_BINARY_WRAPPER(NAME) \ template \ inline float_type NAME(float_type const & lhs, float_type const & rhs) \ { \ return std::NAME(lhs, rhs); \ } DEFINE_STD_BINARY_WRAPPER(pow) template inline float_type sign(float_type const & f) { if (f > 0) return 1; if (f == 0) return 0; else return -1; } template inline float_type square(float_type const & f) { return f*f; } template inline float_type cube(float_type const & f) { return f*f*f; } template inline float_type min(float_type const & x, float_type const & y) { return std::min(x, y); } template inline float_type max(float_type const & x, float_type const & y) { return std::max(x, y); } template inline float_type round(float_type const & arg) { return std::floor(arg + float_type(0.5)); } #ifndef _MSC_VER // Fabian Aussems: visual c++ does not have round template<> inline double round(double const & arg) { return ::round(arg); } #endif #if _XOPEN_SOURCE >= 600 || _ISOC99_SOURCE template<> inline float round(float const & arg) { return ::roundf(arg); } #endif template inline float_type frac(float_type const & arg) { return arg - floor(arg); } template inline float_type log2(float_type arg) { #if defined(__GXX_EXPERIMENTAL_CXX0X__) return std::log2(arg); #else const float rlog2 = 1.f/std::log(2.f); return std::log(arg) * rlog2; #endif } #if !defined(__GXX_EXPERIMENTAL_CXX0X__) #if _XOPEN_SOURCE >= 600 || _ISOC99_SOURCE /* c99 compliant compiler */ template <> inline float log2(float arg) { return ::log2f(arg); } template <> inline double log2(double arg) { return ::log2(arg); } #endif #endif /* __GXX_EXPERIMENTAL_CXX0X__ */ template inline float_type trunc(float_type const & arg) { return (float_type)(long)arg; } template inline float_type signed_sqrt(float_type in0) { if (in0 >= 0) return std::sqrt(in0); else return -std::sqrt(-in0); } template inline float_type signed_pow(float_type in0, float_type in1) { if (in0 > 0) return std::pow(in0, in1); else return -std::pow(-in0, in1); } template inline float_type undenormalize(float_type arg) { const float_type min_positive_value = std::numeric_limits::min(); if (arg > 0) { if (arg < min_positive_value) return 0.0; else return arg; } else { if (arg > -min_positive_value) return 0.0; else return arg; } } template inline float_type reciprocal(float_type in) { return float_type(1) / in; } } } #endif /* NOVA_SIMD_DETAIL_MATH_HPP */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/detail/unroll_helpers.hpp0000664000175000017500000002420312050167111031124 0ustar dandan// unroll helpers // Copyright (C) 2010 Tim Blechmann // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; see the file COPYING. If not, write to // the Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. #ifndef NOVA_SIMD_DETAIL_UNROLL_HELPERS_HPP #define NOVA_SIMD_DETAIL_UNROLL_HELPERS_HPP #include "../vec.hpp" #if defined(__GNUC__) && defined(NDEBUG) #define always_inline inline __attribute__((always_inline)) #else #define always_inline inline #endif namespace nova { namespace detail { template struct compile_time_unroller { typedef vec vec_type; static const int offset = vec_type::size; template static always_inline void run(FloatType * out, arg1_type & in1, Functor const & f) { compile_time_unroller::mp_iteration_1(out, in1.consume(), in1, f); } template static always_inline void run(FloatType * out, arg1_type & in1, arg2_type & in2, Functor const & f) { compile_time_unroller::mp_iteration_2(out, in1.consume(), in1, in2.consume(), in2, f); } template static always_inline void run(FloatType * out, arg1_type & in1, arg2_type & in2, arg3_type & in3, Functor const & f) { compile_time_unroller::mp_iteration_3(out, in1.consume(), in1, in2.consume(), in2, in3.consume(), in3, f); } template static always_inline void run(FloatType * out, arg1_type & in1, arg2_type & in2, arg3_type & in3, arg4_type & in4, Functor const & f) { compile_time_unroller::mp_iteration_4(out, in1.consume(), in1, in2.consume(), in2, in3.consume(), in3, in4.consume(), in4, f); } private: friend struct compile_time_unroller; template static always_inline void mp_iteration_1(FloatType * out, vec_type loaded_in1, arg1_type & in1, Functor const & f) { vec_type loaded_next_in1; if (N != offset) loaded_next_in1 = in1.consume(); vec_type result = f(loaded_in1); result.store_aligned(out); compile_time_unroller::mp_iteration_1(out+offset, loaded_next_in1, in1, f); } template static always_inline void mp_iteration_2(FloatType * out, vec_type loaded_in1, arg1_type & in1, vec_type loaded_in2, arg2_type & in2, Functor const & f) { vec_type loaded_next_in1; if (N != offset) loaded_next_in1 = in1.consume(); vec_type loaded_next_in2; if (N != offset) loaded_next_in2 = in2.consume(); vec_type result = f(loaded_in1, loaded_in2); result.store_aligned(out); compile_time_unroller::mp_iteration_2(out+offset, loaded_next_in1, in1, loaded_next_in2, in2, f); } template static always_inline void mp_iteration_3(FloatType * out, vec_type loaded_in1, arg1_type & in1, vec_type loaded_in2, arg2_type & in2, vec_type loaded_in3, arg3_type & in3, Functor const & f) { vec_type loaded_next_in1; if (N != offset) loaded_next_in1 = in1.consume(); vec_type loaded_next_in2; if (N != offset) loaded_next_in2 = in2.consume(); vec_type loaded_next_in3; if (N != offset) loaded_next_in3 = in3.consume(); vec_type result = f(loaded_in1, loaded_in2, loaded_in3); result.store_aligned(out); compile_time_unroller::mp_iteration_3(out+offset, loaded_next_in1, in1, loaded_next_in2, in2, loaded_next_in3, in3, f); } template static always_inline void mp_iteration_4(FloatType * out, vec_type loaded_in1, arg1_type & in1, vec_type loaded_in2, arg2_type & in2, vec_type loaded_in3, arg3_type & in3, vec_type loaded_in4, arg4_type & in4, Functor const & f) { vec_type loaded_next_in1; if (N != offset) loaded_next_in1 = in1.consume(); vec_type loaded_next_in2; if (N != offset) loaded_next_in2 = in2.consume(); vec_type loaded_next_in3; if (N != offset) loaded_next_in3 = in3.consume(); vec_type loaded_next_in4; if (N != offset) loaded_next_in4 = in4.consume(); vec_type result = f(loaded_in1, loaded_in2, loaded_in3, loaded_in4); result.store_aligned(out); compile_time_unroller::mp_iteration_4(out+offset, loaded_next_in1, in1, loaded_next_in2, in2, loaded_next_in3, in3, loaded_next_in4, in4, f); } }; template struct compile_time_unroller { friend struct compile_time_unroller::size>; private: template static always_inline void mp_iteration_1(FloatType * out, LoadedArg1 const &, Arg1 const &, Functor const & f) {} template static always_inline void mp_iteration_2(FloatType * out, LoadedArg1 const &, Arg1 const &, LoadedArg2 const &, Arg2 const &, Functor const & f) {} template static always_inline void mp_iteration_3(FloatType * out, LoadedArg1 const &, Arg1 const &, LoadedArg2 const &, Arg2 const &, LoadedArg3 const &, Arg3 const &, Functor const & f) {} template static always_inline void mp_iteration_4(FloatType * out, LoadedArg1 const &, Arg1 const &, LoadedArg2 const &, Arg2 const &, LoadedArg3 const &, Arg3 const &, LoadedArg4 const &, Arg4 const &, Functor const & f) {} }; template always_inline void generate_simd_loop(float_type * out, Arg1 arg1, unsigned int n, Functor const & f) { const unsigned int per_loop = vec::objects_per_cacheline; n /= per_loop; do { detail::compile_time_unroller::run(out, arg1, f); out += per_loop; } while (--n); } template always_inline void generate_simd_loop(float_type * out, Arg1 arg1, Arg2 arg2, unsigned int n, Functor const & f) { const unsigned int per_loop = vec::objects_per_cacheline; n /= per_loop; do { detail::compile_time_unroller::run(out, arg1, arg2, f); out += per_loop; } while (--n); } template always_inline void generate_simd_loop(float_type * out, Arg1 arg1, Arg2 arg2, Arg3 arg3, unsigned int n, Functor const & f) { const unsigned int per_loop = vec::objects_per_cacheline; n /= per_loop; do { detail::compile_time_unroller::run(out, arg1, arg2, arg3, f); out += per_loop; } while (--n); } template always_inline void generate_simd_loop(float_type * out, Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, unsigned int n, Functor const & f) { const unsigned int per_loop = vec::objects_per_cacheline; n /= per_loop; do { detail::compile_time_unroller::run(out, arg1, arg2, arg3, arg4, f); out += per_loop; } while (--n); } } } #undef always_inline #endif /* NOVA_SIMD_DETAIL_UNROLL_HELPERS_HPP */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/simd_math.hpp0000664000175000017500000000715211747572246026623 0ustar dandan// simdfied mathematical functions // Copyright (C) 2009 Tim Blechmann // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; see the file COPYING. If not, write to // the Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. #ifndef SIMD_MATH_HPP #define SIMD_MATH_HPP #include "vec.hpp" #include "detail/math.hpp" #include "detail/unroll_helpers.hpp" #include "detail/define_macros.hpp" #if defined(__GNUC__) && defined(NDEBUG) #define always_inline inline __attribute__((always_inline)) #else #define always_inline inline #endif namespace nova { #define DEFINE_UNARY_FUNCTOR(NAME) \ namespace detail { \ struct NAME##_ \ { \ template \ always_inline FloatType operator()(FloatType arg) const \ { \ return NAME(arg); \ } \ }; \ } // namespace detail #define DEFINE_UNARY_MATH_FUNCTIONS(NAME) \ DEFINE_UNARY_FUNCTOR(NAME) \ NOVA_SIMD_DEFINE_UNARY_WRAPPER(NAME, detail::NAME##_) DEFINE_UNARY_MATH_FUNCTIONS(sin) DEFINE_UNARY_MATH_FUNCTIONS(cos) DEFINE_UNARY_MATH_FUNCTIONS(tan) DEFINE_UNARY_MATH_FUNCTIONS(asin) DEFINE_UNARY_MATH_FUNCTIONS(acos) DEFINE_UNARY_MATH_FUNCTIONS(atan) DEFINE_UNARY_MATH_FUNCTIONS(tanh) DEFINE_UNARY_MATH_FUNCTIONS(log) DEFINE_UNARY_MATH_FUNCTIONS(log2) DEFINE_UNARY_MATH_FUNCTIONS(log10) DEFINE_UNARY_MATH_FUNCTIONS(exp) DEFINE_UNARY_MATH_FUNCTIONS(signed_sqrt) #define DEFINE_BINARY_MATH_FUNCTOR(NAME) \ namespace detail { \ struct NAME##_ \ { \ template \ always_inline FloatType operator()(FloatType lhs, FloatType rhs) const \ { \ return NAME(lhs, rhs); \ } \ }; \ \ } DEFINE_BINARY_MATH_FUNCTOR(pow) DEFINE_BINARY_MATH_FUNCTOR(signed_pow) NOVA_SIMD_DEFINE_BINARY_WRAPPER(pow, detail::pow_) NOVA_SIMD_DEFINE_BINARY_WRAPPER(spow, detail::signed_pow_) } #undef DEFINE_UNARY_FUNCTOR #undef DEFINE_BINARY_MATH_FUNCTOR #undef DEFINE_UNARY_MATH_FUNCTIONS #undef DEFINE_BINARY_MATH_FUNCTIONS #undef always_inline #endif /* SIMD_MATH_HPP */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/vec_avx_double.hpp0000664000175000017500000002154612110473257027631 0ustar dandan// avx double-precision vector class // // Copyright (C) 2011 Tim Blechmann // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; see the file COPYING. If not, write to // the Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. #ifndef VEC_AVX_DOUBLE_HPP #define VEC_AVX_DOUBLE_HPP #include #include #include "detail/vec_math.hpp" #include "vec_base.hpp" #if defined(__GNUC__) && defined(NDEBUG) #define always_inline inline __attribute__((always_inline)) #else #define always_inline inline #endif #include "stdint.h" namespace nova { template <> struct vec: vec_base { private: typedef vec_base base; static const bool has_compare_bitmask = true; public: typedef double float_type; static inline __m256d gen_sign_mask(void) { return set_bitmask(0x8000000000000000); } static inline __m256d gen_abs_mask(void) { return set_bitmask(0x7fffffffffffffff); } static inline __m256d set_bitmask(uint64_t mask) { union { uint64_t i; double d; } u; u.i = mask; return _mm256_set1_pd(u.d); } static inline __m256d gen_one(void) { return _mm256_set1_pd(1.f); } static inline __m256d gen_05(void) { return _mm256_set1_pd(0.5f); } static inline __m256d gen_zero(void) { return _mm256_setzero_pd(); } static inline __m256d gen_ones(void) { __m256d x = gen_zero(); __m256d ones = _mm256_cmp_pd(x, x, _CMP_EQ_OQ); return ones; } vec(__m256d const & arg): base(arg) {} public: static const int size = 4; static const int objects_per_cacheline = 64/sizeof(double); static bool is_aligned(double* ptr) { return ((intptr_t)(ptr) & (intptr_t)(size * sizeof(double) - 1)) == 0; } /* @{ */ /** constructors */ vec(void) {} vec(double f) { set_vec(f); } vec(float f) { set_vec((double)f); } vec(vec const & rhs) { data_ = rhs.data_; } /* @} */ /* @{ */ /** io */ void load(const double * data) { data_ = _mm256_loadu_pd(data); } void load_aligned(const double * data) { data_ = _mm256_load_pd(data); } void load_first(const double * data) { clear(); data_ = _mm256_castpd128_pd256(_mm_load_sd(data)); } void store(double * dest) const { _mm256_storeu_pd(dest, data_); } void store_aligned(double * dest) const { _mm256_store_pd(dest, data_); } void store_aligned_stream(double * dest) const { _mm256_stream_pd(dest, data_); } void clear(void) { data_ = gen_zero(); } /* @} */ /* @{ */ /** element access */ void set_vec (double value) { data_ = _mm256_set1_pd(value); } double set_slope(double start, double slope) { double v1 = start + slope; double v2 = v1 + slope; double v3 = v2 + slope; data_ = _mm256_set_pd(v3, v2, v1, start); return slope + slope + slope + slope; } double set_exp(double start, double curve) { double v1 = start * curve; double v2 = v1 * curve; double v3 = v2 * curve; data_ = _mm256_set_pd(v3, v2, v1, start); return v3 * curve; } /* @} */ /* @{ */ /** arithmetic operators */ #define OPERATOR_ASSIGNMENT(op, opcode) \ vec & operator op(vec const & rhs) \ { \ data_ = opcode(data_, rhs.data_);\ return *this;\ } OPERATOR_ASSIGNMENT(+=, _mm256_add_pd) OPERATOR_ASSIGNMENT(-=, _mm256_sub_pd) OPERATOR_ASSIGNMENT(*=, _mm256_mul_pd) OPERATOR_ASSIGNMENT(/=, _mm256_div_pd) #undef OPERATOR_ASSIGNMENT #define ARITHMETIC_OPERATOR(op, opcode) \ vec operator op(vec const & rhs) const \ { \ return opcode(data_, rhs.data_); \ } ARITHMETIC_OPERATOR(+, _mm256_add_pd) ARITHMETIC_OPERATOR(-, _mm256_sub_pd) ARITHMETIC_OPERATOR(*, _mm256_mul_pd) ARITHMETIC_OPERATOR(/, _mm256_div_pd) #undef ARITHMETIC_OPERATOR NOVA_SIMD_DELEGATE_UNARY_TO_BASE(reciprocal) NOVA_SIMD_DEFINE_MADD #define RELATIONAL_OPERATOR(op, RELATION) \ vec operator op(vec const & rhs) const \ { \ const __m256d one = gen_one(); \ return _mm256_and_pd(_mm256_cmp_pd(data_, rhs.data_, RELATION), one); \ } RELATIONAL_OPERATOR(<, _CMP_LT_OS) RELATIONAL_OPERATOR(<=, _CMP_LE_OS) RELATIONAL_OPERATOR(>, _CMP_NLE_US) RELATIONAL_OPERATOR(>=, _CMP_NLT_US) RELATIONAL_OPERATOR(==, _CMP_EQ_OQ) RELATIONAL_OPERATOR(!=, _CMP_NEQ_UQ) #undef RELATIONAL_OPERATOR /* @{ */ #define BITWISE_OPERATOR(op, opcode) \ vec operator op(vec const & rhs) const \ { \ return opcode(data_, rhs.data_); \ } BITWISE_OPERATOR(&, _mm256_and_pd) BITWISE_OPERATOR(|, _mm256_or_pd) BITWISE_OPERATOR(^, _mm256_xor_pd) #undef BITWISE_OPERATOR #define RELATIONAL_MASK_OPERATOR(op, RELATION) \ friend vec mask_##op(vec const & lhs, vec const & rhs) \ { \ return _mm256_cmp_pd(lhs.data_, rhs.data_, RELATION); \ } RELATIONAL_MASK_OPERATOR(lt, _CMP_LT_OS) RELATIONAL_MASK_OPERATOR(le, _CMP_LE_OS) RELATIONAL_MASK_OPERATOR(gt, _CMP_NLE_US) RELATIONAL_MASK_OPERATOR(ge, _CMP_NLT_US) RELATIONAL_MASK_OPERATOR(eq, _CMP_EQ_OQ) RELATIONAL_MASK_OPERATOR(neq, _CMP_NEQ_UQ) #undef RELATIONAL_MASK_OPERATOR friend inline vec select(vec lhs, vec rhs, vec bitmask) { /* if bitmask is set, return value in rhs, else value in lhs */ return _mm256_blendv_pd(lhs.data_, rhs.data_, bitmask.data_); } /* @} */ /* @{ */ /** unary functions */ friend inline vec abs(vec const & arg) { return _mm256_and_pd(gen_abs_mask(), arg.data_); } friend always_inline vec sign(vec const & arg) { return detail::vec_sign(arg); } friend inline vec square(vec const & arg) { return _mm256_mul_pd(arg.data_, arg.data_); } friend inline vec sqrt(vec const & arg) { return _mm256_sqrt_pd(arg.data_); } friend inline vec cube(vec const & arg) { return _mm256_mul_pd(arg.data_, _mm256_mul_pd(arg.data_, arg.data_)); } /* @} */ /* @{ */ /** binary functions */ friend inline vec max_(vec const & lhs, vec const & rhs) { return _mm256_max_pd(lhs.data_, rhs.data_); } friend inline vec min_(vec const & lhs, vec const & rhs) { return _mm256_min_pd(lhs.data_, rhs.data_); } /* @} */ /* @{ */ /** rounding functions */ friend inline vec round(vec const & arg) { return _mm256_round_pd(arg.data_, _MM_FROUND_TO_NEAREST_INT); } friend inline vec frac(vec const & arg) { vec floor_result = floor(arg); return arg - floor_result; } friend inline vec floor(vec const & arg) { return _mm256_round_pd(arg.data_, _MM_FROUND_TO_NEG_INF); } friend inline vec ceil(vec const & arg) { return _mm256_round_pd(arg.data_, _MM_FROUND_TO_POS_INF); } friend inline vec trunc(vec const & arg) { return _mm256_round_pd(arg.data_, _MM_FROUND_TO_ZERO); } /* @} */ /* @{ */ /** mathematical functions */ NOVA_SIMD_DELEGATE_BINARY_TO_BASE(pow) NOVA_SIMD_DELEGATE_BINARY_TO_BASE(signed_pow) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(log) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(log2) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(log10) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(exp) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(sin) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(cos) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(tan) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(asin) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(acos) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(atan) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(tanh) friend inline vec signed_sqrt(vec const & arg) { return detail::vec_signed_sqrt(arg); } friend inline vec undenormalize(vec const & arg) { return detail::vec_undenormalize(arg); } /* @} */ }; } /* namespace nova */ #undef OPERATOR_ASSIGNMENT #undef ARITHMETIC_OPERATOR #undef RELATIONAL_OPERATOR #undef always_inline #endif /* VEC_AVX_DOUBLE_HPP */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/simd_utils.hpp0000644000175000017500000000724711512512273027015 0ustar dandan// utilities for the simd implementation // Copyright (C) 2008, 2009 Tim Blechmann // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; see the file COPYING. If not, write to // the Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. #ifndef SIMD_UTILS_HPP #define SIMD_UTILS_HPP #include #ifdef __SSE2__ #include #endif /* __SSE2__ */ #ifdef __SSE4_1__ #include #endif /* __SSE41__ */ namespace nova { namespace detail { #ifdef __SSE2__ inline __m128 gen_sign_mask(void) { __m128i x = _mm_setzero_si128(); __m128i ones = _mm_cmpeq_epi32(x, x); return (__m128)_mm_slli_epi32 (_mm_srli_epi32(ones, 31), 31); } inline __m128 gen_abs_mask(void) { __m128i x = _mm_setzero_si128(); __m128i ones = _mm_cmpeq_epi32(x, x); return (__m128)_mm_srli_epi32 (_mm_slli_epi32(ones, 1), 1); } inline __m128 gen_one(void) { __m128i x = _mm_setzero_si128(); __m128i ones = _mm_cmpeq_epi32(x, x); return (__m128)_mm_slli_epi32 (_mm_srli_epi32(ones, 25), 23); } inline __m128 gen_05(void) { __m128i x = _mm_setzero_si128(); __m128i ones = _mm_cmpeq_epi32(x, x); return (__m128)_mm_slli_epi32 (_mm_srli_epi32(ones, 26), 24); } #else /* SSE fallback */ inline __m128 gen_sign_mask(void) { static const int sign_mask = 0x80000000; float * casted = (float*)(&sign_mask); return _mm_set_ps1(*casted); } inline __m128 gen_abs_mask(void) { static const int abs_mask = 0x7fffffff; float * casted = (float*)(&abs_mask); return _mm_set_ps1(*casted); } inline __m128 gen_one(void) { return _mm_set_ps1(1.f); } inline __m128 gen_05(void) { return _mm_set_ps1(0.5f); } #endif inline __m128 gen_025(void) { return _mm_set_ps1(0.25f); } inline float extract_0(__m128 arg) { float r; _mm_store_ss(&r, arg); return r; } inline float extract_3(__m128 arg) { __m128 last = _mm_shuffle_ps(arg, arg, _MM_SHUFFLE(2, 1, 0, 3)); float r; _mm_store_ss(&r, last); return r; } inline float horizontal_min(__m128 args) { __m128 xmm0, xmm1; xmm0 = args; xmm1 = _mm_shuffle_ps(xmm0, xmm0, _MM_SHUFFLE(2,2,2,2)); xmm0 = _mm_min_ps(xmm0, xmm1); xmm1 = _mm_shuffle_ps(xmm0, xmm0, _MM_SHUFFLE(1,1,1,1)); xmm0 = _mm_min_ss(xmm0, xmm1); return extract_0(xmm0); } inline float horizontal_max(__m128 args) { __m128 xmm0, xmm1; xmm0 = args; xmm1 = _mm_shuffle_ps(xmm0, xmm0, _MM_SHUFFLE(2,2,2,2)); xmm0 = _mm_max_ps(xmm0, xmm1); xmm1 = _mm_shuffle_ps(xmm0, xmm0, _MM_SHUFFLE(1,1,1,1)); xmm0 = _mm_max_ss(xmm0, xmm1); return extract_0(xmm0); } #ifdef __SSE4_1__ inline __m128 select_vector(__m128 val0, __m128 val1, __m128 sel) { /* if bitmask is set, return value in val1, else value in val0 */ return _mm_blendv_ps(val0, val1, sel); } #else inline __m128 select_vector(__m128 val0, __m128 val1, __m128 sel) { /* if bitmask is set, return value in val1, else value in val0 */ return _mm_or_ps(_mm_andnot_ps(sel, val0), _mm_and_ps(val1, sel)); } #endif } /* namespace detail */ } /* namespace nova */ #endif /* SIMD_UTILS_HPP */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/simd_unit_conversion.hpp0000664000175000017500000000704211747572246031114 0ustar dandan// simdfied unit conversion functions // Copyright (C) 2010 Tim Blechmann // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; see the file COPYING. If not, write to // the Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. #ifndef SIMD_UNIT_CONVERSION_HPP #define SIMD_UNIT_CONVERSION_HPP #include "simd_unary_arithmetic.hpp" #include "simd_math.hpp" #if defined(__GNUC__) && defined(NDEBUG) #define always_inline inline __attribute__((always_inline)) #else #define always_inline inline #endif namespace nova { namespace detail { struct abs_log2 { template always_inline FloatType operator()(const FloatType & arg) const { return log2_()(fabs_()(arg)); } }; struct midi2freq { template always_inline FloatType operator()(const FloatType & midi) const { return (FloatType)440. * pow_()(FloatType(2.), (midi - FloatType(69.)) * FloatType(0.083333333333)); } }; struct freq2midi { template always_inline FloatType operator()(const FloatType & freq) const { return abs_log2()(freq * FloatType(0.0022727272727)) * FloatType(12.) + FloatType(69.); } }; struct midi2ratio { template always_inline FloatType operator()(const FloatType & midi) const { return pow_()(FloatType(2.), midi * FloatType(0.083333333333)); } }; struct ratio2midi { template always_inline FloatType operator()(const FloatType & ratio) const { return FloatType(12.) * log2_()(ratio); } }; struct oct2freq { template always_inline FloatType operator()(const FloatType & note) const { return FloatType(440.) * pow_()(FloatType(2.), note - FloatType(4.75)); } }; struct freq2oct { template always_inline FloatType operator()(const FloatType & freq) const { return abs_log2()(freq * FloatType(0.0022727272727)) + FloatType(4.75); } }; struct amp2db { template always_inline FloatType operator()(const FloatType & amp) const { return log10_()(fabs_()(amp)) * FloatType(20.); } }; struct db2amp { template always_inline FloatType operator()(const FloatType & db) const { return pow_()(FloatType(10.), db * FloatType(0.05)); } }; } NOVA_SIMD_DEFINE_UNARY_WRAPPER(midi2freq, detail::midi2freq) NOVA_SIMD_DEFINE_UNARY_WRAPPER(freq2midi, detail::freq2midi) NOVA_SIMD_DEFINE_UNARY_WRAPPER(midi2ratio, detail::midi2ratio) NOVA_SIMD_DEFINE_UNARY_WRAPPER(ratio2midi, detail::ratio2midi) NOVA_SIMD_DEFINE_UNARY_WRAPPER(oct2freq, detail::oct2freq) NOVA_SIMD_DEFINE_UNARY_WRAPPER(freq2oct, detail::freq2oct) NOVA_SIMD_DEFINE_UNARY_WRAPPER(amp2db, detail::amp2db) NOVA_SIMD_DEFINE_UNARY_WRAPPER(db2amp, detail::db2amp) } #undef always_inline #endif /* SIMD_UNIT_CONVERSION_HPP */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/vec_altivec.hpp0000664000175000017500000003341212110473257027123 0ustar dandan// altivec vector class // // Copyright (C) 2011 Tim Blechmann // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; see the file COPYING. If not, write to // the Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. #ifndef VEC_ALTIVEC_HPP #define VEC_ALTIVEC_HPP #include #undef bool #include "detail/vec_math.hpp" #include "vec_int_altivec.hpp" #include "detail/math.hpp" #include "vec_base.hpp" #if defined(__GNUC__) && defined(NDEBUG) #define always_inline inline __attribute__((always_inline)) #else #define always_inline inline #endif namespace nova { template <> struct vec: vec_base { typedef vector float internal_vector_type; typedef float float_type; private: typedef vec_base base; static internal_vector_type set_vector(float f0, float f1, float f2, float f3) { union { float f[4]; internal_vector_type v; } ret; ret.f[0] = f0; ret.f[1] = f1; ret.f[2] = f2; ret.f[3] = f3; return ret.v; } static internal_vector_type set_vector(float f) { return set_vector(f, f, f, f); } public: static const bool has_compare_bitmask = true; static inline internal_vector_type gen_sign_mask(void) { return set_bitmask(0x80000000); } static inline internal_vector_type gen_abs_mask(void) { return set_bitmask(0x7fffffff); } static inline internal_vector_type gen_one(void) { return set_vector(1.f); } static inline internal_vector_type gen_05(void) { return set_vector(0.5f); } static inline internal_vector_type set_bitmask(unsigned int mask) { union { unsigned int i; float f; } u; u.i = mask; return set_vector(u.f); } static inline internal_vector_type gen_exp_mask(void) { return set_bitmask(0x7F800000); } static inline internal_vector_type gen_exp_mask_1(void) { return set_bitmask(0x3F000000); } static inline internal_vector_type gen_ones(void) { return set_bitmask(0xFFFFFFFF); } static inline internal_vector_type gen_zero(void) { return (internal_vector_type)vec_splat_u32(0); } vec(internal_vector_type const & arg): base(arg) {} public: static const int size = 4; static const int objects_per_cacheline = 64/sizeof(float); static bool is_aligned(float* ptr) { return ((intptr_t)(ptr) & (intptr_t)(size * sizeof(float) - 1)) == 0; } /* @{ */ /** constructors */ vec(void) {} vec(float f) { set_vec(f); } vec(vec const & rhs): base(rhs.data_) {} /* @} */ /* @{ */ /** io */ void load(const float * data) { base::data_ = vec_ld(0, data); } void load_aligned(const float * data) { base::data_ = vec_ld(0, data); } void load_first(const float * data) { clear(); base::set(0, *data); } void store(float * dest) const { vec_st(base::data_, 0, dest); } void store_aligned(float * dest) const { vec_st(base::data_, 0, dest); } void store_aligned_stream(float * dest) const { vec_st(base::data_, 0, dest); } void clear(void) { base::data_ = gen_zero(); } operator internal_vector_type (void) const { return base::data_; } /* @} */ /* @{ */ /** element access */ void set_vec (float value) { data_ = set_vector(value, value, value, value); } float set_slope(float start, float slope) { float v1 = start + slope; float v2 = start + slope + slope; float v3 = start + slope + slope + slope; data_ = set_vector(start, v1, v2, v3); return slope + slope + slope + slope; } float set_exp(float start, float curve) { float v1 = start * curve; float v2 = v1 * curve; float v3 = v2 * curve; data_ = set_vector(start, v1, v2, v3); return v3 * curve; } /* @} */ /* @{ */ private: static internal_vector_type vec_mul(internal_vector_type const & lhs, internal_vector_type const & rhs) { return vec_madd(lhs, rhs, gen_zero()); } static internal_vector_type vec_reciprocal(internal_vector_type const & arg) { // adapted from http://developer.apple.com/hardwaredrivers/ve/algorithms.html // Get the reciprocal estimate vector float estimate = vec_re(arg); // One round of Newton-Raphson refinement return vec_madd(vec_nmsub(estimate, arg, gen_one()), estimate, estimate); } static internal_vector_type vec_div(internal_vector_type const & lhs, internal_vector_type const & rhs) { return vec_mul(lhs, vec_reciprocal(rhs)); } public: /** arithmetic operators */ #define OPERATOR_ASSIGNMENT(op, opcode) \ vec & operator op(vec const & rhs) \ { \ data_ = opcode(data_, rhs.data_);\ return *this;\ } OPERATOR_ASSIGNMENT(+=, vec_add) OPERATOR_ASSIGNMENT(-=, vec_sub) OPERATOR_ASSIGNMENT(*=, vec_mul) OPERATOR_ASSIGNMENT(/=, vec_div) #define ARITHMETIC_OPERATOR(op, opcode) \ vec operator op(vec const & rhs) const \ { \ return opcode(data_, rhs.data_); \ } \ \ friend vec operator op(vec const & lhs, float f) \ { \ return opcode(lhs.data_, vec(f).data_); \ } \ \ friend vec operator op(float f, vec const & rhs) \ { \ return opcode(vec(f).data_, rhs.data_); \ } ARITHMETIC_OPERATOR(+, vec_add) ARITHMETIC_OPERATOR(-, vec_sub) ARITHMETIC_OPERATOR(*, vec_mul) ARITHMETIC_OPERATOR(/, vec_div) friend vec operator -(const vec & arg) { return vec_xor(arg.data_, gen_sign_mask()); } friend vec fast_reciprocal(const vec & arg) { vector float estimate = vec_re(arg); return estimate; } friend vec reciprocal(const vec & arg) { return vec_reciprocal(arg.data_); } friend vec madd(vec const & arg1, vec const & arg2, vec const & arg3) { return vec_madd(arg1.data_, arg2.data_, arg3.data_); } private: static internal_vector_type vec_not(internal_vector_type const & arg) { return vec_nor(arg, arg); } static internal_vector_type vec_cmpneq(internal_vector_type const & lhs, internal_vector_type const & rhs) { internal_vector_type equal = (internal_vector_type)vec_cmpeq(lhs, rhs); return vec_not(equal); } public: #define RELATIONAL_OPERATOR(op, opcode) \ vec operator op(vec const & rhs) const \ { \ const internal_vector_type one = gen_one(); \ vector unsigned int mask = (vector unsigned int)opcode(data_, rhs.data_); \ return (internal_vector_type)vec_and(mask, (vector unsigned int)one); \ } #define vec_cmple_(a, b) vec_cmpge(b, a) RELATIONAL_OPERATOR(<, vec_cmplt) RELATIONAL_OPERATOR(<=, vec_cmple_) RELATIONAL_OPERATOR(>, vec_cmpgt) RELATIONAL_OPERATOR(>=, vec_cmpge) RELATIONAL_OPERATOR(==, vec_cmpeq) RELATIONAL_OPERATOR(!=, vec_cmpneq) #undef RELATIONAL_OPERATOR /* @{ */ #define BITWISE_OPERATOR(op, opcode) \ vec operator op(vec const & rhs) const \ { \ return opcode(data_, rhs.data_); \ } BITWISE_OPERATOR(&, vec_and) BITWISE_OPERATOR(|, vec_or) BITWISE_OPERATOR(^, vec_xor) friend inline vec andnot(vec const & lhs, vec const & rhs) { return vec_andc(lhs.data_, rhs.data_); } #undef BITWISE_OPERATOR #define RELATIONAL_MASK_OPERATOR(op, opcode) \ friend vec mask_##op(vec const & lhs, vec const & rhs) \ { \ return internal_vector_type(opcode(lhs.data_, rhs.data_)); \ } RELATIONAL_MASK_OPERATOR(lt, vec_cmplt) RELATIONAL_MASK_OPERATOR(le, vec_cmple_) RELATIONAL_MASK_OPERATOR(gt, vec_cmpgt) RELATIONAL_MASK_OPERATOR(ge, vec_cmpge) RELATIONAL_MASK_OPERATOR(eq, vec_cmpeq) RELATIONAL_MASK_OPERATOR(neq, vec_cmpneq) #undef RELATIONAL_MASK_OPERATOR friend inline vec select(vec lhs, vec rhs, vec bitmask) { return vec_sel(lhs.data_, rhs.data_, (vector unsigned int)bitmask.data_); } /* @} */ /* @{ */ /** unary functions */ friend inline vec abs(vec const & arg) { return vec_abs(arg.data_); } friend always_inline vec sign(vec const & arg) { return detail::vec_sign(arg); } friend inline vec square(vec const & arg) { return vec_mul(arg.data_, arg.data_); } private: static internal_vector_type vec_rsqrt(internal_vector_type const & arg) { // adapted from http://developer.apple.com/hardwaredrivers/ve/algorithms.html //Get the square root reciprocal estimate vector float zero = gen_zero(); vector float oneHalf = gen_05(); vector float one = gen_one(); vector float estimate = vec_rsqrte(arg); //One round of Newton-Raphson refinement vector float estimateSquared = vec_madd(estimate, estimate, zero); vector float halfEstimate = vec_madd(estimate, oneHalf, zero); return vec_madd(vec_nmsub(arg, estimateSquared, one), halfEstimate, estimate); } static internal_vector_type vec_sqrt(internal_vector_type const & arg) { // adapted from http://developer.apple.com/hardwaredrivers/ve/algorithms.html return vec_mul(arg, vec_rsqrt(arg)); } public: friend inline vec sqrt(vec const & arg) { return vec_sqrt(arg.data_); } friend inline vec cube(vec const & arg) { return vec_mul(arg.data_, vec_mul(arg.data_, arg.data_)); } /* @} */ /* @{ */ /** binary functions */ friend inline vec max_(vec const & lhs, vec const & rhs) { return vec_max(lhs.data_, rhs.data_); } friend inline vec min_(vec const & lhs, vec const & rhs) { return vec_min(lhs.data_, rhs.data_); } /* @} */ /* @{ */ /** rounding functions */ friend inline vec round(vec const & arg) { return detail::vec_round_float(arg); // return vec_round(arg.data_); testsuite fails: seems to round differently than we do? } friend inline vec frac(vec const & arg) { vec floor_result = floor(arg); return arg - floor_result; } friend inline vec floor(vec const & arg) { return vec_floor(arg.data_); } friend inline vec ceil(vec const & arg) { return vec_ceil(arg.data_); } friend inline vec trunc(vec const & arg) { return arg.truncate_to_int().convert_to_float(); } typedef detail::int_vec_altivec int_vec; vec (int_vec const & rhs): base((internal_vector_type)rhs.data_) {} int_vec truncate_to_int(void) const { return int_vec(vec_ctu(data_, 0)); } /* @} */ /* @{ */ /** mathematical functions */ #if 0 // FIXME: vector math support seems to be broken typedef nova::detail::int_vec_altivec int_vec; friend inline vec exp(vec const & arg) { return detail::vec_exp_float(arg); } friend inline vec log(vec const & arg) { return detail::vec_log_float(arg); } friend inline vec pow(vec const & arg1, vec const & arg2) { return detail::vec_pow(arg1, arg2); } friend inline vec sin(vec const & arg) { return detail::vec_sin_float(arg); } friend inline vec cos(vec const & arg) { return detail::vec_cos_float(arg); } friend inline vec tan(vec const & arg) { return detail::vec_tan_float(arg); } friend inline vec asin(vec const & arg) { return detail::vec_asin_float(arg); } friend inline vec acos(vec const & arg) { return detail::vec_acos_float(arg); } friend inline vec atan(vec const & arg) { return detail::vec_atan_float(arg); } friend inline vec tanh(vec const & arg) { return detail::vec_tanh_float(arg); } friend inline vec signed_pow(vec const & lhs, vec const & rhs) { return detail::vec_signed_pow(lhs, rhs); } friend inline vec signed_sqrt(vec const & arg) { return detail::vec_signed_sqrt(arg); } friend inline vec log2(vec const & arg) { return detail::vec_log2(arg); } friend inline vec log10(vec const & arg) { return detail::vec_log10(arg); } #else NOVA_SIMD_DELEGATE_BINARY_TO_BASE(pow) NOVA_SIMD_DELEGATE_BINARY_TO_BASE(signed_pow) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(log) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(log2) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(log10) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(exp) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(sin) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(cos) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(tan) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(asin) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(acos) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(atan) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(tanh) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(signed_sqrt) #endif /* @} */ }; } /* namespace nova */ #undef always_inline #undef vec_cmplt_ #endif /* VEC_ALTIVEC_HPP */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/vec.hpp0000664000175000017500000000264312110473257025416 0ustar dandan// generic vector class // // Copyright (C) 2010 Tim Blechmann // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; see the file COPYING. If not, write to // the Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. #ifndef VEC_HPP #define VEC_HPP #include "vec_generic.hpp" #ifdef __ARM_NEON__ # include "vec_neon.hpp" #endif #ifdef __ALTIVEC__ # include "vec_altivec.hpp" #endif #ifdef __AVX__ # include "vec_avx_float.hpp" #elif defined(__SSE__) # include "vec_sse.hpp" #endif #ifdef __AVX__ # include "vec_avx_double.hpp" #elif defined(__SSE2__) # include "vec_sse2.hpp" #endif namespace nova { template T max_(T const & left, T const & right) { return std::max(left, right); } template T min_(T const & left, T const & right) { return std::min(left, right); } } #endif /* VEC_HPP */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/vec_avx_float.hpp0000664000175000017500000002563112110473257027463 0ustar dandan// avx single-precision vector class // // Copyright (C) 2011 Tim Blechmann // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; see the file COPYING. If not, write to // the Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. #ifndef VEC_AVX_FLOAT_HPP #define VEC_AVX_FLOAT_HPP #include #include #include "detail/vec_math.hpp" #include #if defined(__GNUC__) && defined(NDEBUG) #define always_inline inline __attribute__((always_inline)) #else #define always_inline inline #endif #include "vec_int_avx.hpp" #include "vec_base.hpp" namespace nova { template <> struct vec: vec_base { private: typedef vec_base base; public: static const bool has_compare_bitmask = true; typedef __m256 internal_vector_type; typedef float float_type; /* SSE fallback */ static inline __m256 gen_sign_mask(void) { return set_bitmask(0x80000000); } static inline __m256 gen_abs_mask(void) { return set_bitmask(0x7fffffff); } static inline __m256 gen_one(void) { return _mm256_set1_ps(1.f); } static inline __m256 gen_05(void) { return _mm256_set1_ps(0.5f); } static inline __m256 set_bitmask(unsigned int mask) { union { unsigned int i; float f; } u; u.i = mask; return _mm256_set1_ps(u.f); } static inline __m256 gen_exp_mask(void) { return set_bitmask(0x7F800000); } static inline __m256 gen_exp_mask_1(void) { return set_bitmask(0x3F000000); } static inline __m256 gen_ones(void) { __m256 x = gen_zero(); __m256 ones = _mm256_cmp_ps(x, x, _CMP_EQ_OQ); return ones; } static inline __m256 gen_zero(void) { return _mm256_setzero_ps(); } vec(__m256 const & arg): base(arg) {} public: static const int size = 8; static const int objects_per_cacheline = 64/sizeof(float); static bool is_aligned(float* ptr) { return ((intptr_t)(ptr) & (intptr_t)(size * sizeof(float) - 1)) == 0; } /* @{ */ /** constructors */ vec(void) {} vec(float f) { set_vec(f); } vec(vec const & rhs) { data_ = rhs.data_; } /* @} */ /* @{ */ /** io */ void load(const float * data) { data_ = _mm256_loadu_ps(data); } void load_aligned(const float * data) { data_ = _mm256_load_ps(data); } void load_first(const float * data) { clear(); data_ = _mm256_castps128_ps256(_mm_load_ss(data)); } void store(float * dest) const { _mm256_storeu_ps(dest, data_); } void store_aligned(float * dest) const { _mm256_store_ps(dest, data_); } void store_aligned_stream(float * dest) const { _mm256_stream_ps(dest, data_); } void clear(void) { data_ = gen_zero(); } operator __m256(void) const { return data_; } /* @} */ /* @{ */ /** element access */ void set_vec (float value) { data_ = _mm256_set1_ps(value); } float set_slope(float start, float slope) { float v1 = start + slope; float v2 = v1 + slope; float v3 = v2 + slope; float v4 = v3 + slope; float v5 = v4 + slope; float v6 = v5 + slope; float v7 = v6 + slope; data_ = _mm256_set_ps(v7, v6, v5, v4, v3, v2, v1, start); return slope * 8; } float set_exp(float start, float curve) { float v1 = start * curve; float v2 = v1 * curve; float v3 = v2 * curve; float v4 = v3 * curve; float v5 = v4 * curve; float v6 = v5 * curve; float v7 = v6 * curve; data_ = _mm256_set_ps(v7, v6, v5, v4,v3, v2, v1, start); return v7 * curve; } /* @} */ /* @{ */ /** arithmetic operators */ #define OPERATOR_ASSIGNMENT(op, opcode) \ vec & operator op(vec const & rhs) \ { \ data_ = opcode(data_, rhs.data_);\ return *this;\ } OPERATOR_ASSIGNMENT(+=, _mm256_add_ps) OPERATOR_ASSIGNMENT(-=, _mm256_sub_ps) OPERATOR_ASSIGNMENT(*=, _mm256_mul_ps) OPERATOR_ASSIGNMENT(/=, _mm256_div_ps) #undef OPERATOR_ASSIGNMENT #define ARITHMETIC_OPERATOR(op, opcode) \ vec operator op(vec const & rhs) const \ { \ return opcode(data_, rhs.data_); \ } \ \ friend vec operator op(vec const & lhs, float f) \ { \ return opcode(lhs.data_, vec(f).data_); \ } \ \ friend vec operator op(float f, vec const & rhs) \ { \ return opcode(vec(f).data_, rhs.data_); \ } ARITHMETIC_OPERATOR(+, _mm256_add_ps) ARITHMETIC_OPERATOR(-, _mm256_sub_ps) ARITHMETIC_OPERATOR(*, _mm256_mul_ps) ARITHMETIC_OPERATOR(/, _mm256_div_ps) #undef ARITHMETIC_OPERATOR friend vec operator -(const vec & arg) { return _mm256_xor_ps(arg.data_, gen_sign_mask()); } friend vec fast_reciprocal(const vec & arg) { return _mm256_rcp_ps(arg.data_); } friend vec reciprocal(const vec & arg) { return detail::vec_reciprocal_newton(arg); } NOVA_SIMD_DEFINE_MADD #define RELATIONAL_OPERATOR(op, RELATION) \ vec operator op(vec const & rhs) const \ { \ const __m256 one = gen_one(); \ return _mm256_and_ps(_mm256_cmp_ps(data_, rhs.data_, RELATION), one); \ } RELATIONAL_OPERATOR(<, _CMP_LT_OS) RELATIONAL_OPERATOR(<=, _CMP_LE_OS) RELATIONAL_OPERATOR(>, _CMP_NLE_US) RELATIONAL_OPERATOR(>=, _CMP_NLT_US) RELATIONAL_OPERATOR(==, _CMP_EQ_OQ) RELATIONAL_OPERATOR(!=, _CMP_NEQ_UQ) #undef RELATIONAL_OPERATOR /* @{ */ #define BITWISE_OPERATOR(op, opcode) \ vec operator op(vec const & rhs) const \ { \ return opcode(data_, rhs.data_); \ } BITWISE_OPERATOR(&, _mm256_and_ps) BITWISE_OPERATOR(|, _mm256_or_ps) BITWISE_OPERATOR(^, _mm256_xor_ps) #undef BITWISE_OPERATOR friend inline vec andnot(vec const & lhs, vec const & rhs) { return _mm256_andnot_ps(lhs.data_, rhs.data_); } #define RELATIONAL_MASK_OPERATOR(op, RELATION) \ friend vec mask_##op(vec const & lhs, vec const & rhs) \ { \ return _mm256_cmp_ps(lhs.data_, rhs.data_, RELATION); \ } RELATIONAL_MASK_OPERATOR(lt, _CMP_LT_OS) RELATIONAL_MASK_OPERATOR(le, _CMP_LE_OS) RELATIONAL_MASK_OPERATOR(gt, _CMP_NLE_US) RELATIONAL_MASK_OPERATOR(ge, _CMP_NLT_US) RELATIONAL_MASK_OPERATOR(eq, _CMP_EQ_OQ) RELATIONAL_MASK_OPERATOR(neq, _CMP_NEQ_UQ) #undef RELATIONAL_MASK_OPERATOR friend inline vec select(vec lhs, vec rhs, vec bitmask) { /* if bitmask is set, return value in rhs, else value in lhs */ return _mm256_blendv_ps(lhs.data_, rhs.data_, bitmask.data_); } /* @} */ /* @{ */ /** unary functions */ friend inline vec abs(vec const & arg) { return _mm256_and_ps(gen_abs_mask(), arg.data_); } friend always_inline vec sign(vec const & arg) { return detail::vec_sign(arg); } friend inline vec square(vec const & arg) { return _mm256_mul_ps(arg.data_, arg.data_); } friend inline vec sqrt(vec const & arg) { return _mm256_sqrt_ps(arg.data_); } friend inline vec cube(vec const & arg) { return arg * arg * arg; } /* @} */ /* @{ */ /** binary functions */ friend inline vec max_(vec const & lhs, vec const & rhs) { return _mm256_max_ps(lhs.data_, rhs.data_); } friend inline vec min_(vec const & lhs, vec const & rhs) { return _mm256_min_ps(lhs.data_, rhs.data_); } /* @} */ /* @{ */ /** rounding functions */ friend inline vec round(vec const & arg) { return _mm256_round_ps(arg.data_, _MM_FROUND_TO_NEAREST_INT); } friend inline vec frac(vec const & arg) { vec floor_result = floor(arg); return arg - floor_result; } friend inline vec floor(vec const & arg) { return _mm256_round_ps(arg.data_, _MM_FROUND_TO_NEG_INF); } friend inline vec ceil(vec const & arg) { return _mm256_round_ps(arg.data_, _MM_FROUND_TO_POS_INF); } friend inline vec trunc(vec const & arg) { return _mm256_round_ps(arg.data_, _MM_FROUND_TO_ZERO); } /* @} */ /* @{ */ /** mathematical functions */ friend inline vec exp(vec const & arg) { return detail::vec_exp_float(arg); } friend inline vec log(vec const & arg) { return detail::vec_log_float(arg); } friend inline vec pow(vec const & arg1, vec const & arg2) { return detail::vec_pow(arg1, arg2); } friend inline vec sin(vec const & arg) { return detail::vec_sin_float(arg); } friend inline vec cos(vec const & arg) { return detail::vec_cos_float(arg); } friend inline vec tan(vec const & arg) { return detail::vec_tan_float(arg); } friend inline vec asin(vec const & arg) { return detail::vec_asin_float(arg); } friend inline vec acos(vec const & arg) { return detail::vec_acos_float(arg); } friend inline vec atan(vec const & arg) { return detail::vec_atan_float(arg); } friend inline vec tanh(vec const & arg) { return detail::vec_tanh_float(arg); } friend inline vec signed_pow(vec const & lhs, vec const & rhs) { return detail::vec_signed_pow(lhs, rhs); } friend inline vec signed_sqrt(vec const & arg) { return detail::vec_signed_sqrt(arg); } friend inline vec log2(vec const & arg) { return detail::vec_log2(arg); } friend inline vec log10(vec const & arg) { return detail::vec_log10(arg); } friend inline vec undenormalize(vec const & arg) { return detail::vec_undenormalize(arg); } /* @} */ /* @{ */ typedef nova::detail::int_vec_avx int_vec; vec (int_vec const & rhs): base(_mm256_castsi256_ps(rhs.data_)) {} int_vec truncate_to_int(void) const { __m256i int_val = _mm256_cvttps_epi32(data_); return int_vec(int_val); } /* @} */ }; } /* namespace nova */ #undef always_inline #endif /* VEC_AVX_FLOAT_HPP */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/vec_int_sse2.hpp0000664000175000017500000000560312110473257027223 0ustar dandan// sse integer vector helper class // // Copyright (C) 2011 Tim Blechmann // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; see the file COPYING. If not, write to // the Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. #ifndef VEC_INT_SSE_HPP #define VEC_INT_SSE_HPP #include namespace nova { namespace detail { struct int_vec_sse2 { __m128i data_; explicit int_vec_sse2(int arg): data_(_mm_set1_epi32(arg)) {} int_vec_sse2(__m128 arg): data_((__m128i)arg) {} int_vec_sse2(__m128i arg): data_(arg) {} int_vec_sse2(int_vec_sse2 const & arg): data_(arg.data_) {} int_vec_sse2(void) {} operator __m128i (void) const { return data_; } friend int_vec_sse2 operator+(int_vec_sse2 const & lhs, int_vec_sse2 const & rhs) { return _mm_add_epi32(lhs.data_, rhs.data_); } friend int_vec_sse2 operator-(int_vec_sse2 const & lhs, int_vec_sse2 const & rhs) { return _mm_sub_epi32(lhs.data_, rhs.data_); } #define RELATIONAL_MASK_OPERATOR(op, opcode) \ friend inline int_vec_sse2 mask_##op(int_vec_sse2 const & lhs, int_vec_sse2 const & rhs) \ { \ return opcode(lhs.data_, rhs.data_); \ } RELATIONAL_MASK_OPERATOR(lt, _mm_cmplt_epi32) RELATIONAL_MASK_OPERATOR(gt, _mm_cmpgt_epi32) RELATIONAL_MASK_OPERATOR(eq, _mm_cmpeq_epi32) #undef RELATIONAL_MASK_OPERATOR friend int_vec_sse2 operator&(int_vec_sse2 const & lhs, int_vec_sse2 const & rhs) { int_vec_sse2 ret = int_vec_sse2 (_mm_and_si128(lhs.data_, rhs.data_)); return ret; } friend inline int_vec_sse2 andnot(int_vec_sse2 const & lhs, int_vec_sse2 const & rhs) { return int_vec_sse2(_mm_andnot_si128(lhs.data_, rhs.data_)); } // shift in zeros friend inline int_vec_sse2 slli(int_vec_sse2 const & arg, int count) { int_vec_sse2 ret (_mm_slli_epi32(arg.data_, count)); return ret; } // shift in zeros friend inline int_vec_sse2 srli(int_vec_sse2 const & arg, int count) { int_vec_sse2 ret (_mm_srli_epi32(arg.data_, count)); return ret; } inline __m128 convert_to_float(void) const { return _mm_cvtepi32_ps(data_); } }; } } #endif /* VEC_INT_SSE_HPP */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/vec_int_altivec.hpp0000664000175000017500000000621612110473257027777 0ustar dandan// altivec integer vector helper class // // Copyright (C) 2011 Tim Blechmann // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; see the file COPYING. If not, write to // the Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. #ifndef VEC_INT_ALTIVEC_HPP #define VEC_INT_ALTIVEC_HPP #include namespace nova { namespace detail { struct int_vec_altivec { typedef vector float fvec; typedef vector unsigned int ivec; ivec data_; private: static ivec set_vector(int i) { #ifdef __GNUC__ return (ivec){i, i, i, i}; #else #error compiler not supported #endif } public: explicit int_vec_altivec(int arg): data_(set_vector(arg)) {} int_vec_altivec(fvec arg): data_((ivec)arg) {} int_vec_altivec(ivec arg): data_(arg) {} int_vec_altivec(int_vec_altivec const & arg): data_(arg.data_) {} int_vec_altivec(vector signed int arg): data_((ivec)arg) {} int_vec_altivec(void) {} operator ivec (void) const { return data_; } friend int_vec_altivec operator+(int_vec_altivec const & lhs, int_vec_altivec const & rhs) { return vec_add(lhs.data_, rhs.data_); } friend int_vec_altivec operator-(int_vec_altivec const & lhs, int_vec_altivec const & rhs) { return vec_sub(lhs.data_, rhs.data_); } #define RELATIONAL_MASK_OPERATOR(op, opcode) \ friend inline int_vec_altivec mask_##op(int_vec_altivec const & lhs, int_vec_altivec const & rhs) \ { \ return int_vec_altivec((ivec)opcode(lhs.data_, rhs.data_)); \ } RELATIONAL_MASK_OPERATOR(lt, vec_cmplt) RELATIONAL_MASK_OPERATOR(gt, vec_cmpgt) RELATIONAL_MASK_OPERATOR(eq, vec_cmpeq) #undef RELATIONAL_MASK_OPERATOR friend int_vec_altivec operator&(int_vec_altivec const & lhs, int_vec_altivec const & rhs) { return int_vec_altivec (vec_and(lhs.data_, rhs.data_)); } friend inline int_vec_altivec andnot(int_vec_altivec const & lhs, int_vec_altivec const & rhs) { return int_vec_altivec(vec_andc(lhs.data_, rhs.data_)); } // shift in zeros friend inline int_vec_altivec slli(int_vec_altivec const & arg, int count) { return vec_sl(arg.data_, set_vector(count)); } // shift in zeros friend inline int_vec_altivec srli(int_vec_altivec const & arg, int count) { return vec_sr(arg.data_, set_vector(count)); } inline fvec convert_to_float(void) const { return vec_ctf(data_, 0); } }; } } #endif /* VEC_INT_ALTIVEC_HPP */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/benchmarks/0000775000175000017500000000000012110505246026232 5ustar dandan././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/benchmarks/simd_pow_benchmarks.cppSuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/benchmarks/simd_pow_benchmarks.0000644000175000017500000000175311512512273032260 0ustar dandan#include "benchmark_helpers.hpp" #include "cache_aligned_array.hpp" #include "../simd_math.hpp" #include using namespace nova; using namespace std; aligned_array out, in, in2; void __noinline__ bench_1(unsigned int n) { spow_vec(out.begin(), in.begin(), 2.3f, n); } void __noinline__ bench_1_simd(unsigned int n) { spow_vec_simd(out.begin(), in.begin(), 2.3f, n); } void __noinline__ bench_2(unsigned int n) { spow_vec(out.begin(), in.begin(), in2.begin(), n); } void __noinline__ bench_2_simd(unsigned int n) { spow_vec_simd(out.begin(), in.begin(), in2.begin(), n); } int main(void) { out.assign(0); in.assign(0.2f); in2.assign(2.3f); const unsigned int iterations = 500000; cout << "pow(0.2, 2.3):" << endl; run_bench(boost::bind(bench_1, 64), iterations); run_bench(boost::bind(bench_1_simd, 64), iterations); run_bench(boost::bind(bench_2, 64), iterations); run_bench(boost::bind(bench_2_simd, 64), iterations); } SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/benchmarks/malloc_aligned.hpp0000644000175000017500000001422411512512273031701 0ustar dandan// functions for aligned memory allocation // Copyright (C) 2009 Tim Blechmann // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; see the file COPYING. If not, write to // the Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. #ifndef UTILITIES_MALLOC_ALIGNED_HPP #define UTILITIES_MALLOC_ALIGNED_HPP #include #include #include #ifdef __SSE2__ #include #elif defined(HAVE_TBB) #include #endif /* HAVE_TBB */ namespace nova { #if _POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600 /* we have posix_memalign */ /* memory alignment constraints: * * - 16 byte for SSE operations * - the cache lines size of modern x86 cpus is 64 bytes (pentium-m, pentium 4, core, k8) */ const int malloc_memory_alignment = 64; inline void* malloc_aligned(std::size_t nbytes) { void * ret; int status = posix_memalign(&ret, malloc_memory_alignment, nbytes); if (!status) return ret; else return 0; } inline void free_aligned(void *ptr) { free(ptr); } #elif defined(__APPLE__) const int malloc_memory_alignment = 64; /* apple's malloc implementation returns 16-byte aligned chunks */ inline void* malloc_aligned(std::size_t nbytes) { return malloc(nbytes); } inline void free_aligned(void *ptr) { free(ptr); } #elif defined(__SSE2__) const int malloc_memory_alignment = 64; inline void* malloc_aligned(std::size_t nbytes) { return _mm_malloc(nbytes, malloc_memory_alignment); } inline void free_aligned(void *ptr) { _mm_free(ptr); } #elif defined(HAVE_TBB) inline void* malloc_aligned(std::size_t nbytes) { tbb::cache_aligned_allocator ca_alloc; return static_cast(ca_alloc.allocate(nbytes)); } inline void free_aligned(void *ptr) { tbb::cache_aligned_allocator ca_alloc; ca_alloc.deallocate(static_cast(ptr), 0); } #else /* on other systems, we use the aligned memory allocation taken * from thomas grill's implementation for pd */ #define VECTORALIGNMENT 128 inline void* malloc_aligned(std::size_t nbytes) { void* vec = malloc(nbytes+ (VECTORALIGNMENT/8-1) + sizeof(void *)); if (vec != NULL) { /* get alignment of first possible signal vector byte */ long alignment = ((long)vec+sizeof(void *))&(VECTORALIGNMENT/8-1); /* calculate aligned pointer */ void *ret = (unsigned char *)vec+sizeof(void *)+(alignment == 0?0:VECTORALIGNMENT/8-alignment); /* save original memory location */ *(void **)((unsigned char *)ret-sizeof(void *)) = vec; return ret; } else return 0; } inline void free_aligned(void *ptr) { /* get original memory location */ void *ori = *(void **)((unsigned char *)ptr-sizeof(void *)); free(ori); } #undef VECTORALIGNMENT #endif inline void * calloc_aligned(std::size_t nbytes) { void * ret = malloc_aligned(nbytes); if (ret) std::memset(ret, 0, nbytes); return ret; } template T* malloc_aligned(std::size_t n) { return static_cast(malloc_aligned(n * sizeof(T))); } template T* calloc_aligned(std::size_t n) { return static_cast(calloc_aligned(n * sizeof(T))); } /** aligned allocator. uses malloc_aligned and free_aligned internally * */ template class aligned_allocator { public: typedef std::size_t size_type; typedef std::ptrdiff_t difference_type; typedef T* pointer; typedef const T* const_pointer; typedef T& reference; typedef const T& const_reference; typedef T value_type; template struct rebind { typedef aligned_allocator other; }; pointer address(reference x) const { return &x; } const_pointer address(const_reference x) const { return &x; } pointer allocate(size_type n, const_pointer hint = 0) { pointer ret = malloc_aligned(n); if (ret == 0) throw std::bad_alloc(); return ret; } void deallocate(pointer p, size_type n) { return free_aligned(p); } size_type max_size() const throw() { return size_type(-1) / sizeof(T); } void construct(pointer p, const T& val) { ::new(p) T(val); } void destroy(pointer p) { p->~T(); } }; template bool operator==( aligned_allocator const& left, aligned_allocator const& right ) { return !(left != right); } template bool operator!=( aligned_allocator const& left, aligned_allocator const& right ) { return true; } /** smart-pointer, freeing the managed pointer via free_aligned */ template class aligned_storage_ptr { public: explicit aligned_storage_ptr(T * p = 0): ptr(p) {} ~aligned_storage_ptr(void) { if (managed && ptr) free_aligned(ptr); } void reset(T * p = 0) { if (managed && ptr) free_aligned(ptr); ptr = p; } T & operator*() const { return *ptr; } T * operator->() const { return ptr; } T * get() const { return ptr; } aligned_storage_ptr & operator=(T * p) { reset(p); return *this; } operator bool() const { return bool(ptr); } void swap(aligned_storage_ptr & b) { T * p = ptr; ptr = b.ptr; b.ptr = p; } private: T * ptr; }; } /* namespace nova */ #endif /* UTILITIES_MALLOC_ALIGNED_HPP */ ././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/benchmarks/simd_tan_benchmarks.cppSuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/benchmarks/simd_tan_benchmarks.0000644000175000017500000000121511512512273032226 0ustar dandan#include "benchmark_helpers.hpp" #include "cache_aligned_array.hpp" #include "../simd_math.hpp" #include using namespace nova; using namespace std; aligned_array out, in; void __noinline__ bench_1_simd(unsigned int n) { tan_vec_simd(out.begin(), in.begin(), n); } void __noinline__ bench_1(unsigned int n) { for (int i = 0; i != n; ++i) out[i] = tan(in[i]); } int main(void) { out.assign(0.f); const unsigned int iterations = 5000000; in.assign(0.2f); cout << "tan(0.2):" << endl; run_bench(boost::bind(bench_1, 64), iterations); run_bench(boost::bind(bench_1_simd, 64), iterations); } ././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/benchmarks/simd_tanh_benchmarks.cppSuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/benchmarks/simd_tanh_benchmarks0000644000175000017500000000221211512512273032316 0ustar dandan#include "benchmark_helpers.hpp" #include "cache_aligned_array.hpp" #include "../simd_math.hpp" #include using namespace nova; using namespace std; aligned_array out, in; void __noinline__ bench_1_simd(unsigned int n) { tanh_vec_simd(out.begin(), in.begin(), n); } void __noinline__ bench_1(unsigned int n) { for (int i = 0; i != n; ++i) out[i] = tanh(in[i]); } int main(void) { out.assign(0.f); const unsigned int iterations = 5000000; in.assign(0.2f); cout << "tanh(0.2):" << endl; run_bench(boost::bind(bench_1, 64), iterations); run_bench(boost::bind(bench_1_simd, 64), iterations); in.assign(2.f); cout << "tanh(2):" << endl; run_bench(boost::bind(bench_1, 64), iterations); run_bench(boost::bind(bench_1_simd, 64), iterations); in.assign(200.f); cout << "tanh(200):" << endl; run_bench(boost::bind(bench_1, 64), iterations); run_bench(boost::bind(bench_1_simd, 64), iterations); fill_container(in); cout << "tanh([-1..1]):" << endl; run_bench(boost::bind(bench_1, 64), iterations); run_bench(boost::bind(bench_1_simd, 64), iterations); } ././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/benchmarks/inplace_benchmark.cppSuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/benchmarks/inplace_benchmark.cp0000644000175000017500000000122711512512273032206 0ustar dandan#include "benchmark_helpers.hpp" #include "../simd_unary_arithmetic.hpp" const int size = 16384; nova::aligned_array in; nova::aligned_array out; using namespace nova; void __noinline__ bench_1(unsigned int numSamples) { abs_vec_simd(out.begin(), in.begin(), numSamples); } void __noinline__ bench_2(unsigned int numSamples) { abs_vec_simd(in.begin(), in.begin(), numSamples); } int main(void) { /* touch buffers */ out.assign(0); fill_container(in); const unsigned int iterations = 20000000; run_bench(boost::bind(bench_1, size), iterations); run_bench(boost::bind(bench_2, size), iterations); } ././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/benchmarks/simd_pan2_benchmark.cppSuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/benchmarks/simd_pan2_benchmark.0000644000175000017500000000341111512512273032121 0ustar dandan#include "benchmark_helpers.hpp" #include "../simd_pan.hpp" void __noinline__ bench_1(float * out0, float * out1, const float * in, float factor0, float factor1, unsigned int n) { nova::pan2_vec(out0, out1, in, factor0, factor1, n); } void __noinline__ bench_2(float * out0, float * out1, const float * in, float factor0, float factor1, unsigned int n) { nova::pan2_vec_simd(out0, out1, in, factor0, factor1, n); } void __noinline__ bench_3(float * out0, float * out1, const float * in, float factor0, float slope0, float factor1, float slope1, unsigned int n) { nova::pan2_vec(out0, out1, in, factor0, slope0, factor1, slope1, n); } void __noinline__ bench_4(float * out0, float * out1, const float * in, float factor0, float slope0, float factor1, float slope1, unsigned int n) { nova::pan2_vec_simd(out0, out1, in, factor0, slope0, factor1, slope1, n); } int main(void) { using namespace std; nova::aligned_array __attribute__((aligned(64))) in; nova::aligned_array __attribute__((aligned(64))) out0; nova::aligned_array __attribute__((aligned(64))) out1; fill_container(in); fill_container(out0); fill_container(out1); const int iterations = 50000000; run_bench(boost::bind(bench_1, out0.begin(), out1.begin(), in.begin(), 0.4f, 0.6f, 64), iterations); run_bench(boost::bind(bench_2, out0.begin(), out1.begin(), in.begin(), 0.4f, 0.6f, 64), iterations); run_bench(boost::bind(bench_3, out0.begin(), out1.begin(), in.begin(), 0.4f, 0.6f, 0.01f, 0.01f, 64), iterations); run_bench(boost::bind(bench_4, out0.begin(), out1.begin(), in.begin(), 0.4f, 0.6f, 0.01f, 0.01f, 64), iterations); } ././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/benchmarks/benchmark_helpers.hppSuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/benchmarks/benchmark_helpers.hp0000644000175000017500000000335011512512273032241 0ustar dandan// some benchmarking helpers // Copyright (C) 2008 Tim Blechmann // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; see the file COPYING. If not, write to // the Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. #include #include #include #include "cache_aligned_array.hpp" template void fill_container(Container & t) { for (int i = 0; i != t.size(); ++i) t[i] = rand()/RAND_MAX * 2 - 1; } #ifdef NO_PERFORMANCE_COUNTERS #include "../source/utilities/high_resolution_timer.hpp" template inline void run_bench(Function const & f, unsigned int loops = 5000000) { boost::high_resolution_timer hrt; hrt.restart(); for (int i = 0; i != loops; ++i) f(); double e = hrt.elapsed(); std::cout << e << std::endl; } #else #include "perf_counter.hpp" template inline void run_bench(Function const & f, unsigned int loops = 5000000) { perf_counter pc; pc.start(); for (int i = 0; i != loops; ++i) f(); pc.stop(); pc.dump(false); } #endif #define __noinline__ __attribute__ ((noinline)) ././@LongLink0000000000000000000000000000015300000000000011564 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/benchmarks/simd_ampmod_benchmarks.cppSuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/benchmarks/simd_ampmod_benchmar0000644000175000017500000000332011512512273032304 0ustar dandan#include "benchmark_helpers.hpp" #include "cache_aligned_array.hpp" #include "../simd_ternary_arithmetic.hpp" using namespace nova; using namespace std; aligned_array out, in1, in2, in3; void __noinline__ bench_1(unsigned int n) { ampmod_vec(out.begin(), wrap_argument(in1.begin()), wrap_argument(in2.begin()), wrap_argument(0.1f), n); } void __noinline__ bench_1_simd(unsigned int n) { ampmod_vec_simd(out.begin(), wrap_argument(in1.begin()), wrap_argument(in2.begin()), wrap_argument(0.1f), n); } void __noinline__ bench_2(unsigned int n) { ampmod_vec(out.begin(), wrap_argument(in1.begin()), wrap_argument(in2.begin()), wrap_argument(in3.begin()), n); } void __noinline__ bench_2_simd(unsigned int n) { ampmod_vec_simd(out.begin(), wrap_argument(in1.begin()), wrap_argument(in2.begin()), wrap_argument(in3.begin()), n); } void __noinline__ bench_3(unsigned int n) { ampmod_vec(out.begin(), wrap_argument(in1.begin()), wrap_argument(in2.begin()), wrap_argument(0.1f, 0.001f), n); } void __noinline__ bench_3_simd(unsigned int n) { ampmod_vec_simd(out.begin(), wrap_argument(in1.begin()), wrap_argument(in2.begin()), wrap_argument(0.1f, 0.001f), n); } int main(void) { out.assign(0.f); in1.assign(0.f); in2.assign(0.f); in3.assign(0.f); const unsigned int iterations = 50000000; cout << "simd:" << endl; run_bench(boost::bind(bench_1_simd, 64), iterations); run_bench(boost::bind(bench_2_simd, 64), iterations); run_bench(boost::bind(bench_3_simd, 64), iterations); cout << "\nnormal:" << endl; run_bench(boost::bind(bench_1, 64), iterations); run_bench(boost::bind(bench_2, 64), iterations); run_bench(boost::bind(bench_3, 64), iterations); } ././@LongLink0000000000000000000000000000015400000000000011565 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/benchmarks/simd_unroll_benchmarks2.cppSuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/benchmarks/simd_unroll_benchmar0000644000175000017500000000577511532066166032371 0ustar dandan#include "benchmark_helpers.hpp" #ifdef __SSE__ #include #endif #include "../simd_binary_arithmetic.hpp" using namespace nova; using namespace std; aligned_array out, in1, in2; #ifdef __SSE__ void __noinline__ bench_1(float * out, float * in1, float * in2, unsigned int n) { n /= 4; do { __m128 lhs = _mm_load_ps(in1); __m128 rhs = _mm_load_ps(in2); __m128 result = _mm_add_ps(lhs, rhs); _mm_store_ps(out, result); in1 += 4; in2 += 4; out += 4; } while (--n); } void __noinline__ bench_2(float * out, float * in1, float * in2, unsigned int n) { n /= 8; do { __m128 lhs1 = _mm_load_ps(in1); __m128 lhs2 = _mm_load_ps(in1+4); __m128 rhs1 = _mm_load_ps(in2); __m128 rhs2 = _mm_load_ps(in2+4); __m128 result1 = _mm_add_ps(lhs1, rhs1); __m128 result2 = _mm_add_ps(lhs2, rhs2); _mm_store_ps(out, result1); _mm_store_ps(out+4, result2); in1 += 8; in2 += 8; out += 8; } while (--n); } void __noinline__ bench_3(float * out, float * in1, float * in2, unsigned int n) { n /= 16; do { __m128 lhs1 = _mm_load_ps(in1); __m128 lhs2 = _mm_load_ps(in1+4); __m128 lhs3 = _mm_load_ps(in1+8); __m128 lhs4 = _mm_load_ps(in1+12); __m128 rhs1 = _mm_load_ps(in2); __m128 rhs2 = _mm_load_ps(in2+4); __m128 rhs3 = _mm_load_ps(in2+8); __m128 rhs4 = _mm_load_ps(in2+12); __m128 result1 = _mm_add_ps(lhs1, rhs1); __m128 result2 = _mm_add_ps(lhs2, rhs2); __m128 result3 = _mm_add_ps(lhs3, rhs3); __m128 result4 = _mm_add_ps(lhs4, rhs4); _mm_store_ps(out, result1); _mm_store_ps(out+4, result2); _mm_store_ps(out+8, result3); _mm_store_ps(out+12, result4); in1 += 16; in2 += 16; out += 16; } while (--n); } #endif void __noinline__ bench_4(float * out, float * in1, float * in2, unsigned int n) { n /= 8; do { nova::plus_vec_simd<8>(out, in1, in2); in1 += 8; in2 += 8; out += 8; } while (--n); } void __noinline__ bench_5(float * out, float * in1, float * in2, unsigned int n) { n /= 16; do { nova::plus_vec_simd<16>(out, in1, in2); in1 += 16; in2 += 16; out += 16; } while (--n); } int main(void) { out.assign(0.f); in1.assign(0.f); in2.assign(0.f); const unsigned int iterations = 100000000; #ifdef __SSE__ run_bench(boost::bind(bench_1, out.begin(), in1.begin(), in2.begin(), 64), iterations); run_bench(boost::bind(bench_2, out.begin(), in1.begin(), in2.begin(), 64), iterations); run_bench(boost::bind(bench_3, out.begin(), in1.begin(), in2.begin(), 64), iterations); #endif run_bench(boost::bind(bench_4, out.begin(), in1.begin(), in2.begin(), 64), iterations); run_bench(boost::bind(bench_5, out.begin(), in1.begin(), in2.begin(), 64), iterations); } SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/benchmarks/clip_benchmarks.cpp0000644000175000017500000000361511532066166032077 0ustar dandan#include "benchmark_helpers.hpp" #include "../simd_ternary_arithmetic.hpp" #include #define sc_clip(x, lo, hi) ((x) > (hi) ? (hi) : ((x) < (lo) ? (lo) : (x))) using namespace nova; nova::aligned_array in; nova::aligned_array out; void __noinline__ bench_1(unsigned int numSamples) { for (unsigned int i = 0; i != numSamples; ++i) out[i] = sc_clip(in[i], -0.5f, 0.5f); } /* #define direct_clip(x, lo, hi) std::max (lo, std::min(hi, x)); */ /* void __noinline__ bench_2(unsigned int numSamples) */ /* { */ /* for (unsigned int i = 0; i != numSamples; ++i) */ /* out[i] = direct_clip(in[i], -0.5f, 0.5f); */ /* } */ #ifdef __SSE__ #include inline float sse_clip(float x, float lo, float hi) { __m128 xx = _mm_load_ss(&x); __m128 xlo = _mm_load_ss(&lo); __m128 xhi = _mm_load_ss(&hi); __m128 clipped = _mm_max_ss(xlo, _mm_min_ss(xx, xhi)); float ret; _mm_store_ss(&ret, clipped); return ret; } void __noinline__ bench_3(unsigned int numSamples) { for (unsigned int i = 0; __builtin_expect((i != numSamples), 1); ++i) out[i] = sse_clip(in[i], -0.5f, 0.5f); } #endif /* void __noinline__ bench_4(unsigned int numSamples) */ /* { */ /* clip_vec_simd<64>(out.begin(), in.begin(), -0.5f, 0.5f); */ /* } */ void __noinline__ bench_5(unsigned int numSamples) { clip_vec_simd(out.begin(), wrap_argument(in.begin()), wrap_argument(-0.5f), wrap_argument(0.5f), numSamples); } int main(void) { /* touch buffers */ out.assign(0); fill_container(in); const int iterations = 50000000; run_bench(boost::bind(bench_1, 64), iterations); /* run_bench(boost::bind(bench_2, 64), iterations); */ #ifdef __SSE__ run_bench(boost::bind(bench_3, 64), iterations); #endif /* run_bench(boost::bind(bench_4, 64), iterations); */ run_bench(boost::bind(bench_5, 64), iterations); } ././@LongLink0000000000000000000000000000015300000000000011564 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/benchmarks/simd_unroll_benchmarks.cppSuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/benchmarks/simd_unroll_benchmar0000644000175000017500000000773511532066166032367 0ustar dandan#include "benchmark_helpers.hpp" #ifdef __SSE__ #include #endif #include "../simd_binary_arithmetic.hpp" using namespace nova; using namespace std; aligned_array out, in; #ifdef __SSE__ void __noinline__ bench_1(float * out, float * in, float f, unsigned int n) { n /= 4; __m128 scalar = _mm_set_ps1(f); do { __m128 arg = _mm_load_ps(in); __m128 result = _mm_add_ps(arg, scalar); _mm_store_ps(out, result); in += 4; out += 4; } while (--n); } void __noinline__ bench_2(float * out, float * in, float f, unsigned int n) { n /= 8; __m128 scalar = _mm_set_ps1(f); do { __m128 arg = _mm_load_ps(in); __m128 result = _mm_add_ps(arg, scalar); _mm_store_ps(out, result); arg = _mm_load_ps(in+4); result = _mm_add_ps(arg, scalar); _mm_store_ps(out+4, result); in += 8; out += 8; } while (--n); } void __noinline__ bench_3(float * __restrict__ out, float * __restrict__ in, float f, unsigned int n) { n /= 8; __m128 scalar = _mm_set_ps1(f); do { __m128 arg = _mm_load_ps(in); __m128 result = _mm_add_ps(arg, scalar); _mm_store_ps(out, result); arg = _mm_load_ps(in+4); result = _mm_add_ps(arg, scalar); _mm_store_ps(out+4, result); in += 8; out += 8; } while (--n); } void __noinline__ bench_4(float * out, float * in, float f, unsigned int n) { n /= 8; __m128 scalar = _mm_set_ps1(f); do { __m128 arg = _mm_load_ps(in); __m128 arg2 = _mm_load_ps(in+4); __m128 result = _mm_add_ps(arg, scalar); __m128 result2 = _mm_add_ps(arg2, scalar); _mm_store_ps(out, result); _mm_store_ps(out+4, result2); in += 8; out += 8; } while (--n); } void __noinline__ bench_5(float * out, float * in, float f, unsigned int n) { n /= 16; __m128 scalar = _mm_set_ps1(f); do { __m128 arg = _mm_load_ps(in); __m128 arg2 = _mm_load_ps(in+4); __m128 arg3 = _mm_load_ps(in+8); __m128 arg4 = _mm_load_ps(in+12); __m128 result = _mm_add_ps(arg, scalar); __m128 result2 = _mm_add_ps(arg2, scalar); __m128 result3 = _mm_add_ps(arg3, scalar); __m128 result4 = _mm_add_ps(arg4, scalar); _mm_store_ps(out, result); _mm_store_ps(out+4, result2); _mm_store_ps(out+8, result3); _mm_store_ps(out+12, result4); in += 16; out += 16; } while (--n); } #endif /*void __noinline__ bench_6(float * out, float * in, float f, unsigned int n) { n /= 8; do { nova::plus_vec_simd<8>(out, in, f); in += 8; out += 8; } while (--n); } */ void __noinline__ bench_7(float * out, float * in, float f, unsigned int n) { n /= 16; do { nova::plus_vec_simd<16>(out, in, f); in += 16; out += 16; } while (--n); } void __noinline__ bench_8(float * out, float * in, float f, unsigned int n) { n /= 32; do { nova::plus_vec_simd<32>(out, in, f); in += 32; out += 32; } while (--n); } int main(void) { out.assign(0.f); in.assign(0.f); const unsigned int iterations = 100000000; #ifdef __SSE__ run_bench(boost::bind(bench_1, out.begin(), in.begin(), 1.f, 64), iterations); run_bench(boost::bind(bench_2, out.begin(), in.begin(), 1.f, 64), iterations); run_bench(boost::bind(bench_3, out.begin(), in.begin(), 1.f, 64), iterations); run_bench(boost::bind(bench_4, out.begin(), in.begin(), 1.f, 64), iterations); run_bench(boost::bind(bench_5, out.begin(), in.begin(), 1.f, 64), iterations); #endif /* run_bench(boost::bind(bench_6, out.begin(), in.begin(), 1.f, 64), iterations);*/ run_bench(boost::bind(bench_7, out.begin(), in.begin(), 1.f, 64), iterations); run_bench(boost::bind(bench_8, out.begin(), in.begin(), 1.f, 64), iterations); } ././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/benchmarks/simd_mix_benchmark.cppSuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/benchmarks/simd_mix_benchmark.c0000644000175000017500000000343011512512273032222 0ustar dandan#include "benchmark_helpers.hpp" #include "../simd_mix.hpp" void __noinline__ bench_1(float * out0, const float * in0, float factor0, const float * in1, float factor1, unsigned int n) { nova::mix_vec(out0, in0, factor0, in1, factor1, n); } void __noinline__ bench_2(float * out0, const float * in0, float factor0, const float * in1, float factor1, unsigned int n) { nova::mix_vec_simd(out0, in0, factor0, in1, factor1, n); } void __noinline__ bench_3(float * out0, const float * in0, float factor0, float slope0, const float * in1, float factor1, float slope1, unsigned int n) { nova::mix_vec(out0, in0, factor0, slope0, in1, factor1, slope1, n); } void __noinline__ bench_4(float * out0, const float * in0, float factor0, float slope0, const float * in1, float factor1, float slope1, unsigned int n) { nova::mix_vec_simd(out0, in0, factor0, slope0, in1, factor1, slope1, n); } int main(void) { using namespace std; nova::aligned_array __attribute__((aligned(64))) out; nova::aligned_array __attribute__((aligned(64))) in0; nova::aligned_array __attribute__((aligned(64))) in1; fill_container(out); fill_container(in0); fill_container(in1); const int iterations = 50000000; run_bench(boost::bind(bench_1, out.begin(), in0.begin(), 0.1f, in1.begin(), 0.9f, 64), iterations); run_bench(boost::bind(bench_2, out.begin(), in0.begin(), 0.1f, in1.begin(), 0.9f, 64), iterations); run_bench(boost::bind(bench_3, out.begin(), in0.begin(), 0.1f, 0.01f, in1.begin(), 0.9f, 0.01f, 64), iterations); run_bench(boost::bind(bench_4, out.begin(), in0.begin(), 0.1f, 0.01f, in1.begin(), 0.9f, 0.01f, 64), iterations); } ././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/benchmarks/cache_aligned_array.hppSuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/benchmarks/cache_aligned_array.0000644000175000017500000003010311512512273032155 0ustar dandan/* cache-aligned array, based on boost::array * * The following code declares class array, * an STL container (as wrapper) for arrays of constant size. * * See * http://www.boost.org/libs/array/ * for documentation. * * The original author site is at: http://www.josuttis.com/ * * (C) Copyright Nicolai M. Josuttis 2001. * * Distributed under the Boost Software License, Version 1.0. (See * accompanying file LICENSE_1_0.txt or copy at * http://www.boost.org/LICENSE_1_0.txt) * * 29 Jan 2004 - c_array() added, BOOST_NO_PRIVATE_IN_AGGREGATE removed (Nico Josuttis) * 23 Aug 2002 - fix for Non-MSVC compilers combined with MSVC libraries. * 05 Aug 2001 - minor update (Nico Josuttis) * 20 Jan 2001 - STLport fix (Beman Dawes) * 29 Sep 2000 - Initial Revision (Nico Josuttis) * * Jan 29, 2004 */ #ifndef CACHE_ALIGNED_ARRAY_HPP #define CACHE_ALIGNED_ARRAY_HPP #include #include #include // Handles broken standard libraries better than #include #include #include // FIXES for broken compilers #include #include "malloc_aligned.hpp" namespace nova { template class aligned_array { public: T * elems; // fixed-size array of elements of type T public: aligned_array(void) { elems = (T*)malloc_aligned(N * sizeof(T)); for (int i = 0; i != N; ++i) new(elems+i) T(); } aligned_array(aligned_array const & rhs) { elems = (T*)malloc_aligned(N * sizeof(T)); for (int i = 0; i != N; ++i) new(elems+i) T(); operator=(rhs); } ~aligned_array(void) { for (int i = 0; i != N; ++i) elems[i].~T(); free_aligned(elems); } // type definitions typedef T value_type; typedef T* iterator; typedef const T* const_iterator; typedef T& reference; typedef const T& const_reference; typedef std::size_t size_type; typedef std::ptrdiff_t difference_type; // iterator support iterator begin() { return elems; } const_iterator begin() const { return elems; } iterator end() { return elems+N; } const_iterator end() const { return elems+N; } // reverse iterator support #if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && !defined(BOOST_MSVC_STD_ITERATOR) && !defined(BOOST_NO_STD_ITERATOR_TRAITS) typedef std::reverse_iterator reverse_iterator; typedef std::reverse_iterator const_reverse_iterator; #elif defined(_MSC_VER) && (_MSC_VER == 1300) && defined(BOOST_DINKUMWARE_STDLIB) && (BOOST_DINKUMWARE_STDLIB == 310) // workaround for broken reverse_iterator in VC7 typedef std::reverse_iterator > reverse_iterator; typedef std::reverse_iterator > const_reverse_iterator; #else // workaround for broken reverse_iterator implementations typedef std::reverse_iterator reverse_iterator; typedef std::reverse_iterator const_reverse_iterator; #endif reverse_iterator rbegin() { return reverse_iterator(end()); } const_reverse_iterator rbegin() const { return const_reverse_iterator(end()); } reverse_iterator rend() { return reverse_iterator(begin()); } const_reverse_iterator rend() const { return const_reverse_iterator(begin()); } // operator[] reference operator[](size_type i) { BOOST_ASSERT( i < N && "out of range" ); return elems[i]; } const_reference operator[](size_type i) const { BOOST_ASSERT( i < N && "out of range" ); return elems[i]; } // at() with range check reference at(size_type i) { rangecheck(i); return elems[i]; } const_reference at(size_type i) const { rangecheck(i); return elems[i]; } // front() and back() reference front() { return elems[0]; } const_reference front() const { return elems[0]; } reference back() { return elems[N-1]; } const_reference back() const { return elems[N-1]; } // size is constant static size_type size() { return N; } static bool empty() { return false; } static size_type max_size() { return N; } enum { static_size = N }; // swap (note: linear complexity) void swap (aligned_array& y) { std::swap_ranges(begin(),end(),y.begin()); } // direct access to data (read-only) const T* data() const { return elems; } T* data() { return elems; } // use array as C array (direct read/write access to data) T* c_array() { return elems; } // assignment with type conversion aligned_array & operator=(const aligned_array & rhs) { std::copy(rhs.begin(),rhs.end(), begin()); return *this; } template aligned_array& operator= (const aligned_array& rhs) { std::copy(rhs.begin(),rhs.end(), begin()); return *this; } // assign one value to all elements void assign (const T& value) { std::fill_n(begin(),size(),value); } // check range (may be private because it is static) static void rangecheck (size_type i) { if (i >= size()) { throw std::out_of_range("aligned_array<>: index out of range"); } } }; #if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) template< class T > class aligned_array< T, 0 > { public: // type definitions typedef T value_type; typedef T* iterator; typedef const T* const_iterator; typedef T& reference; typedef const T& const_reference; typedef std::size_t size_type; typedef std::ptrdiff_t difference_type; // iterator support iterator begin() { return iterator( reinterpret_cast< T * >( this ) ); } const_iterator begin() const { return const_iterator( reinterpret_cast< const T * >( this ) ); } iterator end() { return begin(); } const_iterator end() const { return begin(); } // reverse iterator support #if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && !defined(BOOST_MSVC_STD_ITERATOR) && !defined(BOOST_NO_STD_ITERATOR_TRAITS) typedef std::reverse_iterator reverse_iterator; typedef std::reverse_iterator const_reverse_iterator; #elif defined(_MSC_VER) && (_MSC_VER == 1300) && defined(BOOST_DINKUMWARE_STDLIB) && (BOOST_DINKUMWARE_STDLIB == 310) // workaround for broken reverse_iterator in VC7 typedef std::reverse_iterator > reverse_iterator; typedef std::reverse_iterator > const_reverse_iterator; #else // workaround for broken reverse_iterator implementations typedef std::reverse_iterator reverse_iterator; typedef std::reverse_iterator const_reverse_iterator; #endif reverse_iterator rbegin() { return reverse_iterator(end()); } const_reverse_iterator rbegin() const { return const_reverse_iterator(end()); } reverse_iterator rend() { return reverse_iterator(begin()); } const_reverse_iterator rend() const { return const_reverse_iterator(begin()); } // operator[] reference operator[](size_type i) { return failed_rangecheck(); } const_reference operator[](size_type i) const { return failed_rangecheck(); } // at() with range check reference at(size_type i) { return failed_rangecheck(); } const_reference at(size_type i) const { return failed_rangecheck(); } // front() and back() reference front() { return failed_rangecheck(); } const_reference front() const { return failed_rangecheck(); } reference back() { return failed_rangecheck(); } const_reference back() const { return failed_rangecheck(); } // size is constant static size_type size() { return 0; } static bool empty() { return true; } static size_type max_size() { return 0; } enum { static_size = 0 }; void swap (aligned_array& y) { } // direct access to data (read-only) const T* data() const { return 0; } T* data() { return 0; } // use array as C array (direct read/write access to data) T* c_array() { return 0; } // assignment with type conversion template aligned_array& operator= (const aligned_array& ) { return *this; } // assign one value to all elements void assign (const T& ) { } // check range (may be private because it is static) static reference failed_rangecheck () { std::out_of_range e("attempt to access element of an empty aligned_array"); boost::throw_exception(e); // // We need to return something here to keep // some compilers happy: however we will never // actually get here.... // static T placeholder; return placeholder; } }; #endif // comparisons template bool operator== (const aligned_array& x, const aligned_array& y) { return std::equal(x.begin(), x.end(), y.begin()); } template bool operator< (const aligned_array& x, const aligned_array& y) { return std::lexicographical_compare(x.begin(),x.end(),y.begin(),y.end()); } template bool operator!= (const aligned_array& x, const aligned_array& y) { return !(x==y); } template bool operator> (const aligned_array& x, const aligned_array& y) { return y bool operator<= (const aligned_array& x, const aligned_array& y) { return !(y bool operator>= (const aligned_array& x, const aligned_array& y) { return !(x inline void swap (aligned_array& x, aligned_array& y) { x.swap(y); } template #ifdef GCC inline sample_type __attribute__((aligned(64))) * get_samples(aligned_array & arg) #else inline sample_type * get_samples(aligned_array & arg) #endif { return arg.begin(); } template #ifdef GCC inline const sample_type __attribute__((aligned(64))) * get_samples(aligned_array const & arg) #else inline const sample_type * get_samples(aligned_array const & arg) #endif { return arg.begin(); } } /* namespace nova */ #endif /*CACHE_ALIGNED_ARRAY_HPP*/ SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/benchmarks/clear_benchmark.cpp0000644000175000017500000001241311512512273032040 0ustar dandan#include "benchmark_helpers.hpp" #include "../simd_memory.hpp" #define LOOP(length, stmt) for (int xxi=0; xxi<(length); ++xxi) { stmt; } #define ZXP(z) (*++(z)) #define ZOFF (1) void __noinline__ bench_1(float * out, unsigned int numSamples) { if ((numSamples & 1) == 0) { double *outd = (double*)out - ZOFF; LOOP(numSamples >> 1, ZXP(outd) = 0.; ); } else { out -= ZOFF; LOOP(numSamples, ZXP(out) = 0.f; ); } } void __noinline__ bench_2(float * out, unsigned int numSamples) { int i; for(i = 0; i < numSamples; ++i) out[i] = 0.f; } void __noinline__ bench_3(float * out, unsigned int numSamples) { int i; float *loc = out; for(i = 0; i < numSamples; ++i) *(loc++) = 0.f; } void __noinline__ bench_4(float * out, unsigned int numSamples) { int i; float *loc = out - 1; for(i = 0; i < numSamples; ++i) *(++loc) = 0.f; } void __noinline__ bench_5(float * out, unsigned int numSamples) { int i = numSamples; do{ out[--i] = 0.f; }while(i != 0); } #define DUFF_DEVICE_8(aCount, aAction) \ { \ int count_ = (aCount); \ int times_ = (count_ + 7) >> 3; \ switch (count_ & 7){ \ case 0: do { aAction; \ case 7: aAction; \ case 6: aAction; \ case 5: aAction; \ case 4: aAction; \ case 3: aAction; \ case 2: aAction; \ case 1: aAction; \ } while (--times_ > 0); \ } \ } void __noinline__ bench_6(float * out, unsigned int numSamples) { float *loc = out; DUFF_DEVICE_8(numSamples, *(loc++)=0.f;); } void __noinline__ bench_7(float * out, unsigned int numSamples) { float *loc = out - 1; DUFF_DEVICE_8(numSamples, *(++loc)=0.f;); } void __noinline__ bench_8(float * out, unsigned int numSamples) { memset(out, 0, numSamples * sizeof(float)); } void __noinline__ bench_9(float * out, unsigned int numSamples) { bzero(out, numSamples * sizeof(float)); } void __noinline__ bench_10(float * out, unsigned int numSamples) { int i; float *loc = out; for(i = numSamples >> 2; i != 0; --i){ // Unroll into blocks of four *(loc++) = 0.f; *(loc++) = 0.f; *(loc++) = 0.f; *(loc++) = 0.f; } // These two "if"s handle the remainder, if not divisible exactly by four if(numSamples & 1){ *(loc++) = 0.f; } if(numSamples & 2){ *(loc++) = 0.f; *(loc++) = 0.f; } } using namespace nova; void __noinline__ bench_11(float * out, unsigned int numSamples) { zerovec_simd<64>(out); } void __noinline__ bench_12(float * out, unsigned int numSamples) { zerovec_simd<64>(out); if (numSamples-64) zerovec(out+64, numSamples-64); } void __noinline__ bench_13(float * out, unsigned int numSamples) { zerovec_simd(out, numSamples); } void __noinline__ bench_14(float * out, unsigned int numSamples) { unsigned int unrolled = numSamples & ~8; unsigned int remain = numSamples - unrolled; if (unrolled) zerovec_simd(out, unrolled); if (remain) zerovec(out, remain); } template inline void zerovec_8(F * dest, uint n) { for (uint i = 0; i != n; i+=8) { dest[i+0] = dest[i+1] = dest[i+2] = dest[i+3] = dest[i+4] = dest[i+5] = dest[i+6] = dest[i+7] = 0; } } void __noinline__ bench_15(float * out, unsigned int numSamples) { zerovec_8(out, numSamples); } void __noinline__ bench_16(float * out, unsigned int numSamples) { unsigned int unrolled = numSamples & ~8; unsigned int remain = numSamples - unrolled; if (unrolled) zerovec_8(out, unrolled); if (remain) zerovec(out, remain); } void __noinline__ bench_17(float * out, unsigned int numSamples) { zerovec(out, numSamples); } void __noinline__ bench_18(float * out, unsigned int numSamples) { unsigned int unrolled = numSamples & ~8; unsigned int remain = numSamples - unrolled; if (unrolled) zerovec_na_simd(out, unrolled); if (remain) zerovec(out, remain); } int main(void) { const int iterations = 50000000; nova::aligned_array buffer; fill_container(buffer); run_bench(boost::bind(bench_1, buffer.begin(), 64), iterations); run_bench(boost::bind(bench_2, buffer.begin(), 64), iterations); run_bench(boost::bind(bench_3, buffer.begin(), 64), iterations); run_bench(boost::bind(bench_4, buffer.begin(), 64), iterations); run_bench(boost::bind(bench_5, buffer.begin(), 64), iterations); run_bench(boost::bind(bench_6, buffer.begin(), 64), iterations); run_bench(boost::bind(bench_7, buffer.begin(), 64), iterations); run_bench(boost::bind(bench_8, buffer.begin(), 64), iterations); run_bench(boost::bind(bench_9, buffer.begin(), 64), iterations); run_bench(boost::bind(bench_10, buffer.begin(), 64), iterations); run_bench(boost::bind(bench_11, buffer.begin(), 64), iterations); run_bench(boost::bind(bench_12, buffer.begin(), 64), iterations); run_bench(boost::bind(bench_13, buffer.begin(), 64), iterations); run_bench(boost::bind(bench_14, buffer.begin(), 64), iterations); run_bench(boost::bind(bench_15, buffer.begin(), 64), iterations); run_bench(boost::bind(bench_16, buffer.begin(), 64), iterations); run_bench(boost::bind(bench_17, buffer.begin(), 64), iterations); run_bench(boost::bind(bench_18, buffer.begin(), 64), iterations); } SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/benchmarks/copy_benchmark.cpp0000644000175000017500000001277511532066166031746 0ustar dandan#include "benchmark_helpers.hpp" #include "../simd_memory.hpp" #ifdef __SSE2__ #include #include #endif const int unroll = 8; using namespace nova; void __noinline__ bench_1(float * out, float * in, unsigned int numSamples) { copyvec(out, in, numSamples); } #ifdef __SSE2__ void __noinline__ bench_2(float * out, float * in, unsigned int numSamples) { int loops = numSamples / unroll; do { __m128 data = _mm_load_ps(in); _mm_store_ps(out, data); __m128 data2 = _mm_load_ps(in+4); _mm_store_ps(out+4, data2); in += 8; out += 8; } while (--loops); } void __noinline__ bench_3(float * out, float * in, unsigned int numSamples) { int loops = numSamples / unroll; do { __m128 data = _mm_load_ps(in); __m128 data2 = _mm_load_ps(in+4); _mm_store_ps(out, data); _mm_store_ps(out+4, data2); in += 8; out += 8; } while (--loops); } void __noinline__ bench_4(float * out, float * in, unsigned int numSamples) { int loops = numSamples / unroll; do { __m128d data = _mm_load_pd((double*)in); _mm_store_pd((double*)out, data); __m128d data2 = _mm_load_pd((double*)in+4); _mm_store_pd((double*)out+4, data2); in += 8; out += 8; } while (--loops); } void __noinline__ bench_5(float * out, float * in, unsigned int numSamples) { int loops = numSamples / unroll; do { __m128i data = _mm_load_si128((__m128i*)in); _mm_store_si128((__m128i*)out, data); __m128i data2 = _mm_load_si128((__m128i*)in+4); _mm_store_si128((__m128i*)out+4, data2); in += 8; out += 8; } while (--loops); } /* * sse implementation of partially aligned copy operations * this seems to be more efficient than memcpy on x86, but not on x86_64 * */ #if defined(__GNUC__) && defined(NDEBUG) #define always_inline inline __attribute__((always_inline)) #else #define always_inline inline #endif const int samples_per_loop = 8; template always_inline void copyvec_naa_simd_mp(float *dest, const float *src) { __m128 data = _mm_loadu_ps(src); _mm_store_ps(dest, data); copyvec_naa_simd_mp(dest+4, src+4); } template <> always_inline void copyvec_naa_simd_mp<0>(float *dest, const float *src) {} template always_inline void copyvec_ana_simd_mp(float *dest, const float *src) { __m128 data = _mm_load_ps(src); _mm_storeu_ps(dest, data); copyvec_ana_simd_mp(dest+4, src+4); } template <> always_inline void copyvec_ana_simd_mp<0>(float *dest, const float *src) {} template always_inline void copyvec_nana_simd_mp(float *dest, const float *src) { __m128 data = _mm_loadu_ps(src); _mm_storeu_ps(dest, data); copyvec_nana_simd_mp(dest+4, src+4); } template <> always_inline void copyvec_nana_simd_mp<0>(float *dest, const float *src) {} inline void copyvec_naa_simd(float * dest, const float * src, uint n) { n = n / samples_per_loop; do { copyvec_naa_simd_mp(dest, src); dest += samples_per_loop; src += samples_per_loop; } while(--n); } inline void copyvec_ana_simd(float * dest, const float * src, uint n) { n = n / samples_per_loop; do { copyvec_ana_simd_mp(dest, src); dest += samples_per_loop; src += samples_per_loop; } while(--n); } inline void copyvec_nana_simd(float * dest, const float * src, uint n) { n = n / samples_per_loop; do { copyvec_nana_simd_mp(dest, src); dest += samples_per_loop; src += samples_per_loop; } while(--n); } void __noinline__ bench_6(float * out, float * in, unsigned int numSamples) { copyvec_nana_simd(out, in, numSamples); } void __noinline__ bench_7(float * out, float * in, unsigned int numSamples) { copyvec_ana_simd(out, in, numSamples); } void __noinline__ bench_8(float * out, float * in, unsigned int numSamples) { copyvec_naa_simd(out, in, numSamples); } #endif int main(void) { using namespace std; const int iterations = 50000000; nova::aligned_array __attribute__((aligned(64))) in; nova::aligned_array __attribute__((aligned(64))) out; fill_container(in); fill_container(out); cout << "memcpy" << endl; run_bench(boost::bind(bench_1, out.begin(), in.begin(), 64), iterations); run_bench(boost::bind(bench_1, out.begin()+2, in.begin(), 64), iterations); run_bench(boost::bind(bench_1, out.begin(), in.begin()+2, 64), iterations); run_bench(boost::bind(bench_1, out.begin()+2, in.begin()+2, 64), iterations); cout << endl; #ifdef __SSE2__ cout << "float/double/int (sse/sse2 instructions)" << endl; run_bench(boost::bind(bench_2, out.begin(), in.begin(), 64), iterations); run_bench(boost::bind(bench_3, out.begin(), in.begin(), 64), iterations); run_bench(boost::bind(bench_4, out.begin(), in.begin(), 64), iterations); run_bench(boost::bind(bench_5, out.begin(), in.begin(), 64), iterations); cout << endl; cout << "nonaligned" << endl; run_bench(boost::bind(bench_6, out.begin(), in.begin(), 64), iterations); run_bench(boost::bind(bench_6, out.begin()+2, in.begin()+2, 64), iterations); cout << endl; cout << "partially aligned" << endl; run_bench(boost::bind(bench_7, out.begin()+2, in.begin(), 64), iterations); run_bench(boost::bind(bench_8, out.begin(), in.begin()+2, 64), iterations); cout << endl; #endif } ././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/benchmarks/simd_plus_benchmarks.cppSuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/benchmarks/simd_plus_benchmarks0000644000175000017500000001330311512512273032352 0ustar dandan#include "benchmark_helpers.hpp" #include "../simd_binary_arithmetic.hpp" #include using namespace nova; using namespace std; namespace { aligned_array out, in, in2; typedef float afloat __attribute__ ((__aligned__(16))); afloat * __restrict__ o = out.begin(); afloat * __restrict__ i1 = in.begin(); afloat * __restrict__ i2 = in2.begin(); void __noinline__ bench_1(unsigned int n) { plus_vec_simd(o, i1, i2, n); } void __noinline__ bench_2(unsigned int n) { plus_vec_simd<64>(out.begin(), in.begin(), in2.begin()); } // void __noinline__ bench_2a(unsigned int n) // { // n /= 8; // float * i = in.begin(); // float * i2 = in2.begin(); // float * o = out.begin(); // do // { // plus_vec_simd<8>(o, i, i2); // i += 8; // i2 += 8; // o += 8; // } // while (--n); // } void __noinline__ bench_2b(unsigned int n) { n /= 16; float * i = in.begin(); float * i2 = in2.begin(); float * o = out.begin(); do { plus_vec_simd<16>(o, i, i2); i += 16; i2 += 16; o += 16; } while (--n); } void __noinline__ bench_2c(unsigned int n) { plus_vec_simd<64>(out.begin(), in.begin(), 1.f); } void __noinline__ bench_2d(unsigned int n) { n /= 32; float * i = in.begin(); float * o = out.begin(); do { plus_vec_simd<32>(o, i, 1.f); i += 32; o += 32; } while (--n); } void __noinline__ bench_2e(unsigned int n) { n /= 16; float * i = in.begin(); float * o = out.begin(); do { plus_vec_simd<16>(o, i, 1.f); i += 16; o += 16; } while (--n); } void __noinline__ bench_3(unsigned int n) { for (int i = 0; i != n; ++i) o[i] = i1[i] + i2[i]; } void __noinline__ bench_3a(unsigned int n) { for (std::size_t i = 0; i != n; ++i) out[i] = in[i] + in2[i]; } void __noinline__ bench_4(unsigned int n) { for (int i = 0; i != n; i+=4) { o[i] = i1[i] + i2[i]; o[i+1] = i1[i+1] + i2[i+1]; o[i+2] = i1[i+2] + i2[i+2]; o[i+3] = i1[i+3] + i2[i+3]; } } void __noinline__ bench_4a(unsigned int n) { for (std::size_t i = 0; i != n; i+=4) { out[i] = in[i] + in2[i]; out[i+1] = in[i+1] + in2[i+1]; out[i+2] = in[i+2] + in2[i+2]; out[i+3] = in[i+3] + in2[i+3]; } } void __noinline__ bench_5(unsigned int n) { for (int i = 0; i != n; i+=8) { o[i] = i1[i] + i2[i]; o[i+1] = i1[i+1] + i2[i+1]; o[i+2] = i1[i+2] + i2[i+2]; o[i+3] = i1[i+3] + i2[i+3]; o[i+4] = i1[i+4] + i2[i+4]; o[i+5] = i1[i+5] + i2[i+5]; o[i+6] = i1[i+6] + i2[i+6]; o[i+7] = i1[i+7] + i2[i+7]; } } void __noinline__ bench_5a(float * out, const float * in, const float * in2, unsigned int n) { for (std::size_t i = 0; i != n; i+=8) { out[i] = in[i] + in2[i]; out[i+1] = in[i+1] + in2[i+1]; out[i+2] = in[i+2] + in2[i+2]; out[i+3] = in[i+3] + in2[i+3]; out[i+4] = in[i+4] + in2[i+4]; out[i+5] = in[i+5] + in2[i+5]; out[i+6] = in[i+6] + in2[i+6]; out[i+7] = in[i+7] + in2[i+7]; } } void __noinline__ bench_5b(float * out, const float * in, const float * in2, unsigned int n) { for (std::size_t i = 0; i != n; i+=4) { float i01 = in[i]; float i02 = in2[i]; float i11 = in[i+1]; float i12 = in2[i+1]; float i21 = in[i+2]; float i22 = in2[i+2]; float i31 = in[i+3]; float i32 = in2[i+3]; /* float i41 = in[i+4]; */ /* float i42 = in2[i+4]; */ /* float i51 = in[i+5]; */ /* float i52 = in2[i+5]; */ /* float i61 = in[i+6]; */ /* float i62 = in2[i+6]; */ /* float i71 = in[i+7]; */ /* float i72 = in2[i+7]; */ out[i] = i01 + i02; out[i+1] = i11 + i12; out[i+2] = i21 + i22; out[i+3] = i31 + i32; /* out[i+4] = i41 + i42; */ /* out[i+5] = i51 + i52; */ /* out[i+6] = i61 + i62; */ /* out[i+7] = i71 + i72; */ } } void __noinline__ bench_5c(float * __restrict__ out, const float * __restrict__ in, const float * __restrict__ in2, unsigned int n) { for (std::size_t i = 0; i != n; i+=8) { out[i] = in[i] + in2[i]; out[i+1] = in[i+1] + in2[i+1]; out[i+2] = in[i+2] + in2[i+2]; out[i+3] = in[i+3] + in2[i+3]; out[i+4] = in[i+4] + in2[i+4]; out[i+5] = in[i+5] + in2[i+5]; out[i+6] = in[i+6] + in2[i+6]; out[i+7] = in[i+7] + in2[i+7]; } } } int main(void) { out.assign(0.f); in.assign(0.2f); in2.assign(0.3f); const unsigned int iterations = 100000000; run_bench(boost::bind(bench_1, 64), iterations); run_bench(boost::bind(bench_2, 64), iterations); /* run_bench(boost::bind(bench_2a, 64), iterations);*/ run_bench(boost::bind(bench_2b, 64), iterations); run_bench(boost::bind(bench_2c, 64), iterations); run_bench(boost::bind(bench_2d, 64), iterations); run_bench(boost::bind(bench_2e, 64), iterations); /* run_bench(boost::bind(bench_3, 64), iterations); */ /* run_bench(boost::bind(bench_3a, 64), iterations); */ /* run_bench(boost::bind(bench_4, 64), iterations); */ /* run_bench(boost::bind(bench_4a, 64), iterations); */ /* run_bench(boost::bind(bench_5, 64), iterations); */ /* run_bench(boost::bind(bench_5a, out.begin(), in.begin(), in2.begin(), 64), iterations); */ /* run_bench(boost::bind(bench_5b, out.begin(), in.begin(), in2.begin(), 64), iterations); */ /* run_bench(boost::bind(bench_5c, out.begin(), in.begin(), in2.begin(), 64), iterations); */ } SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/benchmarks/round_benchmark.cpp0000644000175000017500000000115511512512273032102 0ustar dandan#include "benchmark_helpers.hpp" #include "../simd_unary_arithmetic.hpp" nova::aligned_array in; nova::aligned_array out; void __noinline__ bench_1(unsigned int numSamples) { nova::round_vec(out.data(), in.data(), numSamples); } void __noinline__ bench_2(unsigned int numSamples) { nova::round_vec_simd(out.data(), in.data(), numSamples); } int main(void) { /* touch buffers */ out.assign(0); fill_container(in); const unsigned int iterations = 50000000; run_bench(boost::bind(bench_1, 64), iterations); run_bench(boost::bind(bench_2, 64), iterations); } ././@LongLink0000000000000000000000000000015500000000000011566 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/benchmarks/simd_softclip_benchmarks.cppSuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/benchmarks/simd_softclip_benchm0000644000175000017500000000306411512512273032334 0ustar dandan#include "benchmark_helpers.hpp" #include "cache_aligned_array.hpp" #include "../softclip.hpp" using namespace nova; using namespace std; aligned_array out, args_best_case, args_worst_case, args_avg_case; void __noinline__ bench_simd_best(unsigned int n) { softclip_vec_simd(out.begin(), args_best_case.begin(), n); } void __noinline__ bench_best(unsigned int n) { softclip_vec(out.begin(), args_best_case.begin(), n); } void __noinline__ bench_simd_worst(unsigned int n) { softclip_vec_simd(out.begin(), args_worst_case.begin(), n); } void __noinline__ bench_worst(unsigned int n) { softclip_vec(out.begin(), args_worst_case.begin(), n); } void __noinline__ bench_simd_avg(unsigned int n) { softclip_vec_simd(out.begin(), args_avg_case.begin(), n); } void __noinline__ bench_avg(unsigned int n) { softclip_vec(out.begin(), args_avg_case.begin(), n); } int main(void) { out.assign(0.f); const unsigned int iterations = 10000000; for (int i = 0; i != 64; ++i) { args_best_case[i] = float(i) / 128.0; args_worst_case[i] = float(i) / 64.0 + 0.5; args_avg_case[i] = float(i) / 64.0; } cout << "simd:" << endl; run_bench(boost::bind(bench_simd_best, 64), iterations); run_bench(boost::bind(bench_simd_avg, 64), iterations); run_bench(boost::bind(bench_simd_worst, 64), iterations); cout << "\nnormal:" << endl; run_bench(boost::bind(bench_best, 64), iterations); run_bench(boost::bind(bench_avg, 64), iterations); run_bench(boost::bind(bench_worst, 64), iterations); } SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/benchmarks/CMakeLists.txt0000664000175000017500000000126111750340243030775 0ustar dandanset(benchmarks abs_benchmarks.cpp clear_benchmark.cpp clip_benchmarks.cpp copy_benchmark.cpp inplace_benchmark.cpp round_benchmark.cpp simd_ampmod_benchmarks.cpp simd_mix_benchmark.cpp simd_pan2_benchmark.cpp simd_peakmeter_benchmarks.cpp simd_plus_benchmarks.cpp simd_pow_benchmarks.cpp simd_slope_benchmarks.cpp simd_softclip_benchmarks.cpp simd_tan_benchmarks.cpp simd_tanh_benchmarks.cpp simd_unroll_benchmarks2.cpp simd_unroll_benchmarks.cpp ) # build benchmarks foreach(benchmark ${benchmarks}) string(REPLACE .cpp "" benchmark_name ${benchmark} ) add_executable(${benchmark_name} ${benchmark} ${headers}) endforeach(benchmark) ././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/benchmarks/simd_slope_benchmarks.cppSuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/benchmarks/simd_slope_benchmark0000644000175000017500000001024211532066166032334 0ustar dandan#include "benchmark_helpers.hpp" #include #ifdef __SSE__ #include #endif using namespace std; nova::aligned_array out, in, in2; typedef float afloat __attribute__ ((__aligned__(16))); void __noinline__ bench_1(float * out, float * in1, float in2, float slope, unsigned int n) { for (unsigned int i = 0; i != n; ++i) { out[i] = in1[i] + in2; in2 += slope; } } void __noinline__ bench_2(float * out, float * in1, float in2, float slope, unsigned int n) { for (unsigned int i = 0; i != n; i += 4) { out[i] = in1[i] + in2; in2 += slope; out[i+1] = in1[i+1] + in2; in2 += slope; out[i+2] = in1[i+2] + in2; in2 += slope; out[i+3] = in1[i+3] + in2; in2 += slope; } } #ifdef __SSE__ void __noinline__ bench_3(float * out, float * in1, float in2, float slope, unsigned int n) { __m128 arg2 = _mm_set_ps(in2, in2+slope, in2+slope+slope, in2+slope+slope+slope); const __m128 vslope = _mm_set_ps1(slope+slope+slope+slope); std::size_t loops = n / 4; do { __m128 arg1 = _mm_load_ps(in1); __m128 result = _mm_add_ps(arg1, arg2); arg2 = _mm_add_ps(arg2, vslope); _mm_store_ps(out, result); in1+=4; out+=4; } while (--loops); } void __noinline__ bench_3a(float * out, float * in1, float in2, float slope, unsigned int n) { __m128 arg2 = _mm_set_ps(in2, in2+slope, in2+ 2*slope, in2+3*slope); const __m128 vslope = _mm_set_ps1(4 * slope); std::size_t loops = n / 4; do { __m128 arg1 = _mm_load_ps(in1); __m128 result = _mm_add_ps(arg1, arg2); arg2 = _mm_add_ps(arg2, vslope); _mm_store_ps(out, result); in1+=4; out+=4; } while (--loops); } #endif void __noinline__ bench_4(float * out, float * in1, float in2, float slope, unsigned int n) { for (unsigned int i = 0; i != n; ++i) { out[i] = in1[i] * in2; in2 += slope; } } void __noinline__ bench_5(float * out, float * in1, float in2, float slope, unsigned int n) { for (unsigned int i = 0; i != n; i += 4) { out[i] = in1[i] * in2; in2 += slope; out[i+1] = in1[i+1] * in2; in2 += slope; out[i+2] = in1[i+2] * in2; in2 += slope; out[i+3] = in1[i+3] * in2; in2 += slope; } } #ifdef __SSE__ void __noinline__ bench_6(float * out, float * in1, float in2, float slope, unsigned int n) { __m128 arg2 = _mm_set_ps(in2, in2+slope, in2+slope+slope, in2+slope+slope+slope); const __m128 vslope = _mm_set_ps1(slope+slope+slope+slope); std::size_t loops = n / 4; do { __m128 arg1 = _mm_load_ps(in1); __m128 result = _mm_mul_ps(arg1, arg2); arg2 = _mm_add_ps(arg2, vslope); _mm_store_ps(out, result); in1+=4; out+=4; } while (--loops); } void __noinline__ bench_6a(float * out, float * in1, float in2, float slope, unsigned int n) { __m128 arg2 = _mm_set_ps(in2, in2+slope, in2+2*slope, in2+3*slope); const __m128 vslope = _mm_set_ps1(4*slope); std::size_t loops = n / 4; do { __m128 arg1 = _mm_load_ps(in1); __m128 result = _mm_mul_ps(arg1, arg2); arg2 = _mm_add_ps(arg2, vslope); _mm_store_ps(out, result); in1+=4; out+=4; } while (--loops); } #endif int main(void) { out.assign(0.f); in.assign(0.2f); in2.assign(0.3f); const unsigned int iterations = 50000000; run_bench(boost::bind(bench_1, out.begin(), in.begin(), 0.1f, 0.001f, 64), iterations); run_bench(boost::bind(bench_2, out.begin(), in.begin(), 0.1f, 0.001f, 64), iterations); #ifdef __SSE__ run_bench(boost::bind(bench_3, out.begin(), in.begin(), 0.1f, 0.001f, 64), iterations); run_bench(boost::bind(bench_3a, out.begin(), in.begin(), 0.1f, 0.001f, 64), iterations); #endif run_bench(boost::bind(bench_4, out.begin(), in.begin(), 0.1f, 0.001f, 64), iterations); run_bench(boost::bind(bench_5, out.begin(), in.begin(), 0.1f, 0.001f, 64), iterations); #ifdef __SSE__ run_bench(boost::bind(bench_6, out.begin(), in.begin(), 0.1f, 0.001f, 64), iterations); run_bench(boost::bind(bench_6a, out.begin(), in.begin(), 0.1f, 0.001f, 64), iterations); #endif } SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/benchmarks/abs_benchmarks.cpp0000644000175000017500000000317211512512273031704 0ustar dandan#include "benchmark_helpers.hpp" #include "../simd_unary_arithmetic.hpp" #define sc_abs(a) ((a)>=0?(a) : -(a)) nova::aligned_array in; nova::aligned_array out; void __noinline__ bench_1(unsigned int numSamples) { for (unsigned int i = 0; i != numSamples; ++i) out[i] = sc_abs(in[i]); } void __noinline__ bench_2(unsigned int numSamples) { for (unsigned int i = 0; i != numSamples; ++i) out[i] = std::fabs(in[i]); } void __noinline__ bench_3(unsigned int numSamples) { typedef float afloat __attribute__ ((__aligned__(16))); float * __restrict__ o = out.data(); float * __restrict__ i = in.data(); for (unsigned int n = 0; n != numSamples; n += 8) { o[n] = std::fabs(i[n]); o[n+1] = std::fabs(i[n+1]); o[n+2] = std::fabs(i[n+2]); o[n+3] = std::fabs(i[n+3]); o[n+4] = std::fabs(i[n+4]); o[n+5] = std::fabs(i[n+5]); o[n+6] = std::fabs(i[n+6]); o[n+7] = std::fabs(i[n+7]); } } using namespace nova; void __noinline__ bench_4(unsigned int numSamples) { abs_vec_simd<64>(out.begin(), in.begin()); } void __noinline__ bench_5(unsigned int numSamples) { abs_vec_simd(out.begin(), in.begin(), numSamples); } int main(void) { /* touch buffers */ out.assign(0); fill_container(in); const unsigned int iterations = 50000000; run_bench(boost::bind(bench_1, 64), iterations); run_bench(boost::bind(bench_2, 64), iterations); run_bench(boost::bind(bench_3, 64), iterations); run_bench(boost::bind(bench_4, 64), iterations); run_bench(boost::bind(bench_5, 64), iterations); } ././@LongLink0000000000000000000000000000015600000000000011567 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/benchmarks/simd_peakmeter_benchmarks.cppSuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/benchmarks/simd_peakmeter_bench0000644000175000017500000000562511512512273032316 0ustar dandan#include #include "benchmark_helpers.hpp" #include "../simd_peakmeter.hpp" #define LOOP(length, stmt) for (int xxi=0; xxi<(length); ++xxi) { stmt; } #define ZXP(z) (*++(z)) #define ZOFF (1) void __noinline__ bench_1(float * out, float * in, unsigned int numSamples) { float level = 0; using namespace std; for (int i = 0; i != numSamples; i += 8, out += 8, in += 8) { float level0 = max(abs(in[0]), level); float level1 = max(abs(in[1]), level0); float level2 = max(abs(in[2]), level1); float level3 = max(abs(in[3]), level2); float level4 = max(abs(in[4]), level3); float level5 = max(abs(in[5]), level4); float level6 = max(abs(in[6]), level5); float level7 = max(abs(in[7]), level6); out[0] = level0; out[1] = level1; out[2] = level2; out[3] = level3; out[4] = level4; out[5] = level5; out[6] = level6; out[7] = level7; level = level7; } } void __noinline__ bench_2(float * out, float * in, unsigned int numSamples) { float inlevel; float level = 0; LOOP(numSamples/8, inlevel = std::abs(ZXP(in)); level = std::max(inlevel, level); ZXP(out) = level; inlevel = std::abs(ZXP(in)); level = std::max(inlevel, level); ZXP(out) = level; inlevel = std::abs(ZXP(in)); level = std::max(inlevel, level); ZXP(out) = level; inlevel = std::abs(ZXP(in)); level = std::max(inlevel, level); ZXP(out) = level; inlevel = std::abs(ZXP(in)); level = std::max(inlevel, level); ZXP(out) = level; inlevel = std::abs(ZXP(in)); level = std::max(inlevel, level); ZXP(out) = level; inlevel = std::abs(ZXP(in)); level = std::max(inlevel, level); ZXP(out) = level; inlevel = std::abs(ZXP(in)); level = std::max(inlevel, level); ZXP(out) = level; inlevel = std::abs(ZXP(in)); level = std::max(inlevel, level); ZXP(out) = level; ); } void __noinline__ bench_3(float * in, unsigned int numSamples) { float level = 0; float inlevel = nova::peak_vec(in, &level, numSamples); } void __noinline__ bench_4(float * in, unsigned int numSamples) { float level = 0; float inlevel = nova::peak_vec_simd(in, &level, numSamples); } int main(void) { const int iterations = 50000000; nova::aligned_array in_buffer; nova::aligned_array out_buffer; fill_container(in_buffer); fill_container(out_buffer); run_bench(boost::bind(bench_1, out_buffer.begin(), in_buffer.begin(), 64), iterations); run_bench(boost::bind(bench_2, out_buffer.begin(), in_buffer.begin(), 64), iterations); run_bench(boost::bind(bench_3, in_buffer.begin(), 64), iterations); run_bench(boost::bind(bench_4, in_buffer.begin(), 64), iterations); } SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/benchmarks/perf_counter.hpp0000664000175000017500000005055612011303105031437 0ustar dandan// Copyright (C) 2008 Tim Blechmann // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; see the file COPYING. If not, write to // the Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. #ifndef PERF_COUNTER_HPP #define PERF_COUNTER_HPP #include #include #include #include #include #include #include #include #include #include #ifdef PERF_COUNTER_H #include #include #else /* taken from perf_counter.h, kernel 2.6.31 * Copyright (C) 2008-2009, Thomas Gleixner * Copyright (C) 2008-2009, Red Hat, Inc., Ingo Molnar * Copyright (C) 2008-2009, Red Hat, Inc., Peter Zijlstra */ #include #include #include #if defined(__ia64__) || defined(__alpha__) #include #endif /* * User-space ABI bits: */ /* * attr.type */ enum perf_type_id { PERF_TYPE_HARDWARE = 0, PERF_TYPE_SOFTWARE = 1, PERF_TYPE_TRACEPOINT = 2, PERF_TYPE_HW_CACHE = 3, PERF_TYPE_RAW = 4, PERF_TYPE_MAX, /* non-ABI */ }; /* * Generalized performance counter event types, used by the * attr.event_id parameter of the sys_perf_counter_open() * syscall: */ enum perf_hw_id { /* * Common hardware events, generalized by the kernel: */ PERF_COUNT_HW_CPU_CYCLES = 0, PERF_COUNT_HW_INSTRUCTIONS = 1, PERF_COUNT_HW_CACHE_REFERENCES = 2, PERF_COUNT_HW_CACHE_MISSES = 3, PERF_COUNT_HW_BRANCH_INSTRUCTIONS = 4, PERF_COUNT_HW_BRANCH_MISSES = 5, PERF_COUNT_HW_BUS_CYCLES = 6, PERF_COUNT_HW_MAX, /* non-ABI */ }; /* * Generalized hardware cache counters: * * { L1-D, L1-I, LLC, ITLB, DTLB, BPU } x * { read, write, prefetch } x * { accesses, misses } */ enum perf_hw_cache_id { PERF_COUNT_HW_CACHE_L1D = 0, PERF_COUNT_HW_CACHE_L1I = 1, PERF_COUNT_HW_CACHE_LL = 2, PERF_COUNT_HW_CACHE_DTLB = 3, PERF_COUNT_HW_CACHE_ITLB = 4, PERF_COUNT_HW_CACHE_BPU = 5, PERF_COUNT_HW_CACHE_MAX, /* non-ABI */ }; enum perf_hw_cache_op_id { PERF_COUNT_HW_CACHE_OP_READ = 0, PERF_COUNT_HW_CACHE_OP_WRITE = 1, PERF_COUNT_HW_CACHE_OP_PREFETCH = 2, PERF_COUNT_HW_CACHE_OP_MAX, /* non-ABI */ }; enum perf_hw_cache_op_result_id { PERF_COUNT_HW_CACHE_RESULT_ACCESS = 0, PERF_COUNT_HW_CACHE_RESULT_MISS = 1, PERF_COUNT_HW_CACHE_RESULT_MAX, /* non-ABI */ }; /* * Special "software" counters provided by the kernel, even if the hardware * does not support performance counters. These counters measure various * physical and sw events of the kernel (and allow the profiling of them as * well): */ enum perf_sw_ids { PERF_COUNT_SW_CPU_CLOCK = 0, PERF_COUNT_SW_TASK_CLOCK = 1, PERF_COUNT_SW_PAGE_FAULTS = 2, PERF_COUNT_SW_CONTEXT_SWITCHES = 3, PERF_COUNT_SW_CPU_MIGRATIONS = 4, PERF_COUNT_SW_PAGE_FAULTS_MIN = 5, PERF_COUNT_SW_PAGE_FAULTS_MAJ = 6, PERF_COUNT_SW_MAX, /* non-ABI */ }; /* * Bits that can be set in attr.sample_type to request information * in the overflow packets. */ enum perf_counter_sample_format { PERF_SAMPLE_IP = 1U << 0, PERF_SAMPLE_TID = 1U << 1, PERF_SAMPLE_TIME = 1U << 2, PERF_SAMPLE_ADDR = 1U << 3, PERF_SAMPLE_READ = 1U << 4, PERF_SAMPLE_CALLCHAIN = 1U << 5, PERF_SAMPLE_ID = 1U << 6, PERF_SAMPLE_CPU = 1U << 7, PERF_SAMPLE_PERIOD = 1U << 8, PERF_SAMPLE_STREAM_ID = 1U << 9, PERF_SAMPLE_RAW = 1U << 10, PERF_SAMPLE_MAX = 1U << 11, /* non-ABI */ }; /* * The format of the data returned by read() on a perf counter fd, * as specified by attr.read_format: * * struct read_format { * { u64 value; * { u64 time_enabled; } && PERF_FORMAT_ENABLED * { u64 time_running; } && PERF_FORMAT_RUNNING * { u64 id; } && PERF_FORMAT_ID * } && !PERF_FORMAT_GROUP * * { u64 nr; * { u64 time_enabled; } && PERF_FORMAT_ENABLED * { u64 time_running; } && PERF_FORMAT_RUNNING * { u64 value; * { u64 id; } && PERF_FORMAT_ID * } cntr[nr]; * } && PERF_FORMAT_GROUP * }; */ enum perf_counter_read_format { PERF_FORMAT_TOTAL_TIME_ENABLED = 1U << 0, PERF_FORMAT_TOTAL_TIME_RUNNING = 1U << 1, PERF_FORMAT_ID = 1U << 2, PERF_FORMAT_GROUP = 1U << 3, PERF_FORMAT_MAX = 1U << 4, /* non-ABI */ }; #define PERF_ATTR_SIZE_VER0 64 /* sizeof first published struct */ /* * Hardware event to monitor via a performance monitoring counter: */ struct perf_counter_attr { /* * Major type: hardware/software/tracepoint/etc. */ __u32 type; /* * Size of the attr structure, for fwd/bwd compat. */ __u32 size; /* * Type specific configuration information. */ __u64 config; union { __u64 sample_period; __u64 sample_freq; }; __u64 sample_type; __u64 read_format; __u64 disabled : 1, /* off by default */ inherit : 1, /* children inherit it */ pinned : 1, /* must always be on PMU */ exclusive : 1, /* only group on PMU */ exclude_user : 1, /* don't count user */ exclude_kernel : 1, /* ditto kernel */ exclude_hv : 1, /* ditto hypervisor */ exclude_idle : 1, /* don't count when idle */ mmap : 1, /* include mmap data */ comm : 1, /* include comm data */ freq : 1, /* use freq, not period */ inherit_stat : 1, /* per task counts */ enable_on_exec : 1, /* next exec enables */ task : 1, /* trace fork/exit */ __reserved_1 : 50; __u32 wakeup_events; /* wakeup every n events */ __u32 __reserved_2; __u64 __reserved_3; }; /* * Ioctls that can be done on a perf counter fd: */ #define PERF_COUNTER_IOC_ENABLE _IO ('$', 0) #define PERF_COUNTER_IOC_DISABLE _IO ('$', 1) #define PERF_COUNTER_IOC_REFRESH _IO ('$', 2) #define PERF_COUNTER_IOC_RESET _IO ('$', 3) #define PERF_COUNTER_IOC_PERIOD _IOW('$', 4, u64) enum perf_counter_ioc_flags { PERF_IOC_FLAG_GROUP = 1U << 0, }; /* * Structure of the page that can be mapped via mmap */ struct perf_counter_mmap_page { __u32 version; /* version number of this structure */ __u32 compat_version; /* lowest version this is compat with */ /* * Bits needed to read the hw counters in user-space. * * u32 seq; * s64 count; * * do { * seq = pc->lock; * * barrier() * if (pc->index) { * count = pmc_read(pc->index - 1); * count += pc->offset; * } else * goto regular_read; * * barrier(); * } while (pc->lock != seq); * * NOTE: for obvious reason this only works on self-monitoring * processes. */ __u32 lock; /* seqlock for synchronization */ __u32 index; /* hardware counter identifier */ __s64 offset; /* add to hardware counter value */ __u64 time_enabled; /* time counter active */ __u64 time_running; /* time counter on cpu */ /* * Hole for extension of the self monitor capabilities */ __u64 __reserved[123]; /* align to 1k */ /* * Control data for the mmap() data buffer. * * User-space reading the @data_head value should issue an rmb(), on * SMP capable platforms, after reading this value -- see * perf_counter_wakeup(). * * When the mapping is PROT_WRITE the @data_tail value should be * written by userspace to reflect the last read data. In this case * the kernel will not over-write unread data. */ __u64 data_head; /* head in the data section */ __u64 data_tail; /* user-space written tail */ }; #define PERF_EVENT_MISC_CPUMODE_MASK (3 << 0) #define PERF_EVENT_MISC_CPUMODE_UNKNOWN (0 << 0) #define PERF_EVENT_MISC_KERNEL (1 << 0) #define PERF_EVENT_MISC_USER (2 << 0) #define PERF_EVENT_MISC_HYPERVISOR (3 << 0) struct perf_event_header { __u32 type; __u16 misc; __u16 size; }; enum perf_event_type { /* * The MMAP events record the PROT_EXEC mappings so that we can * correlate userspace IPs to code. They have the following structure: * * struct { * struct perf_event_header header; * * u32 pid, tid; * u64 addr; * u64 len; * u64 pgoff; * char filename[]; * }; */ PERF_EVENT_MMAP = 1, /* * struct { * struct perf_event_header header; * u64 id; * u64 lost; * }; */ PERF_EVENT_LOST = 2, /* * struct { * struct perf_event_header header; * * u32 pid, tid; * char comm[]; * }; */ PERF_EVENT_COMM = 3, /* * struct { * struct perf_event_header header; * u32 pid, ppid; * u32 tid, ptid; * }; */ PERF_EVENT_EXIT = 4, /* * struct { * struct perf_event_header header; * u64 time; * u64 id; * u64 stream_id; * }; */ PERF_EVENT_THROTTLE = 5, PERF_EVENT_UNTHROTTLE = 6, /* * struct { * struct perf_event_header header; * u32 pid, ppid; * u32 tid, ptid; * }; */ PERF_EVENT_FORK = 7, /* * struct { * struct perf_event_header header; * u32 pid, tid; * * struct read_format values; * }; */ PERF_EVENT_READ = 8, /* * struct { * struct perf_event_header header; * * { u64 ip; } && PERF_SAMPLE_IP * { u32 pid, tid; } && PERF_SAMPLE_TID * { u64 time; } && PERF_SAMPLE_TIME * { u64 addr; } && PERF_SAMPLE_ADDR * { u64 id; } && PERF_SAMPLE_ID * { u64 stream_id;} && PERF_SAMPLE_STREAM_ID * { u32 cpu, res; } && PERF_SAMPLE_CPU * { u64 period; } && PERF_SAMPLE_PERIOD * * { struct read_format values; } && PERF_SAMPLE_READ * * { u64 nr, * u64 ips[nr]; } && PERF_SAMPLE_CALLCHAIN * * # * # The RAW record below is opaque data wrt the ABI * # * # That is, the ABI doesn't make any promises wrt to * # the stability of its content, it may vary depending * # on event, hardware, kernel version and phase of * # the moon. * # * # In other words, PERF_SAMPLE_RAW contents are not an ABI. * # * * { u32 size; * char data[size];}&& PERF_SAMPLE_RAW * }; */ PERF_EVENT_SAMPLE = 9, PERF_EVENT_MAX, /* non-ABI */ }; enum perf_callchain_context { PERF_CONTEXT_HV = (__u64)-32, PERF_CONTEXT_KERNEL = (__u64)-128, PERF_CONTEXT_USER = (__u64)-512, PERF_CONTEXT_GUEST = (__u64)-2048, PERF_CONTEXT_GUEST_KERNEL = (__u64)-2176, PERF_CONTEXT_GUEST_USER = (__u64)-2560, PERF_CONTEXT_MAX = (__u64)-4095, }; #endif /* perf_types.h: * We define u64 as unsigned long long for every architecture * so that we can print it with %Lx without getting warnings. */ typedef unsigned long long u64; typedef signed long long s64; typedef unsigned int u32; typedef signed int s32; typedef unsigned short u16; typedef signed short s16; typedef unsigned char u8; typedef signed char s8; /* parts from perf.h */ #if defined(__i386__) #include "asm/unistd.h" #define rmb() asm volatile("lock; addl $0,0(%%esp)" ::: "memory") #define cpu_relax() asm volatile("rep; nop" ::: "memory"); #endif #if defined(__x86_64__) #include "asm/unistd.h" #define rmb() asm volatile("lfence" ::: "memory") #define cpu_relax() asm volatile("rep; nop" ::: "memory"); #endif #ifdef __powerpc__ #include "asm/unistd.h" #define rmb() asm volatile ("sync" ::: "memory") #define cpu_relax() asm volatile ("" ::: "memory"); #endif #ifdef __s390__ #include "asm/unistd.h" #define rmb() asm volatile("bcr 15,0" ::: "memory") #define cpu_relax() asm volatile("" ::: "memory"); #endif #ifdef __sh__ #include "asm/unistd.h" #if defined(__SH4A__) || defined(__SH5__) # define rmb() asm volatile("synco" ::: "memory") #else # define rmb() asm volatile("" ::: "memory") #endif #define cpu_relax() asm volatile("" ::: "memory") #endif #ifdef __hppa__ #include "../../arch/parisc/include/asm/unistd.h" #define rmb() asm volatile("" ::: "memory") #define cpu_relax() asm volatile("" ::: "memory"); #endif #include #include #include #include #include "linux/types.h" /* * prctl(PR_TASK_PERF_COUNTERS_DISABLE) will (cheaply) disable all * counters in the current task. */ #define PR_TASK_PERF_COUNTERS_DISABLE 31 #define PR_TASK_PERF_COUNTERS_ENABLE 32 #ifndef NSEC_PER_SEC # define NSEC_PER_SEC 1000000000ULL #endif static inline unsigned long long rdclock(void) { struct timespec ts; clock_gettime(CLOCK_MONOTONIC, &ts); return ts.tv_sec * 1000000000ULL + ts.tv_nsec; } /* * Pick up some kernel type conventions: */ #define __user #define asmlinkage #define __used __attribute__((__unused__)) #define unlikely(x) __builtin_expect(!!(x), 0) #ifndef __NR_perf_event_open #define __NR_perf_event_open __NR_perf_counter_open #endif static inline int sys_perf_counter_open(struct perf_counter_attr *attr, pid_t pid, int cpu, int group_fd, unsigned long flags) { attr->size = sizeof(*attr); return syscall(__NR_perf_event_open, attr, pid, cpu, group_fd, flags); } #define MAX_COUNTERS 256 #define MAX_NR_CPUS 256 struct ip_callchain { u64 nr; u64 ips[0]; }; /* our class */ class perf_counter { boost::array fd; static int open_performance_counter(int type) { perf_counter_attr attr; memset(&attr, 0, sizeof(perf_counter_attr)); attr.type = PERF_TYPE_HARDWARE; attr.config = type; int ret = sys_perf_counter_open(&attr, 0, -1, -1, 0); if (ret < 0) throw std::exception(); return ret; } public: perf_counter(void) { for (int i = 0; i != 7; ++i) fd[i] = open_performance_counter(i); } ~perf_counter(void) { for (int i = 0; i != 7; ++i) close(fd[i]); } void reset(void) {} void start(void) { prctl(PR_TASK_PERF_COUNTERS_ENABLE); } void stop(void) { prctl(PR_TASK_PERF_COUNTERS_DISABLE); } void dump(bool verbose = true) { static const char *hw_event_names [] = { "cycles", "instructions", "cache references", "cache misses", "branches", "branch misses", "bus cycles", }; boost::array count; using namespace std; for (int i = 0; i != 7; ++i) { u64 cnt; ssize_t res = read(fd[i], (char*)&cnt, sizeof(cnt)); if (res != sizeof(cnt)) throw std::runtime_error("read error"); count[i] = cnt; } if (verbose) { for (int i = 0; i != 7; ++i) cout << hw_event_names[i] << ": " << count[i] << endl; cout << endl; } else { cout << setw(12) << setfill(' ') << count[0] << " " << setw(12) << setfill(' ') << count[1] << " " << setw(7) << setfill(' ') << count[2] << " " << setw(5) << setfill(' ') << count[3] << " " << setw(10) << setfill(' ') << count[4] << " " << setw(8) << setfill(' ') << count[5] << " " << setw(12) << setfill(' ') << count[6] << " " /* << setw(8) << setfill(' ') << soft_count[0] << " " */ /* << setw(8) << setfill(' ') << soft_count[1] */ << endl; } } }; #undef unlikely #endif /* PERF_COUNTER_HPP */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/simd_ternary_arithmetic.hpp0000664000175000017500000000434711747572246031572 0ustar dandan// templated arithmetic simd functions // Copyright (C) 2009 Tim Blechmann // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; see the file COPYING. If not, write to // the Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. // // implemented as part of nova #ifndef SIMD_TERNARY_ARITHMETIC_HPP #define SIMD_TERNARY_ARITHMETIC_HPP #include #include "vec.hpp" #include "detail/define_macros.hpp" #if defined(__GNUC__) && defined(NDEBUG) #define always_inline inline __attribute__((always_inline)) #else #define always_inline inline #endif namespace nova { namespace detail { struct clip { template float_type operator()(float_type value, float_type low, float_type high) const { return max_(min_(value, high), low); } }; struct muladd { template float_type operator()(float_type value, float_type mul, float_type add) const { return value * mul + add; } template vec operator()(vec value, vec mul, vec add) const { return madd(value, mul, add); } }; struct ampmod { template float_type operator()(float_type signal, float_type modulator, float_type amount) const { float_type one = 1.f; return signal * (one + modulator * amount); } }; } NOVA_SIMD_DEFINE_TERNARY_WRAPPER(clip, detail::clip) NOVA_SIMD_DEFINE_TERNARY_WRAPPER(muladd, detail::muladd) NOVA_SIMD_DEFINE_TERNARY_WRAPPER(ampmod, detail::ampmod) } #undef always_inline #endif /* SIMD_TERNARY_ARITHMETIC_HPP */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/simd_horizontal_functions.hpp0000644000175000017500000001202011643070235032121 0ustar dandan// horizontal simd functions // Copyright (C) 2011 Tim Blechmann // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; see the file COPYING. If not, write to // the Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. #ifndef SIMD_HORIZONTAL_FUNCTIONS_HPP #define SIMD_HORIZONTAL_FUNCTIONS_HPP #include "vec.hpp" #include /* for max */ #if defined(__GNUC__) && defined(NDEBUG) #define always_inline inline __attribute__((always_inline)) #else #define always_inline inline #endif namespace nova { /* horizontal max */ template inline F horizontal_max_vec(const F * in, unsigned int n) { F current = std::numeric_limits::min(); using namespace std; do { current = max(current, *in++); } while(--n); return current; } template inline F horizontal_max_vec_simd(const F * in, unsigned int n) { F init = std::numeric_limits::min(); vec current(init); /* loop */ const size_t vec_size = vec::size; n /= vec_size; do { vec val; val.load_aligned(in); current = max_(current, val); in += vec_size; } while(--n); return current.horizontal_max(); } /* horizontal min */ template inline F horizontal_min_vec(const F * in, unsigned int n) { F current = std::numeric_limits::min(); using namespace std; do { current = min(current, *in++); } while(--n); return current; } template inline F horizontal_min_vec_simd(const F * in, unsigned int n) { F init = std::numeric_limits::min(); vec current(init); /* loop */ const size_t vec_size = vec::size; n /= vec_size; do { vec val; val.load_aligned(in); current = min_(current, val); in += vec_size; } while(--n); return current.horizontal_min(); } /* horizontal sum */ template inline F horizontal_sum_vec(const F * in, unsigned int n) { F current = 0; using namespace std; do { current = current + *in++; } while(--n); return current; } template inline F horizontal_sum_vec_simd(const F * in, unsigned int n) { vec current(F(0)); /* loop */ const size_t vec_size = vec::size; n /= vec_size; do { vec val; val.load_aligned(in); current = current + val; in += vec_size; } while(--n); return current.horizontal_sum(); } /* horizontal min/max */ template inline void horizontal_minmax_vec(F & rmin, F & rmax, const F * in, unsigned int n) { F current_max = std::numeric_limits::min(); F current_min = std::numeric_limits::max(); using namespace std; do { current_max = max(current_max, *in); current_min = min(current_min, *in++); } while(--n); rmax = current_max; rmin = current_min; } template inline void horizontal_minmax_vec_simd(F & rmin, F & rmax, const F * in, unsigned int n) { vec current_max(std::numeric_limits::min()); vec current_min(std::numeric_limits::max()); /* loop */ const size_t vec_size = vec::size; n /= vec_size; do { vec val; val.load_aligned(in); current_max = max_(current_max, val); current_min = min_(current_min, val); in += vec_size; } while(--n); rmin = current_min.horizontal_min(); rmax = current_max.horizontal_max(); } /* horizontal max/sum */ template inline void horizontal_maxsum_vec(F & rmax, F & rsum, const F * in, unsigned int n) { F current_max = std::numeric_limits::min(); F current_sum = 0; using namespace std; do { current_max = max(current_max, *in); current_sum = current_sum + *in++; } while(--n); rmax = current_max; rsum = current_sum; } template inline void horizontal_maxsum_vec_simd(F & rmax, F & rsum, const F * in, unsigned int n) { vec current_max(std::numeric_limits::min()); vec current_sum(F(0)); /* loop */ const size_t vec_size = vec::size; n /= vec_size; do { vec val; val.load_aligned(in); current_max = max_(current_max, val); current_sum = current_sum + val; in += vec_size; } while(--n); rsum = current_sum.horizontal_sum(); rmax = current_max.horizontal_max(); } } /* namespace nova */ #undef always_inline #endif /* SIMD_PEAKMETER_HPP */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/simd_unary_arithmetic.hpp0000664000175000017500000000627412013456043031224 0ustar dandan// unary arithmetic simd functions // Copyright (C) 2010 Tim Blechmann // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; see the file COPYING. If not, write to // the Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. #ifndef SIMD_UNARY_ARITHMETIC_HPP #define SIMD_UNARY_ARITHMETIC_HPP #include "vec.hpp" #include "detail/define_macros.hpp" #if defined(__GNUC__) && defined(NDEBUG) #define always_inline inline __attribute__((always_inline)) #else #define always_inline inline #endif namespace nova { namespace detail { #define DEFINE_UNARY_FUNCTOR(NAME, VEC_NAME) \ struct NAME##_ \ { \ template \ always_inline FloatType operator()(FloatType arg) const \ { \ return NAME(arg); \ } \ template \ always_inline vec operator()(vec arg) const \ { \ return VEC_NAME(arg); \ } \ }; DEFINE_UNARY_FUNCTOR(fabs, abs) DEFINE_UNARY_FUNCTOR(sign, sign) DEFINE_UNARY_FUNCTOR(square, square) DEFINE_UNARY_FUNCTOR(cube, cube) DEFINE_UNARY_FUNCTOR(reciprocal, reciprocal) DEFINE_UNARY_FUNCTOR(round, round) DEFINE_UNARY_FUNCTOR(frac, frac) DEFINE_UNARY_FUNCTOR(ceil, ceil) DEFINE_UNARY_FUNCTOR(floor, floor) DEFINE_UNARY_FUNCTOR(trunc, trunc) DEFINE_UNARY_FUNCTOR(undenormalize, undenormalize) } /* namespace detail */ NOVA_SIMD_DEFINE_UNARY_WRAPPER(abs, detail::fabs_) NOVA_SIMD_DEFINE_UNARY_WRAPPER(sgn, detail::sign_) NOVA_SIMD_DEFINE_UNARY_WRAPPER(square, detail::square_) NOVA_SIMD_DEFINE_UNARY_WRAPPER(cube, detail::cube_) NOVA_SIMD_DEFINE_UNARY_WRAPPER(round, detail::round_) NOVA_SIMD_DEFINE_UNARY_WRAPPER(frac, detail::frac_) NOVA_SIMD_DEFINE_UNARY_WRAPPER(ceil, detail::ceil_) NOVA_SIMD_DEFINE_UNARY_WRAPPER(floor, detail::floor_) NOVA_SIMD_DEFINE_UNARY_WRAPPER(trunc, detail::trunc_) NOVA_SIMD_DEFINE_UNARY_WRAPPER(undenormalize, detail::undenormalize_) NOVA_SIMD_DEFINE_UNARY_WRAPPER(reciprocal, detail::reciprocal_) } /* namespace nova */ #undef always_inline #undef DEFINE_UNARY_FUNCTOR #endif /* SIMD_UNARY_ARITHMETIC_HPP */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/simd_unroll_constraints.hpp0000644000175000017500000000221711512512273031607 0ustar dandan// unrolling constratins for simd functions // Copyright (C) 2009 Tim Blechmann // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; see the file COPYING. If not, write to // the Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. #ifndef SIMD_UNROLL_CONSTRAINTS_HPP #define SIMD_UNROLL_CONSTRAINTS_HPP #include "vec.hpp" namespace nova { template struct unroll_constraints { static const unsigned int samples_per_loop = vec::objects_per_cacheline; }; } /* namespace nova */ #endif /* SIMD_UNROLL_CONSTRAINTS_HPP */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/CMakeLists.txt0000664000175000017500000000077411750340243026670 0ustar dandancmake_minimum_required (VERSION 2.8) project (nova-simd) include(CTest) enable_testing() option(NATIVE "compile on gcc with -march=native" OFF) option(BENCHMARKS "compile benchmarks" OFF) file (GLOB_RECURSE headers *hpp) if(CMAKE_COMPILER_IS_GNUCXX) if (NATIVE) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native") endif() set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ftemplate-depth-1000") endif() if(BENCHMARKS) add_subdirectory (benchmarks) endif() add_subdirectory (testsuite) SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/simd_binary_arithmetic.hpp0000664000175000017500000001042411747572246031363 0ustar dandan// binary arithmetic simd functions // Copyright (C) 2010 Tim Blechmann // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; see the file COPYING. If not, write to // the Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. #ifndef SIMD_BINARY_ARITHMETIC_HPP #define SIMD_BINARY_ARITHMETIC_HPP #include #include #include "vec.hpp" #include "detail/unroll_helpers.hpp" #include "detail/define_macros.hpp" #if defined(__GNUC__) && defined(NDEBUG) #define always_inline inline __attribute__((always_inline)) #else #define always_inline inline #endif namespace nova { namespace detail { struct plus { template FloatType operator()(FloatType const & arg1, FloatType const & arg2) const { return arg1 + arg2; } }; struct minus { template FloatType operator()(FloatType const & arg1, FloatType const & arg2) const { return arg1 - arg2; } }; struct multiplies { template FloatType operator()(FloatType const & arg1, FloatType const & arg2) const { return arg1 * arg2; } }; struct divides { template FloatType operator()(FloatType const & arg1, FloatType const & arg2) const { return arg1 / arg2; } }; struct clip2 { template FloatType operator()(FloatType const & f, FloatType const & limit) const { FloatType zero = 0.0; FloatType neg = zero - FloatType(limit); return max_(neg, min_(f, limit)); } }; struct min_functor { template FloatType operator()(FloatType const & x, FloatType const & y) const { return min_(x, y); } }; struct max_functor { template FloatType operator()(FloatType const & x, FloatType const & y) const { return max_(x, y); } }; struct less { template FloatType operator()(FloatType const & x, FloatType const & y) const { return x < y; } }; struct less_equal { template FloatType operator()(FloatType const & x, FloatType const & y) const { return x <= y; } }; struct greater { template FloatType operator()(FloatType const & x, FloatType const & y) const { return x > y; } }; struct greater_equal { template FloatType operator()(FloatType const & x, FloatType const & y) const { return x >= y; } }; struct equal_to { template FloatType operator()(FloatType const & x, FloatType const & y) const { return x == y; } }; struct not_equal_to { template FloatType operator()(FloatType const & x, FloatType const & y) const { return x != y; } }; } /* namespace detail */ NOVA_SIMD_DEFINE_BINARY_WRAPPER(plus, detail::plus) NOVA_SIMD_DEFINE_BINARY_WRAPPER(minus, detail::minus) NOVA_SIMD_DEFINE_BINARY_WRAPPER(times, detail::multiplies) NOVA_SIMD_DEFINE_BINARY_WRAPPER(over, detail::divides) NOVA_SIMD_DEFINE_BINARY_WRAPPER(min, detail::min_functor) NOVA_SIMD_DEFINE_BINARY_WRAPPER(max, detail::max_functor) NOVA_SIMD_DEFINE_BINARY_WRAPPER(less, detail::less) NOVA_SIMD_DEFINE_BINARY_WRAPPER(less_equal, detail::less_equal) NOVA_SIMD_DEFINE_BINARY_WRAPPER(greater, detail::greater) NOVA_SIMD_DEFINE_BINARY_WRAPPER(greater_equal, detail::greater_equal) NOVA_SIMD_DEFINE_BINARY_WRAPPER(equal, detail::equal_to) NOVA_SIMD_DEFINE_BINARY_WRAPPER(notequal, detail::not_equal_to) NOVA_SIMD_DEFINE_BINARY_WRAPPER(clip2, detail::clip2) } /* namespace nova */ #undef always_inline #endif /* SIMD_BINARY_ARITHMETIC_HPP */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/vec_base.hpp0000664000175000017500000002354312110473257026412 0ustar dandan// vector base class // // Copyright (C) 2011 Tim Blechmann // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; see the file COPYING. If not, write to // the Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. #ifndef VEC_BASE_HPP #define VEC_BASE_HPP #include #include #include #include "detail/math.hpp" #if defined(__GNUC__) && defined(NDEBUG) #define always_inline inline __attribute__((always_inline)) #else #define always_inline inline #endif #include "stdint.h" namespace nova { /* vector base class * * requirements: * - WrappedType is the wrapped scalar type * - get_pointer(VecType) should return WrappedType* * - VecSize should be the number of WrappedType elements inside a VecType * */ template class vec_base { typedef union { WrappedType f[VecSize]; VecType vec; } cast_unit; public: static const int size = VecSize; static const bool has_compare_bitmask = false; protected: vec_base (void) {} public: vec_base (VecType arg): data_(arg) {} operator VecType (void) const { return data_; } public: /* @{ */ /** io */ void load(const WrappedType * src) { cast_unit u; for (int i = 0; i != size; ++i) u.f[i] = src[i]; data_ = u.vec; } void load_first(const WrappedType * src) { cast_unit u; u.f[0] = *src; for (int i = 1; i != size; ++i) u.f[i] = 0; data_ = u.vec; } void load_aligned(const WrappedType * data) { load(data); } void store(WrappedType * dest) const { cast_unit u; u.vec = data_; for (int i = 0; i != size; ++i) dest[i] = u.f[i]; } void store_aligned(WrappedType * dest) const { store(dest); } void store_aligned_stream(WrappedType * dest) const { store(dest); } void clear(void) { set_vec(0); } /* @} */ /* @{ */ /** element access */ WrappedType get (int index) const { assert(index < size); cast_unit u; u.vec = data_; return u.f[index]; } void set (int index, WrappedType arg) { cast_unit u; u.vec = data_; u.f[index] = arg; data_ = u.vec; } void set_vec (WrappedType value) { cast_unit u; for (int i = 0; i != size; ++i) u.f[i] = value; data_ = u.vec; } WrappedType set_slope(WrappedType start, WrappedType slope) { WrappedType diff = 0; cast_unit u; for (int i = 0; i != size; ++i) { u.f[i] = start + diff; diff += slope; } data_ = u.vec; return diff; } WrappedType set_exp(WrappedType start, WrappedType curve) { WrappedType value = start; cast_unit u; for (int i = 0; i != size; ++i) { u.f[i] = value; value *= curve; } data_ = u.vec; return value; } /* @} */ private: template static always_inline VecType apply_unary(VecType const & arg, Functor const & f) { cast_unit u; u.vec = arg; for (int i = 0; i != VecSize; ++i) u.f[i] = f(u.f[i]); return u.vec; } template static always_inline VecType apply_binary(VecType const & arg1, VecType const & arg2, Functor const & f) { cast_unit a1, a2, ret; a1.vec = arg1; a2.vec = arg2; for (int i = 0; i != VecSize; ++i) ret.f[i] = f(a1.f[i], a2.f[i]); return ret.vec; } public: vec_base operator+(vec_base const & rhs) const { return vec_base::apply_binary(data_, rhs.data_, std::plus()); } vec_base operator-(vec_base const & rhs) const { return vec_base::apply_binary(data_, rhs.data_, std::minus()); } vec_base operator*(vec_base const & rhs) const { return vec_base::apply_binary(data_, rhs.data_, std::multiplies()); } vec_base operator/(vec_base const & rhs) const { return vec_base::apply_binary(data_, rhs.data_, std::divides()); } vec_base & operator+=(vec_base const & rhs) { data_ = vec_base::apply_binary(data_, rhs.data_, std::plus()); return *this; } vec_base & operator-=(vec_base const & rhs) { data_ = vec_base::apply_binary(data_, rhs.data_, std::minus()); return *this; } vec_base & operator*=(vec_base const & rhs) { data_ = vec_base::apply_binary(data_, rhs.data_, std::multiplies()); return *this; } vec_base & operator/=(vec_base const & rhs) { data_ = vec_base::apply_binary(data_, rhs.data_, std::divides()); return *this; } vec_base operator<(vec_base const & rhs) const { return vec_base::apply_binary(data_, rhs.data_, std::less()); } vec_base operator<=(vec_base const & rhs) const { return vec_base::apply_binary(data_, rhs.data_, std::less_equal()); } vec_base operator==(vec_base const & rhs) const { return vec_base::apply_binary(data_, rhs.data_, std::equal_to()); } vec_base operator!=(vec_base const & rhs) const { return vec_base::apply_binary(data_, rhs.data_, std::not_equal_to()); } vec_base operator>(vec_base const & rhs) const { return vec_base::apply_binary(data_, rhs.data_, std::greater()); } vec_base operator>=(vec_base const & rhs) const { return vec_base::apply_binary(data_, rhs.data_, std::greater_equal()); } #define DEFINE_UNARY_STATIC(NAME, METHOD) \ static always_inline VecType NAME(VecType const & arg) \ { \ return apply_unary(arg, METHOD); \ } #define DEFINE_BINARY_STATIC(NAME, METHOD) \ static always_inline VecType NAME(VecType const & arg1, VecType const & arg2) \ { \ return apply_binary(arg1, arg2, METHOD); \ } protected: DEFINE_UNARY_STATIC(reciprocal, detail::reciprocal) DEFINE_UNARY_STATIC(sin, detail::sin) DEFINE_UNARY_STATIC(cos, detail::cos) DEFINE_UNARY_STATIC(tan, detail::tan) DEFINE_UNARY_STATIC(asin, detail::asin) DEFINE_UNARY_STATIC(acos, detail::acos) DEFINE_UNARY_STATIC(atan, detail::atan) DEFINE_UNARY_STATIC(tanh, detail::tanh) DEFINE_UNARY_STATIC(log, detail::log) DEFINE_UNARY_STATIC(log2, detail::log2) DEFINE_UNARY_STATIC(log10, detail::log10) DEFINE_UNARY_STATIC(exp, detail::exp) DEFINE_UNARY_STATIC(signed_sqrt, detail::signed_sqrt) DEFINE_UNARY_STATIC(round, detail::round) DEFINE_UNARY_STATIC(ceil, detail::ceil) DEFINE_UNARY_STATIC(floor, detail::floor) DEFINE_UNARY_STATIC(frac, detail::frac) DEFINE_UNARY_STATIC(trunc, detail::trunc) DEFINE_BINARY_STATIC(pow, detail::pow) DEFINE_BINARY_STATIC(signed_pow, detail::signed_pow) DEFINE_UNARY_STATIC(abs, detail::fabs) DEFINE_UNARY_STATIC(sign, detail::sign) DEFINE_UNARY_STATIC(square, detail::square) DEFINE_UNARY_STATIC(cube, detail::cube) DEFINE_BINARY_STATIC(max_, detail::max) DEFINE_BINARY_STATIC(min_, detail::min) DEFINE_UNARY_STATIC(undenormalize, detail::undenormalize) public: WrappedType horizontal_min(void) const { cast_unit u; u.vec = data_; return *std::min_element(u.f, u.f + size); } WrappedType horizontal_max(void) const { cast_unit u; u.vec = data_; return *std::max_element(u.f, u.f + size); } WrappedType horizontal_sum(void) const { cast_unit u; u.vec = data_; WrappedType ret = 0; for (int i = 0; i != size; ++i) ret += u.f[i]; return ret; } protected: VecType data_; }; } #define NOVA_SIMD_DELEGATE_UNARY_TO_BASE(NAME) \ inline friend vec NAME(vec const & arg) \ { \ return base::NAME(arg.data_); \ } #define NOVA_SIMD_DELEGATE_OPERATOR_TO_BASE(NAME) \ inline vec NAME(vec const & rhs) const \ { \ return base::NAME(rhs.data_); \ } #define NOVA_SIMD_DELEGATE_BINARY_TO_BASE(NAME) \ inline friend vec NAME(vec const & arg1, vec const & arg2) \ { \ return base::NAME(arg1.data_, arg2.data_); \ } #define NOVA_SIMD_DEFINE_MADD \ inline friend vec madd(vec const & arg1, vec const & arg2, vec const & arg3) \ { \ return arg1 * arg2 + arg3; \ } #undef always_inline #endif /* VEC_BASE_HPP */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/simd_mix.hpp0000664000175000017500000000413711747572246026467 0ustar dandan// simd functions for mixing // Copyright (C) 2009 Tim Blechmann // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; see the file COPYING. If not, write to // the Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. #ifndef SIMD_MIX_HPP #define SIMD_MIX_HPP #include "vec.hpp" #include "detail/define_macros.hpp" #include "detail/wrap_argument_vector.hpp" namespace nova { #if defined(__GNUC__) && defined(NDEBUG) #define always_inline inline __attribute__((always_inline)) #else #define always_inline inline #endif namespace detail { struct scaled_mix2 { template always_inline ArgType operator()(ArgType sig0, ArgType factor0, ArgType sig1, ArgType factor1) const { return sig0 * factor0 + sig1 * factor1; } }; struct sum { template always_inline ArgType operator()(ArgType sig0, ArgType sig1) const { return sig0 + sig1; } template always_inline ArgType operator()(ArgType sig0, ArgType sig1, ArgType sig2) const { return sig0 + sig1 + sig2; } template always_inline ArgType operator()(ArgType sig0, ArgType sig1, ArgType sig2, ArgType sig3) const { return (sig0 + sig1) + (sig2 + sig3); } }; } NOVA_SIMD_DEFINE_4ARY_WRAPPER(mix, detail::scaled_mix2) NOVA_SIMD_DEFINE_BINARY_WRAPPER(sum, detail::sum) NOVA_SIMD_DEFINE_TERNARY_WRAPPER(sum, detail::sum) NOVA_SIMD_DEFINE_4ARY_WRAPPER(sum, detail::sum) } #undef always_inline #endif /* SIMD_MIX_HPP */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/vec_generic.hpp0000664000175000017500000001043412110473257027107 0ustar dandan// generic vector class // // Copyright (C) 2010 Tim Blechmann // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; see the file COPYING. If not, write to // the Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. #ifndef VEC_GENERIC_HPP #define VEC_GENERIC_HPP #include #include #include #include "wrap_arguments.hpp" #include "detail/math.hpp" #include "vec_base.hpp" namespace nova { namespace detail { template struct array { friend T* get_pointer(array & arg) { return arg.data; } friend const T * get_pointer(array const & arg) { return arg.data; } T operator[](int index) const { return data[index]; } T & operator[](int index) { return data[index]; } T data[size]; }; } template class vec: public vec_base, 4> { typedef vec_base, 4> base; public: typedef FloatType float_type; static const int size = 4; static const int objects_per_cacheline = 64/sizeof(float_type); /* @{ */ /** constructors */ vec(void) {} vec(double f) { base::set_vec(f); } vec(float f) { base::set_vec(f); } vec(vec const & rhs): base(rhs.data_) {} vec(detail::array const & rhs) { base::data_ = rhs; } vec(base const & arg): base(arg) {} static bool is_aligned(FloatType * ptr) { return ((intptr_t)(ptr) & (intptr_t)(sizeof(float) - 1)) == 0; } static vec gen_zero() { return vec(0.0); } static vec gen_ones() { return vec(1.0); } public: /* @} */ NOVA_SIMD_DELEGATE_OPERATOR_TO_BASE(operator+) NOVA_SIMD_DELEGATE_OPERATOR_TO_BASE(operator-) NOVA_SIMD_DELEGATE_OPERATOR_TO_BASE(operator*) NOVA_SIMD_DELEGATE_OPERATOR_TO_BASE(operator/) /* @{ */ /** unary functions */ NOVA_SIMD_DELEGATE_UNARY_TO_BASE(abs) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(sign) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(square) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(cube) /* @} */ /* @{ */ NOVA_SIMD_DELEGATE_BINARY_TO_BASE(max_) NOVA_SIMD_DELEGATE_BINARY_TO_BASE(min_) /* @} */ /* @{ */ /** rounding functions */ NOVA_SIMD_DELEGATE_UNARY_TO_BASE(round) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(frac) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(floor) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(ceil) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(trunc) /* @} */ /* @{ */ NOVA_SIMD_DEFINE_MADD friend inline vec select(vec lhs, vec rhs, vec bitmask) { vec ret; for (int i = 0; i != size; ++i) { ret.data_[i] = bitmask.data_[i] != 0 ? rhs.data_[i] : lhs.data_[i]; } return ret; } /** mathematical functions */ NOVA_SIMD_DELEGATE_BINARY_TO_BASE(pow) NOVA_SIMD_DELEGATE_BINARY_TO_BASE(signed_pow) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(reciprocal) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(log) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(log2) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(log10) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(exp) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(sin) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(cos) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(tan) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(asin) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(acos) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(atan) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(tanh) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(signed_sqrt) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(undenormalize) /* @} */ }; } /* namespace nova */ #endif /* VEC_GENERIC_HPP */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/simd_pan.hpp0000644000175000017500000001125611512512273026426 0ustar dandan// simd functions for panning // Copyright (C) 2009, 2010 Tim Blechmann // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; see the file COPYING. If not, write to // the Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. #ifndef SIMD_PAN_HPP #define SIMD_PAN_HPP #include "vec.hpp" #if defined(__GNUC__) && defined(NDEBUG) #define always_inline inline __attribute__((always_inline)) #else #define always_inline inline #endif namespace nova { template inline void pan2_vec(F * out0, F * out1, const F * in, F factor0, F factor1, unsigned int n) { do { F sig = *in++; *out0++ = sig * factor0; *out1++ = sig * factor1; } while(--n); } template inline void pan2_vec(F * out0, F * out1, const F * in, F factor0, F slope0, F factor1, F slope1, unsigned int n) { do { F sig = *in++; *out0++ = sig * factor0; *out1++ = sig * factor1; factor0 += slope0; factor1 += slope1; } while(--n); } namespace detail { template struct pan2 { static const int offset = vec::size; static always_inline void mp_iteration(F * out0, F * out1, const F * in, vec const & factor0, vec const & factor1) { vec vin, vout0, vout1; vin.load_aligned(in); vout0 = vin * factor0; vout1 = vin * factor1; vout0.store_aligned(out0); vout1.store_aligned(out1); pan2::mp_iteration(out0+offset, out1+offset, in+offset, factor0, factor1); } static always_inline void mp_iteration(F * out0, F * out1, const F * in, vec & factor0, vec const & slope0, vec & factor1, vec const & slope1) { vec vin, vout0, vout1; vin.load_aligned(in); vout0 = vin * factor0; vout1 = vin * factor1; vout0.store_aligned(out0); vout1.store_aligned(out1); factor0 += slope0; factor1 += slope1; pan2::mp_iteration(out0+offset, out1+offset, in+offset, factor0, slope0, factor1, slope1); } }; template struct pan2 { static always_inline void mp_iteration(F * out0, F * out1, const F * in, vec const & factor0, vec const & factor1) {} static always_inline void mp_iteration(F * out0, F * out1, const F * in, vec & factor0, vec const & slope0, vec & factor1, vec const & slope1) {} }; } /* namespace detail */ template inline void pan2_vec_simd(F * out0, F * out1, const F * in, F factor0, F factor1, unsigned int n) { vec vf0(factor0), vf1(factor1); const int per_loop = vec::objects_per_cacheline; n /= per_loop; do { detail::pan2::mp_iteration(out0, out1, in, vf0, vf1); out0 += per_loop; out1 += per_loop; in += per_loop; } while(--n); } template inline void pan2_vec_simd(F * out0, F * out1, const F * in, F factor0, F factor1) { vec vf0(factor0), vf1(factor1); detail::pan2::mp_iteration(out0, out1, in, vf0, vf1); } template inline void pan2_vec_simd(F * out0, F * out1, const F * in, F factor0, F slope0, F factor1, F slope1, unsigned int n) { const int per_loop = vec::objects_per_cacheline; vec vf0, vf1, vslope0, vslope1; vslope0.set_vec(vf0.set_slope(factor0, slope0)); vslope1.set_vec(vf1.set_slope(factor1, slope1)); n /= per_loop; do { detail::pan2::mp_iteration(out0, out1, in, vf0, vslope0, vf1, vslope1); out0 += per_loop; out1 += per_loop; in += per_loop; } while(--n); } template inline void pan2_vec_simd(F * out0, F * out1, const F * in, F factor0, F slope0, F factor1, F slope1) { vec vf0, vf1, vslope0, vslope1; vslope0.set_vec(vf0.set_slope(factor0, slope0)); vslope1.set_vec(vf1.set_slope(factor1, slope1)); detail::pan2::mp_iteration(out0, out1, in, vf0, vslope0, vf1, vslope1); } } /* namespace nova */ #undef always_inline #endif /* SIMD_PAN_HPP */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-simd/vec_neon.hpp0000664000175000017500000003116512110473257026436 0ustar dandan// neon vector class // // Copyright (c) 2010 Tim Blechmann and Dan Stowell // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; see the file COPYING. If not, write to // the Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. #ifndef VEC_NEON_HPP #define VEC_NEON_HPP #include #include "vec_base.hpp" #include "vec_int_neon.hpp" #include "detail/vec_math.hpp" #if defined(__GNUC__) && defined(NDEBUG) #define always_inline inline __attribute__((always_inline)) #else #define always_inline inline #endif namespace nova { template <> struct vec: vec_base { typedef float float_type; private: typedef float32x4_t internal_vector_type; typedef vec_base base; static float32x4_t set_vector(float f0, float f1, float f2, float f3) { float32x4_t ret; ret = vsetq_lane_f32(f0, ret, 0); ret = vsetq_lane_f32(f1, ret, 1); ret = vsetq_lane_f32(f2, ret, 2); ret = vsetq_lane_f32(f3, ret, 3); return ret; } static float32x4_t set_vector(float f) { return vdupq_n_f32(f); } public: static inline float32x4_t gen_sign_mask(void) { static const int sign_mask = 0x80000000; float * casted = (float*)(&sign_mask); return vdupq_n_f32(*casted); } static inline float32x4_t gen_abs_mask(void) { static const int abs_mask = 0x7fffffff; float * casted = (float*)(&abs_mask); return vdupq_n_f32(*casted); } static inline float32x4_t gen_one(void) { return vdupq_n_f32(1.f); } static inline float32x4_t gen_05(void) { return vdupq_n_f32(0.5f); } static inline float32x4_t gen_zero(void) { return vdupq_n_f32(0.f); } static inline internal_vector_type gen_exp_mask(void) { return set_bitmask(0x7F800000); } static inline internal_vector_type gen_exp_mask_1(void) { return set_bitmask(0x3F000000); } static inline internal_vector_type set_bitmask(unsigned int mask) { union { unsigned int i; float f; } u; u.i = mask; return set_vector(u.f); } vec(float32x4_t const & arg): base(arg) {} public: static const int size = 4; static const int objects_per_cacheline = 64/sizeof(float); static const bool has_compare_bitmask = true; static bool is_aligned(float* ptr) { return ((intptr_t)(ptr) & (intptr_t)(size * sizeof(float) - 1)) == 0; } /* @{ */ /** constructors */ vec(void) {} vec(float f) { set_vec(f); } vec(double f) { set_vec((float)f); } vec(vec const & rhs) { data_ = rhs.data_; } /* @} */ /* @{ */ /** io */ void load(const float * data) { base::data_ = vld1q_f32((const float32_t*)data); } void load_aligned(const float * data) { load(data); } void store(float * dest) const { vst1q_f32((float32_t*)dest, data_); } void store_aligned(float * dest) const { store(dest); } void store_aligned_stream(float * dest) const { store(dest); } // no particular setzero intrinsic void clear(void) { set_vec(0); } /* @} */ /* @{ */ /** element access */ void set (std::size_t index, float value) { switch (index) { case 0: data_ = vsetq_lane_f32(value, data_, 0); return; case 1: data_ = vsetq_lane_f32(value, data_, 1); return; case 2: data_ = vsetq_lane_f32(value, data_, 2); return; case 3: data_ = vsetq_lane_f32(value, data_, 3); return; } assert(false); } void set_vec (float value) { data_ = vdupq_n_f32(value); } float set_slope(float start, float slope) { data_ = set_vector(start, start + slope, start + slope + slope, start + slope + slope + slope); return slope + slope + slope + slope; } float set_exp(float start, float curve) { data_ = set_vector(start, start * curve, start * curve * curve, start * curve * curve * curve); return start * curve * curve * curve * curve; } float get (std::size_t index) const { switch (index) { case 0: return vgetq_lane_f32(data_, 0); case 1: return vgetq_lane_f32(data_, 1); case 2: return vgetq_lane_f32(data_, 2); case 3: return vgetq_lane_f32(data_, 3); } assert(false); } /* @} */ /* @{ */ private: static float32x4_t vdivq_f32(float32x4_t lhs, float32x4_t rhs) { float32x4_t reciprocal = vrecpeq_f32(rhs); reciprocal = vmulq_f32(reciprocal, vrecpsq_f32(rhs, reciprocal)); return vmulq_f32(lhs, reciprocal); } public: friend vec fast_reciprocal(vec const & arg) { float32x4_t reciprocal = vrecpeq_f32(arg); return reciprocal; } friend vec reciprocal(vec const & arg) { float32x4_t reciprocal = vrecpeq_f32(arg); reciprocal = vmulq_f32(reciprocal, vrecpsq_f32(arg, reciprocal)); return reciprocal; } /** arithmetic operators */ #define OPERATOR_ASSIGNMENT(op, opcode) \ vec & operator op(vec const & rhs) \ { \ data_ = opcode(data_, rhs.data_);\ return *this;\ } OPERATOR_ASSIGNMENT(+=, vaddq_f32) OPERATOR_ASSIGNMENT(-=, vsubq_f32) OPERATOR_ASSIGNMENT(*=, vmulq_f32) OPERATOR_ASSIGNMENT(/=, vdivq_f32) #undef OPERATOR_ASSIGNMENT #define ARITHMETIC_OPERATOR(op, opcode) \ friend vec operator op(vec const & lhs, vec const & rhs) \ { \ return opcode(lhs.data_, rhs.data_); \ } ARITHMETIC_OPERATOR(+, vaddq_f32) ARITHMETIC_OPERATOR(-, vsubq_f32) ARITHMETIC_OPERATOR(*, vmulq_f32) ARITHMETIC_OPERATOR(/, vdivq_f32) #undef ARITHMETIC_OPERATOR friend vec madd(vec const & arg1, vec const & arg2, vec const & arg3) { return vmlaq_f32(arg3.data_, arg2.data_, arg1.data_); } private: static uint32x4_t vcneqq_f32(float32x4_t a, float32x4_t b) { return vmvnq_u32(vceqq_f32(a, b)); } public: #define RELATIONAL_OPERATOR(op, opcode) \ vec operator op(vec const & rhs) const \ { \ const uint32x4_t one = vreinterpretq_u32_f32(gen_one()); \ uint32x4_t mask = opcode(data_, rhs.data_); \ return vreinterpretq_f32_u32(vandq_u32(mask, one)); \ } RELATIONAL_OPERATOR(<, vcltq_f32) RELATIONAL_OPERATOR(<=, vcleq_f32) RELATIONAL_OPERATOR(>, vcgtq_f32) RELATIONAL_OPERATOR(>=, vcgeq_f32) RELATIONAL_OPERATOR(==, vceqq_f32) RELATIONAL_OPERATOR(!=, vcneqq_f32) #undef RELATIONAL_OPERATOR /* @{ */ #define BITWISE_OPERATOR(op, opcode) \ vec operator op(vec const & rhs) const \ { \ return vreinterpretq_f32_u32(opcode( \ vreinterpretq_u32_f32(data_), vreinterpretq_u32_f32(rhs.data_))); \ } BITWISE_OPERATOR(&, vandq_u32) BITWISE_OPERATOR(|, vorrq_u32) BITWISE_OPERATOR(^, veorq_u32) #undef BITWISE_OPERATOR friend inline vec andnot(vec const & lhs, vec const & rhs) { return vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(lhs.data_), vmvnq_u32(vreinterpretq_u32_f32(rhs.data_))));; } #define RELATIONAL_MASK_OPERATOR(op, opcode) \ friend vec mask_##op(vec const & lhs, vec const & rhs) \ { \ return vreinterpretq_f32_u32(opcode( \ lhs.data_, rhs.data_)); \ } RELATIONAL_MASK_OPERATOR(lt, vcltq_f32) RELATIONAL_MASK_OPERATOR(le, vcleq_f32) RELATIONAL_MASK_OPERATOR(gt, vcgtq_f32) RELATIONAL_MASK_OPERATOR(ge, vcgeq_f32) RELATIONAL_MASK_OPERATOR(eq, vceqq_f32) RELATIONAL_MASK_OPERATOR(neq, vcneqq_f32) #undef RELATIONAL_MASK_OPERATOR public: friend inline vec select(vec lhs, vec rhs, vec bitmask) { return vbslq_f32(vreinterpretq_u32_f32(bitmask.data_), lhs.data_, rhs.data_); } /* @} */ /* @{ */ /** unary functions */ friend inline vec abs(vec const & arg) { return vabsq_f32(arg.data_); } friend inline vec square(vec const & arg) { return vmulq_f32(arg.data_, arg.data_); } friend inline vec cube(vec const & arg) { return vmulq_f32(arg.data_, vmulq_f32(arg.data_, arg.data_)); } /* @} */ /* @{ */ /** binary functions */ friend inline vec max_(vec const & lhs, vec const & rhs) { return vmaxq_f32(lhs.data_, rhs.data_); } friend inline vec min_(vec const & lhs, vec const & rhs) { return vminq_f32(lhs.data_, rhs.data_); } /* @} */ /* @{ */ /** rounding functions */ friend inline vec round(vec const & arg) { return detail::vec_round_float(arg); } friend inline vec frac(vec const & arg) { vec floor_result = floor(arg); return arg - floor_result; } friend inline vec floor(vec const & arg) { return detail::vec_floor_float(arg); } friend inline vec ceil(vec const & arg) { return detail::vec_ceil_float(arg); } /* FIXME: this is broken friend inline vec trunc(vec const & arg) { return arg.truncate_to_int().convert_to_float(); } */ NOVA_SIMD_DELEGATE_UNARY_TO_BASE(trunc) /* @} */ /* @{ */ /** mathematical functions */ friend inline vec sign(vec const & arg) { return detail::vec_sign(arg); } NOVA_SIMD_DELEGATE_BINARY_TO_BASE(pow) NOVA_SIMD_DELEGATE_BINARY_TO_BASE(signed_pow) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(log) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(log2) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(log10) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(exp) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(sin) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(cos) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(tan) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(asin) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(acos) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(atan) NOVA_SIMD_DELEGATE_UNARY_TO_BASE(tanh) private: static float32x4_t vsqrtq_f32(float32x4_t arg) { float32x4_t reciprocal = vrsqrteq_f32(arg); // TODO: maybe we should do another newton-raphson iteration (see: qvrsqrtsq_f32)? return vmulq_f32(arg, reciprocal); } public: friend vec sqrt(vec const & arg) { return vsqrtq_f32(arg); } friend inline vec signed_sqrt(vec const & arg) { return detail::vec_signed_sqrt(arg); } /* @} */ typedef detail::int_vec_neon int_vec; vec (int_vec const & rhs): base(vreinterpretq_f32_u32(rhs.data_)) {} int_vec truncate_to_int(void) const { return int_vec(vreinterpretq_u32_s32(vcvtq_s32_f32(data_))); } float horizontal_min(void) const { float32x2_t high = vget_high_f32(data_); float32x2_t low = vget_low_f32(data_); float32x2_t pmin = vmin_f32(low, high); float pmin0 = vget_lane_f32(pmin, 0); float pmin1 = vget_lane_f32(pmin, 1); return std::min(pmin0, pmin1); } float horizontal_max(void) const { float32x2_t high = vget_high_f32(data_); float32x2_t low = vget_low_f32(data_); float32x2_t pmax = vmax_f32(low, high); float pmax0 = vget_lane_f32(pmax, 0); float pmax1 = vget_lane_f32(pmax, 1); return std::max(pmax0, pmax1); } float horizontal_sum(void) const { float32x2_t high = vget_high_f32(data_); float32x2_t low = vget_low_f32(data_); float32x2_t psum = vpadd_f32(low, high); return vget_lane_f32(psum, 0) + vget_lane_f32(psum, 1); } }; } /* namespace nova */ #undef always_inline #endif /* VEC_NEON_HPP */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-tt/0000775000175000017500000000000012110505246023610 5ustar dandanSuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-tt/Doxyfile0000644000175000017500000017357111512512334025333 0ustar dandan# Doxyfile 1.6.1 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the config file # that follow. The default is UTF-8 which is also the encoding used for all # text before the first occurrence of this tag. Doxygen uses libiconv (or the # iconv built into libc) for the transcoding. See # http://www.gnu.org/software/libiconv for the list of possible encodings. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = "nova thread tools" # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = doxy # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, # Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, # Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English # messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, # Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, # Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. OUTPUT_LANGUAGE = English # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is # used as the annotated text. Otherwise, the brief description is used as-is. # If left blank, the following values are used ("$name" is automatically # replaced with the name of the entity): "The $name class" "The $name widget" # "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = YES # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like regular Qt-style comments # (thus requiring an explicit @brief command for a brief description.) JAVADOC_AUTOBRIEF = YES # If the QT_AUTOBRIEF tag is set to YES then Doxygen will # interpret the first line (until the first dot) of a Qt-style # comment as the brief description. If set to NO, the comments # will behave just like regular Qt-style comments (thus requiring # an explicit \brief command for a brief description.) QT_AUTOBRIEF = YES # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 4 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = NO # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java # sources only. Doxygen will then generate output that is more tailored for # Java. For instance, namespaces will be presented as packages, qualified # scopes will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran # sources only. Doxygen will then generate output that is more tailored for # Fortran. OPTIMIZE_FOR_FORTRAN = NO # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL # sources. Doxygen will then generate output that is tailored for # VHDL. OPTIMIZE_OUTPUT_VHDL = NO # Doxygen selects the parser to use depending on the extension of the files it parses. # With this tag you can assign which parser to use for a given extension. # Doxygen has a built-in mapping, but you can override or extend it using this tag. # The format is ext=language, where ext is a file extension, and language is one of # the parsers supported by doxygen: IDL, Java, Javascript, C#, C, C++, D, PHP, # Objective-C, Python, Fortran, VHDL, C, C++. For instance to make doxygen treat # .inc files as Fortran files (default is PHP), and .f files as C (default is Fortran), # use: inc=Fortran f=C. Note that for custom extensions you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. EXTENSION_MAPPING = # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should # set this tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); v.s. # func(std::string) {}). This also make the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. BUILTIN_STL_SUPPORT = YES # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. # Doxygen will parse them like normal C++ but will assume all classes use public # instead of private inheritance when no explicit protection keyword is present. SIP_SUPPORT = NO # For Microsoft's IDL there are propget and propput attributes to indicate getter # and setter methods for a property. Setting this option to YES (the default) # will make doxygen to replace the get and set methods by a property in the # documentation. This will only work if the methods are indeed getting or # setting a simple type. If this is not the case, or you want to show the # methods anyway, you should set this option to NO. IDL_PROPERTY_SUPPORT = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES # When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum # is documented as struct, union, or enum with the name of the typedef. So # typedef struct TypeS {} TypeT, will appear in the documentation as a struct # with name TypeT. When disabled the typedef will appear as a member of a file, # namespace, or class. And the struct will be named TypeS. This can typically # be useful for C code in case the coding convention dictates that all compound # types are typedef'ed and only the typedef is referenced, never the tag name. TYPEDEF_HIDES_STRUCT = NO # The SYMBOL_CACHE_SIZE determines the size of the internal cache use to # determine which symbols to keep in memory and which to flush to disk. # When the cache is full, less often used symbols will be written to disk. # For small to medium size projects (<1000 input files) the default value is # probably good enough. For larger projects a too small cache size can cause # doxygen to be busy swapping symbols to and from disk most of the time # causing a significant performance penality. # If the system has enough physical memory increasing the cache will improve the # performance by keeping more symbols in memory. Note that the value works on # a logarithmic scale so increasing the size by one will rougly double the # memory usage. The cache size is given by this formula: # 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, # corresponding to a cache size of 2^16 = 65536 symbols SYMBOL_CACHE_SIZE = 0 #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = NO # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = NO # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = YES # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = NO # If this flag is set to YES, the members of anonymous namespaces will be # extracted and appear in the documentation as a namespace called # 'anonymous_namespace{file}', where file will be replaced with the base # name of the file that contains the anonymous namespace. By default # anonymous namespace are hidden. EXTRACT_ANON_NSPACES = YES # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the (brief and detailed) documentation of class members so that constructors and destructors are listed first. If set to NO (the default) the constructors will appear in the respective orders defined by SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. SORT_MEMBERS_CTORS_1ST = NO # If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the # hierarchy of group names into alphabetical order. If set to NO (the default) # the group names will appear in their defined order. SORT_GROUP_NAMES = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # If the sources in your project are distributed over multiple directories # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy # in the documentation. The default is NO. SHOW_DIRECTORIES = NO # Set the SHOW_FILES tag to NO to disable the generation of the Files page. # This will remove the Files entry from the Quick Index and from the # Folder Tree View (if specified). The default is YES. SHOW_FILES = YES # Set the SHOW_NAMESPACES tag to NO to disable the generation of the # Namespaces page. # This will remove the Namespaces entry from the Quick Index # and from the Folder Tree View (if specified). The default is YES. SHOW_NAMESPACES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from # the version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the program writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed by # doxygen. The layout file controls the global structure of the generated output files # in an output format independent way. The create the layout file that represents # doxygen's defaults, run doxygen with the -l option. You can optionally specify a # file name after the option, if omitted DoxygenLayout.xml will be used as the name # of the layout file. LAYOUT_FILE = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be abled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = NO # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = nova-tt # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is # also the default input encoding. Doxygen uses libiconv (or the iconv built # into libc) for the transcoding. See http://www.gnu.org/software/libiconv for # the list of possible encodings. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx # *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 FILE_PATTERNS = # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix filesystem feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. Note that the wildcards are matched # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* EXCLUDE_PATTERNS = # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, # AClass::ANamespace, ANamespace::*Test EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. # If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. # Doxygen will compare the file name with each pattern and apply the # filter if there is a match. # The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER # is applied to all files. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = NO # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = NO # If the REFERENCES_RELATION tag is set to YES # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = NO # If the REFERENCES_LINK_SOURCE tag is set to YES (the default) # and SOURCE_BROWSER tag is set to YES, then the hyperlinks from # functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will # link to the source code. # Otherwise they will link to the documentation. REFERENCES_LINK_SOURCE = YES # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source # tagging system (see http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = NO # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. For this to work a browser that supports # JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox # Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). HTML_DYNAMIC_SECTIONS = NO # If the GENERATE_DOCSET tag is set to YES, additional index files # will be generated that can be used as input for Apple's Xcode 3 # integrated development environment, introduced with OSX 10.5 (Leopard). # To create a documentation set, doxygen will generate a Makefile in the # HTML output directory. Running make will produce the docset in that # directory and running "make install" will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find # it at startup. # See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html for more information. GENERATE_DOCSET = NO # When GENERATE_DOCSET tag is set to YES, this tag determines the name of the # feed. A documentation feed provides an umbrella under which multiple # documentation sets from a single provider (such as a company or product suite) # can be grouped. DOCSET_FEEDNAME = "Doxygen generated docs" # When GENERATE_DOCSET tag is set to YES, this tag specifies a string that # should uniquely identify the documentation set bundle. This should be a # reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen # will append .docset to the name. DOCSET_BUNDLE_ID = org.doxygen.Project # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compiled HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING # is used to encode HtmlHelp index (hhk), content (hhc) and project file # content. CHM_INDEX_ENCODING = # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and QHP_VIRTUAL_FOLDER # are set, an additional index file will be generated that can be used as input for # Qt's qhelpgenerator to generate a Qt Compressed Help (.qch) of the generated # HTML documentation. GENERATE_QHP = NO # If the QHG_LOCATION tag is specified, the QCH_FILE tag can # be used to specify the file name of the resulting .qch file. # The path specified is relative to the HTML output folder. QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#namespace QHP_NAMESPACE = # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#virtual-folders QHP_VIRTUAL_FOLDER = doc # If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to add. # For more information please see # http://doc.trolltech.com/qthelpproject.html#custom-filters QHP_CUST_FILTER_NAME = # The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the custom filter to add.For more information please see # Qt Help Project / Custom Filters. QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this project's # filter section matches. # Qt Help Project / Filter Attributes. QHP_SECT_FILTER_ATTRS = # If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can # be used to specify the location of Qt's qhelpgenerator. # If non-empty doxygen will try to run qhelpgenerator on the generated # .qhp file. QHG_LOCATION = # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index # structure should be generated to display hierarchical information. # If the tag value is set to YES, a side panel will be generated # containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). # Windows users are probably better off using the HTML help feature. GENERATE_TREEVIEW = NO # By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, # and Class Hierarchy pages using a tree view instead of an ordered list. USE_INLINE_TREES = NO # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 # Use this tag to change the font size of Latex formulas included # as images in the HTML documentation. The default is 10. Note that # when you change the font size after a successful doxygen run you need # to manually remove any form_*.png images from the HTML output directory # to force them to be regenerated. FORMULA_FONTSIZE = 10 # When the SEARCHENGINE tag is enable doxygen will generate a search box for the HTML output. The underlying search engine uses javascript # and DHTML and should work on any modern browser. Note that when using HTML help (GENERATE_HTMLHELP) or Qt help (GENERATE_QHP) # there is already a search function so this one should typically # be disabled. SEARCHENGINE = YES #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = YES # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = YES # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = YES # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO # If LATEX_SOURCE_CODE is set to YES then doxygen will include source code with syntax highlighting in the LaTeX output. Note that which sources are shown also depends on other settings such as SOURCE_BROWSER. LATEX_SOURCE_CODE = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. # This is useful # if you want to understand what is going on. # On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_DEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = POSIX_SEMAPHORE_WRAPPER # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse # the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option is superseded by the HAVE_DOT option below. This is only a # fallback. It is recommended to install and use dot, since it yields more # powerful graphs. CLASS_DIAGRAMS = YES # You can define message sequence charts within doxygen comments using the \msc # command. Doxygen will then run the mscgen tool (see # http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the # documentation. The MSCGEN_PATH tag allows you to specify the directory where # the mscgen tool resides. If left empty the tool is assumed to be found in the # default search path. MSCGEN_PATH = # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = YES # By default doxygen will write a font called FreeSans.ttf to the output # directory and reference it in all dot files that doxygen generates. This # font does not include all possible unicode characters however, so when you need # these (or just want a differently looking font) you can specify the font name # using DOT_FONTNAME. You need need to make sure dot is able to find the font, # which can be done by putting it in a standard location or by setting the # DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory # containing the font. DOT_FONTNAME = FreeSans # The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. # The default size is 10pt. DOT_FONTSIZE = 10 # By default doxygen will tell dot to use the output directory to look for the # FreeSans.ttf font (which doxygen will put there itself). If you specify a # different font using DOT_FONTNAME you can set the path where dot # can find it using this tag. DOT_FONTPATH = # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT options are set to YES then # doxygen will generate a call dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable call graphs # for selected functions only using the \callgraph command. CALL_GRAPH = NO # If the CALLER_GRAPH and HAVE_DOT tags are set to YES then # doxygen will generate a caller dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable caller # graphs for selected functions only using the \callergraph command. CALLER_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of # nodes that will be shown in the graph. If the number of nodes in a graph # becomes larger than this value, doxygen will truncate the graph, which is # visualized by representing a node as a red box. Note that doxygen if the # number of direct children of the root node in a graph is already larger than # DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note # that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. DOT_GRAPH_MAX_NODES = 50 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes # that lay further from the root node will be omitted. Note that setting this # option to 1 or 2 may greatly reduce the computation time needed for large # code bases. Also note that the size of a graph can be further restricted by # DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. MAX_DOT_GRAPH_DEPTH = 0 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is disabled by default, because dot on Windows does not # seem to support this out of the box. Warning: Depending on the platform used, # enabling this option may lead to badly anti-aliased labels on the edges of # a graph (i.e. they become hard to read). DOT_TRANSPARENT = NO # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = YES # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-tt/COPYING0000644000175000017500000000135711512512334024650 0ustar dandanCopyright (C) 2009 Tim Blechmann This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; see the file COPYING. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-tt/README0000644000175000017500000000163411512512334024473 0ustar dandannova thread tools nova thread tools aims to provide cross-platform implementations of thread synchronization functions. provided classes: - nova::dummy_mutex: dummy class, implementing the TryMutex concept - nova::spin_lock: spin lock (pthread wrapper) - nova::nonrecursive_rw_mutex: non-recursive reader-writer mutex (pthread wrapper) - nova::rw_mutex: recursive reader-writer mutex (pthread wrapper) - nova::rw_spinlock: nonrecursive reader-writer spinlock - nova::semaphore: semaphore class (posix/boost wrapper) provided functions: - nova::nanosleep: sleeping functions with nano-second resolution (if supported by operating system) - nova::thread_priority: get priority of current thread - nova::thread_priority_interval(_rt): get valid priority interval - nova::thread_set_priority(_rt): set priority of current thread dependencies: - boost.thread - boost.lockfree (for memory barriers and atomic operations) SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-tt/nova-tt/0000775000175000017500000000000012110505246025200 5ustar dandan././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-tt/nova-tt/semaphore_boost_fallback.hppSuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-tt/nova-tt/semaphore_boost_fallback.0000664000175000017500000000655011715222750032225 0ustar dandan// semaphore class, boost.thread wrapper // based on API proposed in N2043 // // Copyright (C) 2008, 2009 Tim Blechmann // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; see the file COPYING. If not, write to // the Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. #ifndef NOVA_TT_SEMAPHORE_BOOST_FALLBACK_HPP #define NOVA_TT_SEMAPHORE_BOOST_FALLBACK_HPP #include #include #include #include #include namespace nova { namespace nova_tt { /** semaphore class */ template class semaphore: boost::noncopyable { typedef typename boost::mpl::if_c::type mutex_type; public: semaphore(int i=0): m_count(i) {} /** signal semaphore */ void post(void) { boost::mutex::scoped_lock lock(m_mutex); ++m_count; m_cond.notify_one(); } /** wait until this semaphore is signaled */ void wait(void) { boost::mutex::scoped_lock lock(m_mutex); while (m_count==0) m_cond.wait(lock); /** \todo check! valgrind complains about this */ --m_count; } /** try to wait for the semaphore * * \return true, if the value can be decremented * false, otherweise */ bool try_wait(void) { bool success = m_mutex.try_lock(); if (!success) return false; bool ret; if (m_count == 0) ret = false; else { --m_count; ret = true; } m_mutex.unlock(); return ret; } /** try to wait for the semaphore until timeout * * \return true, if the value can be decremented * false, otherweise */ bool timed_wait(struct timespec const & absolute_timeout) { BOOST_STATIC_ASSERT(has_timed_wait); using namespace boost::posix_time; const ptime epoch(boost::gregorian::date(1970, 1, 1)); ptime timeout = epoch + seconds(absolute_timeout.tv_sec) + microsec(absolute_timeout.tv_nsec / 1000); bool success = m_mutex.timed_lock(timeout); if (success) { bool ret; if (m_count == 0) ret = false; else { --m_count; ret = true; } m_mutex.unlock(); return ret; } else return false; } int value(void) { boost::mutex::scoped_lock lock(m_mutex); return m_count; } private: unsigned int m_count; mutex_type m_mutex; boost::condition m_cond; }; } // namespace nova_tt } // namespace nova #endif /* NOVA_TT_SEMAPHORE_BOOST_FALLBACK_HPP */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-tt/nova-tt/nanosleep.hpp0000664000175000017500000000412611757463151027716 0ustar dandan// cross-platform wrapper for nanosleep // Copyright (C) 2009 Tim Blechmann // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; see the file COPYING. If not, write to // the Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. /** \file nanosleep.hpp */ /** \namespace nova */ #ifndef NOVA_TT_NANOSLEEP_HPP #define NOVA_TT_NANOSLEEP_HPP #include #if defined(unix) || defined(__unix__) || defined(__unix) # include #endif #if (_POSIX_TIMERS - 0) >= 200112L #include #endif /* _POSIX_TIMERS */ #include #include namespace nova { namespace detail { const unsigned long ns_per_s = 1000000000; inline void nanosleep(unsigned long sec, unsigned long ns) { assert(ns < ns_per_s); #if _POSIX_C_SOURCE >= 199309L struct timespec timeout, remain; timeout.tv_sec = sec; timeout.tv_nsec = ns; nanosleep(&timeout, &remain); #else #ifdef BOOST_DATE_TIME_HAS_NANOSECONDS boost::this_thread::sleep(boost::posix_time::seconds(sec) + boost::posix_time::nanoseconds(ns)); #else boost::this_thread::sleep(boost::posix_time::seconds(sec) + boost::posix_time::microseconds(ns*0.001)); #endif #endif } } /* namespace detail */ /** sleep for ns nanoseconds */ inline void nanosleep(unsigned long ns) { if (ns < detail::ns_per_s) detail::nanosleep(0, ns); else detail::nanosleep(ns/detail::ns_per_s, ns%detail::ns_per_s); } } /* namespace nova */ #endif /* NOVA_TT_NANOSLEEP_HPP */ ././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-tt/nova-tt/thread_priority_fallback.hppSuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-tt/nova-tt/thread_priority_fallback.0000644000175000017500000000233011512512334032225 0ustar dandan// // Copyright (C) 2010 Tim Blechmann // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; see the file COPYING. If not, write to // the Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. #ifndef NOVA_TT_THREAD_PRITORITY_FALLBACK_HPP #define NOVA_TT_THREAD_PRITORITY_FALLBACK_HPP #include namespace nova { inline int thread_priority(void) { return 0; } inline std::pair thread_priority_interval(void) { return std::make_pair(0, 0); } inline bool thread_set_priority(int priority) { return false; } } /* namespace nova */ #undef USE_PTHREAD #endif /* NOVA_TT_THREAD_PRITORITY_FALLBACK_HPP */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-tt/nova-tt/thread_priority.hpp0000664000175000017500000000236712110473257031137 0ustar dandan// cross-platform wrapper for nanosleep // Copyright (C) 2010 Tim Blechmann // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; see the file COPYING. If not, write to // the Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. #ifndef NOVA_TT_THREAD_PRITORITY_HPP #define NOVA_TT_THREAD_PRITORITY_HPP #if defined(unix) || defined(__unix__) || defined(__unix) # include #endif #if (_POSIX_PRIORITY_SCHEDULING - 0) >= 200112L || (_POSIX_MEMLOCK - 0) >= 200112L #include "thread_priority_pthread.hpp" #elif (__APPLE__) #include "thread_priority_mach.hpp" #else #include "thread_priority_fallback.hpp" #endif #endif /* NOVA_TT_THREAD_PRITORITY_HPP */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-tt/nova-tt/rw_spinlock.hpp0000664000175000017500000001052212110473257030251 0ustar dandan// reader-writer spinlock // Copyright (C) 2009-2011 Tim Blechmann // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; see the file COPYING. If not, write to // the Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. /** \file rw_spinlock.hpp */ #ifndef RW_SPINLOCK_HPP #define RW_SPINLOCK_HPP #include #include #include "boost/atomic.hpp" #include #include "pause.hpp" namespace nova { /** non-recursive reader-writer spinlock, implements a subset of the SharedLockable concept * * except for bool timed_lock_shared(boost::system_time const& abs_time) all SharedLockable members * are provided */ class rw_spinlock { typedef boost::uint32_t uint32_t; static const uint32_t unlocked_state = 0; static const uint32_t locked_state = 0x80000000; static const uint32_t reader_mask = 0x7fffffff; public: struct scoped_lock { scoped_lock(rw_spinlock & sl): sl_(sl) { sl_.lock(); } ~scoped_lock(void) { sl_.unlock(); } rw_spinlock & sl_; }; typedef scoped_lock unique_lock; struct shared_lock { shared_lock(rw_spinlock & sl): sl_(sl) { sl_.lock_shared(); } ~shared_lock(void) { sl_.unlock_shared(); } rw_spinlock & sl_; }; rw_spinlock(void): state(uint32_t(unlocked_state)) {} ~rw_spinlock(void) { assert(state == unlocked_state); } void lock(void) { for (;;) { while (state.load(boost::memory_order_relaxed) != unlocked_state) detail::pause(); uint32_t expected = unlocked_state; if (state.compare_exchange_weak(expected, locked_state, boost::memory_order_acquire)) break; } } bool try_lock(void) { uint32_t expected = unlocked_state; if (state.compare_exchange_strong(expected, locked_state, boost::memory_order_acquire)) return true; else return false; } void unlock(void) { assert(state.load(boost::memory_order_relaxed) == locked_state); state.store(unlocked_state, boost::memory_order_release); } void lock_shared(void) { for(;;) { /* with the mask, the cas will fail, locked exclusively */ uint32_t current_state = state.load(boost::memory_order_acquire) & reader_mask; const uint32_t next_state = current_state + 1; if (state.compare_exchange_weak(current_state, next_state, boost::memory_order_acquire)) break; detail::pause(); } } bool try_lock_shared(void) { /* with the mask, the cas will fail, locked exclusively */ uint32_t current_state = state.load(boost::memory_order_acquire) & reader_mask; const uint32_t next_state = current_state + 1; if (state.compare_exchange_strong(current_state, next_state, boost::memory_order_acquire)) return true; else return false; } void unlock_shared(void) { for(;;) { uint32_t current_state = state.load(boost::memory_order_relaxed); /* we don't need the reader_mask */ const uint32_t next_state = current_state - 1; if (state.compare_exchange_weak(current_state, uint32_t(next_state))) break; detail::pause(); } } private: boost::atomic state; }; class padded_rw_spinlock: public rw_spinlock { static const int padding_bytes = 64 - sizeof(rw_spinlock); boost::uint8_t padding[padding_bytes]; }; } /* namespace nova */ #endif /* RW_SPINLOCK_HPP */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-tt/nova-tt/semaphore_pthreads.hpp0000644000175000017500000000667211600461374031605 0ustar dandan// semaphore class, boost.thread wrapper // based on API proposed in N2043 // // Copyright (C) 2011 Tim Blechmann // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; see the file COPYING. If not, write to // the Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. #ifndef NOVA_TT_SEMAPHORE_PTHREADS_HPP #define NOVA_TT_SEMAPHORE_PTHREADS_HPP #include #include namespace nova { namespace nova_tt { /** semaphore class */ template class semaphore: boost::noncopyable { struct scoped_lock { scoped_lock(pthread_mutex_t & mutex): mutex(mutex) { pthread_mutex_lock(&mutex); } ~scoped_lock(void) { pthread_mutex_unlock(&mutex); } pthread_mutex_t & mutex; }; public: semaphore(int i=0): m_count(i) { pthread_mutex_init (&m_mutex, NULL); pthread_cond_init (&m_cond, NULL); } ~semaphore(void) { pthread_mutex_destroy (&m_mutex); pthread_cond_destroy (&m_cond); } /** signal semaphore */ void post(void) { scoped_lock lock(m_mutex); ++m_count; pthread_cond_signal(&m_cond); } /** wait until this semaphore is signaled */ void wait(void) { scoped_lock lock(m_mutex); while (m_count==0) pthread_cond_wait(&m_cond, &m_mutex); --m_count; } /** try to wait for the semaphore * * \return true, if the value can be decremented * false, otherweise */ bool try_wait(void) { int status = pthread_mutex_trylock(&m_mutex); if (status != 0) return false; bool ret; if (m_count == 0) ret = false; else { --m_count; ret = true; } pthread_mutex_unlock(&m_mutex); return ret; } /** try to wait for the semaphore until timeout * * \return true, if the value can be decremented * false, otherweise */ bool timed_wait(struct timespec const & absolute_timeout) { int status = pthread_mutex_timedlock (&m_mutex, &absolute_timeout); if (status) return false; while (m_count < 1) { int status = pthread_cond_timedwait (&m_cond, &m_mutex, &absolute_timeout); if (status) { pthread_mutex_unlock (&m_mutex); return false; } } m_count--; pthread_mutex_unlock (&m_mutex); return true; } int value(void) { scoped_lock lock(m_mutex); return m_count; } private: unsigned int m_count; pthread_mutex_t m_mutex; pthread_cond_t m_cond; }; } // namespace nova_tt } // namespace nova #endif /* NOVA_TT_SEMAPHORE_PTHREADS_HPP */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-tt/nova-tt/thread_affinity.hpp0000644000175000017500000000302611537776623031075 0ustar dandan// cross-platform wrapper for setting thread affinity // Copyright (C) 2009 Tim Blechmann // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; see the file COPYING. If not, write to // the Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. /** \file thread_affinity.hpp */ #ifndef NOVA_TT_THREAD_AFFINITY_HPP #define NOVA_TT_THREAD_AFFINITY_HPP #ifdef __linux__ #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif #include namespace nova { /** set the affinity of a thread * * \return true, if successful, false otherwise */ inline bool thread_set_affinity(int i) { pthread_t thread = pthread_self(); cpu_set_t cpuset; CPU_ZERO(&cpuset); int status = CPU_SET(i, &cpuset); int error = pthread_setaffinity_np(thread, sizeof(cpu_set_t), &cpuset); return error == 0; } } #else namespace nova { inline bool thread_set_affinity(int i) { return false; } } #endif #endif /* NOVA_TT_THREAD_AFFINITY_HPP */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-tt/nova-tt/name_thread.hpp0000644000175000017500000000227311576713061030175 0ustar dandan// cross-platform wrapper for thread naming // Copyright (C) 2011 Tim Blechmann // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; see the file COPYING. If not, write to // the Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. /** \file mlock.hpp */ #ifndef NOVA_TT_NAME_THREAD_HPP #define NOVA_TT_NAME_THREAD_HPP #include #ifdef __linux__ #include #endif /* __linux__ */ namespace nova { inline int name_thread(const char * name) { #ifdef __linux__ return prctl(PR_SET_NAME, name, 0, 0, 0); #else return ENOSYS; #endif } } #endif /* NOVA_TT_NAME_THREAD_HPP */ ././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-tt/nova-tt/thread_priority_pthread.hppSuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-tt/nova-tt/thread_priority_pthread.h0000644000175000017500000000465411512512334032300 0ustar dandan// // Copyright (C) 2010 Tim Blechmann // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; see the file COPYING. If not, write to // the Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. #ifndef NOVA_TT_THREAD_PRITORITY_PTHREAD_HPP #define NOVA_TT_THREAD_PRITORITY_PTHREAD_HPP #include #include #include #if (_POSIX_PRIORITY_SCHEDULING - 0) >= 200112L || (_POSIX_MEMLOCK - 0) >= 200112L #include #define NOVA_TT_PRIORITY_RT #endif namespace nova { inline int thread_priority(void) { pthread_t this_thread = pthread_self(); int policy; struct sched_param param; int status = pthread_getschedparam(this_thread, &policy, ¶m); assert(status == 0); return param.sched_priority; } namespace detail { inline std::pair thread_priority_interval(int policy) { int minimum = sched_get_priority_min(policy); int maximum = sched_get_priority_max(policy); return std::make_pair(minimum, maximum); } inline bool thread_set_priority(int policy, int priority) { pthread_t this_thread = pthread_self(); struct sched_param parm; parm.sched_priority = priority; int status = pthread_setschedparam(this_thread, policy, &parm); return status == 0; } } /* namespace detail */ inline std::pair thread_priority_interval(void) { return detail::thread_priority_interval(SCHED_OTHER); } inline bool thread_set_priority(int priority) { return detail::thread_set_priority(SCHED_OTHER, priority); } #ifdef NOVA_TT_PRIORITY_RT inline std::pair thread_priority_interval_rt(void) { return detail::thread_priority_interval(SCHED_FIFO); } inline bool thread_set_priority_rt(int priority) { return detail::thread_set_priority(SCHED_FIFO, priority); } #endif } /* namespace nova */ #endif /* NOVA_TT_THREAD_PRITORITY_PTHREAD_HPP */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-tt/nova-tt/semaphore_posix.hpp0000644000175000017500000000476211600461374031133 0ustar dandan// semaphore class, posix wrapper // based on API proposed in N2043 // // Copyright (C) 2008, 2009 Tim Blechmann // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; see the file COPYING. If not, write to // the Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. #ifndef NOVA_TT_SEMAPHORE_POSIX_HPP #define NOVA_TT_SEMAPHORE_POSIX_HPP #include #include #include #include namespace nova { namespace nova_tt { /** semaphore class */ template class semaphore: boost::noncopyable { public: semaphore(unsigned int i=0) { sem_init(&sem, 0, i); } ~semaphore(void) { sem_destroy(&sem); } /** signal semaphore */ void post(void) { int status = sem_post(&sem); assert(status == 0); } /** wait until this semaphore is signaled */ void wait(void) { int status = sem_wait(&sem); assert(status == 0); } /** try to wait for the semaphore * * \return true, if the value can be decremented * false, otherweise */ bool try_wait(void) { int status = sem_trywait(&sem); return status == 0; } /** try to wait for the semaphore until timeout * * \return true, if the value can be decremented * false, otherweise */ bool timed_wait(struct timespec const & absolute_timeout) { BOOST_STATIC_ASSERT(has_timed_wait); int status = sem_timedwait(&sem, &absolute_timeout); return status == 0; } int value(void) { int ret; bool status = sem_getvalue(&sem, &ret); assert(status == 0); if (ret < 0) return 0; else return ret; } private: sem_t sem; }; } // namespace nova_tt } // namespace nova #endif /* NOVA_TT_SEMAPHORE_POSIX_HPP */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-tt/nova-tt/semaphore_mach.hpp0000644000175000017500000000727311605121506030674 0ustar dandan// semaphore class, mach wrapper // based on API proposed in N2043 // // Copyright (C) 2009 Tim Blechmann // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; see the file COPYING. If not, write to // the Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. #ifndef NOVA_TT_SEMAPHORE_MACH_HPP #define NOVA_TT_SEMAPHORE_MACH_HPP #include #include #include #include #include #include #include #include namespace nova { namespace nova_tt { /** semaphore class */ template class semaphore: boost::noncopyable { public: semaphore(unsigned int i=0) { kern_return_t status = semaphore_create(mach_task_self(), &sem, SYNC_POLICY_FIXED_PRIORITY, i); assert(status == KERN_SUCCESS); } ~semaphore(void) { kern_return_t status = semaphore_destroy(mach_task_self(), sem); assert(status == KERN_SUCCESS); } /** signal semaphore */ void post(void) { kern_return_t status = semaphore_signal(sem); assert(status == KERN_SUCCESS); } /** wait until this semaphore is signaled */ void wait(void) { kern_return_t status = semaphore_wait(sem); assert(status == KERN_SUCCESS); } /** try to wait for the semaphore * * \return true, if the value can be decremented * false, otherweise */ bool try_wait(void) { #ifndef __LP64__ /* is it possible to implement this with the mach semaphore api? */ kern_return_t status = semaphore_wait_noblock(&sem); #else mach_timespec_t wait_time = {0, 0}; kern_return_t status = semaphore_timedwait(sem, wait_time); #endif return (status == KERN_SUCCESS); } /** try to wait for the semaphore until timeout * * \return true, if the value can be decremented * false, otherweise */ bool timed_wait(struct timespec const & absolute_timeout) { BOOST_STATIC_ASSERT(has_timed_wait); clock_t clk = clock(); for (;;) { if (try_wait()) return true; timespec now; #if _POSIX_TIMERS > 0 int status = clock_gettime(clk, &now); assert(status); #else struct timeval tv; gettimeofday(&tv, NULL); now.tv_sec = tv.tv_sec; now.tv_nsec = tv.tv_usec*1000; #endif if (now.tv_sec > absolute_timeout.tv_sec || (now.tv_sec == absolute_timeout.tv_sec || now.tv_nsec >= absolute_timeout.tv_nsec)) return false; // timeout timespec wait_time; wait_time.tv_nsec = 100000; wait_time.tv_sec = 0; timespec remain; nanosleep(&wait_time, &remain); } } int value(void) { /* is it possible to implement this with the mach semaphore api? */ assert(false); } private: semaphore_t sem; }; } // namespace nova_tt } // namespace nova #endif /* NOVA_TT_SEMAPHORE_MACH_HPP */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-tt/nova-tt/thread_priority_mach.hpp0000644000175000017500000000476611512512334032125 0ustar dandan// // Copyright (C) 2010 Tim Blechmann // adapted from code by Stephane Letz // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; see the file COPYING. If not, write to // the Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. #ifndef NOVA_TT_THREAD_PRITORITY_MACH_HPP #define NOVA_TT_THREAD_PRITORITY_MACH_HPP #include #include #include #include #include #include #define NOVA_TT_PRIORITY_PERIOD_COMPUTATION_CONSTRAINT namespace nova { inline int thread_priority(void) { pthread_t this_thread = pthread_self(); int policy; struct sched_param param; int status = pthread_getschedparam(this_thread, &policy, ¶m); assert(status == 0); return param.sched_priority; } inline std::pair thread_priority_interval(void) { return std::make_pair(0, 0); } inline bool thread_set_priority(int priority) { /* for non-realtime priorities, we can use */ pthread_t this_thread = pthread_self(); struct sched_param parm; parm.sched_priority = priority; int status = pthread_setschedparam(this_thread, SCHED_OTHER, &parm); return status == 0; } inline bool thread_set_priority_rt(int period, int computation, int constraint, bool preemptible) { pthread_t this_thread = pthread_self(); thread_time_constraint_policy_data_t policy; policy.period = period; policy.computation = computation; policy.constraint = constraint; policy.preemptible = 0; kern_return_t res = thread_policy_set(pthread_mach_thread_np(this_thread), THREAD_TIME_CONSTRAINT_POLICY, (thread_policy_t)&policy, THREAD_TIME_CONSTRAINT_POLICY_COUNT); return res == KERN_SUCCESS; } } /* namespace nova */ #endif /* NOVA_TT_THREAD_PRITORITY_MACH_HPP */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-tt/nova-tt/spin_lock.hpp0000664000175000017500000000455012110473257027704 0ustar dandan// spin_lock class // Copyright (C) 2010, 2011 Tim Blechmann // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; see the file COPYING. If not, write to // the Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. /** \file spin_lock.hpp */ #ifndef NOVA_TT_SPIN_LOCK_HPP #define NOVA_TT_SPIN_LOCK_HPP #include #include #include #include #include "pause.hpp" namespace nova { /** spinlock, implements the Lockable concept */ class spin_lock: public boost::noncopyable { static const bool locked_state = 0; static const bool unlocked_state = 1; boost::atomic state; public: struct scoped_lock { scoped_lock(spin_lock & sl): sl_(sl) { sl_.lock(); } ~scoped_lock(void) { sl_.unlock(); } spin_lock & sl_; }; spin_lock(void): state(unlocked_state) {} ~spin_lock(void) { assert (state == unlocked_state); } void lock(void) { for(;;) { while (state.load(boost::memory_order_relaxed) != unlocked_state) detail::pause(); if (try_lock()) break; } } bool try_lock(void) { return state.exchange(locked_state, boost::memory_order_acquire) == unlocked_state; } void unlock(void) { assert(state.load(boost::memory_order_relaxed) == locked_state); state.store(unlocked_state, boost::memory_order_release); } }; struct padded_spin_lock: public spin_lock { static const int padding_bytes = 64 - sizeof(spin_lock); boost::uint8_t padding[padding_bytes]; }; } /* namespace nova */ #endif /* NOVA_TT_SPIN_LOCK_HPP */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-tt/nova-tt/branch_hints.hpp0000644000175000017500000000254111600461374030361 0ustar dandan// branch hints // Copyright (C) 2007, 2009 Tim Blechmann // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; see the file COPYING. If not, write to // the Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. /** \file branch_hints.hpp */ #ifndef NOVA_TT_BRANCH_HINTS_HPP #define NOVA_TT_BRANCH_HINTS_HPP namespace nova { namespace nova_tt { /** \brief hint for the branch prediction */ inline bool likely(bool expr) { #ifdef __GNUC__ return __builtin_expect(expr, true); #else return expr; #endif } /** \brief hint for the branch prediction */ inline bool unlikely(bool expr) { #ifdef __GNUC__ return __builtin_expect(expr, false); #else return expr; #endif } } /* namespace nova-tt */ } /* namespace nova */ #endif /* NOVA_TT_BRANCH_HINTS_HPP */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-tt/nova-tt/pause.hpp0000664000175000017500000000240712054714242027036 0ustar dandan// spin_lock class // Copyright (C) 2010, 2011 Tim Blechmann // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; see the file COPYING. If not, write to // the Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. /** \file spin_lock.hpp */ #ifndef NOVA_TT_PAUSE_HPP #define NOVA_TT_PAUSE_HPP #ifdef __SSE2__ #include #endif namespace nova { namespace detail { #ifdef __SSE2__ static inline void pause() { _mm_pause(); } #elif defined(__GNUC__) && ( defined(__i386__) || defined(__x86_64__) ) static inline void pause() { __asm__ __volatile__( "rep; nop" : : : "memory" ); } #else static inline void pause() {} #endif }} #endif /* NOVA_TT_PAUSE_HPP */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-tt/nova-tt/rw_mutex.hpp0000664000175000017500000001374612054714242027603 0ustar dandan// read-write mutex class // Copyright (C) 2007, 2009, 2012 Tim Blechmann // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; see the file COPYING. If not, write to // the Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. /** \file rw_mutex.hpp */ #ifndef NOVA_TT_RW_MUTEX_HPP #define NOVA_TT_RW_MUTEX_HPP #include #include #include "boost/thread/shared_mutex.hpp" #ifdef _WIN32 #include "boost/thread/shared_mutex.hpp" #endif #include "pthread.h" #include "boost/thread/locks.hpp" #include "branch_hints.hpp" namespace nova { namespace nova_tt { /** non-recursive reader-writer mutex class, implementing a subset of the SharedLockable concept * * except for bool timed_lock_shared(boost::system_time const& abs_time) all SharedLockable members * are provided * */ class nonrecursive_rw_mutex { public: nonrecursive_rw_mutex(void) { int status = pthread_rwlock_init(&rwlock, NULL); assert(status == 0); } ~nonrecursive_rw_mutex(void) { int status = pthread_rwlock_destroy(&rwlock); assert(status == 0); } void lock(void) { int status = pthread_rwlock_wrlock(&rwlock); assert(status == 0); } bool try_lock(void) { int status = pthread_rwlock_trywrlock(&rwlock); switch (status) { case 0: return true; case EBUSY: return false; case EDEADLK: default: assert(false); return false; } } /* glibc seems to be buggy ... don't unlock more often than it has been locked * * http://sourceware.org/bugzilla/show_bug.cgi?id=4825 */ void unlock(void) { int status = pthread_rwlock_unlock(&rwlock); assert(status == 0); } void lock_shared(void) { int status = pthread_rwlock_rdlock(&rwlock); assert(status == 0); } bool try_lock_shared(void) { int status = pthread_rwlock_tryrdlock(&rwlock); if (status == 0) return true; if (status == EBUSY) return false; assert(false); return false; } void unlock_shared(void) { unlock(); } protected: pthread_rwlock_t rwlock; public: typedef boost::unique_lock unique_lock; typedef boost::shared_lock shared_lock; }; #ifdef _WIN32 // we cannot use the posix-based rw_mutex, as we cannot access the write_id, so we use boost's implementation instead typedef boost::shared_mutex rw_mutex; #else /** reader-writer mutex class, implementing a subset of the SharedLockable concept * * except for bool timed_lock_shared(boost::system_time const& abs_time) all SharedLockable members * are provided * */ class rw_mutex: public nonrecursive_rw_mutex { public: typedef boost::unique_lock unique_lock; typedef boost::shared_lock shared_lock; rw_mutex(void): writelock_count(0), writer_id(0) {} ~rw_mutex(void) { assert(writer_id == 0); } void lock(void) { int status = pthread_rwlock_wrlock(&rwlock); switch (status) { case 0: writer_id = pthread_self(); assert(writelock_count == 0); case EDEADLK: assert(writer_id == pthread_self()); ++writelock_count; return; default: assert(false); } } bool try_lock(void) { int status = pthread_rwlock_trywrlock(&rwlock); switch (status) { case 0: assert(writer_id == 0); assert(writelock_count == 0); writer_id = pthread_self(); ++writelock_count; return true; case EDEADLK: assert(writer_id == pthread_self()); case EBUSY: if (writer_id == pthread_self()) { assert(writelock_count > 0); ++writelock_count; return true; } else { assert(writer_id != pthread_self()); return false; } default: assert(false); return false; } } void unlock(void) { assert(writelock_count > 0); assert(writer_id); if (--writelock_count == 0) { writer_id = 0; nonrecursive_rw_mutex::unlock(); } } void lock_shared(void) { if (unlikely(writer_id == pthread_self())) /* we're already owning it as writer */ return; nonrecursive_rw_mutex::lock_shared(); } bool try_lock_shared(void) { if (unlikely(writer_id == pthread_self())) /* we're already owning it as writer */ return true; return nonrecursive_rw_mutex::try_lock_shared(); } void unlock_shared(void) { if (unlikely(writer_id == pthread_self())) /* we're owning it as writer */ return; int status = pthread_rwlock_unlock(&rwlock); assert(status == 0); } private: unsigned int writelock_count; pthread_t writer_id; /* id of the writer thread * set during the write lock */ }; #endif } /* namespace nova-tt */ using nova_tt::nonrecursive_rw_mutex; using nova_tt::rw_mutex; } /* namespace nova */ #endif /* NOVA_TT_RW_MUTEX_HPP */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-tt/nova-tt/dummy_mutex.hpp0000644000175000017500000000277011512512334030273 0ustar dandan// dummy mutex class // Copyright (C) 2008 Tim Blechmann // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; see the file COPYING. If not, write to // the Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. /** \file dummy_mutex.hpp */ #ifndef NOVA_TT_DUMMY_MUTEX_HPP #define NOVA_TT_DUMMY_MUTEX_HPP #include #include namespace nova { /** dummy mutex class, implementing the TryMutex concept * * all operations are noops * */ class dummy_mutex: public boost::noncopyable { public: /** noop */ dummy_mutex(void) {} /** noop */ ~dummy_mutex(void) {} /** noop */ void lock(void) {} /** noop */ bool try_lock(void) { return true; } /** noop */ void unlock(void) {} typedef boost::lock_guard scoped_lock; }; } /* namespace nova */ #endif /* NOVA_TT_DUMMY_MUTEX_HPP */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-tt/nova-tt/mlock.hpp0000664000175000017500000000235611757463151027042 0ustar dandan// cross-platform wrapper for memory locking // Copyright (C) 2009 Tim Blechmann // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; see the file COPYING. If not, write to // the Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. /** \file mlock.hpp */ #ifndef NOVA_TT_MLOCK_HPP #define NOVA_TT_MLOCK_HPP #if defined(unix) || defined(__unix__) || defined(__unix) # include #endif #ifdef _POSIX_MEMLOCK_RANGE #include #else inline int mlock(const void * addr, size_t len) { return 0; } inline int munlock(const void * addr, size_t len) { return 0; } #endif /* _POSIX_MEMLOCK_RANGE */ #endif /* NOVA_TT_MLOCK_HPP */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-tt/nova-tt/semaphore.hpp0000664000175000017500000000346012110473257027705 0ustar dandan// semaphore class // based on API proposed in N2043 // // Copyright (C) 2009 Tim Blechmann // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; see the file COPYING. If not, write to // the Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. /** \file semaphore.hpp */ #ifndef NOVA_TT_SEMAPHORE_HPP #define NOVA_TT_SEMAPHORE_HPP #if defined(unix) || defined(__unix__) || defined(__unix) # include #endif #if (_POSIX_SEMAPHORES - 0) >= 200112L #include "semaphore_posix.hpp" // mach semaphores seem to be broken // #elif defined(__APPLE__) // #include "semaphore_mach.hpp" #elif defined(_POSIX_TIMEOUTS) && (_POSIX_TIMEOUTS - 200112L) >= 0L #include "semaphore_pthreads.hpp" #else #include "semaphore_boost_fallback.hpp" #endif namespace nova { typedef nova_tt::semaphore semaphore; typedef nova_tt::semaphore timed_semaphore; /** helper class for semaphore synchronization * * destructor will wait for the semaphore to be signaled */ template struct semaphore_sync { semaphore_sync(Semaphore & sem): sem(sem) {} ~semaphore_sync(void) { sem.wait(); } Semaphore & sem; }; } /* namespace nova */ #endif /* NOVA_TT_SEMAPHORE_HPP */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-tt/testsuite/0000775000175000017500000000000012110505246025641 5ustar dandanSuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-tt/testsuite/spin_lock_test.cpp0000644000175000017500000000120111512512334031356 0ustar dandan#define BOOST_TEST_MAIN #include #include "spin_lock.hpp" #include using namespace nova; using namespace boost; namespace { const int thread_count = 8; const int total_count = 5000; int count = 0; spin_lock sl; void test_fn(void) { for (int i = 0; i != total_count; ++i) { spin_lock::scoped_lock lock(sl); ++count; } } } BOOST_AUTO_TEST_CASE( spinlock_test ) { thread_group g; for (int i = 0; i != thread_count; ++i) g.create_thread(test_fn); g.join_all(); BOOST_REQUIRE_EQUAL(count, thread_count * total_count); } SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-tt/testsuite/semaphore_test.cpp0000644000175000017500000000260711600461374031400 0ustar dandan#define BOOST_TEST_MAIN #include #include "semaphore.hpp" #include using namespace nova; using namespace boost; inline timespec ptime_to_timespec (const boost::posix_time::ptime &tm) { const boost::posix_time::ptime epoch(boost::gregorian::date(1970,1,1)); boost::posix_time::time_duration duration (tm - epoch); timespec ts; ts.tv_sec = duration.total_seconds(); ts.tv_nsec = duration.total_nanoseconds() % 1000000000; return ts; } BOOST_AUTO_TEST_CASE( sem_timed_wait ) { timed_semaphore sem; system_time const timeout = get_system_time() + posix_time::milliseconds(500); struct timespec timeoutspec = ptime_to_timespec(timeout); int status = sem.timed_wait(timeoutspec); BOOST_REQUIRE(!status); } namespace { const int thread_count = 8; const int iterations_per_thread = 100000; int count = 0; semaphore s(1); void test_fn(void) { for (int i = 0; i != iterations_per_thread; ++i) { s.wait(); ++count; s.post(); } } } BOOST_AUTO_TEST_CASE( sem_test ) { thread_group g; for (int i = 0; i != thread_count; ++i) g.create_thread(test_fn); g.join_all(); BOOST_REQUIRE_EQUAL(count, iterations_per_thread * thread_count); } BOOST_AUTO_TEST_CASE( sem_sync_test ) { semaphore sem(0); sem.post(); semaphore_sync sync(sem); } SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-tt/testsuite/rw_mutex_test.cpp0000664000175000017500000000555011715222750031271 0ustar dandan#define BOOST_TEST_MAIN #include #include #include #include "rw_mutex.hpp" using namespace nova; const int thread_count = 8; const int total_count = 30000; template void nonrecursive_tests(void) { Mutex mut; typedef boost::shared_lock scoped_read_lock; mut.lock_shared(); mut.lock_shared(); BOOST_REQUIRE_EQUAL( mut.try_lock(), false ); BOOST_REQUIRE_EQUAL( mut.try_lock_shared(), true ); { scoped_read_lock lock(mut); } mut.unlock_shared(); mut.unlock_shared(); mut.unlock_shared(); BOOST_REQUIRE_EQUAL( mut.try_lock(), true ); mut.unlock(); BOOST_REQUIRE_EQUAL( mut.try_lock_shared(), true ); mut.unlock_shared(); } template void recursive_tests(void) { Mutex mut; typedef typename Mutex::shared_lock scoped_read_lock; mut.lock_shared(); mut.lock_shared(); BOOST_REQUIRE_EQUAL( mut.try_lock(), false ); BOOST_REQUIRE_EQUAL( mut.try_lock_shared(), true ); { scoped_read_lock lock(mut); } mut.unlock_shared(); mut.unlock_shared(); mut.unlock_shared(); BOOST_REQUIRE_EQUAL( mut.try_lock(), true ); mut.lock(); mut.lock(); BOOST_REQUIRE_EQUAL( mut.try_lock_shared(), true ); mut.unlock_shared(); mut.unlock(); mut.unlock(); mut.unlock(); } BOOST_AUTO_TEST_CASE( rw_mutex_test ) { nonrecursive_tests(); nonrecursive_tests(); } namespace { rw_mutex mut; typedef boost::shared_lock scoped_read_lock; typedef boost::unique_lock scoped_write_lock; void sleep () { boost::thread::yield(); } void test_fn(void) { static rw_mutex mut; for (int i = 0; i != total_count; ++i) { /* recursive read locks */ { scoped_read_lock lock(mut); sleep(); { scoped_read_lock lock(mut); sleep(); } sleep(); } /* recursive write locks */ { scoped_write_lock lock(mut); sleep(); { scoped_write_lock lock(mut); sleep(); } sleep(); } /* nested read / write locks */ { scoped_write_lock lock(mut); sleep(); { scoped_read_lock lock(mut); sleep(); } sleep(); } } } } BOOST_AUTO_TEST_CASE( rw_mutex_test_2 ) { boost::thread_group threads; for (int i = 0; i != thread_count; ++i) threads.create_thread(&test_fn); threads.join_all(); } SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-tt/testsuite/mlock_test.cpp0000644000175000017500000000040511512512334030507 0ustar dandan#define BOOST_TEST_MAIN #include #include "mlock.hpp" BOOST_AUTO_TEST_CASE( mlock_test ) { long size = 1<<16; char * data = new char[size]; mlock((void*)data, size); munlock(data, size); delete[] data; }././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-tt/testsuite/thread_priority_test.cppSuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-tt/testsuite/thread_priority_test.cp0000644000175000017500000000134211616607731032446 0ustar dandan#define BOOST_TEST_MAIN #include #include #include #include "thread_priority.hpp" using namespace nova; using namespace std; BOOST_AUTO_TEST_CASE( priority_test ) { int current_priority = thread_priority(); int low, high; boost::tie(low, high) = thread_priority_interval(); #ifdef NOVA_TT_PRIORITY_RT int low_rt, high_rt; boost::tie(low_rt, high_rt) = thread_priority_interval_rt(); BOOST_CHECK(thread_set_priority_rt(low_rt)); #endif #ifdef NOVA_TT_PRIORITY_PERIOD_COMPUTATION_CONSTRAINT int ns_per_tick = 1e9 / 44100 * 64; BOOST_CHECK(thread_set_priority_rt(ns_per_tick, ns_per_tick - 2, ns_per_tick - 1, false)); #endif } SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-tt/testsuite/nanosleep.cpp0000644000175000017500000000027011512512334030327 0ustar dandan#define BOOST_TEST_MAIN #include #include "nanosleep.hpp" BOOST_AUTO_TEST_CASE( nanosleep ) { nanosleep(0, 100000); nanosleep(3, 200); } SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-tt/testsuite/rw_spinlock_test.cpp0000664000175000017500000000255011715222750031746 0ustar dandan#define BOOST_TEST_MAIN #include #include #include "rw_spinlock.hpp" BOOST_AUTO_TEST_CASE( rw_spinlock_test ) { using namespace nova; rw_spinlock mut; mut.lock_shared(); mut.lock_shared(); BOOST_REQUIRE_EQUAL( mut.try_lock(), false ); BOOST_REQUIRE_EQUAL( mut.try_lock_shared(), true ); { rw_spinlock::shared_lock lock(mut); } mut.unlock_shared(); mut.unlock_shared(); mut.unlock_shared(); BOOST_REQUIRE_EQUAL( mut.try_lock(), true ); BOOST_REQUIRE_EQUAL( mut.try_lock_shared(), false ); mut.unlock(); } namespace { using namespace nova; rw_spinlock guard; uint32_t dummy = 0; uint32_t counter = 0; const unsigned int iterations = 20000; const unsigned int thread_count = 8; void test_fn(void) { for (unsigned int i = 0; i != iterations; ++i) { guard.lock(); counter += 1; guard.unlock(); for (int j = 0; j != 100; ++j) { guard.lock_shared(); dummy += counter; guard.unlock_shared(); } } } } BOOST_AUTO_TEST_CASE( rw_spinlock_test_2 ) { boost::thread_group threads; for (unsigned int i = 0; i != thread_count; ++i) threads.create_thread(&test_fn); threads.join_all(); BOOST_REQUIRE_EQUAL(counter, (iterations * thread_count)); } SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-tt/testsuite/CMakeLists.txt0000664000175000017500000000103712110473257030410 0ustar dandanfile(GLOB headers ../nova-tt/*hpp) set(tests mlock_test.cpp nanosleep_test.cpp rw_mutex_test.cpp rw_spinlock_test.cpp semaphore_test.cpp spin_lock_test.cpp thread_affinity_test.cpp thread_priority_test.cpp ) foreach(test ${tests}) string(REPLACE .cpp "" test_name ${test} ) add_executable(${test_name} ${test} ${headers}) target_link_libraries(${test_name} pthread ${Boost_THREAD_LIBRARIES} ${Boost_SYSTEM_LIBRARY}) add_test(${test_name}_run ${EXECUTABLE_OUTPUT_PATH}/${test_name}) endforeach(test) SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-tt/testsuite/nanosleep_test.cpp0000644000175000017500000000032411512512334031366 0ustar dandan#define BOOST_TEST_MAIN #include #include "nanosleep.hpp" using namespace nova; BOOST_AUTO_TEST_CASE( nanosleep_test ) { nanosleep(100000); nanosleep(2000000000); } ././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-tt/testsuite/thread_affinity_test.cppSuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-tt/testsuite/thread_affinity_test.cp0000644000175000017500000000030111512512334032355 0ustar dandan#define BOOST_TEST_MAIN #include "thread_affinity.hpp" #include BOOST_AUTO_TEST_CASE( affinity_test ) { BOOST_REQUIRE(nova::thread_set_affinity(0)); } SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-tt/CMakeLists.txt0000664000175000017500000000046612054714242026363 0ustar dandanPROJECT(nova-tt) cmake_minimum_required(VERSION 2.6) set(Boost_USE_MULTITHREADED ON) find_package( Boost 1.50.0 COMPONENTS thread system test_exec_monitor ) enable_testing() include_directories (boost_lockfree) include_directories (nova-tt) find_library(pthread pthread) add_subdirectory (testsuite) SuperCollider-3.6.3-Source-linux~repack/external_libraries/nova-tt/nova-tt.kdev40000644000175000017500000000006011512512334026132 0ustar dandan[Project] Manager=KDevCMakeManager Name=nova-tt SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/0000775000175000017500000000000012110505246024376 5ustar dandanSuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/util/0000775000175000017500000000000012110505246025353 5ustar dandanSuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/util/api.cpp0000664000175000017500000000777611723131175026656 0ustar dandan// a sketch of what the new API might look like #include "yaml-cpp/yaml.h" #include int main() { { // test.yaml // - foo // - primes: [2, 3, 5, 7, 11] // odds: [1, 3, 5, 7, 9, 11] // - [x, y] // move-like semantics YAML::Value root = YAML::Parse("test.yaml"); std::cout << root[0].as(); // "foo" std::cout << str(root[0]); // "foo", shorthand? std::cout << root[1]["primes"][3].as(); // "7" std::cout << root[1]["odds"][6].as(); // throws? root[2].push_back(5); root[3] = "Hello, World"; root[0].reset(); root[0]["key"] = "value"; std::cout << root; // # not sure about formatting // - {key: value} // - primes: [2, 3, 5, 7, 11] // odds: [1, 3, 5, 7, 9, 11] // - [x, y, 5] // - Hello, World } { // for all copy-like commands, think of python's "name/value" semantics YAML::Value root = "Hello"; // Hello root = YAML::Sequence(); // [] root[0] = 0; // [0] root[2] = "two"; // [0, ~, two] # forces root[1] to be initialized to null YAML::Value other = root; // both point to the same thing other[0] = 5; // now root[0] is 0 also other.push_back(root); // &1 [5, ~, two, *1] other[3][0] = 0; // &1 [0, ~, two, *1] # since it's a true alias other.push_back(Copy(root)); // &1 [0, ~, two, *1, &2 [0, ~, two, *2]] other[4][0] = 5; // &1 [0, ~, two, *1, &2 [5, ~, two, *2]] # they're really different } { YAML::Value node; // ~ node[0] = 1; // [1] # auto-construct a sequence node["key"] = 5; // {0: 1, key: 5} # auto-turn it into a map node.push_back(10); // error, can't turn a map into a sequence node.erase("key"); // {0: 1} # still a map, even if we remove the key that caused the problem node = "Hello"; // Hello # assignment overwrites everything, so it's now just a plain scalar } { YAML::Value map; // ~ map[3] = 1; // {3: 1} # auto-constructs a map, *not* a sequence YAML::Value seq; // ~ seq = YAML::Sequence(); // [] seq[3] = 1; // [~, ~, ~, 1] } { YAML::Value node; // ~ node[0] = node; // &1 [*1] # fun stuff } { YAML::Value node; YAML::Value subnode = node["key"]; // 'subnode' is not instantiated ('node' is still null) subnode = "value"; // {key: value} # now it is YAML::Value subnode2 = node["key2"]; node["key3"] = subnode2; // subnode2 is still not instantiated, but node["key3"] is "pseudo" aliased to it subnode2 = "monkey"; // {key: value, key2: &1 monkey, key3: *1} # bam! it instantiates both } { YAML::Value seq = YAML::Sequence(); seq[0] = "zero"; // [zero] seq[1] = seq[0]; // [&1 zero, *1] seq[0] = seq[1]; // [&1 zero, *1] # no-op (they both alias the same thing, so setting them equal is nothing) Is(seq[0], seq[1]); // true seq[1] = "one"; // [&1 one, *1] UnAlias(seq[1]); // [one, one] Is(seq[0], seq[1]); // false } { YAML::Value root; root.push_back("zero"); root.push_back("one"); root.push_back("two"); YAML::Value two = root[2]; root = "scalar"; // 'two' is still "two", even though 'root' is "scalar" (the sequence effectively no longer exists) // Note: in all likelihood, the memory for nodes "zero" and "one" is still allocated. How can it go away? Weak pointers? } { YAML::Value root; // ~ root[0] = root; // &1 [*1] root[0] = 5; // [5] } { YAML::Value root; YAML::Value key; key["key"] = "value"; root[key] = key; // &1 {key: value}: *1 } { YAML::Value root; root[0] = "hi"; root[1][0] = "bye"; root[1][1] = root; // &1 [hi, [bye, *1]] # root YAML::Value sub = root[1]; // &1 [bye, [hi, *1]] # sub root = "gone"; // [bye, gone] # sub } return 0; } SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/util/CMakeLists.txt0000664000175000017500000000010611723131175030115 0ustar dandanadd_executable(parse parse.cpp) target_link_libraries(parse yaml-cpp) SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/util/parse.cpp0000664000175000017500000000256011723131175027201 0ustar dandan#include "yaml-cpp/yaml.h" #include "yaml-cpp/eventhandler.h" #include #include #include struct Params { bool hasFile; std::string fileName; }; Params ParseArgs(int argc, char **argv) { Params p; std::vector args(argv + 1, argv + argc); return p; } class NullEventHandler: public YAML::EventHandler { public: virtual void OnDocumentStart(const YAML::Mark&) {} virtual void OnDocumentEnd() {} virtual void OnNull(const YAML::Mark&, YAML::anchor_t) {} virtual void OnAlias(const YAML::Mark&, YAML::anchor_t) {} virtual void OnScalar(const YAML::Mark&, const std::string&, YAML::anchor_t, const std::string&) {} virtual void OnSequenceStart(const YAML::Mark&, const std::string&, YAML::anchor_t) {} virtual void OnSequenceEnd() {} virtual void OnMapStart(const YAML::Mark&, const std::string&, YAML::anchor_t) {} virtual void OnMapEnd() {} }; void parse(std::istream& input) { try { YAML::Parser parser(input); YAML::Node doc; while(parser.GetNextDocument(doc)) { YAML::Emitter emitter; emitter << doc; std::cout << emitter.c_str() << "\n"; } } catch(const YAML::Exception& e) { std::cerr << e.what() << "\n"; } } int main(int argc, char **argv) { Params p = ParseArgs(argc, argv); if(argc > 1) { std::ifstream fin; fin.open(argv[1]); parse(fin); } else { parse(std::cin); } return 0; } SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/src/0000775000175000017500000000000012110505246025165 5ustar dandanSuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/src/emitter.cpp0000664000175000017500000005231511723131175027355 0ustar dandan#include "yaml-cpp/emitter.h" #include "emitterstate.h" #include "emitterutils.h" #include "indentation.h" #include "yaml-cpp/exceptions.h" #include namespace YAML { Emitter::Emitter(): m_pState(new EmitterState) { } Emitter::~Emitter() { } const char *Emitter::c_str() const { return m_stream.str(); } unsigned Emitter::size() const { return m_stream.pos(); } // state checking bool Emitter::good() const { return m_pState->good(); } const std::string Emitter::GetLastError() const { return m_pState->GetLastError(); } // global setters bool Emitter::SetOutputCharset(EMITTER_MANIP value) { return m_pState->SetOutputCharset(value, GLOBAL); } bool Emitter::SetStringFormat(EMITTER_MANIP value) { return m_pState->SetStringFormat(value, GLOBAL); } bool Emitter::SetBoolFormat(EMITTER_MANIP value) { bool ok = false; if(m_pState->SetBoolFormat(value, GLOBAL)) ok = true; if(m_pState->SetBoolCaseFormat(value, GLOBAL)) ok = true; if(m_pState->SetBoolLengthFormat(value, GLOBAL)) ok = true; return ok; } bool Emitter::SetIntBase(EMITTER_MANIP value) { return m_pState->SetIntFormat(value, GLOBAL); } bool Emitter::SetSeqFormat(EMITTER_MANIP value) { return m_pState->SetFlowType(GT_SEQ, value, GLOBAL); } bool Emitter::SetMapFormat(EMITTER_MANIP value) { bool ok = false; if(m_pState->SetFlowType(GT_MAP, value, GLOBAL)) ok = true; if(m_pState->SetMapKeyFormat(value, GLOBAL)) ok = true; return ok; } bool Emitter::SetIndent(unsigned n) { return m_pState->SetIndent(n, GLOBAL); } bool Emitter::SetPreCommentIndent(unsigned n) { return m_pState->SetPreCommentIndent(n, GLOBAL); } bool Emitter::SetPostCommentIndent(unsigned n) { return m_pState->SetPostCommentIndent(n, GLOBAL); } bool Emitter::SetFloatPrecision(unsigned n) { return m_pState->SetFloatPrecision(n, GLOBAL); } bool Emitter::SetDoublePrecision(unsigned n) { return m_pState->SetDoublePrecision(n, GLOBAL); } // SetLocalValue // . Either start/end a group, or set a modifier locally Emitter& Emitter::SetLocalValue(EMITTER_MANIP value) { if(!good()) return *this; switch(value) { case BeginDoc: EmitBeginDoc(); break; case EndDoc: EmitEndDoc(); break; case BeginSeq: EmitBeginSeq(); break; case EndSeq: EmitEndSeq(); break; case BeginMap: EmitBeginMap(); break; case EndMap: EmitEndMap(); break; case Key: EmitKey(); break; case Value: EmitValue(); break; case TagByKind: EmitKindTag(); break; case Newline: EmitNewline(); break; default: m_pState->SetLocalValue(value); break; } return *this; } Emitter& Emitter::SetLocalIndent(const _Indent& indent) { m_pState->SetIndent(indent.value, LOCAL); return *this; } Emitter& Emitter::SetLocalPrecision(const _Precision& precision) { if(precision.floatPrecision >= 0) m_pState->SetFloatPrecision(precision.floatPrecision, LOCAL); if(precision.doublePrecision >= 0) m_pState->SetDoublePrecision(precision.doublePrecision, LOCAL); return *this; } // GotoNextPreAtomicState // . Runs the state machine, emitting if necessary, and returns 'true' if done (i.e., ready to emit an atom) bool Emitter::GotoNextPreAtomicState() { if(!good()) return true; unsigned curIndent = m_pState->GetCurIndent(); EMITTER_STATE curState = m_pState->GetCurState(); switch(curState) { // document-level case ES_WAITING_FOR_DOC: m_pState->SwitchState(ES_WRITING_DOC); return true; case ES_WRITING_DOC: return true; case ES_DONE_WITH_DOC: EmitBeginDoc(); return false; // block sequence case ES_WAITING_FOR_BLOCK_SEQ_ENTRY: m_stream << IndentTo(curIndent) << "-"; m_pState->RequireSoftSeparation(); m_pState->SwitchState(ES_WRITING_BLOCK_SEQ_ENTRY); return true; case ES_WRITING_BLOCK_SEQ_ENTRY: return true; case ES_DONE_WITH_BLOCK_SEQ_ENTRY: m_stream << '\n'; m_pState->SwitchState(ES_WAITING_FOR_BLOCK_SEQ_ENTRY); return false; // flow sequence case ES_WAITING_FOR_FLOW_SEQ_ENTRY: m_pState->SwitchState(ES_WRITING_FLOW_SEQ_ENTRY); return true; case ES_WRITING_FLOW_SEQ_ENTRY: return true; case ES_DONE_WITH_FLOW_SEQ_ENTRY: EmitSeparationIfNecessary(); m_stream << ','; m_pState->RequireSoftSeparation(); m_pState->SwitchState(ES_WAITING_FOR_FLOW_SEQ_ENTRY); return false; // block map case ES_WAITING_FOR_BLOCK_MAP_ENTRY: m_pState->SetError(ErrorMsg::EXPECTED_KEY_TOKEN); return true; case ES_WAITING_FOR_BLOCK_MAP_KEY: if(m_pState->CurrentlyInLongKey()) { m_stream << IndentTo(curIndent) << '?'; m_pState->RequireSoftSeparation(); } m_pState->SwitchState(ES_WRITING_BLOCK_MAP_KEY); return true; case ES_WRITING_BLOCK_MAP_KEY: return true; case ES_DONE_WITH_BLOCK_MAP_KEY: m_pState->SetError(ErrorMsg::EXPECTED_VALUE_TOKEN); return true; case ES_WAITING_FOR_BLOCK_MAP_VALUE: m_pState->SwitchState(ES_WRITING_BLOCK_MAP_VALUE); return true; case ES_WRITING_BLOCK_MAP_VALUE: return true; case ES_DONE_WITH_BLOCK_MAP_VALUE: m_pState->SetError(ErrorMsg::EXPECTED_KEY_TOKEN); return true; // flow map case ES_WAITING_FOR_FLOW_MAP_ENTRY: m_pState->SetError(ErrorMsg::EXPECTED_KEY_TOKEN); return true; case ES_WAITING_FOR_FLOW_MAP_KEY: EmitSeparationIfNecessary(); m_pState->SwitchState(ES_WRITING_FLOW_MAP_KEY); if(m_pState->CurrentlyInLongKey()) { m_stream << '?'; m_pState->RequireSoftSeparation(); } return true; case ES_WRITING_FLOW_MAP_KEY: return true; case ES_DONE_WITH_FLOW_MAP_KEY: m_pState->SetError(ErrorMsg::EXPECTED_VALUE_TOKEN); return true; case ES_WAITING_FOR_FLOW_MAP_VALUE: EmitSeparationIfNecessary(); m_stream << ':'; m_pState->RequireSoftSeparation(); m_pState->SwitchState(ES_WRITING_FLOW_MAP_VALUE); return true; case ES_WRITING_FLOW_MAP_VALUE: return true; case ES_DONE_WITH_FLOW_MAP_VALUE: m_pState->SetError(ErrorMsg::EXPECTED_KEY_TOKEN); return true; default: assert(false); } assert(false); return true; } // PreAtomicWrite // . Depending on the emitter state, write to the stream to get it // in position to do an atomic write (e.g., scalar, sequence, or map) void Emitter::PreAtomicWrite() { if(!good()) return; while(!GotoNextPreAtomicState()) ; } // PostAtomicWrite // . Clean up void Emitter::PostAtomicWrite() { if(!good()) return; EMITTER_STATE curState = m_pState->GetCurState(); switch(curState) { // document-level case ES_WRITING_DOC: m_pState->SwitchState(ES_DONE_WITH_DOC); break; // block seq case ES_WRITING_BLOCK_SEQ_ENTRY: m_pState->SwitchState(ES_DONE_WITH_BLOCK_SEQ_ENTRY); break; // flow seq case ES_WRITING_FLOW_SEQ_ENTRY: m_pState->SwitchState(ES_DONE_WITH_FLOW_SEQ_ENTRY); break; // block map case ES_WRITING_BLOCK_MAP_KEY: if(!m_pState->CurrentlyInLongKey()) { m_stream << ':'; m_pState->RequireSoftSeparation(); } m_pState->SwitchState(ES_DONE_WITH_BLOCK_MAP_KEY); break; case ES_WRITING_BLOCK_MAP_VALUE: m_pState->SwitchState(ES_DONE_WITH_BLOCK_MAP_VALUE); break; // flow map case ES_WRITING_FLOW_MAP_KEY: m_pState->SwitchState(ES_DONE_WITH_FLOW_MAP_KEY); break; case ES_WRITING_FLOW_MAP_VALUE: m_pState->SwitchState(ES_DONE_WITH_FLOW_MAP_VALUE); break; default: assert(false); }; m_pState->ClearModifiedSettings(); } // EmitSeparationIfNecessary void Emitter::EmitSeparationIfNecessary() { if(!good()) return; if(m_pState->RequiresSoftSeparation()) m_stream << ' '; else if(m_pState->RequiresHardSeparation()) m_stream << '\n'; m_pState->UnsetSeparation(); } // EmitBeginDoc void Emitter::EmitBeginDoc() { if(!good()) return; EMITTER_STATE curState = m_pState->GetCurState(); if(curState != ES_WAITING_FOR_DOC && curState != ES_WRITING_DOC && curState != ES_DONE_WITH_DOC) { m_pState->SetError("Unexpected begin document"); return; } if(curState == ES_WRITING_DOC || curState == ES_DONE_WITH_DOC) m_stream << '\n'; m_stream << "---\n"; m_pState->UnsetSeparation(); m_pState->SwitchState(ES_WAITING_FOR_DOC); } // EmitEndDoc void Emitter::EmitEndDoc() { if(!good()) return; EMITTER_STATE curState = m_pState->GetCurState(); if(curState != ES_WAITING_FOR_DOC && curState != ES_WRITING_DOC && curState != ES_DONE_WITH_DOC) { m_pState->SetError("Unexpected end document"); return; } if(curState == ES_WRITING_DOC || curState == ES_DONE_WITH_DOC) m_stream << '\n'; m_stream << "...\n"; m_pState->UnsetSeparation(); m_pState->SwitchState(ES_WAITING_FOR_DOC); } // EmitBeginSeq void Emitter::EmitBeginSeq() { if(!good()) return; // must have a long key if we're emitting a sequence m_pState->StartLongKey(); PreAtomicWrite(); EMITTER_STATE curState = m_pState->GetCurState(); EMITTER_MANIP flowType = m_pState->GetFlowType(GT_SEQ); if(flowType == Block) { if(curState == ES_WRITING_BLOCK_SEQ_ENTRY || curState == ES_WRITING_BLOCK_MAP_KEY || curState == ES_WRITING_BLOCK_MAP_VALUE || curState == ES_WRITING_DOC ) { if(m_pState->RequiresHardSeparation() || curState != ES_WRITING_DOC) { m_stream << "\n"; m_pState->UnsetSeparation(); } } m_pState->PushState(ES_WAITING_FOR_BLOCK_SEQ_ENTRY); } else if(flowType == Flow) { EmitSeparationIfNecessary(); m_stream << "["; m_pState->PushState(ES_WAITING_FOR_FLOW_SEQ_ENTRY); } else assert(false); m_pState->BeginGroup(GT_SEQ); } // EmitEndSeq void Emitter::EmitEndSeq() { if(!good()) return; if(m_pState->GetCurGroupType() != GT_SEQ) return m_pState->SetError(ErrorMsg::UNEXPECTED_END_SEQ); EMITTER_STATE curState = m_pState->GetCurState(); FLOW_TYPE flowType = m_pState->GetCurGroupFlowType(); if(flowType == FT_BLOCK) { // Note: block sequences are *not* allowed to be empty, but we convert it // to a flow sequence if it is assert(curState == ES_DONE_WITH_BLOCK_SEQ_ENTRY || curState == ES_WAITING_FOR_BLOCK_SEQ_ENTRY); if(curState == ES_WAITING_FOR_BLOCK_SEQ_ENTRY) { // Note: only one of these will actually output anything for a given situation EmitSeparationIfNecessary(); unsigned curIndent = m_pState->GetCurIndent(); m_stream << IndentTo(curIndent); m_stream << "[]"; } } else if(flowType == FT_FLOW) { // Note: flow sequences are allowed to be empty assert(curState == ES_DONE_WITH_FLOW_SEQ_ENTRY || curState == ES_WAITING_FOR_FLOW_SEQ_ENTRY); m_stream << "]"; } else assert(false); m_pState->PopState(); m_pState->EndGroup(GT_SEQ); PostAtomicWrite(); } // EmitBeginMap void Emitter::EmitBeginMap() { if(!good()) return; // must have a long key if we're emitting a map m_pState->StartLongKey(); PreAtomicWrite(); EMITTER_STATE curState = m_pState->GetCurState(); EMITTER_MANIP flowType = m_pState->GetFlowType(GT_MAP); if(flowType == Block) { if(curState == ES_WRITING_BLOCK_SEQ_ENTRY || curState == ES_WRITING_BLOCK_MAP_KEY || curState == ES_WRITING_BLOCK_MAP_VALUE || curState == ES_WRITING_DOC ) { if(m_pState->RequiresHardSeparation() || (curState != ES_WRITING_DOC && curState != ES_WRITING_BLOCK_SEQ_ENTRY)) { m_stream << "\n"; m_pState->UnsetSeparation(); } } m_pState->PushState(ES_WAITING_FOR_BLOCK_MAP_ENTRY); } else if(flowType == Flow) { EmitSeparationIfNecessary(); m_stream << "{"; m_pState->PushState(ES_WAITING_FOR_FLOW_MAP_ENTRY); } else assert(false); m_pState->BeginGroup(GT_MAP); } // EmitEndMap void Emitter::EmitEndMap() { if(!good()) return; if(m_pState->GetCurGroupType() != GT_MAP) return m_pState->SetError(ErrorMsg::UNEXPECTED_END_MAP); EMITTER_STATE curState = m_pState->GetCurState(); FLOW_TYPE flowType = m_pState->GetCurGroupFlowType(); if(flowType == FT_BLOCK) { // Note: block sequences are *not* allowed to be empty, but we convert it // to a flow sequence if it is assert(curState == ES_DONE_WITH_BLOCK_MAP_VALUE || curState == ES_WAITING_FOR_BLOCK_MAP_ENTRY); if(curState == ES_WAITING_FOR_BLOCK_MAP_ENTRY) { // Note: only one of these will actually output anything for a given situation EmitSeparationIfNecessary(); unsigned curIndent = m_pState->GetCurIndent(); m_stream << IndentTo(curIndent); m_stream << "{}"; } } else if(flowType == FT_FLOW) { // Note: flow maps are allowed to be empty assert(curState == ES_DONE_WITH_FLOW_MAP_VALUE || curState == ES_WAITING_FOR_FLOW_MAP_ENTRY); EmitSeparationIfNecessary(); m_stream << "}"; } else assert(false); m_pState->PopState(); m_pState->EndGroup(GT_MAP); PostAtomicWrite(); } // EmitKey void Emitter::EmitKey() { if(!good()) return; EMITTER_STATE curState = m_pState->GetCurState(); FLOW_TYPE flowType = m_pState->GetCurGroupFlowType(); if(curState != ES_WAITING_FOR_BLOCK_MAP_ENTRY && curState != ES_DONE_WITH_BLOCK_MAP_VALUE && curState != ES_WAITING_FOR_FLOW_MAP_ENTRY && curState != ES_DONE_WITH_FLOW_MAP_VALUE) return m_pState->SetError(ErrorMsg::UNEXPECTED_KEY_TOKEN); if(flowType == FT_BLOCK) { if(curState == ES_DONE_WITH_BLOCK_MAP_VALUE) m_stream << '\n'; unsigned curIndent = m_pState->GetCurIndent(); m_stream << IndentTo(curIndent); m_pState->UnsetSeparation(); m_pState->SwitchState(ES_WAITING_FOR_BLOCK_MAP_KEY); } else if(flowType == FT_FLOW) { EmitSeparationIfNecessary(); if(curState == ES_DONE_WITH_FLOW_MAP_VALUE) { m_stream << ','; m_pState->RequireSoftSeparation(); } m_pState->SwitchState(ES_WAITING_FOR_FLOW_MAP_KEY); } else assert(false); if(m_pState->GetMapKeyFormat() == LongKey) m_pState->StartLongKey(); else if(m_pState->GetMapKeyFormat() == Auto) m_pState->StartSimpleKey(); else assert(false); } // EmitValue void Emitter::EmitValue() { if(!good()) return; EMITTER_STATE curState = m_pState->GetCurState(); FLOW_TYPE flowType = m_pState->GetCurGroupFlowType(); if(curState != ES_DONE_WITH_BLOCK_MAP_KEY && curState != ES_DONE_WITH_FLOW_MAP_KEY) return m_pState->SetError(ErrorMsg::UNEXPECTED_VALUE_TOKEN); if(flowType == FT_BLOCK) { if(m_pState->CurrentlyInLongKey()) { m_stream << '\n'; m_stream << IndentTo(m_pState->GetCurIndent()); m_stream << ':'; m_pState->RequireSoftSeparation(); } m_pState->SwitchState(ES_WAITING_FOR_BLOCK_MAP_VALUE); } else if(flowType == FT_FLOW) { m_pState->SwitchState(ES_WAITING_FOR_FLOW_MAP_VALUE); } else assert(false); } // EmitNewline void Emitter::EmitNewline() { if(!good()) return; if(CanEmitNewline()) { m_stream << '\n'; m_pState->UnsetSeparation(); } } bool Emitter::CanEmitNewline() const { FLOW_TYPE flowType = m_pState->GetCurGroupFlowType(); if(flowType == FT_BLOCK && m_pState->CurrentlyInLongKey()) return true; EMITTER_STATE curState = m_pState->GetCurState(); return curState != ES_DONE_WITH_BLOCK_MAP_KEY && curState != ES_WAITING_FOR_BLOCK_MAP_VALUE && curState != ES_WRITING_BLOCK_MAP_VALUE; } // ******************************************************************************************* // overloads of Write Emitter& Emitter::Write(const std::string& str) { if(!good()) return *this; // literal scalars must use long keys if(m_pState->GetStringFormat() == Literal && m_pState->GetCurGroupFlowType() != FT_FLOW) m_pState->StartLongKey(); PreAtomicWrite(); EmitSeparationIfNecessary(); bool escapeNonAscii = m_pState->GetOutputCharset() == EscapeNonAscii; EMITTER_MANIP strFmt = m_pState->GetStringFormat(); FLOW_TYPE flowType = m_pState->GetCurGroupFlowType(); unsigned curIndent = m_pState->GetCurIndent(); switch(strFmt) { case Auto: Utils::WriteString(m_stream, str, flowType == FT_FLOW, escapeNonAscii); break; case SingleQuoted: if(!Utils::WriteSingleQuotedString(m_stream, str)) { m_pState->SetError(ErrorMsg::SINGLE_QUOTED_CHAR); return *this; } break; case DoubleQuoted: Utils::WriteDoubleQuotedString(m_stream, str, escapeNonAscii); break; case Literal: if(flowType == FT_FLOW) Utils::WriteString(m_stream, str, flowType == FT_FLOW, escapeNonAscii); else Utils::WriteLiteralString(m_stream, str, curIndent + m_pState->GetIndent()); break; default: assert(false); } PostAtomicWrite(); return *this; } void Emitter::PreWriteIntegralType(std::stringstream& str) { PreAtomicWrite(); EmitSeparationIfNecessary(); EMITTER_MANIP intFmt = m_pState->GetIntFormat(); switch(intFmt) { case Dec: str << std::dec; break; case Hex: str << "0x"; str << std::hex; break; case Oct: str << "0"; str << std::oct; break; default: assert(false); } } void Emitter::PreWriteStreamable(std::stringstream&) { PreAtomicWrite(); EmitSeparationIfNecessary(); } unsigned Emitter::GetFloatPrecision() const { return m_pState->GetFloatPrecision(); } unsigned Emitter::GetDoublePrecision() const { return m_pState->GetDoublePrecision(); } void Emitter::PostWriteIntegralType(const std::stringstream& str) { m_stream << str.str(); PostAtomicWrite(); } void Emitter::PostWriteStreamable(const std::stringstream& str) { m_stream << str.str(); PostAtomicWrite(); } const char *Emitter::ComputeFullBoolName(bool b) const { const EMITTER_MANIP mainFmt = (m_pState->GetBoolLengthFormat() == ShortBool ? YesNoBool : m_pState->GetBoolFormat()); const EMITTER_MANIP caseFmt = m_pState->GetBoolCaseFormat(); switch(mainFmt) { case YesNoBool: switch(caseFmt) { case UpperCase: return b ? "YES" : "NO"; case CamelCase: return b ? "Yes" : "No"; case LowerCase: return b ? "yes" : "no"; default: break; } break; case OnOffBool: switch(caseFmt) { case UpperCase: return b ? "ON" : "OFF"; case CamelCase: return b ? "On" : "Off"; case LowerCase: return b ? "on" : "off"; default: break; } break; case TrueFalseBool: switch(caseFmt) { case UpperCase: return b ? "TRUE" : "FALSE"; case CamelCase: return b ? "True" : "False"; case LowerCase: return b ? "true" : "false"; default: break; } break; default: break; } return b ? "y" : "n"; // should never get here, but it can't hurt to give these answers } Emitter& Emitter::Write(bool b) { if(!good()) return *this; PreAtomicWrite(); EmitSeparationIfNecessary(); const char *name = ComputeFullBoolName(b); if(m_pState->GetBoolLengthFormat() == ShortBool) m_stream << name[0]; else m_stream << name; PostAtomicWrite(); return *this; } Emitter& Emitter::Write(char ch) { if(!good()) return *this; PreAtomicWrite(); EmitSeparationIfNecessary(); Utils::WriteChar(m_stream, ch); PostAtomicWrite(); return *this; } Emitter& Emitter::Write(const _Alias& alias) { if(!good()) return *this; PreAtomicWrite(); EmitSeparationIfNecessary(); if(!Utils::WriteAlias(m_stream, alias.content)) { m_pState->SetError(ErrorMsg::INVALID_ALIAS); return *this; } PostAtomicWrite(); return *this; } Emitter& Emitter::Write(const _Anchor& anchor) { if(!good()) return *this; PreAtomicWrite(); EmitSeparationIfNecessary(); if(!Utils::WriteAnchor(m_stream, anchor.content)) { m_pState->SetError(ErrorMsg::INVALID_ANCHOR); return *this; } m_pState->RequireHardSeparation(); // Note: no PostAtomicWrite() because we need another value for this node return *this; } Emitter& Emitter::Write(const _Tag& tag) { if(!good()) return *this; PreAtomicWrite(); EmitSeparationIfNecessary(); bool success = false; if(tag.type == _Tag::Type::Verbatim) success = Utils::WriteTag(m_stream, tag.content, true); else if(tag.type == _Tag::Type::PrimaryHandle) success = Utils::WriteTag(m_stream, tag.content, false); else success = Utils::WriteTagWithPrefix(m_stream, tag.prefix, tag.content); if(!success) { m_pState->SetError(ErrorMsg::INVALID_TAG); return *this; } m_pState->RequireHardSeparation(); // Note: no PostAtomicWrite() because we need another value for this node return *this; } void Emitter::EmitKindTag() { Write(LocalTag("")); } Emitter& Emitter::Write(const _Comment& comment) { if(!good()) return *this; if(m_stream.col() > 0) m_stream << Indentation(m_pState->GetPreCommentIndent()); Utils::WriteComment(m_stream, comment.content, m_pState->GetPostCommentIndent()); m_pState->RequireHardSeparation(); m_pState->ForceHardSeparation(); return *this; } Emitter& Emitter::Write(const _Null& /*null*/) { if(!good()) return *this; PreAtomicWrite(); EmitSeparationIfNecessary(); m_stream << "~"; PostAtomicWrite(); return *this; } Emitter& Emitter::Write(const Binary& binary) { Write(SecondaryTag("binary")); if(!good()) return *this; PreAtomicWrite(); EmitSeparationIfNecessary(); Utils::WriteBinary(m_stream, binary); PostAtomicWrite(); return *this; } } SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/src/emitterutils.h0000664000175000017500000000235611723131175030103 0ustar dandan#ifndef EMITTERUTILS_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #define EMITTERUTILS_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #if defined(_MSC_VER) || (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 #pragma once #endif #include "yaml-cpp/ostream.h" #include namespace YAML { class Binary; namespace Utils { bool WriteString(ostream& out, const std::string& str, bool inFlow, bool escapeNonAscii); bool WriteSingleQuotedString(ostream& out, const std::string& str); bool WriteDoubleQuotedString(ostream& out, const std::string& str, bool escapeNonAscii); bool WriteLiteralString(ostream& out, const std::string& str, int indent); bool WriteChar(ostream& out, char ch); bool WriteComment(ostream& out, const std::string& str, int postCommentIndent); bool WriteAlias(ostream& out, const std::string& str); bool WriteAnchor(ostream& out, const std::string& str); bool WriteTag(ostream& out, const std::string& str, bool verbatim); bool WriteTagWithPrefix(ostream& out, const std::string& prefix, const std::string& tag); bool WriteBinary(ostream& out, const Binary& binary); } } #endif // EMITTERUTILS_H_62B23520_7C8E_11DE_8A39_0800200C9A66 SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/src/scanscalar.h0000664000175000017500000000377611723131175027472 0ustar dandan#ifndef SCANSCALAR_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #define SCANSCALAR_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #if defined(_MSC_VER) || (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 #pragma once #endif #include #include "regex.h" #include "stream.h" namespace YAML { enum CHOMP { STRIP = -1, CLIP, KEEP }; enum ACTION { NONE, BREAK, THROW }; enum FOLD { DONT_FOLD, FOLD_BLOCK, FOLD_FLOW }; struct ScanScalarParams { ScanScalarParams(): eatEnd(false), indent(0), detectIndent(false), eatLeadingWhitespace(0), escape(0), fold(DONT_FOLD), trimTrailingSpaces(0), chomp(CLIP), onDocIndicator(NONE), onTabInIndentation(NONE), leadingSpaces(false) {} // input: RegEx end; // what condition ends this scalar? bool eatEnd; // should we eat that condition when we see it? int indent; // what level of indentation should be eaten and ignored? bool detectIndent; // should we try to autodetect the indent? bool eatLeadingWhitespace; // should we continue eating this delicious indentation after 'indent' spaces? char escape; // what character do we escape on (i.e., slash or single quote) (0 for none) FOLD fold; // how do we fold line ends? bool trimTrailingSpaces; // do we remove all trailing spaces (at the very end) CHOMP chomp; // do we strip, clip, or keep trailing newlines (at the very end) // Note: strip means kill all, clip means keep at most one, keep means keep all ACTION onDocIndicator; // what do we do if we see a document indicator? ACTION onTabInIndentation; // what do we do if we see a tab where we should be seeing indentation spaces // output: bool leadingSpaces; }; std::string ScanScalar(Stream& INPUT, ScanScalarParams& info); } #endif // SCANSCALAR_H_62B23520_7C8E_11DE_8A39_0800200C9A66 SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/src/token.h0000664000175000017500000000324711723131175026471 0ustar dandan#ifndef TOKEN_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #define TOKEN_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #if defined(_MSC_VER) || (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 #pragma once #endif #include "yaml-cpp/mark.h" #include #include #include namespace YAML { const std::string TokenNames[] = { "DIRECTIVE", "DOC_START", "DOC_END", "BLOCK_SEQ_START", "BLOCK_MAP_START", "BLOCK_SEQ_END", "BLOCK_MAP_END", "BLOCK_ENTRY", "FLOW_SEQ_START", "FLOW_MAP_START", "FLOW_SEQ_END", "FLOW_MAP_END", "FLOW_MAP_COMPACT", "FLOW_ENTRY", "KEY", "VALUE", "ANCHOR", "ALIAS", "TAG", "SCALAR" }; struct Token { // enums enum STATUS { VALID, INVALID, UNVERIFIED }; enum TYPE { DIRECTIVE, DOC_START, DOC_END, BLOCK_SEQ_START, BLOCK_MAP_START, BLOCK_SEQ_END, BLOCK_MAP_END, BLOCK_ENTRY, FLOW_SEQ_START, FLOW_MAP_START, FLOW_SEQ_END, FLOW_MAP_END, FLOW_MAP_COMPACT, FLOW_ENTRY, KEY, VALUE, ANCHOR, ALIAS, TAG, PLAIN_SCALAR, NON_PLAIN_SCALAR }; // data Token(TYPE type_, const Mark& mark_): status(VALID), type(type_), mark(mark_), data(0) {} friend std::ostream& operator << (std::ostream& out, const Token& token) { out << TokenNames[token.type] << std::string(": ") << token.value; for(std::size_t i=0;i params; int data; }; } #endif // TOKEN_H_62B23520_7C8E_11DE_8A39_0800200C9A66 SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/src/scantag.cpp0000664000175000017500000000262611723131175027324 0ustar dandan#include "scanner.h" #include "regex.h" #include "exp.h" #include "yaml-cpp/exceptions.h" namespace YAML { const std::string ScanVerbatimTag(Stream& INPUT) { std::string tag; // eat the start character INPUT.get(); while(INPUT) { if(INPUT.peek() == Keys::VerbatimTagEnd) { // eat the end character INPUT.get(); return tag; } int n = Exp::URI().Match(INPUT); if(n <= 0) break; tag += INPUT.get(n); } throw ParserException(INPUT.mark(), ErrorMsg::END_OF_VERBATIM_TAG); } const std::string ScanTagHandle(Stream& INPUT, bool& canBeHandle) { std::string tag; canBeHandle = true; Mark firstNonWordChar; while(INPUT) { if(INPUT.peek() == Keys::Tag) { if(!canBeHandle) throw ParserException(firstNonWordChar, ErrorMsg::CHAR_IN_TAG_HANDLE); break; } int n = 0; if(canBeHandle) { n = Exp::Word().Match(INPUT); if(n <= 0) { canBeHandle = false; firstNonWordChar = INPUT.mark(); } } if(!canBeHandle) n = Exp::Tag().Match(INPUT); if(n <= 0) break; tag += INPUT.get(n); } return tag; } const std::string ScanTagSuffix(Stream& INPUT) { std::string tag; while(INPUT) { int n = Exp::Tag().Match(INPUT); if(n <= 0) break; tag += INPUT.get(n); } if(tag.empty()) throw ParserException(INPUT.mark(), ErrorMsg::TAG_WITH_NO_SUFFIX); return tag; } } SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/src/stream.cpp0000664000175000017500000003063611723131175027201 0ustar dandan#include "stream.h" #include #include "exp.h" #ifndef YAML_PREFETCH_SIZE #define YAML_PREFETCH_SIZE 2048 #endif #define S_ARRAY_SIZE( A ) (sizeof(A)/sizeof(*(A))) #define S_ARRAY_END( A ) ((A) + S_ARRAY_SIZE(A)) #define CP_REPLACEMENT_CHARACTER (0xFFFD) namespace YAML { enum UtfIntroState { uis_start, uis_utfbe_b1, uis_utf32be_b2, uis_utf32be_bom3, uis_utf32be, uis_utf16be, uis_utf16be_bom1, uis_utfle_bom1, uis_utf16le_bom2, uis_utf32le_bom3, uis_utf16le, uis_utf32le, uis_utf8_imp, uis_utf16le_imp, uis_utf32le_imp3, uis_utf8_bom1, uis_utf8_bom2, uis_utf8, uis_error }; enum UtfIntroCharType { uict00, uictBB, uictBF, uictEF, uictFE, uictFF, uictAscii, uictOther, uictMax }; static bool s_introFinalState[] = { false, //uis_start false, //uis_utfbe_b1 false, //uis_utf32be_b2 false, //uis_utf32be_bom3 true, //uis_utf32be true, //uis_utf16be false, //uis_utf16be_bom1 false, //uis_utfle_bom1 false, //uis_utf16le_bom2 false, //uis_utf32le_bom3 true, //uis_utf16le true, //uis_utf32le false, //uis_utf8_imp false, //uis_utf16le_imp false, //uis_utf32le_imp3 false, //uis_utf8_bom1 false, //uis_utf8_bom2 true, //uis_utf8 true, //uis_error }; static UtfIntroState s_introTransitions[][uictMax] = { // uict00, uictBB, uictBF, uictEF, uictFE, uictFF, uictAscii, uictOther {uis_utfbe_b1, uis_utf8, uis_utf8, uis_utf8_bom1, uis_utf16be_bom1, uis_utfle_bom1, uis_utf8_imp, uis_utf8}, {uis_utf32be_b2, uis_utf8, uis_utf8, uis_utf8, uis_utf8, uis_utf8, uis_utf16be, uis_utf8}, {uis_utf32be, uis_utf8, uis_utf8, uis_utf8, uis_utf32be_bom3, uis_utf8, uis_utf8, uis_utf8}, {uis_utf8, uis_utf8, uis_utf8, uis_utf8, uis_utf8, uis_utf32be, uis_utf8, uis_utf8}, {uis_utf32be, uis_utf32be, uis_utf32be, uis_utf32be, uis_utf32be, uis_utf32be, uis_utf32be, uis_utf32be}, {uis_utf16be, uis_utf16be, uis_utf16be, uis_utf16be, uis_utf16be, uis_utf16be, uis_utf16be, uis_utf16be}, {uis_utf8, uis_utf8, uis_utf8, uis_utf8, uis_utf8, uis_utf16be, uis_utf8, uis_utf8}, {uis_utf8, uis_utf8, uis_utf8, uis_utf8, uis_utf16le_bom2, uis_utf8, uis_utf8, uis_utf8}, {uis_utf32le_bom3, uis_utf16le, uis_utf16le, uis_utf16le, uis_utf16le, uis_utf16le, uis_utf16le, uis_utf16le}, {uis_utf32le, uis_utf16le, uis_utf16le, uis_utf16le, uis_utf16le, uis_utf16le, uis_utf16le, uis_utf16le}, {uis_utf16le, uis_utf16le, uis_utf16le, uis_utf16le, uis_utf16le, uis_utf16le, uis_utf16le, uis_utf16le}, {uis_utf32le, uis_utf32le, uis_utf32le, uis_utf32le, uis_utf32le, uis_utf32le, uis_utf32le, uis_utf32le}, {uis_utf16le_imp, uis_utf8, uis_utf8, uis_utf8, uis_utf8, uis_utf8, uis_utf8, uis_utf8}, {uis_utf32le_imp3, uis_utf16le, uis_utf16le, uis_utf16le, uis_utf16le, uis_utf16le, uis_utf16le, uis_utf16le}, {uis_utf32le, uis_utf16le, uis_utf16le, uis_utf16le, uis_utf16le, uis_utf16le, uis_utf16le, uis_utf16le}, {uis_utf8, uis_utf8_bom2, uis_utf8, uis_utf8, uis_utf8, uis_utf8, uis_utf8, uis_utf8}, {uis_utf8, uis_utf8, uis_utf8, uis_utf8, uis_utf8, uis_utf8, uis_utf8, uis_utf8}, {uis_utf8, uis_utf8, uis_utf8, uis_utf8, uis_utf8, uis_utf8, uis_utf8, uis_utf8}, }; static char s_introUngetCount[][uictMax] = { // uict00, uictBB, uictBF, uictEF, uictFE, uictFF, uictAscii, uictOther {0, 1, 1, 0, 0, 0, 0, 1}, {0, 2, 2, 2, 2, 2, 2, 2}, {3, 3, 3, 3, 0, 3, 3, 3}, {4, 4, 4, 4, 4, 0, 4, 4}, {1, 1, 1, 1, 1, 1, 1, 1}, {1, 1, 1, 1, 1, 1, 1, 1}, {2, 2, 2, 2, 2, 0, 2, 2}, {2, 2, 2, 2, 0, 2, 2, 2}, {0, 1, 1, 1, 1, 1, 1, 1}, {0, 2, 2, 2, 2, 2, 2, 2}, {1, 1, 1, 1, 1, 1, 1, 1}, {1, 1, 1, 1, 1, 1, 1, 1}, {0, 2, 2, 2, 2, 2, 2, 2}, {0, 3, 3, 3, 3, 3, 3, 3}, {4, 4, 4, 4, 4, 4, 4, 4}, {2, 0, 2, 2, 2, 2, 2, 2}, {3, 3, 0, 3, 3, 3, 3, 3}, {1, 1, 1, 1, 1, 1, 1, 1}, }; inline UtfIntroCharType IntroCharTypeOf(std::istream::int_type ch) { if (std::istream::traits_type::eof() == ch) { return uictOther; } switch (ch) { case 0: return uict00; case 0xBB: return uictBB; case 0xBF: return uictBF; case 0xEF: return uictEF; case 0xFE: return uictFE; case 0xFF: return uictFF; } if ((ch > 0) && (ch < 0xFF)) { return uictAscii; } return uictOther; } inline char Utf8Adjust(unsigned long ch, unsigned char lead_bits, unsigned char rshift) { const unsigned char header = ((1 << lead_bits) - 1) << (8 - lead_bits); const unsigned char mask = (0xFF >> (lead_bits + 1)); return static_cast(static_cast( header | ((ch >> rshift) & mask) )); } inline void QueueUnicodeCodepoint(std::deque& q, unsigned long ch) { // We are not allowed to queue the Stream::eof() codepoint, so // replace it with CP_REPLACEMENT_CHARACTER if (static_cast(Stream::eof()) == ch) { ch = CP_REPLACEMENT_CHARACTER; } if (ch < 0x80) { q.push_back(Utf8Adjust(ch, 0, 0)); } else if (ch < 0x800) { q.push_back(Utf8Adjust(ch, 2, 6)); q.push_back(Utf8Adjust(ch, 1, 0)); } else if (ch < 0x10000) { q.push_back(Utf8Adjust(ch, 3, 12)); q.push_back(Utf8Adjust(ch, 1, 6)); q.push_back(Utf8Adjust(ch, 1, 0)); } else { q.push_back(Utf8Adjust(ch, 4, 18)); q.push_back(Utf8Adjust(ch, 1, 12)); q.push_back(Utf8Adjust(ch, 1, 6)); q.push_back(Utf8Adjust(ch, 1, 0)); } } Stream::Stream(std::istream& input) : m_input(input), m_pPrefetched(new unsigned char[YAML_PREFETCH_SIZE]), m_nPrefetchedAvailable(0), m_nPrefetchedUsed(0) { typedef std::istream::traits_type char_traits; if(!input) return; // Determine (or guess) the character-set by reading the BOM, if any. See // the YAML specification for the determination algorithm. char_traits::int_type intro[4]; int nIntroUsed = 0; UtfIntroState state = uis_start; for(; !s_introFinalState[state]; ) { std::istream::int_type ch = input.get(); intro[nIntroUsed++] = ch; UtfIntroCharType charType = IntroCharTypeOf(ch); UtfIntroState newState = s_introTransitions[state][charType]; int nUngets = s_introUngetCount[state][charType]; if(nUngets > 0) { input.clear(); for(; nUngets > 0; --nUngets) { if(char_traits::eof() != intro[--nIntroUsed]) input.putback(char_traits::to_char_type(intro[nIntroUsed])); } } state = newState; } switch (state) { case uis_utf8: m_charSet = utf8; break; case uis_utf16le: m_charSet = utf16le; break; case uis_utf16be: m_charSet = utf16be; break; case uis_utf32le: m_charSet = utf32le; break; case uis_utf32be: m_charSet = utf32be; break; default: m_charSet = utf8; break; } ReadAheadTo(0); } Stream::~Stream() { delete[] m_pPrefetched; } char Stream::peek() const { if (m_readahead.empty()) { return Stream::eof(); } return m_readahead[0]; } Stream::operator bool() const { return m_input.good() || (!m_readahead.empty() && m_readahead[0] != Stream::eof()); } // get // . Extracts a character from the stream and updates our position char Stream::get() { char ch = peek(); AdvanceCurrent(); m_mark.column++; if(ch == '\n') { m_mark.column = 0; m_mark.line++; } return ch; } // get // . Extracts 'n' characters from the stream and updates our position std::string Stream::get(int n) { std::string ret; ret.reserve(n); for(int i=0;i i; } void Stream::StreamInUtf8() const { unsigned char b = GetNextByte(); if (m_input.good()) { m_readahead.push_back(b); } } void Stream::StreamInUtf16() const { unsigned long ch = 0; unsigned char bytes[2]; int nBigEnd = (m_charSet == utf16be) ? 0 : 1; bytes[0] = GetNextByte(); bytes[1] = GetNextByte(); if (!m_input.good()) { return; } ch = (static_cast(bytes[nBigEnd]) << 8) | static_cast(bytes[1 ^ nBigEnd]); if (ch >= 0xDC00 && ch < 0xE000) { // Trailing (low) surrogate...ugh, wrong order QueueUnicodeCodepoint(m_readahead, CP_REPLACEMENT_CHARACTER); return; } else if (ch >= 0xD800 && ch < 0xDC00) { // ch is a leading (high) surrogate // Four byte UTF-8 code point // Read the trailing (low) surrogate for (;;) { bytes[0] = GetNextByte(); bytes[1] = GetNextByte(); if (!m_input.good()) { QueueUnicodeCodepoint(m_readahead, CP_REPLACEMENT_CHARACTER); return; } unsigned long chLow = (static_cast(bytes[nBigEnd]) << 8) | static_cast(bytes[1 ^ nBigEnd]); if (chLow < 0xDC00 || ch >= 0xE000) { // Trouble...not a low surrogate. Dump a REPLACEMENT CHARACTER into the stream. QueueUnicodeCodepoint(m_readahead, CP_REPLACEMENT_CHARACTER); // Deal with the next UTF-16 unit if (chLow < 0xD800 || ch >= 0xE000) { // Easiest case: queue the codepoint and return QueueUnicodeCodepoint(m_readahead, ch); return; } else { // Start the loop over with the new high surrogate ch = chLow; continue; } } // Select the payload bits from the high surrogate ch &= 0x3FF; ch <<= 10; // Include bits from low surrogate ch |= (chLow & 0x3FF); // Add the surrogacy offset ch += 0x10000; } } QueueUnicodeCodepoint(m_readahead, ch); } inline char* ReadBuffer(unsigned char* pBuffer) { return reinterpret_cast(pBuffer); } unsigned char Stream::GetNextByte() const { if (m_nPrefetchedUsed >= m_nPrefetchedAvailable) { std::streambuf *pBuf = m_input.rdbuf(); m_nPrefetchedAvailable = pBuf->sgetn(ReadBuffer(m_pPrefetched), YAML_PREFETCH_SIZE); m_nPrefetchedUsed = 0; if (!m_nPrefetchedAvailable) { m_input.setstate(std::ios_base::eofbit); } if (0 == m_nPrefetchedAvailable) { return 0; } } return m_pPrefetched[m_nPrefetchedUsed++]; } void Stream::StreamInUtf32() const { static int indexes[2][4] = { {3, 2, 1, 0}, {0, 1, 2, 3} }; unsigned long ch = 0; unsigned char bytes[4]; int* pIndexes = (m_charSet == utf32be) ? indexes[1] : indexes[0]; bytes[0] = GetNextByte(); bytes[1] = GetNextByte(); bytes[2] = GetNextByte(); bytes[3] = GetNextByte(); if (!m_input.good()) { return; } for (int i = 0; i < 4; ++i) { ch <<= 8; ch |= bytes[pIndexes[i]]; } QueueUnicodeCodepoint(m_readahead, ch); } } SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/src/ostream.cpp0000664000175000017500000000211711723131175027351 0ustar dandan#include "yaml-cpp/ostream.h" #include namespace YAML { ostream::ostream(): m_buffer(0), m_pos(0), m_size(0), m_row(0), m_col(0) { reserve(1024); } ostream::~ostream() { delete [] m_buffer; } void ostream::reserve(unsigned size) { if(size <= m_size) return; char *newBuffer = new char[size]; std::memset(newBuffer, 0, size * sizeof(char)); std::memcpy(newBuffer, m_buffer, m_size * sizeof(char)); delete [] m_buffer; m_buffer = newBuffer; m_size = size; } void ostream::put(char ch) { if(m_pos >= m_size - 1) // an extra space for the NULL terminator reserve(m_size * 2); m_buffer[m_pos] = ch; m_pos++; if(ch == '\n') { m_row++; m_col = 0; } else m_col++; } ostream& operator << (ostream& out, const char *str) { std::size_t length = std::strlen(str); for(std::size_t i=0;i= 4) || (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 #pragma once #endif #include #include #include "yaml-cpp/noncopyable.h" namespace YAML { class SettingChangeBase; template class Setting { public: Setting(): m_value() {} const T get() const { return m_value; } std::auto_ptr set(const T& value); void restore(const Setting& oldSetting) { m_value = oldSetting.get(); } private: T m_value; }; class SettingChangeBase { public: virtual ~SettingChangeBase() {} virtual void pop() = 0; }; template class SettingChange: public SettingChangeBase { public: SettingChange(Setting *pSetting): m_pCurSetting(pSetting) { // copy old setting to save its state m_oldSetting = *pSetting; } virtual void pop() { m_pCurSetting->restore(m_oldSetting); } private: Setting *m_pCurSetting; Setting m_oldSetting; }; template inline std::auto_ptr Setting::set(const T& value) { std::auto_ptr pChange(new SettingChange (this)); m_value = value; return pChange; } class SettingChanges: private noncopyable { public: SettingChanges() {} ~SettingChanges() { clear(); } void clear() { restore(); for(setting_changes::const_iterator it=m_settingChanges.begin();it!=m_settingChanges.end();++it) delete *it; m_settingChanges.clear(); } void restore() { for(setting_changes::const_iterator it=m_settingChanges.begin();it!=m_settingChanges.end();++it) (*it)->pop(); } void push(std::auto_ptr pSettingChange) { m_settingChanges.push_back(pSettingChange.release()); } // like std::auto_ptr - assignment is transfer of ownership SettingChanges& operator = (SettingChanges& rhs) { if(this == &rhs) return *this; clear(); m_settingChanges = rhs.m_settingChanges; rhs.m_settingChanges.clear(); return *this; } private: typedef std::vector setting_changes; setting_changes m_settingChanges; }; } #endif // SETTING_H_62B23520_7C8E_11DE_8A39_0800200C9A66 SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/src/iterator.cpp0000664000175000017500000000361211723131175027531 0ustar dandan#include "yaml-cpp/node.h" #include "yaml-cpp/exceptions.h" #include "iterpriv.h" namespace YAML { Iterator::Iterator(): m_pData(new IterPriv) { } Iterator::Iterator(std::auto_ptr pData): m_pData(pData) { } Iterator::Iterator(const Iterator& rhs): m_pData(new IterPriv(*rhs.m_pData)) { } Iterator& Iterator::operator = (const Iterator& rhs) { if(this == &rhs) return *this; m_pData.reset(new IterPriv(*rhs.m_pData)); return *this; } Iterator::~Iterator() { } Iterator& Iterator::operator ++ () { if(m_pData->type == IterPriv::IT_SEQ) ++m_pData->seqIter; else if(m_pData->type == IterPriv::IT_MAP) ++m_pData->mapIter; return *this; } Iterator Iterator::operator ++ (int) { Iterator temp = *this; if(m_pData->type == IterPriv::IT_SEQ) ++m_pData->seqIter; else if(m_pData->type == IterPriv::IT_MAP) ++m_pData->mapIter; return temp; } const Node& Iterator::operator * () const { if(m_pData->type == IterPriv::IT_SEQ) return **m_pData->seqIter; throw BadDereference(); } const Node *Iterator::operator -> () const { if(m_pData->type == IterPriv::IT_SEQ) return *m_pData->seqIter; throw BadDereference(); } const Node& Iterator::first() const { if(m_pData->type == IterPriv::IT_MAP) return *m_pData->mapIter->first; throw BadDereference(); } const Node& Iterator::second() const { if(m_pData->type == IterPriv::IT_MAP) return *m_pData->mapIter->second; throw BadDereference(); } bool operator == (const Iterator& it, const Iterator& jt) { if(it.m_pData->type != jt.m_pData->type) return false; if(it.m_pData->type == IterPriv::IT_SEQ) return it.m_pData->seqIter == jt.m_pData->seqIter; else if(it.m_pData->type == IterPriv::IT_MAP) return it.m_pData->mapIter == jt.m_pData->mapIter; return true; } bool operator != (const Iterator& it, const Iterator& jt) { return !(it == jt); } } SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/src/ptr_vector.h0000664000175000017500000000223511723131175027534 0ustar dandan#ifndef PTR_VECTOR_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #define PTR_VECTOR_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #if defined(_MSC_VER) || (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 #pragma once #endif #include "yaml-cpp/noncopyable.h" #include #include #include #include namespace YAML { template class ptr_vector: private YAML::noncopyable { public: ptr_vector() {} ~ptr_vector() { clear(); } void clear() { for(unsigned i=0;i t) { m_data.push_back(NULL); m_data.back() = t.release(); } T& operator[](std::size_t i) { return *m_data[i]; } const T& operator[](std::size_t i) const { return *m_data[i]; } T& back() { return *m_data.back(); } const T& back() const { return *m_data.back(); } private: std::vector m_data; }; } #endif // PTR_VECTOR_H_62B23520_7C8E_11DE_8A39_0800200C9A66 SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/src/exp.h0000664000175000017500000001311011723131175026133 0ustar dandan#ifndef EXP_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #define EXP_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #if defined(_MSC_VER) || (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 #pragma once #endif #include "regex.h" #include #include #include "stream.h" namespace YAML { //////////////////////////////////////////////////////////////////////////////// // Here we store a bunch of expressions for matching different parts of the file. namespace Exp { // misc inline const RegEx& Space() { static const RegEx e = RegEx(' '); return e; } inline const RegEx& Tab() { static const RegEx e = RegEx('\t'); return e; } inline const RegEx& Blank() { static const RegEx e = Space() || Tab(); return e; } inline const RegEx& Break() { static const RegEx e = RegEx('\n') || RegEx("\r\n"); return e; } inline const RegEx& BlankOrBreak() { static const RegEx e = Blank() || Break(); return e; } inline const RegEx& Digit() { static const RegEx e = RegEx('0', '9'); return e; } inline const RegEx& Alpha() { static const RegEx e = RegEx('a', 'z') || RegEx('A', 'Z'); return e; } inline const RegEx& AlphaNumeric() { static const RegEx e = Alpha() || Digit(); return e; } inline const RegEx& Word() { static const RegEx e = AlphaNumeric() || RegEx('-'); return e; } inline const RegEx& Hex() { static const RegEx e = Digit() || RegEx('A', 'F') || RegEx('a', 'f'); return e; } // Valid Unicode code points that are not part of c-printable (YAML 1.2, sec. 5.1) inline const RegEx& NotPrintable() { static const RegEx e = RegEx(0) || RegEx("\x01\x02\x03\x04\x05\x06\x07\x08\x0B\x0C\x7F", REGEX_OR) || RegEx(0x0E, 0x1F) || (RegEx('\xC2') + (RegEx('\x80', '\x84') || RegEx('\x86', '\x9F'))); return e; } inline const RegEx& Utf8_ByteOrderMark() { static const RegEx e = RegEx("\xEF\xBB\xBF"); return e; } // actual tags inline const RegEx& DocStart() { static const RegEx e = RegEx("---") + (BlankOrBreak() || RegEx()); return e; } inline const RegEx& DocEnd() { static const RegEx e = RegEx("...") + (BlankOrBreak() || RegEx()); return e; } inline const RegEx& DocIndicator() { static const RegEx e = DocStart() || DocEnd(); return e; } inline const RegEx& BlockEntry() { static const RegEx e = RegEx('-') + (BlankOrBreak() || RegEx()); return e; } inline const RegEx& Key() { static const RegEx e = RegEx('?'); return e; } inline const RegEx& KeyInFlow() { static const RegEx e = RegEx('?') + BlankOrBreak(); return e; } inline const RegEx& Value() { static const RegEx e = RegEx(':') + (BlankOrBreak() || RegEx()); return e; } inline const RegEx& ValueInFlow() { static const RegEx e = RegEx(':') + (BlankOrBreak() || RegEx(",}", REGEX_OR)); return e; } inline const RegEx& ValueInJSONFlow() { static const RegEx e = RegEx(':'); return e; } inline const RegEx Comment() { static const RegEx e = RegEx('#'); return e; } inline const RegEx& Anchor() { static const RegEx e = !(RegEx("[]{},", REGEX_OR) || BlankOrBreak()); return e; } inline const RegEx& AnchorEnd() { static const RegEx e = RegEx("?:,]}%@`", REGEX_OR) || BlankOrBreak(); return e; } inline const RegEx& URI() { static const RegEx e = Word() || RegEx("#;/?:@&=+$,_.!~*'()[]", REGEX_OR) || (RegEx('%') + Hex() + Hex()); return e; } inline const RegEx& Tag() { static const RegEx e = Word() || RegEx("#;/?:@&=+$_.~*'", REGEX_OR) || (RegEx('%') + Hex() + Hex()); return e; } // Plain scalar rules: // . Cannot start with a blank. // . Can never start with any of , [ ] { } # & * ! | > \' \" % @ ` // . In the block context - ? : must be not be followed with a space. // . In the flow context ? is illegal and : and - must not be followed with a space. inline const RegEx& PlainScalar() { static const RegEx e = !(BlankOrBreak() || RegEx(",[]{}#&*!|>\'\"%@`", REGEX_OR) || (RegEx("-?:", REGEX_OR) + (BlankOrBreak() || RegEx()))); return e; } inline const RegEx& PlainScalarInFlow() { static const RegEx e = !(BlankOrBreak() || RegEx("?,[]{}#&*!|>\'\"%@`", REGEX_OR) || (RegEx("-:", REGEX_OR) + Blank())); return e; } inline const RegEx& EndScalar() { static const RegEx e = RegEx(':') + (BlankOrBreak() || RegEx()); return e; } inline const RegEx& EndScalarInFlow() { static const RegEx e = (RegEx(':') + (BlankOrBreak() || RegEx() || RegEx(",]}", REGEX_OR))) || RegEx(",?[]{}", REGEX_OR); return e; } inline const RegEx& EscSingleQuote() { static const RegEx e = RegEx("\'\'"); return e; } inline const RegEx& EscBreak() { static const RegEx e = RegEx('\\') + Break(); return e; } inline const RegEx& ChompIndicator() { static const RegEx e = RegEx("+-", REGEX_OR); return e; } inline const RegEx& Chomp() { static const RegEx e = (ChompIndicator() + Digit()) || (Digit() + ChompIndicator()) || ChompIndicator() || Digit(); return e; } // and some functions std::string Escape(Stream& in); } namespace Keys { const char Directive = '%'; const char FlowSeqStart = '['; const char FlowSeqEnd = ']'; const char FlowMapStart = '{'; const char FlowMapEnd = '}'; const char FlowEntry = ','; const char Alias = '*'; const char Anchor = '&'; const char Tag = '!'; const char LiteralScalar = '|'; const char FoldedScalar = '>'; const char VerbatimTagStart = '<'; const char VerbatimTagEnd = '>'; } } #endif // EXP_H_62B23520_7C8E_11DE_8A39_0800200C9A66 SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/src/parser.cpp0000664000175000017500000000705211723131175027176 0ustar dandan#include "yaml-cpp/parser.h" #include "yaml-cpp/eventhandler.h" #include "yaml-cpp/exceptions.h" #include "yaml-cpp/node.h" #include "directives.h" #include "nodebuilder.h" #include "scanner.h" #include "singledocparser.h" #include "tag.h" #include "token.h" #include #include namespace YAML { Parser::Parser() { } Parser::Parser(std::istream& in) { Load(in); } Parser::~Parser() { } Parser::operator bool() const { return m_pScanner.get() && !m_pScanner->empty(); } void Parser::Load(std::istream& in) { m_pScanner.reset(new Scanner(in)); m_pDirectives.reset(new Directives); } // HandleNextDocument // . Handles the next document // . Throws a ParserException on error. // . Returns false if there are no more documents bool Parser::HandleNextDocument(EventHandler& eventHandler) { if(!m_pScanner.get()) return false; ParseDirectives(); if(m_pScanner->empty()) return false; SingleDocParser sdp(*m_pScanner, *m_pDirectives); sdp.HandleDocument(eventHandler); return true; } // GetNextDocument // . Reads the next document in the queue (of tokens). // . Throws a ParserException on error. bool Parser::GetNextDocument(Node& document) { NodeBuilder builder(document); return HandleNextDocument(builder); } // ParseDirectives // . Reads any directives that are next in the queue. void Parser::ParseDirectives() { bool readDirective = false; while(1) { if(m_pScanner->empty()) break; Token& token = m_pScanner->peek(); if(token.type != Token::DIRECTIVE) break; // we keep the directives from the last document if none are specified; // but if any directives are specific, then we reset them if(!readDirective) m_pDirectives.reset(new Directives); readDirective = true; HandleDirective(token); m_pScanner->pop(); } } void Parser::HandleDirective(const Token& token) { if(token.value == "YAML") HandleYamlDirective(token); else if(token.value == "TAG") HandleTagDirective(token); } // HandleYamlDirective // . Should be of the form 'major.minor' (like a version number) void Parser::HandleYamlDirective(const Token& token) { if(token.params.size() != 1) throw ParserException(token.mark, ErrorMsg::YAML_DIRECTIVE_ARGS); if(!m_pDirectives->version.isDefault) throw ParserException(token.mark, ErrorMsg::REPEATED_YAML_DIRECTIVE); std::stringstream str(token.params[0]); str >> m_pDirectives->version.major; str.get(); str >> m_pDirectives->version.minor; if(!str || str.peek() != EOF) throw ParserException(token.mark, std::string(ErrorMsg::YAML_VERSION) + token.params[0]); if(m_pDirectives->version.major > 1) throw ParserException(token.mark, ErrorMsg::YAML_MAJOR_VERSION); m_pDirectives->version.isDefault = false; // TODO: warning on major == 1, minor > 2? } // HandleTagDirective // . Should be of the form 'handle prefix', where 'handle' is converted to 'prefix' in the file. void Parser::HandleTagDirective(const Token& token) { if(token.params.size() != 2) throw ParserException(token.mark, ErrorMsg::TAG_DIRECTIVE_ARGS); const std::string& handle = token.params[0]; const std::string& prefix = token.params[1]; if(m_pDirectives->tags.find(handle) != m_pDirectives->tags.end()) throw ParserException(token.mark, ErrorMsg::REPEATED_TAG_DIRECTIVE); m_pDirectives->tags[handle] = prefix; } void Parser::PrintTokens(std::ostream& out) { if(!m_pScanner.get()) return; while(1) { if(m_pScanner->empty()) break; out << m_pScanner->peek() << "\n"; m_pScanner->pop(); } } } SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/src/aliasmanager.cpp0000664000175000017500000000112011723131175030314 0ustar dandan#include "yaml-cpp/aliasmanager.h" #include "yaml-cpp/node.h" #include #include namespace YAML { AliasManager::AliasManager(): m_curAnchor(0) { } void AliasManager::RegisterReference(const Node& node) { m_anchorByIdentity.insert(std::make_pair(&node, _CreateNewAnchor())); } anchor_t AliasManager::LookupAnchor(const Node& node) const { AnchorByIdentity::const_iterator it = m_anchorByIdentity.find(&node); if(it == m_anchorByIdentity.end()) return 0; return it->second; } anchor_t AliasManager::_CreateNewAnchor() { return ++m_curAnchor; } } SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/src/simplekey.cpp0000664000175000017500000000615011723131175027702 0ustar dandan#include "scanner.h" #include "token.h" #include "yaml-cpp/exceptions.h" #include "exp.h" namespace YAML { Scanner::SimpleKey::SimpleKey(const Mark& mark_, int flowLevel_) : mark(mark_), flowLevel(flowLevel_), pIndent(0), pMapStart(0), pKey(0) { } void Scanner::SimpleKey::Validate() { // Note: pIndent will *not* be garbage here; // we "garbage collect" them so we can // always refer to them if(pIndent) pIndent->status = IndentMarker::VALID; if(pMapStart) pMapStart->status = Token::VALID; if(pKey) pKey->status = Token::VALID; } void Scanner::SimpleKey::Invalidate() { if(pIndent) pIndent->status = IndentMarker::INVALID; if(pMapStart) pMapStart->status = Token::INVALID; if(pKey) pKey->status = Token::INVALID; } // CanInsertPotentialSimpleKey bool Scanner::CanInsertPotentialSimpleKey() const { if(!m_simpleKeyAllowed) return false; return !ExistsActiveSimpleKey(); } // ExistsActiveSimpleKey // . Returns true if there's a potential simple key at our flow level // (there's allowed at most one per flow level, i.e., at the start of the flow start token) bool Scanner::ExistsActiveSimpleKey() const { if(m_simpleKeys.empty()) return false; const SimpleKey& key = m_simpleKeys.top(); return key.flowLevel == GetFlowLevel(); } // InsertPotentialSimpleKey // . If we can, add a potential simple key to the queue, // and save it on a stack. void Scanner::InsertPotentialSimpleKey() { if(!CanInsertPotentialSimpleKey()) return; SimpleKey key(INPUT.mark(), GetFlowLevel()); // first add a map start, if necessary if(InBlockContext()) { key.pIndent = PushIndentTo(INPUT.column(), IndentMarker::MAP); if(key.pIndent) { key.pIndent->status = IndentMarker::UNKNOWN; key.pMapStart = key.pIndent->pStartToken; key.pMapStart->status = Token::UNVERIFIED; } } // then add the (now unverified) key m_tokens.push(Token(Token::KEY, INPUT.mark())); key.pKey = &m_tokens.back(); key.pKey->status = Token::UNVERIFIED; m_simpleKeys.push(key); } // InvalidateSimpleKey // . Automatically invalidate the simple key in our flow level void Scanner::InvalidateSimpleKey() { if(m_simpleKeys.empty()) return; // grab top key SimpleKey& key = m_simpleKeys.top(); if(key.flowLevel != GetFlowLevel()) return; key.Invalidate(); m_simpleKeys.pop(); } // VerifySimpleKey // . Determines whether the latest simple key to be added is valid, // and if so, makes it valid. bool Scanner::VerifySimpleKey() { if(m_simpleKeys.empty()) return false; // grab top key SimpleKey key = m_simpleKeys.top(); // only validate if we're in the correct flow level if(key.flowLevel != GetFlowLevel()) return false; m_simpleKeys.pop(); bool isValid = true; // needs to be less than 1024 characters and inline if(INPUT.line() != key.mark.line || INPUT.pos() - key.mark.pos > 1024) isValid = false; // invalidate key if(isValid) key.Validate(); else key.Invalidate(); return isValid; } void Scanner::PopAllSimpleKeys() { while(!m_simpleKeys.empty()) m_simpleKeys.pop(); } } SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/src/contrib/0000775000175000017500000000000012110505246026625 5ustar dandan././@LongLink0000000000000000000000000000015400000000000011565 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/src/contrib/graphbuilderadapter.hSuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/src/contrib/graphbuilderad0000664000175000017500000000432211723131175031533 0ustar dandan#ifndef GRAPHBUILDERADAPTER_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #define GRAPHBUILDERADAPTER_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #if defined(_MSC_VER) || (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 #pragma once #endif #include #include #include #include "yaml-cpp/eventhandler.h" #include "yaml-cpp/contrib/anchordict.h" #include "yaml-cpp/contrib/graphbuilder.h" namespace YAML { class GraphBuilderAdapter : public EventHandler { public: GraphBuilderAdapter(GraphBuilderInterface& builder) : m_builder(builder), m_pRootNode(NULL), m_pKeyNode(NULL) { } virtual void OnDocumentStart(const Mark& mark) {(void)mark;} virtual void OnDocumentEnd() {} virtual void OnNull(const Mark& mark, anchor_t anchor); virtual void OnAlias(const Mark& mark, anchor_t anchor); virtual void OnScalar(const Mark& mark, const std::string& tag, anchor_t anchor, const std::string& value); virtual void OnSequenceStart(const Mark& mark, const std::string& tag, anchor_t anchor); virtual void OnSequenceEnd(); virtual void OnMapStart(const Mark& mark, const std::string& tag, anchor_t anchor); virtual void OnMapEnd(); void *RootNode() const {return m_pRootNode;} private: struct ContainerFrame { ContainerFrame(void *pSequence) : pContainer(pSequence), pPrevKeyNode(&sequenceMarker) {} ContainerFrame(void *pMap, void* pPrevKeyNode) : pContainer(pMap), pPrevKeyNode(pPrevKeyNode) {} void *pContainer; void *pPrevKeyNode; bool isMap() const {return pPrevKeyNode != &sequenceMarker;} private: static int sequenceMarker; }; typedef std::stack ContainerStack; typedef AnchorDict AnchorMap; GraphBuilderInterface& m_builder; ContainerStack m_containers; AnchorMap m_anchors; void *m_pRootNode; void *m_pKeyNode; void *GetCurrentParent() const; void RegisterAnchor(anchor_t anchor, void *pNode); void DispositionNode(void *pNode); }; } #endif // GRAPHBUILDERADAPTER_H_62B23520_7C8E_11DE_8A39_0800200C9A66 ././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/src/contrib/graphbuilder.cppSuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/src/contrib/graphbuilder.c0000664000175000017500000000061611723131175031451 0ustar dandan#include "yaml-cpp/parser.h" #include "yaml-cpp/contrib/graphbuilder.h" #include "graphbuilderadapter.h" namespace YAML { void *BuildGraphOfNextDocument(Parser& parser, GraphBuilderInterface& graphBuilder) { GraphBuilderAdapter eventHandler(graphBuilder); if (parser.HandleNextDocument(eventHandler)) { return eventHandler.RootNode(); } else { return NULL; } } } ././@LongLink0000000000000000000000000000015600000000000011567 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/src/contrib/graphbuilderadapter.cppSuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/src/contrib/graphbuilderad0000664000175000017500000000502011723131175031527 0ustar dandan#include "graphbuilderadapter.h" namespace YAML { int GraphBuilderAdapter::ContainerFrame::sequenceMarker; void GraphBuilderAdapter::OnNull(const Mark& mark, anchor_t anchor) { void *pParent = GetCurrentParent(); void *pNode = m_builder.NewNull(mark, pParent); RegisterAnchor(anchor, pNode); DispositionNode(pNode); } void GraphBuilderAdapter::OnAlias(const Mark& mark, anchor_t anchor) { void *pReffedNode = m_anchors.Get(anchor); DispositionNode(m_builder.AnchorReference(mark, pReffedNode)); } void GraphBuilderAdapter::OnScalar(const Mark& mark, const std::string& tag, anchor_t anchor, const std::string& value) { void *pParent = GetCurrentParent(); void *pNode = m_builder.NewScalar(mark, tag, pParent, value); RegisterAnchor(anchor, pNode); DispositionNode(pNode); } void GraphBuilderAdapter::OnSequenceStart(const Mark& mark, const std::string& tag, anchor_t anchor) { void *pNode = m_builder.NewSequence(mark, tag, GetCurrentParent()); m_containers.push(ContainerFrame(pNode)); RegisterAnchor(anchor, pNode); } void GraphBuilderAdapter::OnSequenceEnd() { void *pSequence = m_containers.top().pContainer; m_containers.pop(); DispositionNode(pSequence); } void GraphBuilderAdapter::OnMapStart(const Mark& mark, const std::string& tag, anchor_t anchor) { void *pNode = m_builder.NewMap(mark, tag, GetCurrentParent()); m_containers.push(ContainerFrame(pNode, m_pKeyNode)); m_pKeyNode = NULL; RegisterAnchor(anchor, pNode); } void GraphBuilderAdapter::OnMapEnd() { void *pMap = m_containers.top().pContainer; m_pKeyNode = m_containers.top().pPrevKeyNode; m_containers.pop(); DispositionNode(pMap); } void *GraphBuilderAdapter::GetCurrentParent() const { if (m_containers.empty()) { return NULL; } return m_containers.top().pContainer; } void GraphBuilderAdapter::RegisterAnchor(anchor_t anchor, void *pNode) { if (anchor) { m_anchors.Register(anchor, pNode); } } void GraphBuilderAdapter::DispositionNode(void *pNode) { if (m_containers.empty()) { m_pRootNode = pNode; return; } void *pContainer = m_containers.top().pContainer; if (m_containers.top().isMap()) { if (m_pKeyNode) { m_builder.AssignInMap(pContainer, m_pKeyNode, pNode); m_pKeyNode = NULL; } else { m_pKeyNode = pNode; } } else { m_builder.AppendToSequence(pContainer, pNode); } } } SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/src/tag.h0000664000175000017500000000121711723131175026117 0ustar dandan#ifndef TAG_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #define TAG_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #if defined(_MSC_VER) || (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 #pragma once #endif #include namespace YAML { struct Token; struct Directives; struct Tag { enum TYPE { VERBATIM, PRIMARY_HANDLE, SECONDARY_HANDLE, NAMED_HANDLE, NON_SPECIFIC }; Tag(const Token& token); const std::string Translate(const Directives& directives); TYPE type; std::string handle, value; }; } #endif // TAG_H_62B23520_7C8E_11DE_8A39_0800200C9A66 SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/src/tag.cpp0000664000175000017500000000206411723131175026453 0ustar dandan#include "tag.h" #include "directives.h" #include "token.h" #include #include namespace YAML { Tag::Tag(const Token& token): type(static_cast(token.data)) { switch(type) { case VERBATIM: value = token.value; break; case PRIMARY_HANDLE: value = token.value; break; case SECONDARY_HANDLE: value = token.value; break; case NAMED_HANDLE: handle = token.value; value = token.params[0]; break; case NON_SPECIFIC: break; default: assert(false); } } const std::string Tag::Translate(const Directives& directives) { switch(type) { case VERBATIM: return value; case PRIMARY_HANDLE: return directives.TranslateTagHandle("!") + value; case SECONDARY_HANDLE: return directives.TranslateTagHandle("!!") + value; case NAMED_HANDLE: return directives.TranslateTagHandle("!" + handle + "!") + value; case NON_SPECIFIC: // TODO: return "!"; default: assert(false); } throw std::runtime_error("yaml-cpp: internal error, bad tag type"); } } SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/src/directives.h0000664000175000017500000000121311723131175027501 0ustar dandan#ifndef DIRECTIVES_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #define DIRECTIVES_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #if defined(_MSC_VER) || (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 #pragma once #endif #include #include namespace YAML { struct Version { bool isDefault; int major, minor; }; struct Directives { Directives(); const std::string TranslateTagHandle(const std::string& handle) const; Version version; std::map tags; }; } #endif // DIRECTIVES_H_62B23520_7C8E_11DE_8A39_0800200C9A66 SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/src/emitterstate.h0000664000175000017500000001435411723131175030064 0ustar dandan#ifndef EMITTERSTATE_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #define EMITTERSTATE_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #if defined(_MSC_VER) || (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 #pragma once #endif #include "ptr_stack.h" #include "setting.h" #include "yaml-cpp/emittermanip.h" #include #include #include #include namespace YAML { enum FMT_SCOPE { LOCAL, GLOBAL }; enum GROUP_TYPE { GT_NONE, GT_SEQ, GT_MAP }; enum FLOW_TYPE { FT_NONE, FT_FLOW, FT_BLOCK }; enum NODE_STATE { NS_START, NS_READY_FOR_ATOM, NS_END }; enum EMITTER_STATE { ES_WAITING_FOR_DOC, ES_WRITING_DOC, ES_DONE_WITH_DOC, // block seq ES_WAITING_FOR_BLOCK_SEQ_ENTRY, ES_WRITING_BLOCK_SEQ_ENTRY, ES_DONE_WITH_BLOCK_SEQ_ENTRY, // flow seq ES_WAITING_FOR_FLOW_SEQ_ENTRY, ES_WRITING_FLOW_SEQ_ENTRY, ES_DONE_WITH_FLOW_SEQ_ENTRY, // block map ES_WAITING_FOR_BLOCK_MAP_ENTRY, ES_WAITING_FOR_BLOCK_MAP_KEY, ES_WRITING_BLOCK_MAP_KEY, ES_DONE_WITH_BLOCK_MAP_KEY, ES_WAITING_FOR_BLOCK_MAP_VALUE, ES_WRITING_BLOCK_MAP_VALUE, ES_DONE_WITH_BLOCK_MAP_VALUE, // flow map ES_WAITING_FOR_FLOW_MAP_ENTRY, ES_WAITING_FOR_FLOW_MAP_KEY, ES_WRITING_FLOW_MAP_KEY, ES_DONE_WITH_FLOW_MAP_KEY, ES_WAITING_FOR_FLOW_MAP_VALUE, ES_WRITING_FLOW_MAP_VALUE, ES_DONE_WITH_FLOW_MAP_VALUE }; class EmitterState { public: EmitterState(); ~EmitterState(); // basic state checking bool good() const { return m_isGood; } const std::string GetLastError() const { return m_lastError; } void SetError(const std::string& error) { m_isGood = false; m_lastError = error; } // main state of the machine EMITTER_STATE GetCurState() const { return m_stateStack.top(); } void SwitchState(EMITTER_STATE state) { PopState(); PushState(state); } void PushState(EMITTER_STATE state) { m_stateStack.push(state); } void PopState() { m_stateStack.pop(); } void SetLocalValue(EMITTER_MANIP value); // group handling void BeginGroup(GROUP_TYPE type); void EndGroup(GROUP_TYPE type); GROUP_TYPE GetCurGroupType() const; FLOW_TYPE GetCurGroupFlowType() const; int GetCurIndent() const { return m_curIndent; } bool CurrentlyInLongKey(); void StartLongKey(); void StartSimpleKey(); bool RequiresSoftSeparation() const { return m_requiresSoftSeparation; } bool RequiresHardSeparation() const { return m_requiresHardSeparation; } void RequireSoftSeparation() { m_requiresSoftSeparation = true; } void RequireHardSeparation() { m_requiresSoftSeparation = true; m_requiresHardSeparation = true; } void ForceHardSeparation() { m_requiresSoftSeparation = false; } void UnsetSeparation() { m_requiresSoftSeparation = false; m_requiresHardSeparation = false; } void ClearModifiedSettings(); // formatters bool SetOutputCharset(EMITTER_MANIP value, FMT_SCOPE scope); EMITTER_MANIP GetOutputCharset() const { return m_charset.get(); } bool SetStringFormat(EMITTER_MANIP value, FMT_SCOPE scope); EMITTER_MANIP GetStringFormat() const { return m_strFmt.get(); } bool SetBoolFormat(EMITTER_MANIP value, FMT_SCOPE scope); EMITTER_MANIP GetBoolFormat() const { return m_boolFmt.get(); } bool SetBoolLengthFormat(EMITTER_MANIP value, FMT_SCOPE scope); EMITTER_MANIP GetBoolLengthFormat() const { return m_boolLengthFmt.get(); } bool SetBoolCaseFormat(EMITTER_MANIP value, FMT_SCOPE scope); EMITTER_MANIP GetBoolCaseFormat() const { return m_boolCaseFmt.get(); } bool SetIntFormat(EMITTER_MANIP value, FMT_SCOPE scope); EMITTER_MANIP GetIntFormat() const { return m_intFmt.get(); } bool SetIndent(unsigned value, FMT_SCOPE scope); int GetIndent() const { return m_indent.get(); } bool SetPreCommentIndent(unsigned value, FMT_SCOPE scope); int GetPreCommentIndent() const { return m_preCommentIndent.get(); } bool SetPostCommentIndent(unsigned value, FMT_SCOPE scope); int GetPostCommentIndent() const { return m_postCommentIndent.get(); } bool SetFlowType(GROUP_TYPE groupType, EMITTER_MANIP value, FMT_SCOPE scope); EMITTER_MANIP GetFlowType(GROUP_TYPE groupType) const; bool SetMapKeyFormat(EMITTER_MANIP value, FMT_SCOPE scope); EMITTER_MANIP GetMapKeyFormat() const { return m_mapKeyFmt.get(); } bool SetFloatPrecision(int value, FMT_SCOPE scope); unsigned GetFloatPrecision() const { return m_floatPrecision.get(); } bool SetDoublePrecision(int value, FMT_SCOPE scope); unsigned GetDoublePrecision() const { return m_doublePrecision.get(); } private: template void _Set(Setting& fmt, T value, FMT_SCOPE scope); private: // basic state ok? bool m_isGood; std::string m_lastError; // other state std::stack m_stateStack; Setting m_charset; Setting m_strFmt; Setting m_boolFmt; Setting m_boolLengthFmt; Setting m_boolCaseFmt; Setting m_intFmt; Setting m_indent; Setting m_preCommentIndent, m_postCommentIndent; Setting m_seqFmt; Setting m_mapFmt; Setting m_mapKeyFmt; Setting m_floatPrecision; Setting m_doublePrecision; SettingChanges m_modifiedSettings; SettingChanges m_globalModifiedSettings; struct Group { Group(GROUP_TYPE type_): type(type_), usingLongKey(false), indent(0) {} GROUP_TYPE type; EMITTER_MANIP flow; bool usingLongKey; int indent; SettingChanges modifiedSettings; }; ptr_stack m_groups; unsigned m_curIndent; bool m_requiresSoftSeparation; bool m_requiresHardSeparation; }; template void EmitterState::_Set(Setting& fmt, T value, FMT_SCOPE scope) { switch(scope) { case LOCAL: m_modifiedSettings.push(fmt.set(value)); break; case GLOBAL: fmt.set(value); m_globalModifiedSettings.push(fmt.set(value)); // this pushes an identity set, so when we restore, // it restores to the value here, and not the previous one break; default: assert(false); } } } #endif // EMITTERSTATE_H_62B23520_7C8E_11DE_8A39_0800200C9A66 SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/src/nodebuilder.h0000664000175000017500000000305011723131175027635 0ustar dandan#ifndef NODEBUILDER_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #define NODEBUILDER_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #if defined(_MSC_VER) || (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 #pragma once #endif #include "yaml-cpp/eventhandler.h" #include #include #include #include namespace YAML { class Node; class NodeBuilder: public EventHandler { public: explicit NodeBuilder(Node& root); virtual ~NodeBuilder(); virtual void OnDocumentStart(const Mark& mark); virtual void OnDocumentEnd(); virtual void OnNull(const Mark& mark, anchor_t anchor); virtual void OnAlias(const Mark& mark, anchor_t anchor); virtual void OnScalar(const Mark& mark, const std::string& tag, anchor_t anchor, const std::string& value); virtual void OnSequenceStart(const Mark& mark, const std::string& tag, anchor_t anchor); virtual void OnSequenceEnd(); virtual void OnMapStart(const Mark& mark, const std::string& tag, anchor_t anchor); virtual void OnMapEnd(); private: Node& Push(anchor_t anchor); Node& Push(); Node& Top(); void Pop(); void Insert(Node& node); void RegisterAnchor(anchor_t anchor, Node& node); private: Node& m_root; bool m_initializedRoot; bool m_finished; std::stack m_stack; std::stack m_pendingKeys; std::stack m_didPushKey; typedef std::vector Anchors; Anchors m_anchors; }; } #endif // NODEBUILDER_H_62B23520_7C8E_11DE_8A39_0800200C9A66 SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/src/collectionstack.h0000664000175000017500000000175011723131175030527 0ustar dandan#ifndef COLLECTIONSTACK_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #define COLLECTIONSTACK_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #if defined(_MSC_VER) || (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 #pragma once #endif #include #include namespace YAML { struct CollectionType { enum value { None, BlockMap, BlockSeq, FlowMap, FlowSeq, CompactMap }; }; class CollectionStack { public: CollectionType::value GetCurCollectionType() const { if(collectionStack.empty()) return CollectionType::None; return collectionStack.top(); } void PushCollectionType(CollectionType::value type) { collectionStack.push(type); } void PopCollectionType(CollectionType::value type) { assert(type == GetCurCollectionType()); collectionStack.pop(); } private: std::stack collectionStack; }; } #endif // COLLECTIONSTACK_H_62B23520_7C8E_11DE_8A39_0800200C9A66 SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/src/scanner.h0000664000175000017500000000602611723131175027000 0ustar dandan#ifndef SCANNER_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #define SCANNER_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #if defined(_MSC_VER) || (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 #pragma once #endif #include #include #include #include #include #include #include "ptr_vector.h" #include "stream.h" #include "token.h" namespace YAML { class Node; class RegEx; class Scanner { public: Scanner(std::istream& in); ~Scanner(); // token queue management (hopefully this looks kinda stl-ish) bool empty(); void pop(); Token& peek(); private: struct IndentMarker { enum INDENT_TYPE { MAP, SEQ, NONE }; enum STATUS { VALID, INVALID, UNKNOWN }; IndentMarker(int column_, INDENT_TYPE type_): column(column_), type(type_), status(VALID), pStartToken(0) {} int column; INDENT_TYPE type; STATUS status; Token *pStartToken; }; enum FLOW_MARKER { FLOW_MAP, FLOW_SEQ }; private: // scanning void EnsureTokensInQueue(); void ScanNextToken(); void ScanToNextToken(); void StartStream(); void EndStream(); Token *PushToken(Token::TYPE type); bool InFlowContext() const { return !m_flows.empty(); } bool InBlockContext() const { return m_flows.empty(); } int GetFlowLevel() const { return m_flows.size(); } Token::TYPE GetStartTokenFor(IndentMarker::INDENT_TYPE type) const; IndentMarker *PushIndentTo(int column, IndentMarker::INDENT_TYPE type); void PopIndentToHere(); void PopAllIndents(); void PopIndent(); int GetTopIndent() const; // checking input bool CanInsertPotentialSimpleKey() const; bool ExistsActiveSimpleKey() const; void InsertPotentialSimpleKey(); void InvalidateSimpleKey(); bool VerifySimpleKey(); void PopAllSimpleKeys(); void ThrowParserException(const std::string& msg) const; bool IsWhitespaceToBeEaten(char ch); const RegEx& GetValueRegex() const; struct SimpleKey { SimpleKey(const Mark& mark_, int flowLevel_); void Validate(); void Invalidate(); Mark mark; int flowLevel; IndentMarker *pIndent; Token *pMapStart, *pKey; }; // and the tokens void ScanDirective(); void ScanDocStart(); void ScanDocEnd(); void ScanBlockSeqStart(); void ScanBlockMapSTart(); void ScanBlockEnd(); void ScanBlockEntry(); void ScanFlowStart(); void ScanFlowEnd(); void ScanFlowEntry(); void ScanKey(); void ScanValue(); void ScanAnchorOrAlias(); void ScanTag(); void ScanPlainScalar(); void ScanQuotedScalar(); void ScanBlockScalar(); private: // the stream Stream INPUT; // the output (tokens) std::queue m_tokens; // state info bool m_startedStream, m_endedStream; bool m_simpleKeyAllowed; bool m_canBeJSONFlow; std::stack m_simpleKeys; std::stack m_indents; ptr_vector m_indentRefs; // for "garbage collection" std::stack m_flows; }; } #endif // SCANNER_H_62B23520_7C8E_11DE_8A39_0800200C9A66 SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/src/iterpriv.h0000664000175000017500000000167611723131175027221 0ustar dandan#ifndef ITERPRIV_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #define ITERPRIV_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #if defined(_MSC_VER) || (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 #pragma once #endif #include "yaml-cpp/ltnode.h" #include #include namespace YAML { class Node; // IterPriv // . The implementation for iterators - essentially a union of sequence and map iterators. struct IterPriv { IterPriv(): type(IT_NONE) {} IterPriv(std::vector ::const_iterator it): type(IT_SEQ), seqIter(it) {} IterPriv(std::map ::const_iterator it): type(IT_MAP), mapIter(it) {} enum ITER_TYPE { IT_NONE, IT_SEQ, IT_MAP }; ITER_TYPE type; std::vector ::const_iterator seqIter; std::map ::const_iterator mapIter; }; } #endif // ITERPRIV_H_62B23520_7C8E_11DE_8A39_0800200C9A66 SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/src/streamcharsource.h0000664000175000017500000000256311723131175030723 0ustar dandan#ifndef STREAMCHARSOURCE_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #define STREAMCHARSOURCE_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #if defined(_MSC_VER) || (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 #pragma once #endif #include "yaml-cpp/noncopyable.h" #include namespace YAML { class StreamCharSource { public: StreamCharSource(const Stream& stream): m_offset(0), m_stream(stream) {} StreamCharSource(const StreamCharSource& source): m_offset(source.m_offset), m_stream(source.m_stream) {} ~StreamCharSource() {} operator bool() const; char operator [] (std::size_t i) const { return m_stream.CharAt(m_offset + i); } bool operator !() const { return !static_cast(*this); } const StreamCharSource operator + (int i) const; private: std::size_t m_offset; const Stream& m_stream; StreamCharSource& operator = (const StreamCharSource&); // non-assignable }; inline StreamCharSource::operator bool() const { return m_stream.ReadAheadTo(m_offset); } inline const StreamCharSource StreamCharSource::operator + (int i) const { StreamCharSource source(*this); if(static_cast (source.m_offset) + i >= 0) source.m_offset += i; else source.m_offset = 0; return source; } } #endif // STREAMCHARSOURCE_H_62B23520_7C8E_11DE_8A39_0800200C9A66 SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/src/exp.cpp0000664000175000017500000000577411723131175026507 0ustar dandan#include "exp.h" #include "yaml-cpp/exceptions.h" #include namespace YAML { namespace Exp { unsigned ParseHex(const std::string& str, const Mark& mark) { unsigned value = 0; for(std::size_t i=0;i(ch)); } // Escape // . Translates the next 'codeLength' characters into a hex number and returns the result. // . Throws if it's not actually hex. std::string Escape(Stream& in, int codeLength) { // grab string std::string str; for(int i=0;i= 0xD800 && value <= 0xDFFF) || value > 0x10FFFF) { std::stringstream msg; msg << ErrorMsg::INVALID_UNICODE << value; throw ParserException(in.mark(), msg.str()); } // now break it up into chars if(value <= 0x7F) return Str(value); else if(value <= 0x7FF) return Str(0xC0 + (value >> 6)) + Str(0x80 + (value & 0x3F)); else if(value <= 0xFFFF) return Str(0xE0 + (value >> 12)) + Str(0x80 + ((value >> 6) & 0x3F)) + Str(0x80 + (value & 0x3F)); else return Str(0xF0 + (value >> 18)) + Str(0x80 + ((value >> 12) & 0x3F)) + Str(0x80 + ((value >> 6) & 0x3F)) + Str(0x80 + (value & 0x3F)); } // Escape // . Escapes the sequence starting 'in' (it must begin with a '\' or single quote) // and returns the result. // . Throws if it's an unknown escape character. std::string Escape(Stream& in) { // eat slash char escape = in.get(); // switch on escape character char ch = in.get(); // first do single quote, since it's easier if(escape == '\'' && ch == '\'') return "\'"; // now do the slash (we're not gonna check if it's a slash - you better pass one!) switch(ch) { case '0': return std::string(1, '\x00'); case 'a': return "\x07"; case 'b': return "\x08"; case 't': case '\t': return "\x09"; case 'n': return "\x0A"; case 'v': return "\x0B"; case 'f': return "\x0C"; case 'r': return "\x0D"; case 'e': return "\x1B"; case ' ': return "\x20"; case '\"': return "\""; case '\'': return "\'"; case '\\': return "\\"; case '/': return "/"; case 'N': return "\x85"; case '_': return "\xA0"; case 'L': return "\xE2\x80\xA8"; // LS (#x2028) case 'P': return "\xE2\x80\xA9"; // PS (#x2029) case 'x': return Escape(in, 2); case 'u': return Escape(in, 4); case 'U': return Escape(in, 8); } std::stringstream msg; throw ParserException(in.mark(), std::string(ErrorMsg::INVALID_ESCAPE) + ch); } } } SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/src/binary.cpp0000664000175000017500000000722111723131175027164 0ustar dandan#include "yaml-cpp/binary.h" #include "yaml-cpp/node.h" namespace YAML { static const char encoding[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; std::string EncodeBase64(const unsigned char *data, std::size_t size) { const char PAD = '='; std::string ret; ret.resize(4 * size / 3 + 3); char *out = &ret[0]; std::size_t chunks = size / 3; std::size_t remainder = size % 3; for(std::size_t i=0;i> 2]; *out++ = encoding[((data[0] & 0x3) << 4) | (data[1] >> 4)]; *out++ = encoding[((data[1] & 0xf) << 2) | (data[2] >> 6)]; *out++ = encoding[data[2] & 0x3f]; } switch(remainder) { case 0: break; case 1: *out++ = encoding[data[0] >> 2]; *out++ = encoding[((data[0] & 0x3) << 4)]; *out++ = PAD; *out++ = PAD; break; case 2: *out++ = encoding[data[0] >> 2]; *out++ = encoding[((data[0] & 0x3) << 4) | (data[1] >> 4)]; *out++ = encoding[((data[1] & 0xf) << 2)]; *out++ = PAD; break; } ret.resize(out - &ret[0]); return ret; } static const unsigned char decoding[] = { 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255, 62,255,255,255, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61,255,255,255, 0,255,255, 255, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,255,255,255,255,255, 255, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, }; std::vector DecodeBase64(const std::string& input) { typedef std::vector ret_type; if(input.empty()) return ret_type(); ret_type ret(3 * input.size() / 4 + 1); unsigned char *out = &ret[0]; unsigned value = 0; for(std::size_t i=0;i(input[i])]; if(d == 255) return ret_type(); value = (value << 6) | d; if(i % 4 == 3) { *out++ = value >> 16; if(i > 0 && input[i - 1] != '=') *out++ = value >> 8; if(input[i] != '=') *out++ = value; } } ret.resize(out - &ret[0]); return ret; } void operator >> (const Node& node, Binary& binary) { std::string scalar; node.GetScalar(scalar); std::vector data = DecodeBase64(scalar); binary.swap(data); } } SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/src/regeximpl.h0000664000175000017500000001120411723131175027335 0ustar dandan#ifndef REGEXIMPL_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #define REGEXIMPL_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #if defined(_MSC_VER) || (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 #pragma once #endif #include "stream.h" #include "stringsource.h" #include "streamcharsource.h" namespace YAML { // query matches inline bool RegEx::Matches(char ch) const { std::string str; str += ch; return Matches(str); } inline bool RegEx::Matches(const std::string& str) const { return Match(str) >= 0; } inline bool RegEx::Matches(const Stream& in) const { return Match(in) >= 0; } template inline bool RegEx::Matches(const Source& source) const { return Match(source) >= 0; } // Match // . Matches the given string against this regular expression. // . Returns the number of characters matched. // . Returns -1 if no characters were matched (the reason for // not returning zero is that we may have an empty regex // which is ALWAYS successful at matching zero characters). // . REMEMBER that we only match from the start of the buffer! inline int RegEx::Match(const std::string& str) const { StringCharSource source(str.c_str(), str.size()); return Match(source); } inline int RegEx::Match(const Stream& in) const { StreamCharSource source(in); return Match(source); } template inline bool RegEx::IsValidSource(const Source& source) const { return source; } template<> inline bool RegEx::IsValidSource(const StringCharSource&source) const { switch(m_op) { case REGEX_MATCH: case REGEX_RANGE: return source; default: return true; } } template inline int RegEx::Match(const Source& source) const { return IsValidSource(source) ? MatchUnchecked(source) : -1; } template inline int RegEx::MatchUnchecked(const Source& source) const { switch(m_op) { case REGEX_EMPTY: return MatchOpEmpty(source); case REGEX_MATCH: return MatchOpMatch(source); case REGEX_RANGE: return MatchOpRange(source); case REGEX_OR: return MatchOpOr(source); case REGEX_AND: return MatchOpAnd(source); case REGEX_NOT: return MatchOpNot(source); case REGEX_SEQ: return MatchOpSeq(source); } return -1; } ////////////////////////////////////////////////////////////////////////////// // Operators // Note: the convention MatchOp* is that we can assume IsSourceValid(source). // So we do all our checks *before* we call these functions // EmptyOperator template inline int RegEx::MatchOpEmpty(const Source& source) const { return source[0] == Stream::eof() ? 0 : -1; } template <> inline int RegEx::MatchOpEmpty(const StringCharSource& source) const { return !source ? 0 : -1; // the empty regex only is successful on the empty string } // MatchOperator template inline int RegEx::MatchOpMatch(const Source& source) const { if(source[0] != m_a) return -1; return 1; } // RangeOperator template inline int RegEx::MatchOpRange(const Source& source) const { if(m_a > source[0] || m_z < source[0]) return -1; return 1; } // OrOperator template inline int RegEx::MatchOpOr(const Source& source) const { for(std::size_t i=0;i= 0) return n; } return -1; } // AndOperator // Note: 'AND' is a little funny, since we may be required to match things // of different lengths. If we find a match, we return the length of // the FIRST entry on the list. template inline int RegEx::MatchOpAnd(const Source& source) const { int first = -1; for(std::size_t i=0;i inline int RegEx::MatchOpNot(const Source& source) const { if(m_params.empty()) return -1; if(m_params[0].MatchUnchecked(source) >= 0) return -1; return 1; } // SeqOperator template inline int RegEx::MatchOpSeq(const Source& source) const { int offset = 0; for(std::size_t i=0;i= 4) || (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 #pragma once #endif #include "yaml-cpp/noncopyable.h" #include "ptr_vector.h" #include namespace YAML { class Node; class NodeOwnership: private noncopyable { public: explicit NodeOwnership(NodeOwnership *pOwner = 0); ~NodeOwnership(); Node& Create() { return m_pOwner->_Create(); } void MarkAsAliased(const Node& node) { m_pOwner->_MarkAsAliased(node); } bool IsAliased(const Node& node) const { return m_pOwner->_IsAliased(node); } private: Node& _Create(); void _MarkAsAliased(const Node& node); bool _IsAliased(const Node& node) const; private: ptr_vector m_nodes; std::set m_aliasedNodes; NodeOwnership *m_pOwner; }; } #endif // NODE_OWNERSHIP_H_62B23520_7C8E_11DE_8A39_0800200C9A66 SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/src/singledocparser.h0000664000175000017500000000342011723131175030526 0ustar dandan#ifndef SINGLEDOCPARSER_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #define SINGLEDOCPARSER_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #if defined(_MSC_VER) || (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 #pragma once #endif #include "yaml-cpp/anchor.h" #include "yaml-cpp/noncopyable.h" #include #include #include namespace YAML { struct Directives; struct Mark; struct Token; class CollectionStack; class EventHandler; class Node; class Scanner; class SingleDocParser: private noncopyable { public: SingleDocParser(Scanner& scanner, const Directives& directives); ~SingleDocParser(); void HandleDocument(EventHandler& eventHandler); private: void HandleNode(EventHandler& eventHandler); void HandleSequence(EventHandler& eventHandler); void HandleBlockSequence(EventHandler& eventHandler); void HandleFlowSequence(EventHandler& eventHandler); void HandleMap(EventHandler& eventHandler); void HandleBlockMap(EventHandler& eventHandler); void HandleFlowMap(EventHandler& eventHandler); void HandleCompactMap(EventHandler& eventHandler); void HandleCompactMapWithNoKey(EventHandler& eventHandler); void ParseProperties(std::string& tag, anchor_t& anchor); void ParseTag(std::string& tag); void ParseAnchor(anchor_t& anchor); anchor_t RegisterAnchor(const std::string& name); anchor_t LookupAnchor(const Mark& mark, const std::string& name) const; private: Scanner& m_scanner; const Directives& m_directives; std::auto_ptr m_pCollectionStack; typedef std::map Anchors; Anchors m_anchors; anchor_t m_curAnchor; }; } #endif // SINGLEDOCPARSER_H_62B23520_7C8E_11DE_8A39_0800200C9A66 SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/src/null.cpp0000664000175000017500000000022711723131175026651 0ustar dandan#include "yaml-cpp/null.h" #include "yaml-cpp/node.h" namespace YAML { _Null Null; bool IsNull(const Node& node) { return node.Read(Null); } } SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/src/conversion.cpp0000664000175000017500000000376411723131175030075 0ustar dandan#include "yaml-cpp/conversion.h" #include //////////////////////////////////////////////////////////////// // Specializations for converting a string to specific types namespace { // we're not gonna mess with the mess that is all the isupper/etc. functions bool IsLower(char ch) { return 'a' <= ch && ch <= 'z'; } bool IsUpper(char ch) { return 'A' <= ch && ch <= 'Z'; } char ToLower(char ch) { return IsUpper(ch) ? ch + 'a' - 'A' : ch; } std::string tolower(const std::string& str) { std::string s(str); std::transform(s.begin(), s.end(), s.begin(), ToLower); return s; } template bool IsEntirely(const std::string& str, T func) { for(std::size_t i=0;i= 0) { if(params.eatEnd) INPUT.eat(n); break; } // do we remove trailing whitespace? if(params.fold == FOLD_FLOW) scalar.erase(lastNonWhitespaceChar); // ******************************** // Phase #2: eat line ending n = Exp::Break().Match(INPUT); INPUT.eat(n); // ******************************** // Phase #3: scan initial spaces // first the required indentation while(INPUT.peek() == ' ' && (INPUT.column() < params.indent || (params.detectIndent && !foundNonEmptyLine))) INPUT.eat(1); // update indent if we're auto-detecting if(params.detectIndent && !foundNonEmptyLine) params.indent = std::max(params.indent, INPUT.column()); // and then the rest of the whitespace while(Exp::Blank().Matches(INPUT)) { // we check for tabs that masquerade as indentation if(INPUT.peek() == '\t'&& INPUT.column() < params.indent && params.onTabInIndentation == THROW) throw ParserException(INPUT.mark(), ErrorMsg::TAB_IN_INDENTATION); if(!params.eatLeadingWhitespace) break; INPUT.eat(1); } // was this an empty line? bool nextEmptyLine = Exp::Break().Matches(INPUT); bool nextMoreIndented = Exp::Blank().Matches(INPUT); if(params.fold == FOLD_BLOCK && foldedNewlineCount == 0 && nextEmptyLine) foldedNewlineStartedMoreIndented = moreIndented; // for block scalars, we always start with a newline, so we should ignore it (not fold or keep) if(pastOpeningBreak) { switch(params.fold) { case DONT_FOLD: scalar += "\n"; break; case FOLD_BLOCK: if(!emptyLine && !nextEmptyLine && !moreIndented && !nextMoreIndented && INPUT.column() >= params.indent) scalar += " "; else if(nextEmptyLine) foldedNewlineCount++; else scalar += "\n"; if(!nextEmptyLine && foldedNewlineCount > 0) { scalar += std::string(foldedNewlineCount - 1, '\n'); if(foldedNewlineStartedMoreIndented || nextMoreIndented | !foundNonEmptyLine) scalar += "\n"; foldedNewlineCount = 0; } break; case FOLD_FLOW: if(nextEmptyLine) scalar += "\n"; else if(!emptyLine && !nextEmptyLine && !escapedNewline) scalar += " "; break; } } emptyLine = nextEmptyLine; moreIndented = nextMoreIndented; pastOpeningBreak = true; // are we done via indentation? if(!emptyLine && INPUT.column() < params.indent) { params.leadingSpaces = true; break; } } // post-processing if(params.trimTrailingSpaces) { std::size_t pos = scalar.find_last_not_of(' '); if(lastEscapedChar != std::string::npos) { if(pos < lastEscapedChar || pos == std::string::npos) pos = lastEscapedChar; } if(pos < scalar.size()) scalar.erase(pos + 1); } switch(params.chomp) { case CLIP: { std::size_t pos = scalar.find_last_not_of('\n'); if(lastEscapedChar != std::string::npos) { if(pos < lastEscapedChar || pos == std::string::npos) pos = lastEscapedChar; } if(pos == std::string::npos) scalar.erase(); else if(pos + 1 < scalar.size()) scalar.erase(pos + 2); } break; case STRIP: { std::size_t pos = scalar.find_last_not_of('\n'); if(lastEscapedChar != std::string::npos) { if(pos < lastEscapedChar || pos == std::string::npos) pos = lastEscapedChar; } if(pos == std::string::npos) scalar.erase(); else if(pos < scalar.size()) scalar.erase(pos + 1); } break; default: break; } return scalar; } } SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/src/regex.h0000664000175000017500000000422111723131175026454 0ustar dandan#ifndef REGEX_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #define REGEX_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #if defined(_MSC_VER) || (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 #pragma once #endif #include #include namespace YAML { class Stream; enum REGEX_OP { REGEX_EMPTY, REGEX_MATCH, REGEX_RANGE, REGEX_OR, REGEX_AND, REGEX_NOT, REGEX_SEQ }; // simplified regular expressions // . Only straightforward matches (no repeated characters) // . Only matches from start of string class RegEx { public: RegEx(); RegEx(char ch); RegEx(char a, char z); RegEx(const std::string& str, REGEX_OP op = REGEX_SEQ); ~RegEx() {} friend RegEx operator ! (const RegEx& ex); friend RegEx operator || (const RegEx& ex1, const RegEx& ex2); friend RegEx operator && (const RegEx& ex1, const RegEx& ex2); friend RegEx operator + (const RegEx& ex1, const RegEx& ex2); bool Matches(char ch) const; bool Matches(const std::string& str) const; bool Matches(const Stream& in) const; template bool Matches(const Source& source) const; int Match(const std::string& str) const; int Match(const Stream& in) const; template int Match(const Source& source) const; private: RegEx(REGEX_OP op); template bool IsValidSource(const Source& source) const; template int MatchUnchecked(const Source& source) const; template int MatchOpEmpty(const Source& source) const; template int MatchOpMatch(const Source& source) const; template int MatchOpRange(const Source& source) const; template int MatchOpOr(const Source& source) const; template int MatchOpAnd(const Source& source) const; template int MatchOpNot(const Source& source) const; template int MatchOpSeq(const Source& source) const; private: REGEX_OP m_op; char m_a, m_z; std::vector m_params; }; } #include "regeximpl.h" #endif // REGEX_H_62B23520_7C8E_11DE_8A39_0800200C9A66 SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/src/node.cpp0000664000175000017500000001357311723131175026634 0ustar dandan#include "yaml-cpp/node.h" #include "yaml-cpp/aliasmanager.h" #include "yaml-cpp/emitfromevents.h" #include "yaml-cpp/emitter.h" #include "yaml-cpp/eventhandler.h" #include "iterpriv.h" #include "nodebuilder.h" #include "nodeownership.h" #include "scanner.h" #include "tag.h" #include "token.h" #include #include namespace YAML { bool ltnode::operator()(const Node *pNode1, const Node *pNode2) const { return *pNode1 < *pNode2; } Node::Node(): m_pOwnership(new NodeOwnership), m_type(NodeType::Null) { } Node::Node(NodeOwnership& owner): m_pOwnership(new NodeOwnership(&owner)), m_type(NodeType::Null) { } Node::~Node() { Clear(); } void Node::Clear() { m_pOwnership.reset(new NodeOwnership); m_type = NodeType::Null; m_tag.clear(); m_scalarData.clear(); m_seqData.clear(); m_mapData.clear(); } bool Node::IsAliased() const { return m_pOwnership->IsAliased(*this); } Node& Node::CreateNode() { return m_pOwnership->Create(); } std::auto_ptr Node::Clone() const { std::auto_ptr pNode(new Node); NodeBuilder nodeBuilder(*pNode); EmitEvents(nodeBuilder); return pNode; } void Node::EmitEvents(EventHandler& eventHandler) const { eventHandler.OnDocumentStart(m_mark); AliasManager am; EmitEvents(am, eventHandler); eventHandler.OnDocumentEnd(); } void Node::EmitEvents(AliasManager& am, EventHandler& eventHandler) const { anchor_t anchor = NullAnchor; if(IsAliased()) { anchor = am.LookupAnchor(*this); if(anchor) { eventHandler.OnAlias(m_mark, anchor); return; } am.RegisterReference(*this); anchor = am.LookupAnchor(*this); } switch(m_type) { case NodeType::Null: eventHandler.OnNull(m_mark, anchor); break; case NodeType::Scalar: eventHandler.OnScalar(m_mark, m_tag, anchor, m_scalarData); break; case NodeType::Sequence: eventHandler.OnSequenceStart(m_mark, m_tag, anchor); for(std::size_t i=0;iEmitEvents(am, eventHandler); eventHandler.OnSequenceEnd(); break; case NodeType::Map: eventHandler.OnMapStart(m_mark, m_tag, anchor); for(node_map::const_iterator it=m_mapData.begin();it!=m_mapData.end();++it) { it->first->EmitEvents(am, eventHandler); it->second->EmitEvents(am, eventHandler); } eventHandler.OnMapEnd(); break; } } void Node::Init(NodeType::value type, const Mark& mark, const std::string& tag) { Clear(); m_mark = mark; m_type = type; m_tag = tag; } void Node::MarkAsAliased() { m_pOwnership->MarkAsAliased(*this); } void Node::SetScalarData(const std::string& data) { assert(m_type == NodeType::Scalar); // TODO: throw? m_scalarData = data; } void Node::Append(Node& node) { assert(m_type == NodeType::Sequence); // TODO: throw? m_seqData.push_back(&node); } void Node::Insert(Node& key, Node& value) { assert(m_type == NodeType::Map); // TODO: throw? m_mapData[&key] = &value; } // begin // Returns an iterator to the beginning of this (sequence or map). Iterator Node::begin() const { switch(m_type) { case NodeType::Null: case NodeType::Scalar: return Iterator(); case NodeType::Sequence: return Iterator(std::auto_ptr(new IterPriv(m_seqData.begin()))); case NodeType::Map: return Iterator(std::auto_ptr(new IterPriv(m_mapData.begin()))); } assert(false); return Iterator(); } // end // . Returns an iterator to the end of this (sequence or map). Iterator Node::end() const { switch(m_type) { case NodeType::Null: case NodeType::Scalar: return Iterator(); case NodeType::Sequence: return Iterator(std::auto_ptr(new IterPriv(m_seqData.end()))); case NodeType::Map: return Iterator(std::auto_ptr(new IterPriv(m_mapData.end()))); } assert(false); return Iterator(); } // size // . Returns the size of a sequence or map node // . Otherwise, returns zero. std::size_t Node::size() const { switch(m_type) { case NodeType::Null: case NodeType::Scalar: return 0; case NodeType::Sequence: return m_seqData.size(); case NodeType::Map: return m_mapData.size(); } assert(false); return 0; } const Node *Node::FindAtIndex(std::size_t i) const { if(m_type == NodeType::Sequence) return m_seqData[i]; return 0; } bool Node::GetScalar(std::string& s) const { switch(m_type) { case NodeType::Null: s = "~"; return true; case NodeType::Scalar: s = m_scalarData; return true; case NodeType::Sequence: case NodeType::Map: return false; } assert(false); return false; } Emitter& operator << (Emitter& out, const Node& node) { EmitFromEvents emitFromEvents(out); node.EmitEvents(emitFromEvents); return out; } int Node::Compare(const Node& rhs) const { if(m_type != rhs.m_type) return rhs.m_type - m_type; switch(m_type) { case NodeType::Null: return 0; case NodeType::Scalar: return m_scalarData.compare(rhs.m_scalarData); case NodeType::Sequence: if(m_seqData.size() < rhs.m_seqData.size()) return 1; else if(m_seqData.size() > rhs.m_seqData.size()) return -1; for(std::size_t i=0;iCompare(*rhs.m_seqData[i])) return cmp; return 0; case NodeType::Map: if(m_mapData.size() < rhs.m_mapData.size()) return 1; else if(m_mapData.size() > rhs.m_mapData.size()) return -1; node_map::const_iterator it = m_mapData.begin(); node_map::const_iterator jt = rhs.m_mapData.begin(); for(;it!=m_mapData.end() && jt!=rhs.m_mapData.end();it++, jt++) { if(int cmp = it->first->Compare(*jt->first)) return cmp; if(int cmp = it->second->Compare(*jt->second)) return cmp; } return 0; } assert(false); return 0; } bool operator < (const Node& n1, const Node& n2) { return n1.Compare(n2) < 0; } } SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/src/scanner.cpp0000664000175000017500000002274611723131175027342 0ustar dandan#include "scanner.h" #include "token.h" #include "yaml-cpp/exceptions.h" #include "exp.h" #include #include namespace YAML { Scanner::Scanner(std::istream& in) : INPUT(in), m_startedStream(false), m_endedStream(false), m_simpleKeyAllowed(false), m_canBeJSONFlow(false) { } Scanner::~Scanner() { } // empty // . Returns true if there are no more tokens to be read bool Scanner::empty() { EnsureTokensInQueue(); return m_tokens.empty(); } // pop // . Simply removes the next token on the queue. void Scanner::pop() { EnsureTokensInQueue(); if(!m_tokens.empty()) m_tokens.pop(); } // peek // . Returns (but does not remove) the next token on the queue. Token& Scanner::peek() { EnsureTokensInQueue(); assert(!m_tokens.empty()); // should we be asserting here? I mean, we really just be checking // if it's empty before peeking. #if 0 static Token *pLast = 0; if(pLast != &m_tokens.front()) std::cerr << "peek: " << m_tokens.front() << "\n"; pLast = &m_tokens.front(); #endif return m_tokens.front(); } // EnsureTokensInQueue // . Scan until there's a valid token at the front of the queue, // or we're sure the queue is empty. void Scanner::EnsureTokensInQueue() { while(1) { if(!m_tokens.empty()) { Token& token = m_tokens.front(); // if this guy's valid, then we're done if(token.status == Token::VALID) return; // here's where we clean up the impossible tokens if(token.status == Token::INVALID) { m_tokens.pop(); continue; } // note: what's left are the unverified tokens } // no token? maybe we've actually finished if(m_endedStream) return; // no? then scan... ScanNextToken(); } } // ScanNextToken // . The main scanning function; here we branch out and // scan whatever the next token should be. void Scanner::ScanNextToken() { if(m_endedStream) return; if(!m_startedStream) return StartStream(); // get rid of whitespace, etc. (in between tokens it should be irrelevent) ScanToNextToken(); // maybe need to end some blocks PopIndentToHere(); // ***** // And now branch based on the next few characters! // ***** // end of stream if(!INPUT) return EndStream(); if(INPUT.column() == 0 && INPUT.peek() == Keys::Directive) return ScanDirective(); // document token if(INPUT.column() == 0 && Exp::DocStart().Matches(INPUT)) return ScanDocStart(); if(INPUT.column() == 0 && Exp::DocEnd().Matches(INPUT)) return ScanDocEnd(); // flow start/end/entry if(INPUT.peek() == Keys::FlowSeqStart || INPUT.peek() == Keys::FlowMapStart) return ScanFlowStart(); if(INPUT.peek() == Keys::FlowSeqEnd || INPUT.peek() == Keys::FlowMapEnd) return ScanFlowEnd(); if(INPUT.peek() == Keys::FlowEntry) return ScanFlowEntry(); // block/map stuff if(Exp::BlockEntry().Matches(INPUT)) return ScanBlockEntry(); if((InBlockContext() ? Exp::Key() : Exp::KeyInFlow()).Matches(INPUT)) return ScanKey(); if(GetValueRegex().Matches(INPUT)) return ScanValue(); // alias/anchor if(INPUT.peek() == Keys::Alias || INPUT.peek() == Keys::Anchor) return ScanAnchorOrAlias(); // tag if(INPUT.peek() == Keys::Tag) return ScanTag(); // special scalars if(InBlockContext() && (INPUT.peek() == Keys::LiteralScalar || INPUT.peek() == Keys::FoldedScalar)) return ScanBlockScalar(); if(INPUT.peek() == '\'' || INPUT.peek() == '\"') return ScanQuotedScalar(); // plain scalars if((InBlockContext() ? Exp::PlainScalar() : Exp::PlainScalarInFlow()).Matches(INPUT)) return ScanPlainScalar(); // don't know what it is! throw ParserException(INPUT.mark(), ErrorMsg::UNKNOWN_TOKEN); } // ScanToNextToken // . Eats input until we reach the next token-like thing. void Scanner::ScanToNextToken() { while(1) { // first eat whitespace while(INPUT && IsWhitespaceToBeEaten(INPUT.peek())) { if(InBlockContext() && Exp::Tab().Matches(INPUT)) m_simpleKeyAllowed = false; INPUT.eat(1); } // then eat a comment if(Exp::Comment().Matches(INPUT)) { // eat until line break while(INPUT && !Exp::Break().Matches(INPUT)) INPUT.eat(1); } // if it's NOT a line break, then we're done! if(!Exp::Break().Matches(INPUT)) break; // otherwise, let's eat the line break and keep going int n = Exp::Break().Match(INPUT); INPUT.eat(n); // oh yeah, and let's get rid of that simple key InvalidateSimpleKey(); // new line - we may be able to accept a simple key now if(InBlockContext()) m_simpleKeyAllowed = true; } } /////////////////////////////////////////////////////////////////////// // Misc. helpers // IsWhitespaceToBeEaten // . We can eat whitespace if it's a space or tab // . Note: originally tabs in block context couldn't be eaten // "where a simple key could be allowed // (i.e., not at the beginning of a line, or following '-', '?', or ':')" // I think this is wrong, since tabs can be non-content whitespace; it's just // that they can't contribute to indentation, so once you've seen a tab in a // line, you can't start a simple key bool Scanner::IsWhitespaceToBeEaten(char ch) { if(ch == ' ') return true; if(ch == '\t') return true; return false; } // GetValueRegex // . Get the appropriate regex to check if it's a value token const RegEx& Scanner::GetValueRegex() const { if(InBlockContext()) return Exp::Value(); return m_canBeJSONFlow ? Exp::ValueInJSONFlow() : Exp::ValueInFlow(); } // StartStream // . Set the initial conditions for starting a stream. void Scanner::StartStream() { m_startedStream = true; m_simpleKeyAllowed = true; std::auto_ptr pIndent(new IndentMarker(-1, IndentMarker::NONE)); m_indentRefs.push_back(pIndent); m_indents.push(&m_indentRefs.back()); } // EndStream // . Close out the stream, finish up, etc. void Scanner::EndStream() { // force newline if(INPUT.column() > 0) INPUT.ResetColumn(); PopAllIndents(); PopAllSimpleKeys(); m_simpleKeyAllowed = false; m_endedStream = true; } Token *Scanner::PushToken(Token::TYPE type) { m_tokens.push(Token(type, INPUT.mark())); return &m_tokens.back(); } Token::TYPE Scanner::GetStartTokenFor(IndentMarker::INDENT_TYPE type) const { switch(type) { case IndentMarker::SEQ: return Token::BLOCK_SEQ_START; case IndentMarker::MAP: return Token::BLOCK_MAP_START; case IndentMarker::NONE: assert(false); break; } assert(false); throw std::runtime_error("yaml-cpp: internal error, invalid indent type"); } // PushIndentTo // . Pushes an indentation onto the stack, and enqueues the // proper token (sequence start or mapping start). // . Returns the indent marker it generates (if any). Scanner::IndentMarker *Scanner::PushIndentTo(int column, IndentMarker::INDENT_TYPE type) { // are we in flow? if(InFlowContext()) return 0; std::auto_ptr pIndent(new IndentMarker(column, type)); IndentMarker& indent = *pIndent; const IndentMarker& lastIndent = *m_indents.top(); // is this actually an indentation? if(indent.column < lastIndent.column) return 0; if(indent.column == lastIndent.column && !(indent.type == IndentMarker::SEQ && lastIndent.type == IndentMarker::MAP)) return 0; // push a start token indent.pStartToken = PushToken(GetStartTokenFor(type)); // and then the indent m_indents.push(&indent); m_indentRefs.push_back(pIndent); return &m_indentRefs.back(); } // PopIndentToHere // . Pops indentations off the stack until we reach the current indentation level, // and enqueues the proper token each time. // . Then pops all invalid indentations off. void Scanner::PopIndentToHere() { // are we in flow? if(InFlowContext()) return; // now pop away while(!m_indents.empty()) { const IndentMarker& indent = *m_indents.top(); if(indent.column < INPUT.column()) break; if(indent.column == INPUT.column() && !(indent.type == IndentMarker::SEQ && !Exp::BlockEntry().Matches(INPUT))) break; PopIndent(); } while(!m_indents.empty() && m_indents.top()->status == IndentMarker::INVALID) PopIndent(); } // PopAllIndents // . Pops all indentations (except for the base empty one) off the stack, // and enqueues the proper token each time. void Scanner::PopAllIndents() { // are we in flow? if(InFlowContext()) return; // now pop away while(!m_indents.empty()) { const IndentMarker& indent = *m_indents.top(); if(indent.type == IndentMarker::NONE) break; PopIndent(); } } // PopIndent // . Pops a single indent, pushing the proper token void Scanner::PopIndent() { const IndentMarker& indent = *m_indents.top(); m_indents.pop(); if(indent.status != IndentMarker::VALID) { InvalidateSimpleKey(); return; } if(indent.type == IndentMarker::SEQ) m_tokens.push(Token(Token::BLOCK_SEQ_END, INPUT.mark())); else if(indent.type == IndentMarker::MAP) m_tokens.push(Token(Token::BLOCK_MAP_END, INPUT.mark())); } // GetTopIndent int Scanner::GetTopIndent() const { if(m_indents.empty()) return 0; return m_indents.top()->column; } // ThrowParserException // . Throws a ParserException with the current token location // (if available). // . Does not parse any more tokens. void Scanner::ThrowParserException(const std::string& msg) const { Mark mark = Mark::null(); if(!m_tokens.empty()) { const Token& token = m_tokens.front(); mark = token.mark; } throw ParserException(mark, msg); } } SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/src/emitterstate.cpp0000664000175000017500000001437611723131175030423 0ustar dandan#include "emitterstate.h" #include "yaml-cpp/exceptions.h" #include namespace YAML { EmitterState::EmitterState(): m_isGood(true), m_curIndent(0), m_requiresSoftSeparation(false), m_requiresHardSeparation(false) { // start up m_stateStack.push(ES_WAITING_FOR_DOC); // set default global manipulators m_charset.set(EmitNonAscii); m_strFmt.set(Auto); m_boolFmt.set(TrueFalseBool); m_boolLengthFmt.set(LongBool); m_boolCaseFmt.set(LowerCase); m_intFmt.set(Dec); m_indent.set(2); m_preCommentIndent.set(2); m_postCommentIndent.set(1); m_seqFmt.set(Block); m_mapFmt.set(Block); m_mapKeyFmt.set(Auto); m_floatPrecision.set(6); m_doublePrecision.set(15); } EmitterState::~EmitterState() { } // SetLocalValue // . We blindly tries to set all possible formatters to this value // . Only the ones that make sense will be accepted void EmitterState::SetLocalValue(EMITTER_MANIP value) { SetOutputCharset(value, LOCAL); SetStringFormat(value, LOCAL); SetBoolFormat(value, LOCAL); SetBoolCaseFormat(value, LOCAL); SetBoolLengthFormat(value, LOCAL); SetIntFormat(value, LOCAL); SetFlowType(GT_SEQ, value, LOCAL); SetFlowType(GT_MAP, value, LOCAL); SetMapKeyFormat(value, LOCAL); } void EmitterState::BeginGroup(GROUP_TYPE type) { unsigned lastIndent = (m_groups.empty() ? 0 : m_groups.top().indent); m_curIndent += lastIndent; std::auto_ptr pGroup(new Group(type)); // transfer settings (which last until this group is done) pGroup->modifiedSettings = m_modifiedSettings; // set up group pGroup->flow = GetFlowType(type); pGroup->indent = GetIndent(); pGroup->usingLongKey = (GetMapKeyFormat() == LongKey ? true : false); m_groups.push(pGroup); } void EmitterState::EndGroup(GROUP_TYPE type) { if(m_groups.empty()) return SetError(ErrorMsg::UNMATCHED_GROUP_TAG); // get rid of the current group { std::auto_ptr pFinishedGroup = m_groups.pop(); if(pFinishedGroup->type != type) return SetError(ErrorMsg::UNMATCHED_GROUP_TAG); } // reset old settings unsigned lastIndent = (m_groups.empty() ? 0 : m_groups.top().indent); assert(m_curIndent >= lastIndent); m_curIndent -= lastIndent; // some global settings that we changed may have been overridden // by a local setting we just popped, so we need to restore them m_globalModifiedSettings.restore(); } GROUP_TYPE EmitterState::GetCurGroupType() const { if(m_groups.empty()) return GT_NONE; return m_groups.top().type; } FLOW_TYPE EmitterState::GetCurGroupFlowType() const { if(m_groups.empty()) return FT_NONE; return (m_groups.top().flow == Flow ? FT_FLOW : FT_BLOCK); } bool EmitterState::CurrentlyInLongKey() { if(m_groups.empty()) return false; return m_groups.top().usingLongKey; } void EmitterState::StartLongKey() { if(!m_groups.empty()) m_groups.top().usingLongKey = true; } void EmitterState::StartSimpleKey() { if(!m_groups.empty()) m_groups.top().usingLongKey = false; } void EmitterState::ClearModifiedSettings() { m_modifiedSettings.clear(); } bool EmitterState::SetOutputCharset(EMITTER_MANIP value, FMT_SCOPE scope) { switch(value) { case EmitNonAscii: case EscapeNonAscii: _Set(m_charset, value, scope); return true; default: return false; } } bool EmitterState::SetStringFormat(EMITTER_MANIP value, FMT_SCOPE scope) { switch(value) { case Auto: case SingleQuoted: case DoubleQuoted: case Literal: _Set(m_strFmt, value, scope); return true; default: return false; } } bool EmitterState::SetBoolFormat(EMITTER_MANIP value, FMT_SCOPE scope) { switch(value) { case OnOffBool: case TrueFalseBool: case YesNoBool: _Set(m_boolFmt, value, scope); return true; default: return false; } } bool EmitterState::SetBoolLengthFormat(EMITTER_MANIP value, FMT_SCOPE scope) { switch(value) { case LongBool: case ShortBool: _Set(m_boolLengthFmt, value, scope); return true; default: return false; } } bool EmitterState::SetBoolCaseFormat(EMITTER_MANIP value, FMT_SCOPE scope) { switch(value) { case UpperCase: case LowerCase: case CamelCase: _Set(m_boolCaseFmt, value, scope); return true; default: return false; } } bool EmitterState::SetIntFormat(EMITTER_MANIP value, FMT_SCOPE scope) { switch(value) { case Dec: case Hex: case Oct: _Set(m_intFmt, value, scope); return true; default: return false; } } bool EmitterState::SetIndent(unsigned value, FMT_SCOPE scope) { if(value == 0) return false; _Set(m_indent, value, scope); return true; } bool EmitterState::SetPreCommentIndent(unsigned value, FMT_SCOPE scope) { if(value == 0) return false; _Set(m_preCommentIndent, value, scope); return true; } bool EmitterState::SetPostCommentIndent(unsigned value, FMT_SCOPE scope) { if(value == 0) return false; _Set(m_postCommentIndent, value, scope); return true; } bool EmitterState::SetFlowType(GROUP_TYPE groupType, EMITTER_MANIP value, FMT_SCOPE scope) { switch(value) { case Block: case Flow: _Set(groupType == GT_SEQ ? m_seqFmt : m_mapFmt, value, scope); return true; default: return false; } } EMITTER_MANIP EmitterState::GetFlowType(GROUP_TYPE groupType) const { // force flow style if we're currently in a flow FLOW_TYPE flowType = GetCurGroupFlowType(); if(flowType == FT_FLOW) return Flow; // otherwise, go with what's asked of use return (groupType == GT_SEQ ? m_seqFmt.get() : m_mapFmt.get()); } bool EmitterState::SetMapKeyFormat(EMITTER_MANIP value, FMT_SCOPE scope) { switch(value) { case Auto: case LongKey: _Set(m_mapKeyFmt, value, scope); return true; default: return false; } } bool EmitterState::SetFloatPrecision(int value, FMT_SCOPE scope) { if(value < 0 || value > std::numeric_limits::digits10) return false; _Set(m_floatPrecision, value, scope); return true; } bool EmitterState::SetDoublePrecision(int value, FMT_SCOPE scope) { if(value < 0 || value > std::numeric_limits::digits10) return false; _Set(m_doublePrecision, value, scope); return true; } } SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/src/stream.h0000664000175000017500000000354411723131175026644 0ustar dandan#ifndef STREAM_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #define STREAM_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #if defined(_MSC_VER) || (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 #pragma once #endif #include "yaml-cpp/noncopyable.h" #include "yaml-cpp/mark.h" #include #include #include #include #include #include namespace YAML { class Stream: private noncopyable { public: friend class StreamCharSource; Stream(std::istream& input); ~Stream(); operator bool() const; bool operator !() const { return !static_cast (*this); } char peek() const; char get(); std::string get(int n); void eat(int n = 1); static char eof() { return 0x04; } const Mark mark() const { return m_mark; } int pos() const { return m_mark.pos; } int line() const { return m_mark.line; } int column() const { return m_mark.column; } void ResetColumn() { m_mark.column = 0; } private: enum CharacterSet {utf8, utf16le, utf16be, utf32le, utf32be}; std::istream& m_input; Mark m_mark; CharacterSet m_charSet; mutable std::deque m_readahead; unsigned char* const m_pPrefetched; mutable size_t m_nPrefetchedAvailable; mutable size_t m_nPrefetchedUsed; void AdvanceCurrent(); char CharAt(size_t i) const; bool ReadAheadTo(size_t i) const; bool _ReadAheadTo(size_t i) const; void StreamInUtf8() const; void StreamInUtf16() const; void StreamInUtf32() const; unsigned char GetNextByte() const; }; // CharAt // . Unchecked access inline char Stream::CharAt(size_t i) const { return m_readahead[i]; } inline bool Stream::ReadAheadTo(size_t i) const { if(m_readahead.size() > i) return true; return _ReadAheadTo(i); } } #endif // STREAM_H_62B23520_7C8E_11DE_8A39_0800200C9A66 SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/src/nodeownership.cpp0000664000175000017500000000103611723131175030562 0ustar dandan#include "nodeownership.h" #include "yaml-cpp/node.h" namespace YAML { NodeOwnership::NodeOwnership(NodeOwnership *pOwner): m_pOwner(pOwner) { if(!m_pOwner) m_pOwner = this; } NodeOwnership::~NodeOwnership() { } Node& NodeOwnership::_Create() { m_nodes.push_back(std::auto_ptr(new Node)); return m_nodes.back(); } void NodeOwnership::_MarkAsAliased(const Node& node) { m_aliasedNodes.insert(&node); } bool NodeOwnership::_IsAliased(const Node& node) const { return m_aliasedNodes.count(&node) > 0; } } SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/src/stringsource.h0000664000175000017500000000226511723131175030077 0ustar dandan#ifndef STRINGSOURCE_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #define STRINGSOURCE_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #if defined(_MSC_VER) || (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 #pragma once #endif #include namespace YAML { class StringCharSource { public: StringCharSource(const char *str, std::size_t size): m_str(str), m_size(size), m_offset(0) {} operator bool() const { return m_offset < m_size; } char operator [] (std::size_t i) const { return m_str[m_offset + i]; } bool operator !() const { return !static_cast(*this); } const StringCharSource operator + (int i) const { StringCharSource source(*this); if(static_cast (source.m_offset) + i >= 0) source.m_offset += i; else source.m_offset = 0; return source; } StringCharSource& operator ++ () { ++m_offset; return *this; } StringCharSource& operator += (std::size_t offset) { m_offset += offset; return *this; } private: const char *m_str; std::size_t m_size; std::size_t m_offset; }; } #endif // STRINGSOURCE_H_62B23520_7C8E_11DE_8A39_0800200C9A66 SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/src/indentation.h0000664000175000017500000000152711723131175027664 0ustar dandan#ifndef INDENTATION_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #define INDENTATION_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #if defined(_MSC_VER) || (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 #pragma once #endif #include "yaml-cpp/ostream.h" #include namespace YAML { struct Indentation { Indentation(unsigned n_): n(n_) {} unsigned n; }; inline ostream& operator << (ostream& out, const Indentation& indent) { for(unsigned i=0;i #include namespace { std::string ToString(YAML::anchor_t anchor) { std::stringstream stream; stream << anchor; return stream.str(); } } namespace YAML { EmitFromEvents::EmitFromEvents(Emitter& emitter): m_emitter(emitter) { } void EmitFromEvents::OnDocumentStart(const Mark&) { } void EmitFromEvents::OnDocumentEnd() { } void EmitFromEvents::OnNull(const Mark&, anchor_t anchor) { BeginNode(); EmitProps("", anchor); m_emitter << Null; } void EmitFromEvents::OnAlias(const Mark&, anchor_t anchor) { BeginNode(); m_emitter << Alias(ToString(anchor)); } void EmitFromEvents::OnScalar(const Mark&, const std::string& tag, anchor_t anchor, const std::string& value) { BeginNode(); EmitProps(tag, anchor); m_emitter << value; } void EmitFromEvents::OnSequenceStart(const Mark&, const std::string& tag, anchor_t anchor) { BeginNode(); EmitProps(tag, anchor); m_emitter << BeginSeq; m_stateStack.push(State::WaitingForSequenceEntry); } void EmitFromEvents::OnSequenceEnd() { m_emitter << EndSeq; assert(m_stateStack.top() == State::WaitingForSequenceEntry); m_stateStack.pop(); } void EmitFromEvents::OnMapStart(const Mark&, const std::string& tag, anchor_t anchor) { BeginNode(); EmitProps(tag, anchor); m_emitter << BeginMap; m_stateStack.push(State::WaitingForKey); } void EmitFromEvents::OnMapEnd() { m_emitter << EndMap; assert(m_stateStack.top() == State::WaitingForKey); m_stateStack.pop(); } void EmitFromEvents::BeginNode() { if(m_stateStack.empty()) return; switch(m_stateStack.top()) { case State::WaitingForKey: m_emitter << Key; m_stateStack.top() = State::WaitingForValue; break; case State::WaitingForValue: m_emitter << Value; m_stateStack.top() = State::WaitingForKey; break; default: break; } } void EmitFromEvents::EmitProps(const std::string& tag, anchor_t anchor) { if(!tag.empty() && tag != "?") m_emitter << VerbatimTag(tag); if(anchor) m_emitter << Anchor(ToString(anchor)); } } SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/src/directives.cpp0000664000175000017500000000070611723131175030042 0ustar dandan#include "directives.h" namespace YAML { Directives::Directives() { // version version.isDefault = true; version.major = 1; version.minor = 2; } const std::string Directives::TranslateTagHandle(const std::string& handle) const { std::map ::const_iterator it = tags.find(handle); if(it == tags.end()) { if(handle == "!!") return "tag:yaml.org,2002:"; return handle; } return it->second; } } SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/src/emitterutils.cpp0000664000175000017500000002332511723131175030435 0ustar dandan#include "emitterutils.h" #include "exp.h" #include "indentation.h" #include "yaml-cpp/binary.h" #include "yaml-cpp/exceptions.h" #include "stringsource.h" #include #include namespace YAML { namespace Utils { namespace { enum {REPLACEMENT_CHARACTER = 0xFFFD}; bool IsAnchorChar(int ch) { // test for ns-anchor-char switch (ch) { case ',': case '[': case ']': case '{': case '}': // c-flow-indicator case ' ': case '\t': // s-white case 0xFEFF: // c-byte-order-mark case 0xA: case 0xD: // b-char return false; case 0x85: return true; } if (ch < 0x20) return false; if (ch < 0x7E) return true; if (ch < 0xA0) return false; if (ch >= 0xD800 && ch <= 0xDFFF) return false; if ((ch & 0xFFFE) == 0xFFFE) return false; if ((ch >= 0xFDD0) && (ch <= 0xFDEF)) return false; if (ch > 0x10FFFF) return false; return true; } int Utf8BytesIndicated(char ch) { int byteVal = static_cast(ch); switch (byteVal >> 4) { case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: return 1; case 12: case 13: return 2; case 14: return 3; case 15: return 4; default: return -1; } } bool IsTrailingByte(char ch) { return (ch & 0xC0) == 0x80; } bool GetNextCodePointAndAdvance(int& codePoint, std::string::const_iterator& first, std::string::const_iterator last) { if (first == last) return false; int nBytes = Utf8BytesIndicated(*first); if (nBytes < 1) { // Bad lead byte ++first; codePoint = REPLACEMENT_CHARACTER; return true; } if (nBytes == 1) { codePoint = *first++; return true; } // Gather bits from trailing bytes codePoint = static_cast(*first) & ~(0xFF << (7 - nBytes)); ++first; --nBytes; for (; nBytes > 0; ++first, --nBytes) { if ((first == last) || !IsTrailingByte(*first)) { codePoint = REPLACEMENT_CHARACTER; break; } codePoint <<= 6; codePoint |= *first & 0x3F; } // Check for illegal code points if (codePoint > 0x10FFFF) codePoint = REPLACEMENT_CHARACTER; else if (codePoint >= 0xD800 && codePoint <= 0xDFFF) codePoint = REPLACEMENT_CHARACTER; else if ((codePoint & 0xFFFE) == 0xFFFE) codePoint = REPLACEMENT_CHARACTER; else if (codePoint >= 0xFDD0 && codePoint <= 0xFDEF) codePoint = REPLACEMENT_CHARACTER; return true; } void WriteCodePoint(ostream& out, int codePoint) { if (codePoint < 0 || codePoint > 0x10FFFF) { codePoint = REPLACEMENT_CHARACTER; } if (codePoint < 0x7F) { out << static_cast(codePoint); } else if (codePoint < 0x7FF) { out << static_cast(0xC0 | (codePoint >> 6)) << static_cast(0x80 | (codePoint & 0x3F)); } else if (codePoint < 0xFFFF) { out << static_cast(0xE0 | (codePoint >> 12)) << static_cast(0x80 | ((codePoint >> 6) & 0x3F)) << static_cast(0x80 | (codePoint & 0x3F)); } else { out << static_cast(0xF0 | (codePoint >> 18)) << static_cast(0x80 | ((codePoint >> 12) & 0x3F)) << static_cast(0x80 | ((codePoint >> 6) & 0x3F)) << static_cast(0x80 | (codePoint & 0x3F)); } } bool IsValidPlainScalar(const std::string& str, bool inFlow, bool allowOnlyAscii) { if(str.empty()) return false; // first check the start const RegEx& start = (inFlow ? Exp::PlainScalarInFlow() : Exp::PlainScalar()); if(!start.Matches(str)) return false; // and check the end for plain whitespace (which can't be faithfully kept in a plain scalar) if(!str.empty() && *str.rbegin() == ' ') return false; // then check until something is disallowed const RegEx& disallowed = (inFlow ? Exp::EndScalarInFlow() : Exp::EndScalar()) || (Exp::BlankOrBreak() + Exp::Comment()) || Exp::NotPrintable() || Exp::Utf8_ByteOrderMark() || Exp::Break() || Exp::Tab(); StringCharSource buffer(str.c_str(), str.size()); while(buffer) { if(disallowed.Matches(buffer)) return false; if(allowOnlyAscii && (0x7F < static_cast(buffer[0]))) return false; ++buffer; } return true; } void WriteDoubleQuoteEscapeSequence(ostream& out, int codePoint) { static const char hexDigits[] = "0123456789abcdef"; char escSeq[] = "\\U00000000"; int digits = 8; if (codePoint < 0xFF) { escSeq[1] = 'x'; digits = 2; } else if (codePoint < 0xFFFF) { escSeq[1] = 'u'; digits = 4; } // Write digits into the escape sequence int i = 2; for (; digits > 0; --digits, ++i) { escSeq[i] = hexDigits[(codePoint >> (4 * (digits - 1))) & 0xF]; } escSeq[i] = 0; // terminate with NUL character out << escSeq; } bool WriteAliasName(ostream& out, const std::string& str) { int codePoint; for(std::string::const_iterator i = str.begin(); GetNextCodePointAndAdvance(codePoint, i, str.end()); ) { if (!IsAnchorChar(codePoint)) return false; WriteCodePoint(out, codePoint); } return true; } } bool WriteString(ostream& out, const std::string& str, bool inFlow, bool escapeNonAscii) { if(IsValidPlainScalar(str, inFlow, escapeNonAscii)) { out << str; return true; } else return WriteDoubleQuotedString(out, str, escapeNonAscii); } bool WriteSingleQuotedString(ostream& out, const std::string& str) { out << "'"; int codePoint; for(std::string::const_iterator i = str.begin(); GetNextCodePointAndAdvance(codePoint, i, str.end()); ) { if (codePoint == '\n') return false; // We can't handle a new line and the attendant indentation yet if (codePoint == '\'') out << "''"; else WriteCodePoint(out, codePoint); } out << "'"; return true; } bool WriteDoubleQuotedString(ostream& out, const std::string& str, bool escapeNonAscii) { out << "\""; int codePoint; for(std::string::const_iterator i = str.begin(); GetNextCodePointAndAdvance(codePoint, i, str.end()); ) { if (codePoint == '\"') out << "\\\""; else if (codePoint == '\\') out << "\\\\"; else if (codePoint < 0x20 || (codePoint >= 0x80 && codePoint <= 0xA0)) // Control characters and non-breaking space WriteDoubleQuoteEscapeSequence(out, codePoint); else if (codePoint == 0xFEFF) // Byte order marks (ZWNS) should be escaped (YAML 1.2, sec. 5.2) WriteDoubleQuoteEscapeSequence(out, codePoint); else if (escapeNonAscii && codePoint > 0x7E) WriteDoubleQuoteEscapeSequence(out, codePoint); else WriteCodePoint(out, codePoint); } out << "\""; return true; } bool WriteLiteralString(ostream& out, const std::string& str, int indent) { out << "|\n"; out << IndentTo(indent); int codePoint; for(std::string::const_iterator i = str.begin(); GetNextCodePointAndAdvance(codePoint, i, str.end()); ) { if (codePoint == '\n') out << "\n" << IndentTo(indent); else WriteCodePoint(out, codePoint); } return true; } bool WriteChar(ostream& out, char ch) { if(('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z')) out << ch; else if((0x20 <= ch && ch <= 0x7e) || ch == ' ') out << "\"" << ch << "\""; else if(ch == '\t') out << "\"\\t\""; else if(ch == '\n') out << "\"\\n\""; else if(ch == '\b') out << "\"\\b\""; else { out << "\""; WriteDoubleQuoteEscapeSequence(out, ch); out << "\""; } return true; } bool WriteComment(ostream& out, const std::string& str, int postCommentIndent) { const unsigned curIndent = out.col(); out << "#" << Indentation(postCommentIndent); int codePoint; for(std::string::const_iterator i = str.begin(); GetNextCodePointAndAdvance(codePoint, i, str.end()); ) { if(codePoint == '\n') out << "\n" << IndentTo(curIndent) << "#" << Indentation(postCommentIndent); else WriteCodePoint(out, codePoint); } return true; } bool WriteAlias(ostream& out, const std::string& str) { out << "*"; return WriteAliasName(out, str); } bool WriteAnchor(ostream& out, const std::string& str) { out << "&"; return WriteAliasName(out, str); } bool WriteTag(ostream& out, const std::string& str, bool verbatim) { out << (verbatim ? "!<" : "!"); StringCharSource buffer(str.c_str(), str.size()); const RegEx& reValid = verbatim ? Exp::URI() : Exp::Tag(); while(buffer) { int n = reValid.Match(buffer); if(n <= 0) return false; while(--n >= 0) { out << buffer[0]; ++buffer; } } if (verbatim) out << ">"; return true; } bool WriteTagWithPrefix(ostream& out, const std::string& prefix, const std::string& tag) { out << "!"; StringCharSource prefixBuffer(prefix.c_str(), prefix.size()); while(prefixBuffer) { int n = Exp::URI().Match(prefixBuffer); if(n <= 0) return false; while(--n >= 0) { out << prefixBuffer[0]; ++prefixBuffer; } } out << "!"; StringCharSource tagBuffer(tag.c_str(), tag.size()); while(tagBuffer) { int n = Exp::Tag().Match(tagBuffer); if(n <= 0) return false; while(--n >= 0) { out << tagBuffer[0]; ++tagBuffer; } } return true; } bool WriteBinary(ostream& out, const Binary& binary) { WriteDoubleQuotedString(out, EncodeBase64(binary.data(), binary.size()), false); return true; } } } SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/src/scantoken.cpp0000664000175000017500000002553511723131175027675 0ustar dandan#include "scanner.h" #include "token.h" #include "yaml-cpp/exceptions.h" #include "exp.h" #include "scanscalar.h" #include "scantag.h" #include "tag.h" #include namespace YAML { /////////////////////////////////////////////////////////////////////// // Specialization for scanning specific tokens // Directive // . Note: no semantic checking is done here (that's for the parser to do) void Scanner::ScanDirective() { std::string name; std::vector params; // pop indents and simple keys PopAllIndents(); PopAllSimpleKeys(); m_simpleKeyAllowed = false; m_canBeJSONFlow = false; // store pos and eat indicator Token token(Token::DIRECTIVE, INPUT.mark()); INPUT.eat(1); // read name while(INPUT && !Exp::BlankOrBreak().Matches(INPUT)) token.value += INPUT.get(); // read parameters while(1) { // first get rid of whitespace while(Exp::Blank().Matches(INPUT)) INPUT.eat(1); // break on newline or comment if(!INPUT || Exp::Break().Matches(INPUT) || Exp::Comment().Matches(INPUT)) break; // now read parameter std::string param; while(INPUT && !Exp::BlankOrBreak().Matches(INPUT)) param += INPUT.get(); token.params.push_back(param); } m_tokens.push(token); } // DocStart void Scanner::ScanDocStart() { PopAllIndents(); PopAllSimpleKeys(); m_simpleKeyAllowed = false; m_canBeJSONFlow = false; // eat Mark mark = INPUT.mark(); INPUT.eat(3); m_tokens.push(Token(Token::DOC_START, mark)); } // DocEnd void Scanner::ScanDocEnd() { PopAllIndents(); PopAllSimpleKeys(); m_simpleKeyAllowed = false; m_canBeJSONFlow = false; // eat Mark mark = INPUT.mark(); INPUT.eat(3); m_tokens.push(Token(Token::DOC_END, mark)); } // FlowStart void Scanner::ScanFlowStart() { // flows can be simple keys InsertPotentialSimpleKey(); m_simpleKeyAllowed = true; m_canBeJSONFlow = false; // eat Mark mark = INPUT.mark(); char ch = INPUT.get(); FLOW_MARKER flowType = (ch == Keys::FlowSeqStart ? FLOW_SEQ : FLOW_MAP); m_flows.push(flowType); Token::TYPE type = (flowType == FLOW_SEQ ? Token::FLOW_SEQ_START : Token::FLOW_MAP_START); m_tokens.push(Token(type, mark)); } // FlowEnd void Scanner::ScanFlowEnd() { if(InBlockContext()) throw ParserException(INPUT.mark(), ErrorMsg::FLOW_END); // we might have a solo entry in the flow context if(InFlowContext()) { if(m_flows.top() == FLOW_MAP && VerifySimpleKey()) m_tokens.push(Token(Token::VALUE, INPUT.mark())); else if(m_flows.top() == FLOW_SEQ) InvalidateSimpleKey(); } m_simpleKeyAllowed = false; m_canBeJSONFlow = true; // eat Mark mark = INPUT.mark(); char ch = INPUT.get(); // check that it matches the start FLOW_MARKER flowType = (ch == Keys::FlowSeqEnd ? FLOW_SEQ : FLOW_MAP); if(m_flows.top() != flowType) throw ParserException(mark, ErrorMsg::FLOW_END); m_flows.pop(); Token::TYPE type = (flowType ? Token::FLOW_SEQ_END : Token::FLOW_MAP_END); m_tokens.push(Token(type, mark)); } // FlowEntry void Scanner::ScanFlowEntry() { // we might have a solo entry in the flow context if(InFlowContext()) { if(m_flows.top() == FLOW_MAP && VerifySimpleKey()) m_tokens.push(Token(Token::VALUE, INPUT.mark())); else if(m_flows.top() == FLOW_SEQ) InvalidateSimpleKey(); } m_simpleKeyAllowed = true; m_canBeJSONFlow = false; // eat Mark mark = INPUT.mark(); INPUT.eat(1); m_tokens.push(Token(Token::FLOW_ENTRY, mark)); } // BlockEntry void Scanner::ScanBlockEntry() { // we better be in the block context! if(InFlowContext()) throw ParserException(INPUT.mark(), ErrorMsg::BLOCK_ENTRY); // can we put it here? if(!m_simpleKeyAllowed) throw ParserException(INPUT.mark(), ErrorMsg::BLOCK_ENTRY); PushIndentTo(INPUT.column(), IndentMarker::SEQ); m_simpleKeyAllowed = true; m_canBeJSONFlow = false; // eat Mark mark = INPUT.mark(); INPUT.eat(1); m_tokens.push(Token(Token::BLOCK_ENTRY, mark)); } // Key void Scanner::ScanKey() { // handle keys diffently in the block context (and manage indents) if(InBlockContext()) { if(!m_simpleKeyAllowed) throw ParserException(INPUT.mark(), ErrorMsg::MAP_KEY); PushIndentTo(INPUT.column(), IndentMarker::MAP); } // can only put a simple key here if we're in block context m_simpleKeyAllowed = InBlockContext(); // eat Mark mark = INPUT.mark(); INPUT.eat(1); m_tokens.push(Token(Token::KEY, mark)); } // Value void Scanner::ScanValue() { // and check that simple key bool isSimpleKey = VerifySimpleKey(); m_canBeJSONFlow = false; if(isSimpleKey) { // can't follow a simple key with another simple key (dunno why, though - it seems fine) m_simpleKeyAllowed = false; } else { // handle values diffently in the block context (and manage indents) if(InBlockContext()) { if(!m_simpleKeyAllowed) throw ParserException(INPUT.mark(), ErrorMsg::MAP_VALUE); PushIndentTo(INPUT.column(), IndentMarker::MAP); } // can only put a simple key here if we're in block context m_simpleKeyAllowed = InBlockContext(); } // eat Mark mark = INPUT.mark(); INPUT.eat(1); m_tokens.push(Token(Token::VALUE, mark)); } // AnchorOrAlias void Scanner::ScanAnchorOrAlias() { bool alias; std::string name; // insert a potential simple key InsertPotentialSimpleKey(); m_simpleKeyAllowed = false; m_canBeJSONFlow = false; // eat the indicator Mark mark = INPUT.mark(); char indicator = INPUT.get(); alias = (indicator == Keys::Alias); // now eat the content while(INPUT && Exp::Anchor().Matches(INPUT)) name += INPUT.get(); // we need to have read SOMETHING! if(name.empty()) throw ParserException(INPUT.mark(), alias ? ErrorMsg::ALIAS_NOT_FOUND : ErrorMsg::ANCHOR_NOT_FOUND); // and needs to end correctly if(INPUT && !Exp::AnchorEnd().Matches(INPUT)) throw ParserException(INPUT.mark(), alias ? ErrorMsg::CHAR_IN_ALIAS : ErrorMsg::CHAR_IN_ANCHOR); // and we're done Token token(alias ? Token::ALIAS : Token::ANCHOR, mark); token.value = name; m_tokens.push(token); } // Tag void Scanner::ScanTag() { // insert a potential simple key InsertPotentialSimpleKey(); m_simpleKeyAllowed = false; m_canBeJSONFlow = false; Token token(Token::TAG, INPUT.mark()); // eat the indicator INPUT.get(); if(INPUT && INPUT.peek() == Keys::VerbatimTagStart){ std::string tag = ScanVerbatimTag(INPUT); token.value = tag; token.data = Tag::VERBATIM; } else { bool canBeHandle; token.value = ScanTagHandle(INPUT, canBeHandle); if(!canBeHandle && token.value.empty()) token.data = Tag::NON_SPECIFIC; else if(token.value.empty()) token.data = Tag::SECONDARY_HANDLE; else token.data = Tag::PRIMARY_HANDLE; // is there a suffix? if(canBeHandle && INPUT.peek() == Keys::Tag) { // eat the indicator INPUT.get(); token.params.push_back(ScanTagSuffix(INPUT)); token.data = Tag::NAMED_HANDLE; } } m_tokens.push(token); } // PlainScalar void Scanner::ScanPlainScalar() { std::string scalar; // set up the scanning parameters ScanScalarParams params; params.end = (InFlowContext() ? Exp::EndScalarInFlow() : Exp::EndScalar()) || (Exp::BlankOrBreak() + Exp::Comment()); params.eatEnd = false; params.indent = (InFlowContext() ? 0 : GetTopIndent() + 1); params.fold = FOLD_FLOW; params.eatLeadingWhitespace = true; params.trimTrailingSpaces = true; params.chomp = STRIP; params.onDocIndicator = BREAK; params.onTabInIndentation = THROW; // insert a potential simple key InsertPotentialSimpleKey(); Mark mark = INPUT.mark(); scalar = ScanScalar(INPUT, params); // can have a simple key only if we ended the scalar by starting a new line m_simpleKeyAllowed = params.leadingSpaces; m_canBeJSONFlow = false; // finally, check and see if we ended on an illegal character //if(Exp::IllegalCharInScalar.Matches(INPUT)) // throw ParserException(INPUT.mark(), ErrorMsg::CHAR_IN_SCALAR); Token token(Token::PLAIN_SCALAR, mark); token.value = scalar; m_tokens.push(token); } // QuotedScalar void Scanner::ScanQuotedScalar() { std::string scalar; // peek at single or double quote (don't eat because we need to preserve (for the time being) the input position) char quote = INPUT.peek(); bool single = (quote == '\''); // setup the scanning parameters ScanScalarParams params; params.end = (single ? RegEx(quote) && !Exp::EscSingleQuote() : RegEx(quote)); params.eatEnd = true; params.escape = (single ? '\'' : '\\'); params.indent = 0; params.fold = FOLD_FLOW; params.eatLeadingWhitespace = true; params.trimTrailingSpaces = false; params.chomp = CLIP; params.onDocIndicator = THROW; // insert a potential simple key InsertPotentialSimpleKey(); Mark mark = INPUT.mark(); // now eat that opening quote INPUT.get(); // and scan scalar = ScanScalar(INPUT, params); m_simpleKeyAllowed = false; m_canBeJSONFlow = true; Token token(Token::NON_PLAIN_SCALAR, mark); token.value = scalar; m_tokens.push(token); } // BlockScalarToken // . These need a little extra processing beforehand. // . We need to scan the line where the indicator is (this doesn't count as part of the scalar), // and then we need to figure out what level of indentation we'll be using. void Scanner::ScanBlockScalar() { std::string scalar; ScanScalarParams params; params.indent = 1; params.detectIndent = true; // eat block indicator ('|' or '>') Mark mark = INPUT.mark(); char indicator = INPUT.get(); params.fold = (indicator == Keys::FoldedScalar ? FOLD_BLOCK : DONT_FOLD); // eat chomping/indentation indicators params.chomp = CLIP; int n = Exp::Chomp().Match(INPUT); for(int i=0;i= 0) params.indent += GetTopIndent(); params.eatLeadingWhitespace = false; params.trimTrailingSpaces = false; params.onTabInIndentation = THROW; scalar = ScanScalar(INPUT, params); // simple keys always ok after block scalars (since we're gonna start a new line anyways) m_simpleKeyAllowed = true; m_canBeJSONFlow = false; Token token(Token::NON_PLAIN_SCALAR, mark); token.value = scalar; m_tokens.push(token); } } SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/src/ptr_stack.h0000664000175000017500000000211311723131175027332 0ustar dandan#ifndef PTR_STACK_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #define PTR_STACK_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #if defined(_MSC_VER) || (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 #pragma once #endif #include "yaml-cpp/noncopyable.h" #include #include #include #include template class ptr_stack: private YAML::noncopyable { public: ptr_stack() {} ~ptr_stack() { clear(); } void clear() { for(unsigned i=0;i t) { m_data.push_back(NULL); m_data.back() = t.release(); } std::auto_ptr pop() { std::auto_ptr t(m_data.back()); m_data.pop_back(); return t; } T& top() { return *m_data.back(); } const T& top() const { return *m_data.back(); } private: std::vector m_data; }; #endif // PTR_STACK_H_62B23520_7C8E_11DE_8A39_0800200C9A66 SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/src/scantag.h0000664000175000017500000000107611723131175026767 0ustar dandan#ifndef SCANTAG_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #define SCANTAG_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #if defined(_MSC_VER) || (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 #pragma once #endif #include #include "stream.h" namespace YAML { const std::string ScanVerbatimTag(Stream& INPUT); const std::string ScanTagHandle(Stream& INPUT, bool& canBeHandle); const std::string ScanTagSuffix(Stream& INPUT); } #endif // SCANTAG_H_62B23520_7C8E_11DE_8A39_0800200C9A66 SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/src/nodebuilder.cpp0000664000175000017500000000534711723131175030203 0ustar dandan#include "nodebuilder.h" #include "yaml-cpp/mark.h" #include "yaml-cpp/node.h" #include namespace YAML { NodeBuilder::NodeBuilder(Node& root): m_root(root), m_initializedRoot(false), m_finished(false) { m_root.Clear(); m_anchors.push_back(0); // since the anchors start at 1 } NodeBuilder::~NodeBuilder() { } void NodeBuilder::OnDocumentStart(const Mark&) { } void NodeBuilder::OnDocumentEnd() { assert(m_finished); } void NodeBuilder::OnNull(const Mark& mark, anchor_t anchor) { Node& node = Push(anchor); node.Init(NodeType::Null, mark, ""); Pop(); } void NodeBuilder::OnAlias(const Mark& /*mark*/, anchor_t anchor) { Node& node = *m_anchors[anchor]; Insert(node); node.MarkAsAliased(); } void NodeBuilder::OnScalar(const Mark& mark, const std::string& tag, anchor_t anchor, const std::string& value) { Node& node = Push(anchor); node.Init(NodeType::Scalar, mark, tag); node.SetScalarData(value); Pop(); } void NodeBuilder::OnSequenceStart(const Mark& mark, const std::string& tag, anchor_t anchor) { Node& node = Push(anchor); node.Init(NodeType::Sequence, mark, tag); } void NodeBuilder::OnSequenceEnd() { Pop(); } void NodeBuilder::OnMapStart(const Mark& mark, const std::string& tag, anchor_t anchor) { Node& node = Push(anchor); node.Init(NodeType::Map, mark, tag); m_didPushKey.push(false); } void NodeBuilder::OnMapEnd() { m_didPushKey.pop(); Pop(); } Node& NodeBuilder::Push(anchor_t anchor) { Node& node = Push(); RegisterAnchor(anchor, node); return node; } Node& NodeBuilder::Push() { if(!m_initializedRoot) { m_initializedRoot = true; return m_root; } Node& node = m_root.CreateNode(); m_stack.push(&node); return node; } Node& NodeBuilder::Top() { return m_stack.empty() ? m_root : *m_stack.top(); } void NodeBuilder::Pop() { assert(!m_finished); if(m_stack.empty()) { m_finished = true; return; } Node& node = *m_stack.top(); m_stack.pop(); Insert(node); } void NodeBuilder::Insert(Node& node) { Node& curTop = Top(); switch(curTop.Type()) { case NodeType::Null: case NodeType::Scalar: assert(false); break; case NodeType::Sequence: curTop.Append(node); break; case NodeType::Map: assert(!m_didPushKey.empty()); if(m_didPushKey.top()) { assert(!m_pendingKeys.empty()); Node& key = *m_pendingKeys.top(); m_pendingKeys.pop(); curTop.Insert(key, node); m_didPushKey.top() = false; } else { m_pendingKeys.push(&node); m_didPushKey.top() = true; } break; } } void NodeBuilder::RegisterAnchor(anchor_t anchor, Node& node) { if(anchor) { assert(anchor == m_anchors.size()); m_anchors.push_back(&node); } } } SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/src/singledocparser.cpp0000664000175000017500000002400411723131175031062 0ustar dandan#include "singledocparser.h" #include "collectionstack.h" #include "directives.h" #include "yaml-cpp/eventhandler.h" #include "yaml-cpp/exceptions.h" #include "scanner.h" #include "tag.h" #include "token.h" #include #include #include namespace YAML { SingleDocParser::SingleDocParser(Scanner& scanner, const Directives& directives): m_scanner(scanner), m_directives(directives), m_pCollectionStack(new CollectionStack), m_curAnchor(0) { } SingleDocParser::~SingleDocParser() { } // HandleDocument // . Handles the next document // . Throws a ParserException on error. void SingleDocParser::HandleDocument(EventHandler& eventHandler) { assert(!m_scanner.empty()); // guaranteed that there are tokens assert(!m_curAnchor); eventHandler.OnDocumentStart(m_scanner.peek().mark); // eat doc start if(m_scanner.peek().type == Token::DOC_START) m_scanner.pop(); // recurse! HandleNode(eventHandler); eventHandler.OnDocumentEnd(); // and finally eat any doc ends we see while(!m_scanner.empty() && m_scanner.peek().type == Token::DOC_END) m_scanner.pop(); } void SingleDocParser::HandleNode(EventHandler& eventHandler) { // an empty node *is* a possibility if(m_scanner.empty()) { eventHandler.OnNull(Mark::null(), NullAnchor); return; } // save location Mark mark = m_scanner.peek().mark; // special case: a value node by itself must be a map, with no header if(m_scanner.peek().type == Token::VALUE) { eventHandler.OnMapStart(mark, "", NullAnchor); HandleMap(eventHandler); eventHandler.OnMapEnd(); return; } // special case: an alias node if(m_scanner.peek().type == Token::ALIAS) { eventHandler.OnAlias(mark, LookupAnchor(mark, m_scanner.peek().value)); m_scanner.pop(); return; } std::string tag; anchor_t anchor; ParseProperties(tag, anchor); const Token& token = m_scanner.peek(); // add non-specific tags if(tag.empty()) tag = (token.type == Token::NON_PLAIN_SCALAR ? "!" : "?"); // now split based on what kind of node we should be switch(token.type) { case Token::PLAIN_SCALAR: case Token::NON_PLAIN_SCALAR: eventHandler.OnScalar(mark, tag, anchor, token.value); m_scanner.pop(); return; case Token::FLOW_SEQ_START: case Token::BLOCK_SEQ_START: eventHandler.OnSequenceStart(mark, tag, anchor); HandleSequence(eventHandler); eventHandler.OnSequenceEnd(); return; case Token::FLOW_MAP_START: case Token::BLOCK_MAP_START: eventHandler.OnMapStart(mark, tag, anchor); HandleMap(eventHandler); eventHandler.OnMapEnd(); return; case Token::KEY: // compact maps can only go in a flow sequence if(m_pCollectionStack->GetCurCollectionType() == CollectionType::FlowSeq) { eventHandler.OnMapStart(mark, tag, anchor); HandleMap(eventHandler); eventHandler.OnMapEnd(); return; } break; default: break; } if(tag == "?") eventHandler.OnNull(mark, anchor); else eventHandler.OnScalar(mark, tag, anchor, ""); } void SingleDocParser::HandleSequence(EventHandler& eventHandler) { // split based on start token switch(m_scanner.peek().type) { case Token::BLOCK_SEQ_START: HandleBlockSequence(eventHandler); break; case Token::FLOW_SEQ_START: HandleFlowSequence(eventHandler); break; default: break; } } void SingleDocParser::HandleBlockSequence(EventHandler& eventHandler) { // eat start token m_scanner.pop(); m_pCollectionStack->PushCollectionType(CollectionType::BlockSeq); while(1) { if(m_scanner.empty()) throw ParserException(Mark::null(), ErrorMsg::END_OF_SEQ); Token token = m_scanner.peek(); if(token.type != Token::BLOCK_ENTRY && token.type != Token::BLOCK_SEQ_END) throw ParserException(token.mark, ErrorMsg::END_OF_SEQ); m_scanner.pop(); if(token.type == Token::BLOCK_SEQ_END) break; // check for null if(!m_scanner.empty()) { const Token& token = m_scanner.peek(); if(token.type == Token::BLOCK_ENTRY || token.type == Token::BLOCK_SEQ_END) { eventHandler.OnNull(token.mark, NullAnchor); continue; } } HandleNode(eventHandler); } m_pCollectionStack->PopCollectionType(CollectionType::BlockSeq); } void SingleDocParser::HandleFlowSequence(EventHandler& eventHandler) { // eat start token m_scanner.pop(); m_pCollectionStack->PushCollectionType(CollectionType::FlowSeq); while(1) { if(m_scanner.empty()) throw ParserException(Mark::null(), ErrorMsg::END_OF_SEQ_FLOW); // first check for end if(m_scanner.peek().type == Token::FLOW_SEQ_END) { m_scanner.pop(); break; } // then read the node HandleNode(eventHandler); // now eat the separator (or could be a sequence end, which we ignore - but if it's neither, then it's a bad node) Token& token = m_scanner.peek(); if(token.type == Token::FLOW_ENTRY) m_scanner.pop(); else if(token.type != Token::FLOW_SEQ_END) throw ParserException(token.mark, ErrorMsg::END_OF_SEQ_FLOW); } m_pCollectionStack->PopCollectionType(CollectionType::FlowSeq); } void SingleDocParser::HandleMap(EventHandler& eventHandler) { // split based on start token switch(m_scanner.peek().type) { case Token::BLOCK_MAP_START: HandleBlockMap(eventHandler); break; case Token::FLOW_MAP_START: HandleFlowMap(eventHandler); break; case Token::KEY: HandleCompactMap(eventHandler); break; case Token::VALUE: HandleCompactMapWithNoKey(eventHandler); break; default: break; } } void SingleDocParser::HandleBlockMap(EventHandler& eventHandler) { // eat start token m_scanner.pop(); m_pCollectionStack->PushCollectionType(CollectionType::BlockMap); while(1) { if(m_scanner.empty()) throw ParserException(Mark::null(), ErrorMsg::END_OF_MAP); Token token = m_scanner.peek(); if(token.type != Token::KEY && token.type != Token::VALUE && token.type != Token::BLOCK_MAP_END) throw ParserException(token.mark, ErrorMsg::END_OF_MAP); if(token.type == Token::BLOCK_MAP_END) { m_scanner.pop(); break; } // grab key (if non-null) if(token.type == Token::KEY) { m_scanner.pop(); HandleNode(eventHandler); } else { eventHandler.OnNull(token.mark, NullAnchor); } // now grab value (optional) if(!m_scanner.empty() && m_scanner.peek().type == Token::VALUE) { m_scanner.pop(); HandleNode(eventHandler); } else { eventHandler.OnNull(token.mark, NullAnchor); } } m_pCollectionStack->PopCollectionType(CollectionType::BlockMap); } void SingleDocParser::HandleFlowMap(EventHandler& eventHandler) { // eat start token m_scanner.pop(); m_pCollectionStack->PushCollectionType(CollectionType::FlowMap); while(1) { if(m_scanner.empty()) throw ParserException(Mark::null(), ErrorMsg::END_OF_MAP_FLOW); Token& token = m_scanner.peek(); // first check for end if(token.type == Token::FLOW_MAP_END) { m_scanner.pop(); break; } // grab key (if non-null) if(token.type == Token::KEY) { m_scanner.pop(); HandleNode(eventHandler); } else { eventHandler.OnNull(token.mark, NullAnchor); } // now grab value (optional) if(!m_scanner.empty() && m_scanner.peek().type == Token::VALUE) { m_scanner.pop(); HandleNode(eventHandler); } else { eventHandler.OnNull(token.mark, NullAnchor); } // now eat the separator (or could be a map end, which we ignore - but if it's neither, then it's a bad node) Token& nextToken = m_scanner.peek(); if(nextToken.type == Token::FLOW_ENTRY) m_scanner.pop(); else if(nextToken.type != Token::FLOW_MAP_END) throw ParserException(nextToken.mark, ErrorMsg::END_OF_MAP_FLOW); } m_pCollectionStack->PopCollectionType(CollectionType::FlowMap); } // . Single "key: value" pair in a flow sequence void SingleDocParser::HandleCompactMap(EventHandler& eventHandler) { m_pCollectionStack->PushCollectionType(CollectionType::CompactMap); // grab key Mark mark = m_scanner.peek().mark; m_scanner.pop(); HandleNode(eventHandler); // now grab value (optional) if(!m_scanner.empty() && m_scanner.peek().type == Token::VALUE) { m_scanner.pop(); HandleNode(eventHandler); } else { eventHandler.OnNull(mark, NullAnchor); } m_pCollectionStack->PopCollectionType(CollectionType::CompactMap); } // . Single ": value" pair in a flow sequence void SingleDocParser::HandleCompactMapWithNoKey(EventHandler& eventHandler) { m_pCollectionStack->PushCollectionType(CollectionType::CompactMap); // null key eventHandler.OnNull(m_scanner.peek().mark, NullAnchor); // grab value m_scanner.pop(); HandleNode(eventHandler); m_pCollectionStack->PopCollectionType(CollectionType::CompactMap); } // ParseProperties // . Grabs any tag or anchor tokens and deals with them. void SingleDocParser::ParseProperties(std::string& tag, anchor_t& anchor) { tag.clear(); anchor = NullAnchor; while(1) { if(m_scanner.empty()) return; switch(m_scanner.peek().type) { case Token::TAG: ParseTag(tag); break; case Token::ANCHOR: ParseAnchor(anchor); break; default: return; } } } void SingleDocParser::ParseTag(std::string& tag) { Token& token = m_scanner.peek(); if(!tag.empty()) throw ParserException(token.mark, ErrorMsg::MULTIPLE_TAGS); Tag tagInfo(token); tag = tagInfo.Translate(m_directives); m_scanner.pop(); } void SingleDocParser::ParseAnchor(anchor_t& anchor) { Token& token = m_scanner.peek(); if(anchor) throw ParserException(token.mark, ErrorMsg::MULTIPLE_ANCHORS); anchor = RegisterAnchor(token.value); m_scanner.pop(); } anchor_t SingleDocParser::RegisterAnchor(const std::string& name) { if(name.empty()) return NullAnchor; return m_anchors[name] = ++m_curAnchor; } anchor_t SingleDocParser::LookupAnchor(const Mark& mark, const std::string& name) const { Anchors::const_iterator it = m_anchors.find(name); if(it == m_anchors.end()) throw ParserException(mark, ErrorMsg::UNKNOWN_ANCHOR); return it->second; } } SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/license.txt0000664000175000017500000000204011723131175026562 0ustar dandanCopyright (c) 2008 Jesse Beder. 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. SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/test/0000775000175000017500000000000012110505246025355 5ustar dandanSuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/test/emittertests.h0000664000175000017500000000062611723131175030273 0ustar dandan#ifndef EMITTERTESTS_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #define EMITTERTESTS_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #if defined(_MSC_VER) || (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 #pragma once #endif namespace Test { bool RunEmitterTests(); } #endif // EMITTERTESTS_H_62B23520_7C8E_11DE_8A39_0800200C9A66 SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/test/old-api/0000775000175000017500000000000012110505246026702 5ustar dandanSuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/test/old-api/spectests.cpp0000664000175000017500000012252711723131175031441 0ustar dandan#include "spectests.h" #include "specexamples.h" #include "yaml-cpp/yaml.h" #include #include #include #include #define YAML_ASSERT(cond) do { if(!(cond)) return " Assert failed: " #cond; } while(false) #define PARSE(doc, input) \ std::stringstream stream(input);\ YAML::Parser parser(stream);\ YAML::Node doc;\ parser.GetNextDocument(doc) #define PARSE_NEXT(doc) parser.GetNextDocument(doc) namespace Test { namespace Spec { // 2.1 TEST SeqScalars() { PARSE(doc, ex2_1); YAML_ASSERT(doc.size() == 3); YAML_ASSERT(doc[0].to() == "Mark McGwire"); YAML_ASSERT(doc[1].to() == "Sammy Sosa"); YAML_ASSERT(doc[2].to() == "Ken Griffey"); return true; } // 2.2 TEST MappingScalarsToScalars() { PARSE(doc, ex2_2); YAML_ASSERT(doc.size() == 3); YAML_ASSERT(doc["hr"].to() == "65"); YAML_ASSERT(doc["avg"].to() == "0.278"); YAML_ASSERT(doc["rbi"].to() == "147"); return true; } // 2.3 TEST MappingScalarsToSequences() { PARSE(doc, ex2_3); YAML_ASSERT(doc.size() == 2); YAML_ASSERT(doc["american"].size() == 3); YAML_ASSERT(doc["american"][0].to() == "Boston Red Sox"); YAML_ASSERT(doc["american"][1].to() == "Detroit Tigers"); YAML_ASSERT(doc["american"][2].to() == "New York Yankees"); YAML_ASSERT(doc["national"].size() == 3); YAML_ASSERT(doc["national"][0].to() == "New York Mets"); YAML_ASSERT(doc["national"][1].to() == "Chicago Cubs"); YAML_ASSERT(doc["national"][2].to() == "Atlanta Braves"); return true; } // 2.4 TEST SequenceOfMappings() { PARSE(doc, ex2_4); YAML_ASSERT(doc.size() == 2); YAML_ASSERT(doc[0].size() == 3); YAML_ASSERT(doc[0]["name"].to() == "Mark McGwire"); YAML_ASSERT(doc[0]["hr"].to() == "65"); YAML_ASSERT(doc[0]["avg"].to() == "0.278"); YAML_ASSERT(doc[1].size() == 3); YAML_ASSERT(doc[1]["name"].to() == "Sammy Sosa"); YAML_ASSERT(doc[1]["hr"].to() == "63"); YAML_ASSERT(doc[1]["avg"].to() == "0.288"); return true; } // 2.5 TEST SequenceOfSequences() { PARSE(doc, ex2_5); YAML_ASSERT(doc.size() == 3); YAML_ASSERT(doc[0].size() == 3); YAML_ASSERT(doc[0][0].to() == "name"); YAML_ASSERT(doc[0][1].to() == "hr"); YAML_ASSERT(doc[0][2].to() == "avg"); YAML_ASSERT(doc[1].size() == 3); YAML_ASSERT(doc[1][0].to() == "Mark McGwire"); YAML_ASSERT(doc[1][1].to() == "65"); YAML_ASSERT(doc[1][2].to() == "0.278"); YAML_ASSERT(doc[2].size() == 3); YAML_ASSERT(doc[2][0].to() == "Sammy Sosa"); YAML_ASSERT(doc[2][1].to() == "63"); YAML_ASSERT(doc[2][2].to() == "0.288"); return true; } // 2.6 TEST MappingOfMappings() { PARSE(doc, ex2_6); YAML_ASSERT(doc.size() == 2); YAML_ASSERT(doc["Mark McGwire"].size() == 2); YAML_ASSERT(doc["Mark McGwire"]["hr"].to() == "65"); YAML_ASSERT(doc["Mark McGwire"]["avg"].to() == "0.278"); YAML_ASSERT(doc["Sammy Sosa"].size() == 2); YAML_ASSERT(doc["Sammy Sosa"]["hr"].to() == "63"); YAML_ASSERT(doc["Sammy Sosa"]["avg"].to() == "0.288"); return true; } // 2.7 TEST TwoDocumentsInAStream() { PARSE(doc, ex2_7); YAML_ASSERT(doc.size() == 3); YAML_ASSERT(doc[0].to() == "Mark McGwire"); YAML_ASSERT(doc[1].to() == "Sammy Sosa"); YAML_ASSERT(doc[2].to() == "Ken Griffey"); PARSE_NEXT(doc); YAML_ASSERT(doc.size() == 2); YAML_ASSERT(doc[0].to() == "Chicago Cubs"); YAML_ASSERT(doc[1].to() == "St Louis Cardinals"); return true; } // 2.8 TEST PlayByPlayFeed() { PARSE(doc, ex2_8); YAML_ASSERT(doc.size() == 3); YAML_ASSERT(doc["time"].to() == "20:03:20"); YAML_ASSERT(doc["player"].to() == "Sammy Sosa"); YAML_ASSERT(doc["action"].to() == "strike (miss)"); PARSE_NEXT(doc); YAML_ASSERT(doc.size() == 3); YAML_ASSERT(doc["time"].to() == "20:03:47"); YAML_ASSERT(doc["player"].to() == "Sammy Sosa"); YAML_ASSERT(doc["action"].to() == "grand slam"); return true; } // 2.9 TEST SingleDocumentWithTwoComments() { PARSE(doc, ex2_9); YAML_ASSERT(doc.size() == 2); YAML_ASSERT(doc["hr"].size() == 2); YAML_ASSERT(doc["hr"][0].to() == "Mark McGwire"); YAML_ASSERT(doc["hr"][1].to() == "Sammy Sosa"); YAML_ASSERT(doc["rbi"].size() == 2); YAML_ASSERT(doc["rbi"][0].to() == "Sammy Sosa"); YAML_ASSERT(doc["rbi"][1].to() == "Ken Griffey"); return true; } // 2.10 TEST SimpleAnchor() { PARSE(doc, ex2_10); YAML_ASSERT(doc.size() == 2); YAML_ASSERT(doc["hr"].size() == 2); YAML_ASSERT(doc["hr"][0].to() == "Mark McGwire"); YAML_ASSERT(doc["hr"][1].to() == "Sammy Sosa"); YAML_ASSERT(doc["rbi"].size() == 2); YAML_ASSERT(doc["rbi"][0].to() == "Sammy Sosa"); YAML_ASSERT(doc["rbi"][1].to() == "Ken Griffey"); return true; } struct Pair { Pair() {} Pair(const std::string& f, const std::string& s): first(f), second(s) {} std::string first, second; }; bool operator == (const Pair& p, const Pair& q) { return p.first == q.first && p.second == q.second; } void operator >> (const YAML::Node& node, Pair& p) { node[0] >> p.first; node[1] >> p.second; } // 2.11 TEST MappingBetweenSequences() { PARSE(doc, ex2_11); YAML_ASSERT(doc.size() == 2); YAML_ASSERT(doc[Pair("Detroit Tigers", "Chicago cubs")].size() == 1); YAML_ASSERT(doc[Pair("Detroit Tigers", "Chicago cubs")][0].to() == "2001-07-23"); YAML_ASSERT(doc[Pair("New York Yankees", "Atlanta Braves")].size() == 3); YAML_ASSERT(doc[Pair("New York Yankees", "Atlanta Braves")][0].to() == "2001-07-02"); YAML_ASSERT(doc[Pair("New York Yankees", "Atlanta Braves")][1].to() == "2001-08-12"); YAML_ASSERT(doc[Pair("New York Yankees", "Atlanta Braves")][2].to() == "2001-08-14"); return true; } // 2.12 TEST CompactNestedMapping() { PARSE(doc, ex2_12); YAML_ASSERT(doc.size() == 3); YAML_ASSERT(doc[0].size() == 2); YAML_ASSERT(doc[0]["item"].to() == "Super Hoop"); YAML_ASSERT(doc[0]["quantity"].to() == 1); YAML_ASSERT(doc[1].size() == 2); YAML_ASSERT(doc[1]["item"].to() == "Basketball"); YAML_ASSERT(doc[1]["quantity"].to() == 4); YAML_ASSERT(doc[2].size() == 2); YAML_ASSERT(doc[2]["item"].to() == "Big Shoes"); YAML_ASSERT(doc[2]["quantity"].to() == 1); return true; } // 2.13 TEST InLiteralsNewlinesArePreserved() { PARSE(doc, ex2_13); YAML_ASSERT(doc.to() == "\\//||\\/||\n" "// || ||__"); return true; } // 2.14 TEST InFoldedScalarsNewlinesBecomeSpaces() { PARSE(doc, ex2_14); YAML_ASSERT(doc.to() == "Mark McGwire's year was crippled by a knee injury."); return true; } // 2.15 TEST FoldedNewlinesArePreservedForMoreIndentedAndBlankLines() { PARSE(doc, ex2_15); YAML_ASSERT(doc.to() == "Sammy Sosa completed another fine season with great stats.\n\n" " 63 Home Runs\n" " 0.288 Batting Average\n\n" "What a year!"); return true; } // 2.16 TEST IndentationDeterminesScope() { PARSE(doc, ex2_16); YAML_ASSERT(doc.size() == 3); YAML_ASSERT(doc["name"].to() == "Mark McGwire"); YAML_ASSERT(doc["accomplishment"].to() == "Mark set a major league home run record in 1998.\n"); YAML_ASSERT(doc["stats"].to() == "65 Home Runs\n0.278 Batting Average\n"); return true; } // 2.17 TEST QuotedScalars() { PARSE(doc, ex2_17); YAML_ASSERT(doc.size() == 6); YAML_ASSERT(doc["unicode"].to() == "Sosa did fine.\xe2\x98\xba"); YAML_ASSERT(doc["control"].to() == "\b1998\t1999\t2000\n"); YAML_ASSERT(doc["hex esc"].to() == "\x0d\x0a is \r\n"); YAML_ASSERT(doc["single"].to() == "\"Howdy!\" he cried."); YAML_ASSERT(doc["quoted"].to() == " # Not a 'comment'."); YAML_ASSERT(doc["tie-fighter"].to() == "|\\-*-/|"); return true; } // 2.18 TEST MultiLineFlowScalars() { PARSE(doc, ex2_18); YAML_ASSERT(doc.size() == 2); YAML_ASSERT(doc["plain"].to() == "This unquoted scalar spans many lines."); YAML_ASSERT(doc["quoted"].to() == "So does this quoted scalar.\n"); return true; } // TODO: 2.19 - 2.22 schema tags // 2.23 TEST VariousExplicitTags() { PARSE(doc, ex2_23); YAML_ASSERT(doc.size() == 3); YAML_ASSERT(doc["not-date"].Tag() == "tag:yaml.org,2002:str"); YAML_ASSERT(doc["not-date"].to() == "2002-04-28"); YAML_ASSERT(doc["picture"].Tag() == "tag:yaml.org,2002:binary"); YAML_ASSERT(doc["picture"].to() == "R0lGODlhDAAMAIQAAP//9/X\n" "17unp5WZmZgAAAOfn515eXv\n" "Pz7Y6OjuDg4J+fn5OTk6enp\n" "56enmleECcgggoBADs=\n" ); YAML_ASSERT(doc["application specific tag"].Tag() == "!something"); YAML_ASSERT(doc["application specific tag"].to() == "The semantics of the tag\n" "above may be different for\n" "different documents." ); return true; } // 2.24 TEST GlobalTags() { PARSE(doc, ex2_24); YAML_ASSERT(doc.Tag() == "tag:clarkevans.com,2002:shape"); YAML_ASSERT(doc.size() == 3); YAML_ASSERT(doc[0].Tag() == "tag:clarkevans.com,2002:circle"); YAML_ASSERT(doc[0].size() == 2); YAML_ASSERT(doc[0]["center"].size() == 2); YAML_ASSERT(doc[0]["center"]["x"].to() == 73); YAML_ASSERT(doc[0]["center"]["y"].to() == 129); YAML_ASSERT(doc[0]["radius"].to() == 7); YAML_ASSERT(doc[1].Tag() == "tag:clarkevans.com,2002:line"); YAML_ASSERT(doc[1].size() == 2); YAML_ASSERT(doc[1]["start"].size() == 2); YAML_ASSERT(doc[1]["start"]["x"].to() == 73); YAML_ASSERT(doc[1]["start"]["y"].to() == 129); YAML_ASSERT(doc[1]["finish"].size() == 2); YAML_ASSERT(doc[1]["finish"]["x"].to() == 89); YAML_ASSERT(doc[1]["finish"]["y"].to() == 102); YAML_ASSERT(doc[2].Tag() == "tag:clarkevans.com,2002:label"); YAML_ASSERT(doc[2].size() == 3); YAML_ASSERT(doc[2]["start"].size() == 2); YAML_ASSERT(doc[2]["start"]["x"].to() == 73); YAML_ASSERT(doc[2]["start"]["y"].to() == 129); YAML_ASSERT(doc[2]["color"].to() == "0xFFEEBB"); YAML_ASSERT(doc[2]["text"].to() == "Pretty vector drawing."); return true; } // 2.25 TEST UnorderedSets() { PARSE(doc, ex2_25); YAML_ASSERT(doc.Tag() == "tag:yaml.org,2002:set"); YAML_ASSERT(doc.size() == 3); YAML_ASSERT(IsNull(doc["Mark McGwire"])); YAML_ASSERT(IsNull(doc["Sammy Sosa"])); YAML_ASSERT(IsNull(doc["Ken Griffey"])); return true; } // 2.26 TEST OrderedMappings() { PARSE(doc, ex2_26); YAML_ASSERT(doc.Tag() == "tag:yaml.org,2002:omap"); YAML_ASSERT(doc.size() == 3); YAML_ASSERT(doc[0].size() == 1); YAML_ASSERT(doc[0]["Mark McGwire"].to() == 65); YAML_ASSERT(doc[1].size() == 1); YAML_ASSERT(doc[1]["Sammy Sosa"].to() == 63); YAML_ASSERT(doc[2].size() == 1); YAML_ASSERT(doc[2]["Ken Griffey"].to() == 58); return true; } // 2.27 TEST Invoice() { PARSE(doc, ex2_27); YAML_ASSERT(doc.Tag() == "tag:clarkevans.com,2002:invoice"); YAML_ASSERT(doc.size() == 8); YAML_ASSERT(doc["invoice"].to() == 34843); YAML_ASSERT(doc["date"].to() == "2001-01-23"); YAML_ASSERT(doc["bill-to"].size() == 3); YAML_ASSERT(doc["bill-to"]["given"].to() == "Chris"); YAML_ASSERT(doc["bill-to"]["family"].to() == "Dumars"); YAML_ASSERT(doc["bill-to"]["address"].size() == 4); YAML_ASSERT(doc["bill-to"]["address"]["lines"].to() == "458 Walkman Dr.\nSuite #292\n"); YAML_ASSERT(doc["bill-to"]["address"]["city"].to() == "Royal Oak"); YAML_ASSERT(doc["bill-to"]["address"]["state"].to() == "MI"); YAML_ASSERT(doc["bill-to"]["address"]["postal"].to() == "48046"); YAML_ASSERT(doc["ship-to"].size() == 3); YAML_ASSERT(doc["ship-to"]["given"].to() == "Chris"); YAML_ASSERT(doc["ship-to"]["family"].to() == "Dumars"); YAML_ASSERT(doc["ship-to"]["address"].size() == 4); YAML_ASSERT(doc["ship-to"]["address"]["lines"].to() == "458 Walkman Dr.\nSuite #292\n"); YAML_ASSERT(doc["ship-to"]["address"]["city"].to() == "Royal Oak"); YAML_ASSERT(doc["ship-to"]["address"]["state"].to() == "MI"); YAML_ASSERT(doc["ship-to"]["address"]["postal"].to() == "48046"); YAML_ASSERT(doc["product"].size() == 2); YAML_ASSERT(doc["product"][0].size() == 4); YAML_ASSERT(doc["product"][0]["sku"].to() == "BL394D"); YAML_ASSERT(doc["product"][0]["quantity"].to() == 4); YAML_ASSERT(doc["product"][0]["description"].to() == "Basketball"); YAML_ASSERT(doc["product"][0]["price"].to() == "450.00"); YAML_ASSERT(doc["product"][1].size() == 4); YAML_ASSERT(doc["product"][1]["sku"].to() == "BL4438H"); YAML_ASSERT(doc["product"][1]["quantity"].to() == 1); YAML_ASSERT(doc["product"][1]["description"].to() == "Super Hoop"); YAML_ASSERT(doc["product"][1]["price"].to() == "2392.00"); YAML_ASSERT(doc["tax"].to() == "251.42"); YAML_ASSERT(doc["total"].to() == "4443.52"); YAML_ASSERT(doc["comments"].to() == "Late afternoon is best. Backup contact is Nancy Billsmer @ 338-4338."); return true; } // 2.28 TEST LogFile() { PARSE(doc, ex2_28); YAML_ASSERT(doc.size() == 3); YAML_ASSERT(doc["Time"].to() == "2001-11-23 15:01:42 -5"); YAML_ASSERT(doc["User"].to() == "ed"); YAML_ASSERT(doc["Warning"].to() == "This is an error message for the log file"); PARSE_NEXT(doc); YAML_ASSERT(doc.size() == 3); YAML_ASSERT(doc["Time"].to() == "2001-11-23 15:02:31 -5"); YAML_ASSERT(doc["User"].to() == "ed"); YAML_ASSERT(doc["Warning"].to() == "A slightly different error message."); PARSE_NEXT(doc); YAML_ASSERT(doc.size() == 4); YAML_ASSERT(doc["Date"].to() == "2001-11-23 15:03:17 -5"); YAML_ASSERT(doc["User"].to() == "ed"); YAML_ASSERT(doc["Fatal"].to() == "Unknown variable \"bar\""); YAML_ASSERT(doc["Stack"].size() == 2); YAML_ASSERT(doc["Stack"][0].size() == 3); YAML_ASSERT(doc["Stack"][0]["file"].to() == "TopClass.py"); YAML_ASSERT(doc["Stack"][0]["line"].to() == "23"); YAML_ASSERT(doc["Stack"][0]["code"].to() == "x = MoreObject(\"345\\n\")\n"); YAML_ASSERT(doc["Stack"][1].size() == 3); YAML_ASSERT(doc["Stack"][1]["file"].to() == "MoreClass.py"); YAML_ASSERT(doc["Stack"][1]["line"].to() == "58"); YAML_ASSERT(doc["Stack"][1]["code"].to() == "foo = bar"); return true; } // TODO: 5.1 - 5.2 BOM // 5.3 TEST BlockStructureIndicators() { PARSE(doc, ex5_3); YAML_ASSERT(doc.size() == 2); YAML_ASSERT(doc["sequence"].size() == 2); YAML_ASSERT(doc["sequence"][0].to() == "one"); YAML_ASSERT(doc["sequence"][1].to() == "two"); YAML_ASSERT(doc["mapping"].size() == 2); YAML_ASSERT(doc["mapping"]["sky"].to() == "blue"); YAML_ASSERT(doc["mapping"]["sea"].to() == "green"); return true; } // 5.4 TEST FlowStructureIndicators() { PARSE(doc, ex5_4); YAML_ASSERT(doc.size() == 2); YAML_ASSERT(doc["sequence"].size() == 2); YAML_ASSERT(doc["sequence"][0].to() == "one"); YAML_ASSERT(doc["sequence"][1].to() == "two"); YAML_ASSERT(doc["mapping"].size() == 2); YAML_ASSERT(doc["mapping"]["sky"].to() == "blue"); YAML_ASSERT(doc["mapping"]["sea"].to() == "green"); return true; } // 5.5 TEST CommentIndicator() { PARSE(doc, ex5_5); YAML_ASSERT(doc.size() == 0); return true; } // 5.6 TEST NodePropertyIndicators() { PARSE(doc, ex5_6); YAML_ASSERT(doc.size() == 2); YAML_ASSERT(doc["anchored"].to() == "value"); // TODO: assert tag YAML_ASSERT(doc["alias"].to() == "value"); return true; } // 5.7 TEST BlockScalarIndicators() { PARSE(doc, ex5_7); YAML_ASSERT(doc.size() == 2); YAML_ASSERT(doc["literal"].to() == "some\ntext\n"); YAML_ASSERT(doc["folded"].to() == "some text\n"); return true; } // 5.8 TEST QuotedScalarIndicators() { PARSE(doc, ex5_8); YAML_ASSERT(doc.size() == 2); YAML_ASSERT(doc["single"].to() == "text"); YAML_ASSERT(doc["double"].to() == "text"); return true; } // TODO: 5.9 directive // TODO: 5.10 reserved indicator // 5.11 TEST LineBreakCharacters() { PARSE(doc, ex5_11); YAML_ASSERT(doc.to() == "Line break (no glyph)\nLine break (glyphed)\n"); return true; } // 5.12 TEST TabsAndSpaces() { PARSE(doc, ex5_12); YAML_ASSERT(doc.size() == 2); YAML_ASSERT(doc["quoted"].to() == "Quoted\t"); YAML_ASSERT(doc["block"].to() == "void main() {\n" "\tprintf(\"Hello, world!\\n\");\n" "}"); return true; } // 5.13 TEST EscapedCharacters() { PARSE(doc, ex5_13); YAML_ASSERT(doc.to() == "Fun with \x5C \x22 \x07 \x08 \x1B \x0C \x0A \x0D \x09 \x0B " + std::string("\x00", 1) + " \x20 \xA0 \x85 \xe2\x80\xa8 \xe2\x80\xa9 A A A"); return true; } // 5.14 TEST InvalidEscapedCharacters() { std::stringstream stream(ex5_14); try { YAML::Parser parser(stream); YAML::Node doc; parser.GetNextDocument(doc); } catch(const YAML::ParserException& e) { YAML_ASSERT(e.msg == std::string(YAML::ErrorMsg::INVALID_ESCAPE) + "c"); return true; } return false; } // 6.1 TEST IndentationSpaces() { PARSE(doc, ex6_1); YAML_ASSERT(doc.size() == 1); YAML_ASSERT(doc["Not indented"].size() == 2); YAML_ASSERT(doc["Not indented"]["By one space"].to() == "By four\n spaces\n"); YAML_ASSERT(doc["Not indented"]["Flow style"].size() == 3); YAML_ASSERT(doc["Not indented"]["Flow style"][0].to() == "By two"); YAML_ASSERT(doc["Not indented"]["Flow style"][1].to() == "Also by two"); YAML_ASSERT(doc["Not indented"]["Flow style"][2].to() == "Still by two"); return true; } // 6.2 TEST IndentationIndicators() { PARSE(doc, ex6_2); YAML_ASSERT(doc.size() == 1); YAML_ASSERT(doc["a"].size() == 2); YAML_ASSERT(doc["a"][0].to() == "b"); YAML_ASSERT(doc["a"][1].size() == 2); YAML_ASSERT(doc["a"][1][0].to() == "c"); YAML_ASSERT(doc["a"][1][1].to() == "d"); return true; } // 6.3 TEST SeparationSpaces() { PARSE(doc, ex6_3); YAML_ASSERT(doc.size() == 2); YAML_ASSERT(doc[0].size() == 1); YAML_ASSERT(doc[0]["foo"].to() == "bar"); YAML_ASSERT(doc[1].size() == 2); YAML_ASSERT(doc[1][0].to() == "baz"); YAML_ASSERT(doc[1][1].to() == "baz"); return true; } // 6.4 TEST LinePrefixes() { PARSE(doc, ex6_4); YAML_ASSERT(doc.size() == 3); YAML_ASSERT(doc["plain"].to() == "text lines"); YAML_ASSERT(doc["quoted"].to() == "text lines"); YAML_ASSERT(doc["block"].to() == "text\n \tlines\n"); return true; } // 6.5 TEST EmptyLines() { PARSE(doc, ex6_5); YAML_ASSERT(doc.size() == 2); YAML_ASSERT(doc["Folding"].to() == "Empty line\nas a line feed"); YAML_ASSERT(doc["Chomping"].to() == "Clipped empty lines\n"); return true; } // 6.6 TEST LineFolding() { PARSE(doc, ex6_6); YAML_ASSERT(doc.to() == "trimmed\n\n\nas space"); return true; } // 6.7 TEST BlockFolding() { PARSE(doc, ex6_7); YAML_ASSERT(doc.to() == "foo \n\n\t bar\n\nbaz\n"); return true; } // 6.8 TEST FlowFolding() { PARSE(doc, ex6_8); YAML_ASSERT(doc.to() == " foo\nbar\nbaz "); return true; } // 6.9 TEST SeparatedComment() { PARSE(doc, ex6_9); YAML_ASSERT(doc.size() == 1); YAML_ASSERT(doc["key"].to() == "value"); return true; } // 6.10 TEST CommentLines() { PARSE(doc, ex6_10); YAML_ASSERT(doc.size() == 0); return true; } // 6.11 TEST MultiLineComments() { PARSE(doc, ex6_11); YAML_ASSERT(doc.size() == 1); YAML_ASSERT(doc["key"].to() == "value"); return true; } struct StringMap { typedef std::map Map; Map _; }; bool operator == (const StringMap& m, const StringMap& n) { return m._ == n._; } void operator >> (const YAML::Node& node, StringMap& m) { m._.clear(); for(YAML::Iterator it=node.begin();it!=node.end();++it) { std::string key = it.first().to(); std::string value = it.second().to(); m._[key] = value; } } // 6.12 TEST SeparationSpacesII() { PARSE(doc, ex6_12); std::map key; key["first"] = "Sammy"; key["last"] = "Sosa"; YAML_ASSERT(doc.size() == 1); YAML_ASSERT(doc[key].size() == 2); YAML_ASSERT(doc[key]["hr"].to() == 65); YAML_ASSERT(doc[key]["avg"].to() == "0.278"); return true; } // 6.13 TEST ReservedDirectives() { PARSE(doc, ex6_13); return true; } // 6.14 TEST YAMLDirective() { PARSE(doc, ex6_14); return true; } // 6.15 TEST InvalidRepeatedYAMLDirective() { try { PARSE(doc, ex6_15); } catch(const YAML::ParserException& e) { if(e.msg == YAML::ErrorMsg::REPEATED_YAML_DIRECTIVE) return true; throw; } return " No exception was thrown"; } // 6.16 TEST TagDirective() { PARSE(doc, ex6_16); YAML_ASSERT(doc.Tag() == "tag:yaml.org,2002:str"); YAML_ASSERT(doc.to() == "foo"); return true; } // 6.17 TEST InvalidRepeatedTagDirective() { try { PARSE(doc, ex6_17); } catch(const YAML::ParserException& e) { if(e.msg == YAML::ErrorMsg::REPEATED_TAG_DIRECTIVE) return true; throw; } return " No exception was thrown"; } // 6.18 TEST PrimaryTagHandle() { PARSE(doc, ex6_18); YAML_ASSERT(doc.Tag() == "!foo"); YAML_ASSERT(doc.to() == "bar"); PARSE_NEXT(doc); YAML_ASSERT(doc.Tag() == "tag:example.com,2000:app/foo"); YAML_ASSERT(doc.to() == "bar"); return true; } // 6.19 TEST SecondaryTagHandle() { PARSE(doc, ex6_19); YAML_ASSERT(doc.Tag() == "tag:example.com,2000:app/int"); YAML_ASSERT(doc.to() == "1 - 3"); return true; } // 6.20 TEST TagHandles() { PARSE(doc, ex6_20); YAML_ASSERT(doc.Tag() == "tag:example.com,2000:app/foo"); YAML_ASSERT(doc.to() == "bar"); return true; } // 6.21 TEST LocalTagPrefix() { PARSE(doc, ex6_21); YAML_ASSERT(doc.Tag() == "!my-light"); YAML_ASSERT(doc.to() == "fluorescent"); PARSE_NEXT(doc); YAML_ASSERT(doc.Tag() == "!my-light"); YAML_ASSERT(doc.to() == "green"); return true; } // 6.22 TEST GlobalTagPrefix() { PARSE(doc, ex6_22); YAML_ASSERT(doc.size() == 1); YAML_ASSERT(doc[0].Tag() == "tag:example.com,2000:app/foo"); YAML_ASSERT(doc[0].to() == "bar"); return true; } // 6.23 TEST NodeProperties() { PARSE(doc, ex6_23); YAML_ASSERT(doc.size() == 2); for(YAML::Iterator it=doc.begin();it!=doc.end();++it) { if(it.first().to() == "foo") { YAML_ASSERT(it.first().Tag() == "tag:yaml.org,2002:str"); YAML_ASSERT(it.second().Tag() == "tag:yaml.org,2002:str"); YAML_ASSERT(it.second().to() == "bar"); } else if(it.first().to() == "baz") { YAML_ASSERT(it.second().to() == "foo"); } else return " unknown key"; } return true; } // 6.24 TEST VerbatimTags() { PARSE(doc, ex6_24); YAML_ASSERT(doc.size() == 1); for(YAML::Iterator it=doc.begin();it!=doc.end();++it) { YAML_ASSERT(it.first().Tag() == "tag:yaml.org,2002:str"); YAML_ASSERT(it.first().to() == "foo"); YAML_ASSERT(it.second().Tag() == "!bar"); YAML_ASSERT(it.second().to() == "baz"); } return true; } // 6.25 TEST InvalidVerbatimTags() { PARSE(doc, ex6_25); return " not implemented yet"; // TODO: check tags (but we probably will say these are valid, I think) } // 6.26 TEST TagShorthands() { PARSE(doc, ex6_26); YAML_ASSERT(doc.size() == 3); YAML_ASSERT(doc[0].Tag() == "!local"); YAML_ASSERT(doc[0].to() == "foo"); YAML_ASSERT(doc[1].Tag() == "tag:yaml.org,2002:str"); YAML_ASSERT(doc[1].to() == "bar"); YAML_ASSERT(doc[2].Tag() == "tag:example.com,2000:app/tag%21"); YAML_ASSERT(doc[2].to() == "baz"); return true; } // 6.27 TEST InvalidTagShorthands() { bool threw = false; try { PARSE(doc, ex6_27a); } catch(const YAML::ParserException& e) { threw = true; if(e.msg != YAML::ErrorMsg::TAG_WITH_NO_SUFFIX) throw; } if(!threw) return " No exception was thrown for a tag with no suffix"; PARSE(doc, ex6_27b); // TODO: should we reject this one (since !h! is not declared)? return " not implemented yet"; } // 6.28 TEST NonSpecificTags() { PARSE(doc, ex6_28); YAML_ASSERT(doc.size() == 3); YAML_ASSERT(doc[0].to() == "12"); // TODO: check tags. How? YAML_ASSERT(doc[1].to() == 12); YAML_ASSERT(doc[2].to() == "12"); return true; } // 6.29 TEST NodeAnchors() { PARSE(doc, ex6_29); YAML_ASSERT(doc.size() == 2); YAML_ASSERT(doc["First occurrence"].to() == "Value"); YAML_ASSERT(doc["Second occurrence"].to() == "Value"); return true; } // 7.1 TEST AliasNodes() { PARSE(doc, ex7_1); YAML_ASSERT(doc.size() == 4); YAML_ASSERT(doc["First occurrence"].to() == "Foo"); YAML_ASSERT(doc["Second occurrence"].to() == "Foo"); YAML_ASSERT(doc["Override anchor"].to() == "Bar"); YAML_ASSERT(doc["Reuse anchor"].to() == "Bar"); return true; } // 7.2 TEST EmptyNodes() { PARSE(doc, ex7_2); YAML_ASSERT(doc.size() == 2); for(YAML::Iterator it=doc.begin();it!=doc.end();++it) { if(it.first().to() == "foo") { YAML_ASSERT(it.second().Tag() == "tag:yaml.org,2002:str"); YAML_ASSERT(it.second().to() == ""); } else if(it.first().to() == "") { YAML_ASSERT(it.first().Tag() == "tag:yaml.org,2002:str"); YAML_ASSERT(it.second().to() == "bar"); } else return " unexpected key"; } return true; } // 7.3 TEST CompletelyEmptyNodes() { PARSE(doc, ex7_3); YAML_ASSERT(doc.size() == 2); YAML_ASSERT(IsNull(doc["foo"])); YAML_ASSERT(doc[YAML::Null].to() == "bar"); return true; } // 7.4 TEST DoubleQuotedImplicitKeys() { PARSE(doc, ex7_4); YAML_ASSERT(doc.size() == 1); YAML_ASSERT(doc["implicit block key"].size() == 1); YAML_ASSERT(doc["implicit block key"][0].size() == 1); YAML_ASSERT(doc["implicit block key"][0]["implicit flow key"].to() == "value"); return true; } // 7.5 TEST DoubleQuotedLineBreaks() { PARSE(doc, ex7_5); YAML_ASSERT(doc.to() == "folded to a space,\nto a line feed, or \t \tnon-content"); return true; } // 7.6 TEST DoubleQuotedLines() { PARSE(doc, ex7_6); YAML_ASSERT(doc.to() == " 1st non-empty\n2nd non-empty 3rd non-empty "); return true; } // 7.7 TEST SingleQuotedCharacters() { PARSE(doc, ex7_7); YAML_ASSERT(doc.to() == "here's to \"quotes\""); return true; } // 7.8 TEST SingleQuotedImplicitKeys() { PARSE(doc, ex7_8); YAML_ASSERT(doc.size() == 1); YAML_ASSERT(doc["implicit block key"].size() == 1); YAML_ASSERT(doc["implicit block key"][0].size() == 1); YAML_ASSERT(doc["implicit block key"][0]["implicit flow key"].to() == "value"); return true; } // 7.9 TEST SingleQuotedLines() { PARSE(doc, ex7_9); YAML_ASSERT(doc.to() == " 1st non-empty\n2nd non-empty 3rd non-empty "); return true; } // 7.10 TEST PlainCharacters() { PARSE(doc, ex7_10); YAML_ASSERT(doc.size() == 6); YAML_ASSERT(doc[0].to() == "::vector"); YAML_ASSERT(doc[1].to() == ": - ()"); YAML_ASSERT(doc[2].to() == "Up, up, and away!"); YAML_ASSERT(doc[3].to() == -123); YAML_ASSERT(doc[4].to() == "http://example.com/foo#bar"); YAML_ASSERT(doc[5].size() == 5); YAML_ASSERT(doc[5][0].to() == "::vector"); YAML_ASSERT(doc[5][1].to() == ": - ()"); YAML_ASSERT(doc[5][2].to() == "Up, up, and away!"); YAML_ASSERT(doc[5][3].to() == -123); YAML_ASSERT(doc[5][4].to() == "http://example.com/foo#bar"); return true; } // 7.11 TEST PlainImplicitKeys() { PARSE(doc, ex7_11); YAML_ASSERT(doc.size() == 1); YAML_ASSERT(doc["implicit block key"].size() == 1); YAML_ASSERT(doc["implicit block key"][0].size() == 1); YAML_ASSERT(doc["implicit block key"][0]["implicit flow key"].to() == "value"); return true; } // 7.12 TEST PlainLines() { PARSE(doc, ex7_12); YAML_ASSERT(doc.to() == "1st non-empty\n2nd non-empty 3rd non-empty"); return true; } // 7.13 TEST FlowSequence() { PARSE(doc, ex7_13); YAML_ASSERT(doc.size() == 2); YAML_ASSERT(doc[0].size() == 2); YAML_ASSERT(doc[0][0].to() == "one"); YAML_ASSERT(doc[0][1].to() == "two"); YAML_ASSERT(doc[1].size() == 2); YAML_ASSERT(doc[1][0].to() == "three"); YAML_ASSERT(doc[1][1].to() == "four"); return true; } // 7.14 TEST FlowSequenceEntries() { PARSE(doc, ex7_14); YAML_ASSERT(doc.size() == 5); YAML_ASSERT(doc[0].to() == "double quoted"); YAML_ASSERT(doc[1].to() == "single quoted"); YAML_ASSERT(doc[2].to() == "plain text"); YAML_ASSERT(doc[3].size() == 1); YAML_ASSERT(doc[3][0].to() == "nested"); YAML_ASSERT(doc[4].size() == 1); YAML_ASSERT(doc[4]["single"].to() == "pair"); return true; } // 7.15 TEST FlowMappings() { PARSE(doc, ex7_15); YAML_ASSERT(doc.size() == 2); YAML_ASSERT(doc[0].size() == 2); YAML_ASSERT(doc[0]["one"].to() == "two"); YAML_ASSERT(doc[0]["three"].to() == "four"); YAML_ASSERT(doc[1].size() == 2); YAML_ASSERT(doc[1]["five"].to() == "six"); YAML_ASSERT(doc[1]["seven"].to() == "eight"); return true; } // 7.16 TEST FlowMappingEntries() { PARSE(doc, ex7_16); YAML_ASSERT(doc.size() == 3); YAML_ASSERT(doc["explicit"].to() == "entry"); YAML_ASSERT(doc["implicit"].to() == "entry"); YAML_ASSERT(IsNull(doc[YAML::Null])); return true; } // 7.17 TEST FlowMappingSeparateValues() { PARSE(doc, ex7_17); YAML_ASSERT(doc.size() == 4); YAML_ASSERT(doc["unquoted"].to() == "separate"); YAML_ASSERT(IsNull(doc["http://foo.com"])); YAML_ASSERT(IsNull(doc["omitted value"])); YAML_ASSERT(doc[YAML::Null].to() == "omitted key"); return true; } // 7.18 TEST FlowMappingAdjacentValues() { PARSE(doc, ex7_18); YAML_ASSERT(doc.size() == 3); YAML_ASSERT(doc["adjacent"].to() == "value"); YAML_ASSERT(doc["readable"].to() == "value"); YAML_ASSERT(IsNull(doc["empty"])); return true; } // 7.19 TEST SinglePairFlowMappings() { PARSE(doc, ex7_19); YAML_ASSERT(doc.size() == 1); YAML_ASSERT(doc[0].size() == 1); YAML_ASSERT(doc[0]["foo"].to() == "bar"); return true; } // 7.20 TEST SinglePairExplicitEntry() { PARSE(doc, ex7_20); YAML_ASSERT(doc.size() == 1); YAML_ASSERT(doc[0].size() == 1); YAML_ASSERT(doc[0]["foo bar"].to() == "baz"); return true; } // 7.21 TEST SinglePairImplicitEntries() { PARSE(doc, ex7_21); YAML_ASSERT(doc.size() == 3); YAML_ASSERT(doc[0].size() == 1); YAML_ASSERT(doc[0][0].size() == 1); YAML_ASSERT(doc[0][0]["YAML"].to() == "separate"); YAML_ASSERT(doc[1].size() == 1); YAML_ASSERT(doc[1][0].size() == 1); YAML_ASSERT(doc[1][0][YAML::Null].to() == "empty key entry"); YAML_ASSERT(doc[2].size() == 1); YAML_ASSERT(doc[2][0].size() == 1); StringMap key; key._["JSON"] = "like"; YAML_ASSERT(doc[2][0][key].to() == "adjacent"); return true; } // 7.22 TEST InvalidImplicitKeys() { try { PARSE(doc, ex7_22); } catch(const YAML::Exception& e) { if(e.msg == YAML::ErrorMsg::END_OF_SEQ_FLOW) return true; throw; } return " no exception thrown"; } // 7.23 TEST FlowContent() { PARSE(doc, ex7_23); YAML_ASSERT(doc.size() == 5); YAML_ASSERT(doc[0].size() == 2); YAML_ASSERT(doc[0][0].to() == "a"); YAML_ASSERT(doc[0][1].to() == "b"); YAML_ASSERT(doc[1].size() == 1); YAML_ASSERT(doc[1]["a"].to() == "b"); YAML_ASSERT(doc[2].to() == "a"); YAML_ASSERT(doc[3].to() == 'b'); YAML_ASSERT(doc[4].to() == "c"); return true; } // 7.24 TEST FlowNodes() { PARSE(doc, ex7_24); YAML_ASSERT(doc.size() == 5); YAML_ASSERT(doc[0].Tag() == "tag:yaml.org,2002:str"); YAML_ASSERT(doc[0].to() == "a"); YAML_ASSERT(doc[1].to() == 'b'); YAML_ASSERT(doc[2].to() == "c"); YAML_ASSERT(doc[3].to() == "c"); YAML_ASSERT(doc[4].Tag() == "tag:yaml.org,2002:str"); YAML_ASSERT(doc[4].to() == ""); return true; } // 8.1 TEST BlockScalarHeader() { PARSE(doc, ex8_1); YAML_ASSERT(doc.size() == 4); YAML_ASSERT(doc[0].to() == "literal\n"); YAML_ASSERT(doc[1].to() == " folded\n"); YAML_ASSERT(doc[2].to() == "keep\n\n"); YAML_ASSERT(doc[3].to() == " strip"); return true; } // 8.2 TEST BlockIndentationHeader() { PARSE(doc, ex8_2); YAML_ASSERT(doc.size() == 4); YAML_ASSERT(doc[0].to() == "detected\n"); YAML_ASSERT(doc[1].to() == "\n\n# detected\n"); YAML_ASSERT(doc[2].to() == " explicit\n"); YAML_ASSERT(doc[3].to() == "\t\ndetected\n"); return true; } // 8.3 TEST InvalidBlockScalarIndentationIndicators() { { bool threw = false; try { PARSE(doc, ex8_3a); } catch(const YAML::Exception& e) { if(e.msg != YAML::ErrorMsg::END_OF_SEQ) throw; threw = true; } if(!threw) return " no exception thrown for less indented auto-detecting indentation for a literal block scalar"; } { bool threw = false; try { PARSE(doc, ex8_3b); } catch(const YAML::Exception& e) { if(e.msg != YAML::ErrorMsg::END_OF_SEQ) throw; threw = true; } if(!threw) return " no exception thrown for less indented auto-detecting indentation for a folded block scalar"; } { bool threw = false; try { PARSE(doc, ex8_3c); } catch(const YAML::Exception& e) { if(e.msg != YAML::ErrorMsg::END_OF_SEQ) throw; threw = true; } if(!threw) return " no exception thrown for less indented explicit indentation for a literal block scalar"; } return true; } // 8.4 TEST ChompingFinalLineBreak() { PARSE(doc, ex8_4); YAML_ASSERT(doc.size() == 3); YAML_ASSERT(doc["strip"].to() == "text"); YAML_ASSERT(doc["clip"].to() == "text\n"); YAML_ASSERT(doc["keep"].to() == "text\n"); return true; } // 8.5 TEST ChompingTrailingLines() { PARSE(doc, ex8_5); YAML_ASSERT(doc.size() == 3); YAML_ASSERT(doc["strip"].to() == "# text"); YAML_ASSERT(doc["clip"].to() == "# text\n"); YAML_ASSERT(doc["keep"].to() == "# text\n"); // Note: I believe this is a bug in the YAML spec - it should be "# text\n\n" return true; } // 8.6 TEST EmptyScalarChomping() { PARSE(doc, ex8_6); YAML_ASSERT(doc.size() == 3); YAML_ASSERT(doc["strip"].to() == ""); YAML_ASSERT(doc["clip"].to() == ""); YAML_ASSERT(doc["keep"].to() == "\n"); return true; } // 8.7 TEST LiteralScalar() { PARSE(doc, ex8_7); YAML_ASSERT(doc.to() == "literal\n\ttext\n"); return true; } // 8.8 TEST LiteralContent() { PARSE(doc, ex8_8); YAML_ASSERT(doc.to() == "\n\nliteral\n \n\ntext\n"); return true; } // 8.9 TEST FoldedScalar() { PARSE(doc, ex8_9); YAML_ASSERT(doc.to() == "folded text\n"); return true; } // 8.10 TEST FoldedLines() { PARSE(doc, ex8_10); YAML_ASSERT(doc.to() == "\nfolded line\nnext line\n * bullet\n\n * list\n * lines\n\nlast line\n"); return true; } // 8.11 TEST MoreIndentedLines() { return true; // same as 8.10 } // 8.12 TEST EmptySeparationLines() { return true; // same as 8.10 } // 8.13 TEST FinalEmptyLines() { return true; // same as 8.10 } // 8.14 TEST BlockSequence() { PARSE(doc, ex8_14); YAML_ASSERT(doc.size() == 1); YAML_ASSERT(doc["block sequence"].size() == 2); YAML_ASSERT(doc["block sequence"][0].to() == "one"); YAML_ASSERT(doc["block sequence"][1].size() == 1); YAML_ASSERT(doc["block sequence"][1]["two"].to() == "three"); return true; } // 8.15 TEST BlockSequenceEntryTypes() { PARSE(doc, ex8_15); YAML_ASSERT(doc.size() == 4); YAML_ASSERT(YAML::IsNull(doc[0])); YAML_ASSERT(doc[1].to() == "block node\n"); YAML_ASSERT(doc[2].size() == 2); YAML_ASSERT(doc[2][0].to() == "one"); YAML_ASSERT(doc[2][1].to() == "two"); YAML_ASSERT(doc[3].size() == 1); YAML_ASSERT(doc[3]["one"].to() == "two"); return true; } // 8.16 TEST BlockMappings() { PARSE(doc, ex8_16); YAML_ASSERT(doc.size() == 1); YAML_ASSERT(doc["block mapping"].size() == 1); YAML_ASSERT(doc["block mapping"]["key"].to() == "value"); return true; } // 8.17 TEST ExplicitBlockMappingEntries() { PARSE(doc, ex8_17); YAML_ASSERT(doc.size() == 2); YAML_ASSERT(IsNull(doc["explicit key"])); YAML_ASSERT(doc["block key\n"].size() == 2); YAML_ASSERT(doc["block key\n"][0].to() == "one"); YAML_ASSERT(doc["block key\n"][1].to() == "two"); return true; } // 8.18 TEST ImplicitBlockMappingEntries() { PARSE(doc, ex8_18); YAML_ASSERT(doc.size() == 3); YAML_ASSERT(doc["plain key"].to() == "in-line value"); YAML_ASSERT(IsNull(doc[YAML::Null])); YAML_ASSERT(doc["quoted key"].size() == 1); YAML_ASSERT(doc["quoted key"][0].to() == "entry"); return true; } // 8.19 TEST CompactBlockMappings() { PARSE(doc, ex8_19); YAML_ASSERT(doc.size() == 2); YAML_ASSERT(doc[0].size() == 1); YAML_ASSERT(doc[0]["sun"].to() == "yellow"); YAML_ASSERT(doc[1].size() == 1); std::map key; key["earth"] = "blue"; YAML_ASSERT(doc[1][key].size() == 1); YAML_ASSERT(doc[1][key]["moon"].to() == "white"); return true; } // 8.20 TEST BlockNodeTypes() { PARSE(doc, ex8_20); YAML_ASSERT(doc.size() == 3); YAML_ASSERT(doc[0].to() == "flow in block"); YAML_ASSERT(doc[1].to() == "Block scalar\n"); YAML_ASSERT(doc[2].size() == 1); YAML_ASSERT(doc[2]["foo"].to() == "bar"); return true; } // 8.21 TEST BlockScalarNodes() { PARSE(doc, ex8_21); YAML_ASSERT(doc.size() == 2); YAML_ASSERT(doc["literal"].to() == "value"); // Note: I believe this is a bug in the YAML spec - it should be "value\n" YAML_ASSERT(doc["folded"].to() == "value"); YAML_ASSERT(doc["folded"].Tag() == "!foo"); return true; } // 8.22 TEST BlockCollectionNodes() { PARSE(doc, ex8_22); YAML_ASSERT(doc.size() == 2); YAML_ASSERT(doc["sequence"].size() == 2); YAML_ASSERT(doc["sequence"][0].to() == "entry"); YAML_ASSERT(doc["sequence"][1].size() == 1); YAML_ASSERT(doc["sequence"][1][0].to() == "nested"); YAML_ASSERT(doc["mapping"].size() == 1); YAML_ASSERT(doc["mapping"]["foo"].to() == "bar"); return true; } } } ././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/test/old-api/parsertests.cppSuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/test/old-api/parsertests.c0000664000175000017500000007514311723131175031444 0ustar dandan#include "tests.h" #include "yaml-cpp/yaml.h" #include #include #include namespace Test { namespace Parser { void SimpleScalar(std::string& inputScalar, std::string& desiredOutput) { inputScalar = "Hello, World!"; desiredOutput = "Hello, World!"; } void MultiLineScalar(std::string& inputScalar, std::string& desiredOutput) { inputScalar = "normal scalar, but\n" "over several lines"; desiredOutput = "normal scalar, but over several lines"; } void LiteralScalar(std::string& inputScalar, std::string& desiredOutput) { inputScalar = "|\n" " literal scalar - so we can draw ASCII:\n" " \n" " - -\n" " | - |\n" " -----\n"; desiredOutput = "literal scalar - so we can draw ASCII:\n" "\n" " - -\n" " | - |\n" " -----\n"; } void FoldedScalar(std::string& inputScalar, std::string& desiredOutput) { inputScalar = ">\n" " and a folded scalar... so we\n" " can just keep writing various\n" " things. And if we want to keep indentation:\n" " \n" " we just indent a little\n" " see, this stays indented"; desiredOutput = "and a folded scalar... so we" " can just keep writing various" " things. And if we want to keep indentation:\n" "\n" " we just indent a little\n" " see, this stays indented"; } void ChompedFoldedScalar(std::string& inputScalar, std::string& desiredOutput) { inputScalar = ">-\n" " Here's a folded scalar\n" " that gets chomped."; desiredOutput = "Here's a folded scalar" " that gets chomped."; } void ChompedLiteralScalar(std::string& inputScalar, std::string& desiredOutput) { inputScalar = "|-\n" " Here's a literal scalar\n" " that gets chomped."; desiredOutput = "Here's a literal scalar\n" "that gets chomped."; } void FoldedScalarWithIndent(std::string& inputScalar, std::string& desiredOutput) { inputScalar = ">2\n" " Here's a folded scalar\n" " that starts with some indentation."; desiredOutput = " Here's a folded scalar\n" "that starts with some indentation."; } void ColonScalar(std::string& inputScalar, std::string& desiredOutput) { inputScalar = "::vector"; desiredOutput = "::vector"; } void QuotedScalar(std::string& inputScalar, std::string& desiredOutput) { inputScalar = "\": - ()\""; desiredOutput = ": - ()"; } void CommaScalar(std::string& inputScalar, std::string& desiredOutput) { inputScalar = "Up, up, and away!"; desiredOutput = "Up, up, and away!"; } void DashScalar(std::string& inputScalar, std::string& desiredOutput) { inputScalar = "-123"; desiredOutput = "-123"; } void URLScalar(std::string& inputScalar, std::string& desiredOutput) { inputScalar = "http://example.com/foo#bar"; desiredOutput = "http://example.com/foo#bar"; } bool SimpleSeq() { std::string input = "- eggs\n" "- bread\n" "- milk"; std::stringstream stream(input); YAML::Parser parser(stream); YAML::Node doc; parser.GetNextDocument(doc); std::string output; if(doc[0].to() != "eggs") return false; if(doc[1].to() != "bread") return false; if(doc[2].to() != "milk") return false; return true; } bool SimpleMap() { std::string input = "name: Prince Fielder\n" "position: 1B\n" "bats: L"; std::stringstream stream(input); YAML::Parser parser(stream); YAML::Node doc; parser.GetNextDocument(doc); std::string output; doc["name"] >> output; if(output != "Prince Fielder") return false; doc["position"] >> output; if(output != "1B") return false; doc["bats"] >> output; if(output != "L") return false; return true; } bool FlowSeq() { std::string input = "[ 2 , 3, 5 , 7, 11]"; std::stringstream stream(input); YAML::Parser parser(stream); YAML::Node doc; parser.GetNextDocument(doc); int output; doc[0] >> output; if(output != 2) return false; doc[1] >> output; if(output != 3) return false; doc[2] >> output; if(output != 5) return false; doc[3] >> output; if(output != 7) return false; doc[4] >> output; if(output != 11) return false; return true; } bool FlowMap() { std::string input = "{hr: 65, avg: 0.278}"; std::stringstream stream(input); YAML::Parser parser(stream); YAML::Node doc; parser.GetNextDocument(doc); std::string output; doc["hr"] >> output; if(output != "65") return false; doc["avg"] >> output; if(output != "0.278") return false; return true; } bool FlowMapWithOmittedKey() { std::string input = "{: omitted key}"; std::stringstream stream(input); YAML::Parser parser(stream); YAML::Node doc; parser.GetNextDocument(doc); std::string output; doc[YAML::Null] >> output; if(output != "omitted key") return false; return true; } bool FlowMapWithOmittedValue() { std::string input = "{a: b, c:, d:}"; std::stringstream stream(input); YAML::Parser parser(stream); YAML::Node doc; parser.GetNextDocument(doc); std::string output; doc["a"] >> output; if(output != "b") return false; if(!IsNull(doc["c"])) return false; if(!IsNull(doc["d"])) return false; return true; } bool FlowMapWithSoloEntry() { std::string input = "{a: b, c, d: e}"; std::stringstream stream(input); YAML::Parser parser(stream); YAML::Node doc; parser.GetNextDocument(doc); std::string output; doc["a"] >> output; if(output != "b") return false; if(!IsNull(doc["c"])) return false; doc["d"] >> output; if(output != "e") return false; return true; } bool FlowMapEndingWithSoloEntry() { std::string input = "{a: b, c}"; std::stringstream stream(input); YAML::Parser parser(stream); YAML::Node doc; parser.GetNextDocument(doc); std::string output; doc["a"] >> output; if(output != "b") return false; if(!IsNull(doc["c"])) return false; return true; } bool QuotedSimpleKeys() { std::string KeyValue[3] = { "\"double\": double\n", "'single': single\n", "plain: plain\n" }; int perm[3] = { 0, 1, 2 }; do { std::string input = KeyValue[perm[0]] + KeyValue[perm[1]] + KeyValue[perm[2]]; std::stringstream stream(input); YAML::Parser parser(stream); YAML::Node doc; parser.GetNextDocument(doc); std::string output; doc["double"] >> output; if(output != "double") return false; doc["single"] >> output; if(output != "single") return false; doc["plain"] >> output; if(output != "plain") return false; } while(std::next_permutation(perm, perm + 3)); return true; } bool CompressedMapAndSeq() { std::string input = "key:\n- one\n- two"; std::stringstream stream(input); YAML::Parser parser(stream); YAML::Node doc; parser.GetNextDocument(doc); const YAML::Node& seq = doc["key"]; if(seq.size() != 2) return false; std::string output; seq[0] >> output; if(output != "one") return false; seq[1] >> output; if(output != "two") return false; return true; } bool NullBlockSeqEntry() { std::string input = "- hello\n-\n- world"; std::stringstream stream(input); YAML::Parser parser(stream); YAML::Node doc; parser.GetNextDocument(doc); std::string output; doc[0] >> output; if(output != "hello") return false; if(!IsNull(doc[1])) return false; doc[2] >> output; if(output != "world") return false; return true; } bool NullBlockMapKey() { std::string input = ": empty key"; std::stringstream stream(input); YAML::Parser parser(stream); YAML::Node doc; parser.GetNextDocument(doc); std::string output; doc[YAML::Null] >> output; if(output != "empty key") return false; return true; } bool NullBlockMapValue() { std::string input = "empty value:"; std::stringstream stream(input); YAML::Parser parser(stream); YAML::Node doc; parser.GetNextDocument(doc); if(!IsNull(doc["empty value"])) return false; return true; } bool SimpleAlias() { std::string input = "- &alias test\n- *alias"; std::stringstream stream(input); YAML::Parser parser(stream); YAML::Node doc; parser.GetNextDocument(doc); std::string output; doc[0] >> output; if(output != "test") return false; doc[1] >> output; if(output != "test") return false; if(doc.size() != 2) return false; return true; } bool AliasWithNull() { std::string input = "- &alias\n- *alias"; std::stringstream stream(input); YAML::Parser parser(stream); YAML::Node doc; parser.GetNextDocument(doc); if(!IsNull(doc[0])) return false; if(!IsNull(doc[1])) return false; if(doc.size() != 2) return false; return true; } bool AnchorInSimpleKey() { std::string input = "- &a b: c\n- *a"; std::stringstream stream(input); YAML::Parser parser(stream); YAML::Node doc; parser.GetNextDocument(doc); if(doc.size() != 2) return false; std::string output; doc[0]["b"] >> output; if(output != "c") return false; doc[1] >> output; if(output != "b") return false; return true; } bool AliasAsSimpleKey() { std::string input = "- &a b\n- *a : c"; std::stringstream stream(input); YAML::Parser parser(stream); YAML::Node doc; parser.GetNextDocument(doc); if(doc.size() != 2) return false; std::string output; doc[0] >> output; if(output != "b") return false; doc[1]["b"] >> output; if(output != "c") return false; return true; } bool ExplicitDoc() { std::string input = "---\n- one\n- two"; std::stringstream stream(input); YAML::Parser parser(stream); YAML::Node doc; parser.GetNextDocument(doc); if(doc.size() != 2) return false; std::string output; doc[0] >> output; if(output != "one") return false; doc[1] >> output; if(output != "two") return false; return true; } bool MultipleDocs() { std::string input = "---\nname: doc1\n---\nname: doc2"; std::stringstream stream(input); YAML::Parser parser(stream); YAML::Node doc; parser.GetNextDocument(doc); std::string output; doc["name"] >> output; if(output != "doc1") return false; if(!parser) return false; parser.GetNextDocument(doc); doc["name"] >> output; if(output != "doc2") return false; return true; } bool ExplicitEndDoc() { std::string input = "- one\n- two\n...\n..."; std::stringstream stream(input); YAML::Parser parser(stream); YAML::Node doc; parser.GetNextDocument(doc); if(doc.size() != 2) return false; std::string output; doc[0] >> output; if(output != "one") return false; doc[1] >> output; if(output != "two") return false; return true; } bool MultipleDocsWithSomeExplicitIndicators() { std::string input = "- one\n- two\n...\n" "---\nkey: value\n...\n...\n" "- three\n- four\n" "---\nkey: value"; std::stringstream stream(input); YAML::Parser parser(stream); YAML::Node doc; std::string output; parser.GetNextDocument(doc); if(doc.size() != 2) return false; doc[0] >> output; if(output != "one") return false; doc[1] >> output; if(output != "two") return false; parser.GetNextDocument(doc); doc["key"] >> output; if(output != "value") return false; parser.GetNextDocument(doc); if(doc.size() != 2) return false; doc[0] >> output; if(output != "three") return false; doc[1] >> output; if(output != "four") return false; parser.GetNextDocument(doc); doc["key"] >> output; if(output != "value") return false; return true; } bool BlockKeyWithNullValue() { std::string input = "key:\n" "just a key: value"; std::stringstream stream(input); YAML::Parser parser(stream); YAML::Node doc; parser.GetNextDocument(doc); if(doc.size() != 2) return false; if(!IsNull(doc["key"])) return false; if(doc["just a key"].to() != "value") return false; return true; } bool Bases() { std::string input = "- 15\n" "- 0x10\n" "- 030\n" "- 0xffffffff\n"; std::stringstream stream(input); YAML::Parser parser(stream); YAML::Node doc; parser.GetNextDocument(doc); if(doc.size() != 4) return false; if(doc[0].to() != 15) return false; if(doc[1].to() != 0x10) return false; if(doc[2].to() != 030) return false; if(doc[3].to() != 0xffffffff) return false; return true; } bool KeyNotFound() { std::string input = "key: value"; std::stringstream stream(input); YAML::Parser parser(stream); YAML::Node doc; parser.GetNextDocument(doc); try { doc["bad key"]; } catch(const YAML::Exception& e) { if(e.msg != std::string(YAML::ErrorMsg::KEY_NOT_FOUND) + ": bad key") throw; } try { doc[5]; } catch(const YAML::Exception& e) { if(e.msg != std::string(YAML::ErrorMsg::KEY_NOT_FOUND) + ": 5") throw; } try { doc[2.5]; } catch(const YAML::Exception& e) { if(e.msg != std::string(YAML::ErrorMsg::KEY_NOT_FOUND) + ": 2.5") throw; } return true; } bool DuplicateKey() { std::string input = "{a: 1, b: 2, c: 3, a: 4}"; std::stringstream stream(input); YAML::Parser parser(stream); YAML::Node doc; parser.GetNextDocument(doc); if(doc["a"].to() != 4) return false; if(doc["b"].to() != 2) return false; if(doc["c"].to() != 3) return false; return true; } void PrepareNodeForTagExam(YAML::Node& doc, const std::string& input) { std::stringstream stream(input); YAML::Parser parser(stream); parser.GetNextDocument(doc); } struct TagMismatch: public std::exception { TagMismatch(const std::string& actualTag, const std::string& expectedTag) { std::stringstream output; output << "Tag has value \"" << actualTag << "\" but \"" << expectedTag << "\" was expected"; what_ = output.str(); } virtual ~TagMismatch() throw() {} virtual const char *what() const throw() { return what_.c_str(); } private: std::string what_; }; bool ExpectedTagValue(YAML::Node& node, const char* tag) { if(node.Tag() == tag) return true; throw TagMismatch(node.Tag(), tag); } bool DefaultPlainScalarTag() { YAML::Node node; PrepareNodeForTagExam(node, "--- 12"); return ExpectedTagValue(node, "?"); } bool DefaultSingleQuotedScalarTag() { YAML::Node node; PrepareNodeForTagExam(node, "--- '12'"); return ExpectedTagValue(node, "!"); } bool ExplicitNonSpecificPlainScalarTag() { YAML::Node node; PrepareNodeForTagExam(node, "--- ! 12"); return ExpectedTagValue(node, "!"); } bool BasicLocalTag() { YAML::Node node; PrepareNodeForTagExam(node, "--- !foo 12"); return ExpectedTagValue(node, "!foo"); } bool VerbatimLocalTag() { YAML::Node node; PrepareNodeForTagExam(node, "--- ! 12"); return ExpectedTagValue(node, "!foo"); } bool StandardShortcutTag() { YAML::Node node; PrepareNodeForTagExam(node, "--- !!int 12"); return ExpectedTagValue(node, "tag:yaml.org,2002:int"); } bool VerbatimURITag() { YAML::Node node; PrepareNodeForTagExam(node, "--- ! 12"); return ExpectedTagValue(node, "tag:yaml.org,2002:int"); } bool DefaultSequenceTag() { YAML::Node node; PrepareNodeForTagExam(node, "--- [12]"); return ExpectedTagValue(node, "?"); } bool ExplicitNonSpecificSequenceTag() { YAML::Node node; PrepareNodeForTagExam(node, "--- ! [12]"); return ExpectedTagValue(node, "!"); } bool Infinity() { std::string input = "- .inf\n" "- .Inf\n" "- .INF\n" "- +.inf\n" "- +.Inf\n" "- +.INF\n" "- -.inf\n" "- -.Inf\n" "- -.INF\n"; std::stringstream stream(input); YAML::Parser parser(stream); YAML::Node doc; parser.GetNextDocument(doc); for(unsigned i=0;i() != (i < 6 ? +1 : -1) * std::numeric_limits::infinity()) return false; for(unsigned i=0;i() != (i < 6 ? +1 : -1) * std::numeric_limits::infinity()) return false; for(unsigned i=0;i() != (i < 6 ? +1 : -1) * std::numeric_limits::infinity()) return false; return true; } bool NaN() { std::string input = "- .nan\n" "- .NaN\n" "- .NAN\n"; std::stringstream stream(input); YAML::Parser parser(stream); YAML::Node doc; parser.GetNextDocument(doc); for(unsigned i=0;i> d; if(d == d) return false; } for(unsigned i=0;i> d; if(d == d) return false; } for(unsigned i=0;i> d; if(d == d) return false; } return true; } bool NonConstKey() { std::string input = "{a: 1}"; std::stringstream stream(input); YAML::Parser parser(stream); YAML::Node doc; parser.GetNextDocument(doc); std::vector key(2); key[0] = 'a'; key[1] = '\0'; if(doc[&key[0]].to() != 1) return false; return true; } bool SingleChar() { std::string input = "5"; std::stringstream stream(input); YAML::Parser parser(stream); YAML::Node doc; parser.GetNextDocument(doc); return doc.to() == 5; } bool QuotedNewline() { std::string input = "foo: \"\\n\""; std::stringstream stream(input); YAML::Parser parser(stream); YAML::Node doc; parser.GetNextDocument(doc); return doc["foo"].to() == "\n"; } bool DoubleAsInt() { std::string input = "1.5"; std::stringstream stream(input); YAML::Parser parser(stream); YAML::Node doc; parser.GetNextDocument(doc); try { doc.to(); } catch(const YAML::InvalidScalar& e) { return true; } return false; } bool Binary() { std::string input = "[!!binary \"SGVsbG8sIFdvcmxkIQ==\", !!binary \"TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlzIHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2YgdGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGludWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRoZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4K\"]"; std::stringstream stream(input); YAML::Parser parser(stream); YAML::Node doc; parser.GetNextDocument(doc); if(doc[0].to() != YAML::Binary(reinterpret_cast("Hello, World!"), 13)) return false; if(doc[1].to() != YAML::Binary(reinterpret_cast("Man is distinguished, not only by his reason, but by this singular passion from other animals, which is a lust of the mind, that by a perseverance of delight in the continued and indefatigable generation of knowledge, exceeds the short vehemence of any carnal pleasure.\n"), 270)) return false; return true; } } namespace { void RunScalarParserTest(void (*test)(std::string&, std::string&), const std::string& name, int& passed, int& total) { std::string error; std::string inputScalar, desiredOutput; std::string output; bool ok = true; try { test(inputScalar, desiredOutput); std::stringstream stream(inputScalar); YAML::Parser parser(stream); YAML::Node doc; parser.GetNextDocument(doc); doc >> output; } catch(const YAML::Exception& e) { ok = false; error = e.what(); } if(ok && output == desiredOutput) { passed++; } else { std::cout << "Parser test failed: " << name << "\n"; if(error != "") std::cout << "Caught exception: " << error << "\n"; else { std::cout << "Output:\n" << output << "<<<\n"; std::cout << "Desired output:\n" << desiredOutput << "<<<\n"; } } total++; } void RunParserTest(bool (*test)(), const std::string& name, int& passed, int& total) { std::string error; bool ok = true; try { ok = test(); } catch(const YAML::Exception& e) { ok = false; error = e.what(); } catch(const Parser::TagMismatch& e) { ok = false; error = e.what(); } if(ok) { passed++; } else { std::cout << "Parser test failed: " << name << "\n"; if(error != "") std::cout << " Caught exception: " << error << "\n"; } total++; } typedef void (*EncodingFn)(std::ostream&, int); inline char Byte(int ch) { return static_cast(static_cast(static_cast(ch))); } void EncodeToUtf8(std::ostream& stream, int ch) { if (ch <= 0x7F) { stream << Byte(ch); } else if (ch <= 0x7FF) { stream << Byte(0xC0 | (ch >> 6)); stream << Byte(0x80 | (ch & 0x3F)); } else if (ch <= 0xFFFF) { stream << Byte(0xE0 | (ch >> 12)); stream << Byte(0x80 | ((ch >> 6) & 0x3F)); stream << Byte(0x80 | (ch & 0x3F)); } else if (ch <= 0x1FFFFF) { stream << Byte(0xF0 | (ch >> 18)); stream << Byte(0x80 | ((ch >> 12) & 0x3F)); stream << Byte(0x80 | ((ch >> 6) & 0x3F)); stream << Byte(0x80 | (ch & 0x3F)); } } bool SplitUtf16HighChar(std::ostream& stream, EncodingFn encoding, int ch) { int biasedValue = ch - 0x10000; if (biasedValue < 0) { return false; } int high = 0xD800 | (biasedValue >> 10); int low = 0xDC00 | (biasedValue & 0x3FF); encoding(stream, high); encoding(stream, low); return true; } void EncodeToUtf16LE(std::ostream& stream, int ch) { if (!SplitUtf16HighChar(stream, &EncodeToUtf16LE, ch)) { stream << Byte(ch & 0xFF) << Byte(ch >> 8); } } void EncodeToUtf16BE(std::ostream& stream, int ch) { if (!SplitUtf16HighChar(stream, &EncodeToUtf16BE, ch)) { stream << Byte(ch >> 8) << Byte(ch & 0xFF); } } void EncodeToUtf32LE(std::ostream& stream, int ch) { stream << Byte(ch & 0xFF) << Byte((ch >> 8) & 0xFF) << Byte((ch >> 16) & 0xFF) << Byte((ch >> 24) & 0xFF); } void EncodeToUtf32BE(std::ostream& stream, int ch) { stream << Byte((ch >> 24) & 0xFF) << Byte((ch >> 16) & 0xFF) << Byte((ch >> 8) & 0xFF) << Byte(ch & 0xFF); } class EncodingTester { public: EncodingTester(EncodingFn encoding, bool declareEncoding) { if (declareEncoding) { encoding(m_yaml, 0xFEFF); } AddEntry(encoding, 0x0021, 0x007E); // Basic Latin AddEntry(encoding, 0x00A1, 0x00FF); // Latin-1 Supplement AddEntry(encoding, 0x0660, 0x06FF); // Arabic (largest contiguous block) // CJK unified ideographs (multiple lines) AddEntry(encoding, 0x4E00, 0x4EFF); AddEntry(encoding, 0x4F00, 0x4FFF); AddEntry(encoding, 0x5000, 0x51FF); // 512 character line AddEntry(encoding, 0x5200, 0x54FF); // 768 character line AddEntry(encoding, 0x5500, 0x58FF); // 1024 character line AddEntry(encoding, 0x103A0, 0x103C3); // Old Persian m_yaml.seekg(0, std::ios::beg); } std::istream& stream() {return m_yaml;} const std::vector& entries() {return m_entries;} private: std::stringstream m_yaml; std::vector m_entries; void AddEntry(EncodingFn encoding, int startCh, int endCh) { encoding(m_yaml, '-'); encoding(m_yaml, ' '); encoding(m_yaml, '|'); encoding(m_yaml, '\n'); encoding(m_yaml, ' '); encoding(m_yaml, ' '); std::stringstream entry; for (int ch = startCh; ch <= endCh; ++ch) { encoding(m_yaml, ch); EncodeToUtf8(entry, ch); } encoding(m_yaml, '\n'); m_entries.push_back(entry.str()); } }; void RunEncodingTest(EncodingFn encoding, bool declareEncoding, const std::string& name, int& passed, int& total) { EncodingTester tester(encoding, declareEncoding); std::string error; bool ok = true; try { YAML::Parser parser(tester.stream()); YAML::Node doc; parser.GetNextDocument(doc); YAML::Iterator itNode = doc.begin(); std::vector::const_iterator itEntry = tester.entries().begin(); for (; (itNode != doc.end()) && (itEntry != tester.entries().end()); ++itNode, ++itEntry) { std::string stScalarValue; if (!itNode->GetScalar(stScalarValue) && (stScalarValue == *itEntry)) { break; } } if ((itNode != doc.end()) || (itEntry != tester.entries().end())) { ok = false; } } catch(const YAML::Exception& e) { ok = false; error = e.msg; } if(ok) { passed++; } else { std::cout << "Parser test failed: " << name << "\n"; if(error != "") std::cout << " Caught exception: " << error << "\n"; } total++; } } bool RunParserTests() { int passed = 0; int total = 0; RunScalarParserTest(&Parser::SimpleScalar, "simple scalar", passed, total); RunScalarParserTest(&Parser::MultiLineScalar, "multi-line scalar", passed, total); RunScalarParserTest(&Parser::LiteralScalar, "literal scalar", passed, total); RunScalarParserTest(&Parser::FoldedScalar, "folded scalar", passed, total); RunScalarParserTest(&Parser::ChompedFoldedScalar, "chomped folded scalar", passed, total); RunScalarParserTest(&Parser::ChompedLiteralScalar, "chomped literal scalar", passed, total); RunScalarParserTest(&Parser::FoldedScalarWithIndent, "folded scalar with indent", passed, total); RunScalarParserTest(&Parser::ColonScalar, "colon scalar", passed, total); RunScalarParserTest(&Parser::QuotedScalar, "quoted scalar", passed, total); RunScalarParserTest(&Parser::CommaScalar, "comma scalar", passed, total); RunScalarParserTest(&Parser::DashScalar, "dash scalar", passed, total); RunScalarParserTest(&Parser::URLScalar, "url scalar", passed, total); RunParserTest(&Parser::SimpleSeq, "simple seq", passed, total); RunParserTest(&Parser::SimpleMap, "simple map", passed, total); RunParserTest(&Parser::FlowSeq, "flow seq", passed, total); RunParserTest(&Parser::FlowMap, "flow map", passed, total); RunParserTest(&Parser::FlowMapWithOmittedKey, "flow map with omitted key", passed, total); RunParserTest(&Parser::FlowMapWithOmittedValue, "flow map with omitted value", passed, total); RunParserTest(&Parser::FlowMapWithSoloEntry, "flow map with solo entry", passed, total); RunParserTest(&Parser::FlowMapEndingWithSoloEntry, "flow map ending with solo entry", passed, total); RunParserTest(&Parser::QuotedSimpleKeys, "quoted simple keys", passed, total); RunParserTest(&Parser::CompressedMapAndSeq, "compressed map and seq", passed, total); RunParserTest(&Parser::NullBlockSeqEntry, "null block seq entry", passed, total); RunParserTest(&Parser::NullBlockMapKey, "null block map key", passed, total); RunParserTest(&Parser::NullBlockMapValue, "null block map value", passed, total); RunParserTest(&Parser::SimpleAlias, "simple alias", passed, total); RunParserTest(&Parser::AliasWithNull, "alias with null", passed, total); RunParserTest(&Parser::AnchorInSimpleKey, "anchor in simple key", passed, total); RunParserTest(&Parser::AliasAsSimpleKey, "alias as simple key", passed, total); RunParserTest(&Parser::ExplicitDoc, "explicit doc", passed, total); RunParserTest(&Parser::MultipleDocs, "multiple docs", passed, total); RunParserTest(&Parser::ExplicitEndDoc, "explicit end doc", passed, total); RunParserTest(&Parser::MultipleDocsWithSomeExplicitIndicators, "multiple docs with some explicit indicators", passed, total); RunParserTest(&Parser::BlockKeyWithNullValue, "block key with null value", passed, total); RunParserTest(&Parser::Bases, "bases", passed, total); RunParserTest(&Parser::KeyNotFound, "key not found", passed, total); RunParserTest(&Parser::DuplicateKey, "duplicate key", passed, total); RunParserTest(&Parser::DefaultPlainScalarTag, "default plain scalar tag", passed, total); RunParserTest(&Parser::DefaultSingleQuotedScalarTag, "default single-quoted scalar tag", passed, total); RunParserTest(&Parser::ExplicitNonSpecificPlainScalarTag, "explicit, non-specific plain scalar tag", passed, total); RunParserTest(&Parser::BasicLocalTag, "basic local tag", passed, total); RunParserTest(&Parser::VerbatimLocalTag, "verbatim local tag", passed, total); RunParserTest(&Parser::StandardShortcutTag, "standard shortcut tag", passed, total); RunParserTest(&Parser::VerbatimURITag, "verbatim URI tag", passed, total); RunParserTest(&Parser::DefaultPlainScalarTag, "default plain scalar tag", passed, total); RunParserTest(&Parser::DefaultSequenceTag, "default sequence tag", passed, total); RunParserTest(&Parser::ExplicitNonSpecificSequenceTag, "explicit, non-specific sequence tag", passed, total); RunParserTest(&Parser::Infinity, "infinity", passed, total); RunParserTest(&Parser::NaN, "NaN", passed, total); RunParserTest(&Parser::NonConstKey, "non const key", passed, total); RunParserTest(&Parser::SingleChar, "single char", passed, total); RunParserTest(&Parser::QuotedNewline, "quoted newline", passed, total); RunParserTest(&Parser::DoubleAsInt, "double as int", passed, total); RunParserTest(&Parser::Binary, "binary", passed, total); RunEncodingTest(&EncodeToUtf8, false, "UTF-8, no BOM", passed, total); RunEncodingTest(&EncodeToUtf8, true, "UTF-8 with BOM", passed, total); RunEncodingTest(&EncodeToUtf16LE, false, "UTF-16LE, no BOM", passed, total); RunEncodingTest(&EncodeToUtf16LE, true, "UTF-16LE with BOM", passed, total); RunEncodingTest(&EncodeToUtf16BE, false, "UTF-16BE, no BOM", passed, total); RunEncodingTest(&EncodeToUtf16BE, true, "UTF-16BE with BOM", passed, total); RunEncodingTest(&EncodeToUtf32LE, false, "UTF-32LE, no BOM", passed, total); RunEncodingTest(&EncodeToUtf32LE, true, "UTF-32LE with BOM", passed, total); RunEncodingTest(&EncodeToUtf32BE, false, "UTF-32BE, no BOM", passed, total); RunEncodingTest(&EncodeToUtf32BE, true, "UTF-32BE with BOM", passed, total); std::cout << "Parser tests: " << passed << "/" << total << " passed\n"; return passed == total; } } SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/test/nodetests.h0000664000175000017500000000061411723131175027544 0ustar dandan#ifndef NODETESTS_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #define NODETESTS_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #if defined(_MSC_VER) || (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 #pragma once #endif namespace Test { bool RunNodeTests(); } #endif // NODETESTS_H_62B23520_7C8E_11DE_8A39_0800200C9A6666 SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/test/specexamples.h0000664000175000017500000003634011723131175030232 0ustar dandannamespace Test { namespace Spec { const char *ex2_1 = "- Mark McGwire\n" "- Sammy Sosa\n" "- Ken Griffey"; const char *ex2_2 = "hr: 65 # Home runs\n" "avg: 0.278 # Batting average\n" "rbi: 147 # Runs Batted In"; const char *ex2_3 = "american:\n" "- Boston Red Sox\n" "- Detroit Tigers\n" "- New York Yankees\n" "national:\n" "- New York Mets\n" "- Chicago Cubs\n" "- Atlanta Braves"; const char *ex2_4 = "-\n" " name: Mark McGwire\n" " hr: 65\n" " avg: 0.278\n" "-\n" " name: Sammy Sosa\n" " hr: 63\n" " avg: 0.288"; const char *ex2_5 = "- [name , hr, avg ]\n" "- [Mark McGwire, 65, 0.278]\n" "- [Sammy Sosa , 63, 0.288]"; const char *ex2_6 = "Mark McGwire: {hr: 65, avg: 0.278}\n" "Sammy Sosa: {\n" " hr: 63,\n" " avg: 0.288\n" " }"; const char *ex2_7 = "# Ranking of 1998 home runs\n" "---\n" "- Mark McGwire\n" "- Sammy Sosa\n" "- Ken Griffey\n" "\n" "# Team ranking\n" "---\n" "- Chicago Cubs\n" "- St Louis Cardinals"; const char *ex2_8 = "---\n" "time: 20:03:20\n" "player: Sammy Sosa\n" "action: strike (miss)\n" "...\n" "---\n" "time: 20:03:47\n" "player: Sammy Sosa\n" "action: grand slam\n" "..."; const char *ex2_9 = "---\n" "hr: # 1998 hr ranking\n" " - Mark McGwire\n" " - Sammy Sosa\n" "rbi:\n" " # 1998 rbi ranking\n" " - Sammy Sosa\n" " - Ken Griffey"; const char *ex2_10 = "---\n" "hr:\n" " - Mark McGwire\n" " # Following node labeled SS\n" " - &SS Sammy Sosa\n" "rbi:\n" " - *SS # Subsequent occurrence\n" " - Ken Griffey"; const char *ex2_11 = "? - Detroit Tigers\n" " - Chicago cubs\n" ":\n" " - 2001-07-23\n" "\n" "? [ New York Yankees,\n" " Atlanta Braves ]\n" ": [ 2001-07-02, 2001-08-12,\n" " 2001-08-14 ]"; const char *ex2_12 = "---\n" "# Products purchased\n" "- item : Super Hoop\n" " quantity: 1\n" "- item : Basketball\n" " quantity: 4\n" "- item : Big Shoes\n" " quantity: 1"; const char *ex2_13 = "# ASCII Art\n" "--- |\n" " \\//||\\/||\n" " // || ||__"; const char *ex2_14 = "--- >\n" " Mark McGwire's\n" " year was crippled\n" " by a knee injury."; const char *ex2_15 = ">\n" " Sammy Sosa completed another\n" " fine season with great stats.\n" " \n" " 63 Home Runs\n" " 0.288 Batting Average\n" " \n" " What a year!"; const char *ex2_16 = "name: Mark McGwire\n" "accomplishment: >\n" " Mark set a major league\n" " home run record in 1998.\n" "stats: |\n" " 65 Home Runs\n" " 0.278 Batting Average\n"; const char *ex2_17 = "unicode: \"Sosa did fine.\\u263A\"\n" "control: \"\\b1998\\t1999\\t2000\\n\"\n" "hex esc: \"\\x0d\\x0a is \\r\\n\"\n" "\n" "single: '\"Howdy!\" he cried.'\n" "quoted: ' # Not a ''comment''.'\n" "tie-fighter: '|\\-*-/|'"; const char *ex2_18 = "plain:\n" " This unquoted scalar\n" " spans many lines.\n" "\n" "quoted: \"So does this\n" " quoted scalar.\\n\""; // TODO: 2.19 - 2.22 schema tags const char *ex2_23 = "---\n" "not-date: !!str 2002-04-28\n" "\n" "picture: !!binary |\n" " R0lGODlhDAAMAIQAAP//9/X\n" " 17unp5WZmZgAAAOfn515eXv\n" " Pz7Y6OjuDg4J+fn5OTk6enp\n" " 56enmleECcgggoBADs=\n" "\n" "application specific tag: !something |\n" " The semantics of the tag\n" " above may be different for\n" " different documents."; const char *ex2_24 = "%TAG ! tag:clarkevans.com,2002:\n" "--- !shape\n" " # Use the ! handle for presenting\n" " # tag:clarkevans.com,2002:circle\n" "- !circle\n" " center: &ORIGIN {x: 73, y: 129}\n" " radius: 7\n" "- !line\n" " start: *ORIGIN\n" " finish: { x: 89, y: 102 }\n" "- !label\n" " start: *ORIGIN\n" " color: 0xFFEEBB\n" " text: Pretty vector drawing."; const char *ex2_25 = "# Sets are represented as a\n" "# Mapping where each key is\n" "# associated with a null value\n" "--- !!set\n" "? Mark McGwire\n" "? Sammy Sosa\n" "? Ken Griffey"; const char *ex2_26 = "# Ordered maps are represented as\n" "# A sequence of mappings, with\n" "# each mapping having one key\n" "--- !!omap\n" "- Mark McGwire: 65\n" "- Sammy Sosa: 63\n" "- Ken Griffey: 58"; const char *ex2_27 = "--- !\n" "invoice: 34843\n" "date : 2001-01-23\n" "bill-to: &id001\n" " given : Chris\n" " family : Dumars\n" " address:\n" " lines: |\n" " 458 Walkman Dr.\n" " Suite #292\n" " city : Royal Oak\n" " state : MI\n" " postal : 48046\n" "ship-to: *id001\n" "product:\n" " - sku : BL394D\n" " quantity : 4\n" " description : Basketball\n" " price : 450.00\n" " - sku : BL4438H\n" " quantity : 1\n" " description : Super Hoop\n" " price : 2392.00\n" "tax : 251.42\n" "total: 4443.52\n" "comments:\n" " Late afternoon is best.\n" " Backup contact is Nancy\n" " Billsmer @ 338-4338."; const char *ex2_28 = "---\n" "Time: 2001-11-23 15:01:42 -5\n" "User: ed\n" "Warning:\n" " This is an error message\n" " for the log file\n" "---\n" "Time: 2001-11-23 15:02:31 -5\n" "User: ed\n" "Warning:\n" " A slightly different error\n" " message.\n" "---\n" "Date: 2001-11-23 15:03:17 -5\n" "User: ed\n" "Fatal:\n" " Unknown variable \"bar\"\n" "Stack:\n" " - file: TopClass.py\n" " line: 23\n" " code: |\n" " x = MoreObject(\"345\\n\")\n" " - file: MoreClass.py\n" " line: 58\n" " code: |-\n" " foo = bar"; // TODO: 5.1 - 5.2 BOM const char *ex5_3 = "sequence:\n" "- one\n" "- two\n" "mapping:\n" " ? sky\n" " : blue\n" " sea : green"; const char *ex5_4 = "sequence: [ one, two, ]\n" "mapping: { sky: blue, sea: green }"; const char *ex5_5 = "# Comment only."; const char *ex5_6 = "anchored: !local &anchor value\n" "alias: *anchor"; const char *ex5_7 = "literal: |\n" " some\n" " text\n" "folded: >\n" " some\n" " text\n"; const char *ex5_8 = "single: 'text'\n" "double: \"text\""; // TODO: 5.9 directive // TODO: 5.10 reserved indicator const char *ex5_11 = "|\n" " Line break (no glyph)\n" " Line break (glyphed)\n"; const char *ex5_12 = "# Tabs and spaces\n" "quoted: \"Quoted\t\"\n" "block: |\n" " void main() {\n" " \tprintf(\"Hello, world!\\n\");\n" " }"; const char *ex5_13 = "\"Fun with \\\\\n" "\\\" \\a \\b \\e \\f \\\n" "\\n \\r \\t \\v \\0 \\\n" "\\ \\_ \\N \\L \\P \\\n" "\\x41 \\u0041 \\U00000041\""; const char *ex5_14 = "Bad escapes:\n" " \"\\c\n" " \\xq-\""; const char *ex6_1 = " # Leading comment line spaces are\n" " # neither content nor indentation.\n" " \n" "Not indented:\n" " By one space: |\n" " By four\n" " spaces\n" " Flow style: [ # Leading spaces\n" " By two, # in flow style\n" " Also by two, # are neither\n" " \tStill by two # content nor\n" " ] # indentation."; const char *ex6_2 = "? a\n" ": -\tb\n" " - -\tc\n" " - d"; const char *ex6_3 = "- foo:\t bar\n" "- - baz\n" " -\tbaz"; const char *ex6_4 = "plain: text\n" " lines\n" "quoted: \"text\n" " \tlines\"\n" "block: |\n" " text\n" " \tlines\n"; const char *ex6_5 = "Folding:\n" " \"Empty line\n" " \t\n" " as a line feed\"\n" "Chomping: |\n" " Clipped empty lines\n" " "; const char *ex6_6 = ">-\n" " trimmed\n" " \n" " \n" "\n" " as\n" " space"; const char *ex6_7 = ">\n" " foo \n" " \n" " \t bar\n" "\n" " baz\n"; const char *ex6_8 = "\"\n" " foo \n" " \n" " \t bar\n" "\n" " baz\n" "\""; const char *ex6_9 = "key: # Comment\n" " value"; const char *ex6_10 = " # Comment\n" " \n" "\n"; const char *ex6_11 = "key: # Comment\n" " # lines\n" " value\n" "\n"; const char *ex6_12 = "{ first: Sammy, last: Sosa }:\n" "# Statistics:\n" " hr: # Home runs\n" " 65\n" " avg: # Average\n" " 0.278"; const char *ex6_13 = "%FOO bar baz # Should be ignored\n" " # with a warning.\n" "--- \"foo\""; const char *ex6_14 = "%YAML 1.3 # Attempt parsing\n" " # with a warning\n" "---\n" "\"foo\""; const char *ex6_15 = "%YAML 1.2\n" "%YAML 1.1\n" "foo"; const char *ex6_16 = "%TAG !yaml! tag:yaml.org,2002:\n" "---\n" "!yaml!str \"foo\""; const char *ex6_17 = "%TAG ! !foo\n" "%TAG ! !foo\n" "bar"; const char *ex6_18 = "# Private\n" "!foo \"bar\"\n" "...\n" "# Global\n" "%TAG ! tag:example.com,2000:app/\n" "---\n" "!foo \"bar\""; const char *ex6_19 = "%TAG !! tag:example.com,2000:app/\n" "---\n" "!!int 1 - 3 # Interval, not integer"; const char *ex6_20 = "%TAG !e! tag:example.com,2000:app/\n" "---\n" "!e!foo \"bar\""; const char *ex6_21 = "%TAG !m! !my-\n" "--- # Bulb here\n" "!m!light fluorescent\n" "...\n" "%TAG !m! !my-\n" "--- # Color here\n" "!m!light green"; const char *ex6_22 = "%TAG !e! tag:example.com,2000:app/\n" "---\n" "- !e!foo \"bar\""; const char *ex6_23 = "!!str &a1 \"foo\":\n" " !!str bar\n" "&a2 baz : *a1"; const char *ex6_24 = "! foo :\n" " ! baz"; const char *ex6_25 = "- ! foo\n" "- !<$:?> bar\n"; const char *ex6_26 = "%TAG !e! tag:example.com,2000:app/\n" "---\n" "- !local foo\n" "- !!str bar\n" "- !e!tag%21 baz\n"; const char *ex6_27a = "%TAG !e! tag:example,2000:app/\n" "---\n" "- !e! foo"; const char *ex6_27b = "%TAG !e! tag:example,2000:app/\n" "---\n" "- !h!bar baz"; const char *ex6_28 = "# Assuming conventional resolution:\n" "- \"12\"\n" "- 12\n" "- ! 12"; const char *ex6_29 = "First occurrence: &anchor Value\n" "Second occurrence: *anchor"; const char *ex7_1 = "First occurrence: &anchor Foo\n" "Second occurrence: *anchor\n" "Override anchor: &anchor Bar\n" "Reuse anchor: *anchor"; const char *ex7_2 = "{\n" " foo : !!str,\n" " !!str : bar,\n" "}"; const char *ex7_3 = "{\n" " ? foo :,\n" " : bar,\n" "}\n"; const char *ex7_4 = "\"implicit block key\" : [\n" " \"implicit flow key\" : value,\n" " ]"; const char *ex7_5 = "\"folded \n" "to a space,\t\n" " \n" "to a line feed, or \t\\\n" " \\ \tnon-content\""; const char *ex7_6 = "\" 1st non-empty\n" "\n" " 2nd non-empty \n" "\t3rd non-empty \""; const char *ex7_7 = " 'here''s to \"quotes\"'"; const char *ex7_8 = "'implicit block key' : [\n" " 'implicit flow key' : value,\n" " ]"; const char *ex7_9 = "' 1st non-empty\n" "\n" " 2nd non-empty \n" "\t3rd non-empty '"; const char *ex7_10 = "# Outside flow collection:\n" "- ::vector\n" "- \": - ()\"\n" "- Up, up, and away!\n" "- -123\n" "- http://example.com/foo#bar\n" "# Inside flow collection:\n" "- [ ::vector,\n" " \": - ()\",\n" " \"Up, up, and away!\",\n" " -123,\n" " http://example.com/foo#bar ]"; const char *ex7_11 = "implicit block key : [\n" " implicit flow key : value,\n" " ]"; const char *ex7_12 = "1st non-empty\n" "\n" " 2nd non-empty \n" "\t3rd non-empty"; const char *ex7_13 = "- [ one, two, ]\n" "- [three ,four]"; const char *ex7_14 = "[\n" "\"double\n" " quoted\", 'single\n" " quoted',\n" "plain\n" " text, [ nested ],\n" "single: pair,\n" "]"; const char *ex7_15 = "- { one : two , three: four , }\n" "- {five: six,seven : eight}"; const char *ex7_16 = "{\n" "? explicit: entry,\n" "implicit: entry,\n" "?\n" "}"; const char *ex7_17 = "{\n" "unquoted : \"separate\",\n" "http://foo.com,\n" "omitted value:,\n" ": omitted key,\n" "}"; const char *ex7_18 = "{\n" "\"adjacent\":value,\n" "\"readable\":value,\n" "\"empty\":\n" "}"; const char *ex7_19 = "[\n" "foo: bar\n" "]"; const char *ex7_20 = "[\n" "? foo\n" " bar : baz\n" "]"; const char *ex7_21 = "- [ YAML : separate ]\n" "- [ : empty key entry ]\n" "- [ {JSON: like}:adjacent ]"; const char *ex7_22 = "[ foo\n" " bar: invalid,"; // Note: we don't check (on purpose) the >1K chars for an implicit key const char *ex7_23 = "- [ a, b ]\n" "- { a: b }\n" "- \"a\"\n" "- 'b'\n" "- c"; const char *ex7_24 = "- !!str \"a\"\n" "- 'b'\n" "- &anchor \"c\"\n" "- *anchor\n" "- !!str"; const char *ex8_1 = "- | # Empty header\n" " literal\n" "- >1 # Indentation indicator\n" " folded\n" "- |+ # Chomping indicator\n" " keep\n" "\n" "- >1- # Both indicators\n" " strip\n"; const char *ex8_2 = "- |\n" " detected\n" "- >\n" " \n" " \n" " # detected\n" "- |1\n" " explicit\n" "- >\n" " \t\n" " detected\n"; const char *ex8_3a = "- |\n" " \n" " text"; const char *ex8_3b = "- >\n" " text\n" " text"; const char *ex8_3c = "- |2\n" " text"; const char *ex8_4 = "strip: |-\n" " text\n" "clip: |\n" " text\n" "keep: |+\n" " text\n"; const char *ex8_5 = " # Strip\n" " # Comments:\n" "strip: |-\n" " # text\n" " \n" " # Clip\n" " # comments:\n" "\n" "clip: |\n" " # text\n" " \n" " # Keep\n" " # comments:\n" "\n" "keep: |+\n" " # text\n" "\n" " # Trail\n" " # Comments\n"; const char *ex8_6 = "strip: >-\n" "\n" "clip: >\n" "\n" "keep: |+\n" "\n"; const char *ex8_7 = "|\n" " literal\n" " \ttext\n" "\n"; const char *ex8_8 = "|\n" " \n" " \n" " literal\n" " \n" " \n" " text\n" "\n" " # Comment\n"; const char *ex8_9 = ">\n" " folded\n" " text\n" "\n"; const char *ex8_10 = ">\n" "\n" " folded\n" " line\n" "\n" " next\n" " line\n" " * bullet\n" "\n" " * list\n" " * lines\n" "\n" " last\n" " line\n" "\n" "# Comment\n"; const char *ex8_11 = ex8_10; const char *ex8_12 = ex8_10; const char *ex8_13 = ex8_10; const char *ex8_14 = "block sequence:\n" " - one\n" " - two : three\n"; const char *ex8_15 = "- # Empty\n" "- |\n" " block node\n" "- - one # Compact\n" " - two # sequence\n" "- one: two # Compact mapping\n"; const char *ex8_16 = "block mapping:\n" " key: value\n"; const char *ex8_17 = "? explicit key # Empty value\n" "? |\n" " block key\n" ": - one # Explicit compact\n" " - two # block value\n"; const char *ex8_18 = "plain key: in-line value\n" ": # Both empty\n" "\"quoted key\":\n" "- entry\n"; const char *ex8_19 = "- sun: yellow\n" "- ? earth: blue\n" " : moon: white\n"; const char *ex8_20 = "-\n" " \"flow in block\"\n" "- >\n" " Block scalar\n" "- !!map # Block collection\n" " foo : bar\n"; const char *ex8_21 = "literal: |2\n" " value\n" "folded:\n" " !foo\n" " >1\n" " value\n"; const char *ex8_22 = "sequence: !!seq\n" "- entry\n" "- !!seq\n" " - nested\n" "mapping: !!map\n" " foo: bar\n"; } } SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/test/tests.cpp0000664000175000017500000000072711723131175027236 0ustar dandan#include "tests.h" #include "emittertests.h" #include "nodetests.h" #include "parsertests.h" #include "spectests.h" #include "yaml-cpp/yaml.h" #include #include #include #include namespace Test { void RunAll() { bool passed = true; if(!RunParserTests()) passed = false; if(!RunEmitterTests()) passed = false; if(!RunSpecTests()) passed = false; if(passed) std::cout << "All tests passed!\n"; } } SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/test/tests.h0000664000175000017500000000363011723131175026677 0ustar dandan#ifndef TESTS_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #define TESTS_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #if defined(_MSC_VER) || (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 #pragma once #endif #include namespace Test { void RunAll(); namespace Parser { // scalar tests void SimpleScalar(std::string& inputScalar, std::string& desiredOutput); void MultiLineScalar(std::string& inputScalar, std::string& desiredOutput); void LiteralScalar(std::string& inputScalar, std::string& desiredOutput); void FoldedScalar(std::string& inputScalar, std::string& desiredOutput); void ChompedFoldedScalar(std::string& inputScalar, std::string& desiredOutput); void ChompedLiteralScalar(std::string& inputScalar, std::string& desiredOutput); void FoldedScalarWithIndent(std::string& inputScalar, std::string& desiredOutput); void ColonScalar(std::string& inputScalar, std::string& desiredOutput); void QuotedScalar(std::string& inputScalar, std::string& desiredOutput); void CommaScalar(std::string& inputScalar, std::string& desiredOutput); void DashScalar(std::string& inputScalar, std::string& desiredOutput); void URLScalar(std::string& inputScalar, std::string& desiredOutput); // misc tests bool SimpleSeq(); bool SimpleMap(); bool FlowSeq(); bool FlowMap(); bool FlowMapWithOmittedKey(); bool FlowMapWithOmittedValue(); bool FlowMapWithSoloEntry(); bool FlowMapEndingWithSoloEntry(); bool QuotedSimpleKeys(); bool CompressedMapAndSeq(); bool NullBlockSeqEntry(); bool NullBlockMapKey(); bool NullBlockMapValue(); bool SimpleAlias(); bool AliasWithNull(); bool AnchorInSimpleKey(); bool AliasAsSimpleKey(); bool ExplicitDoc(); bool MultipleDocs(); bool ExplicitEndDoc(); bool MultipleDocsWithSomeExplicitIndicators(); } } #endif // TESTS_H_62B23520_7C8E_11DE_8A39_0800200C9A66 SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/test/spectests.cpp0000664000175000017500000002423011723131175030104 0ustar dandan#include "spectests.h" #include "yaml-cpp/yaml.h" #include namespace Test { namespace { void RunSpecTest(TEST (*test)(), const std::string& index, const std::string& name, int& passed, int& total) { TEST ret; try { ret = test(); } catch(const YAML::Exception& e) { ret.ok = false; ret.error = std::string(" Exception caught: ") + e.what(); } if(!ret.ok) { std::cout << "Spec test " << index << " failed: " << name << "\n"; std::cout << ret.error << "\n"; } if(ret.ok) passed++; total++; } } bool RunSpecTests() { int passed = 0; int total = 0; RunSpecTest(&Spec::SeqScalars, "2.1", "Sequence of Scalars", passed, total); RunSpecTest(&Spec::MappingScalarsToScalars, "2.2", "Mapping Scalars to Scalars", passed, total); RunSpecTest(&Spec::MappingScalarsToSequences, "2.3", "Mapping Scalars to Sequences", passed, total); RunSpecTest(&Spec::SequenceOfMappings, "2.4", "Sequence of Mappings", passed, total); RunSpecTest(&Spec::SequenceOfSequences, "2.5", "Sequence of Sequences", passed, total); RunSpecTest(&Spec::MappingOfMappings, "2.6", "Mapping of Mappings", passed, total); RunSpecTest(&Spec::TwoDocumentsInAStream, "2.7", "Two Documents in a Stream", passed, total); RunSpecTest(&Spec::PlayByPlayFeed, "2.8", "Play by Play Feed from a Game", passed, total); RunSpecTest(&Spec::SingleDocumentWithTwoComments, "2.9", "Single Document with Two Comments", passed, total); RunSpecTest(&Spec::SimpleAnchor, "2.10", "Node for \"Sammy Sosa\" appears twice in this document", passed, total); RunSpecTest(&Spec::MappingBetweenSequences, "2.11", "Mapping between Sequences", passed, total); RunSpecTest(&Spec::CompactNestedMapping, "2.12", "Compact Nested Mapping", passed, total); RunSpecTest(&Spec::InLiteralsNewlinesArePreserved, "2.13", "In literals, newlines are preserved", passed, total); RunSpecTest(&Spec::InFoldedScalarsNewlinesBecomeSpaces, "2.14", "In folded scalars, newlines become spaces", passed, total); RunSpecTest(&Spec::FoldedNewlinesArePreservedForMoreIndentedAndBlankLines, "2.15", "Folded newlines are preserved for \"more indented\" and blank lines", passed, total); RunSpecTest(&Spec::IndentationDeterminesScope, "2.16", "Indentation determines scope", passed, total); RunSpecTest(&Spec::QuotedScalars, "2.17", "Quoted scalars", passed, total); RunSpecTest(&Spec::MultiLineFlowScalars, "2.18", "Multi-line flow scalars", passed, total); RunSpecTest(&Spec::VariousExplicitTags, "2.23", "Various Explicit Tags", passed, total); RunSpecTest(&Spec::GlobalTags, "2.24", "Global Tags", passed, total); RunSpecTest(&Spec::UnorderedSets, "2.25", "Unordered Sets", passed, total); RunSpecTest(&Spec::OrderedMappings, "2.26", "Ordered Mappings", passed, total); RunSpecTest(&Spec::Invoice, "2.27", "Invoice", passed, total); RunSpecTest(&Spec::LogFile, "2.28", "Log File", passed, total); RunSpecTest(&Spec::BlockStructureIndicators, "5.3", "Block Structure Indicators", passed, total); RunSpecTest(&Spec::FlowStructureIndicators, "5.4", "Flow Structure Indicators", passed, total); RunSpecTest(&Spec::NodePropertyIndicators, "5.6", "Node Property Indicators", passed, total); RunSpecTest(&Spec::BlockScalarIndicators, "5.7", "Block Scalar Indicators", passed, total); RunSpecTest(&Spec::QuotedScalarIndicators, "5.8", "Quoted Scalar Indicators", passed, total); RunSpecTest(&Spec::LineBreakCharacters, "5.11", "Line Break Characters", passed, total); RunSpecTest(&Spec::TabsAndSpaces, "5.12", "Tabs and Spaces", passed, total); RunSpecTest(&Spec::EscapedCharacters, "5.13", "Escaped Characters", passed, total); RunSpecTest(&Spec::InvalidEscapedCharacters, "5.14", "Invalid Escaped Characters", passed, total); RunSpecTest(&Spec::IndentationSpaces, "6.1", "Indentation Spaces", passed, total); RunSpecTest(&Spec::IndentationIndicators, "6.2", "Indentation Indicators", passed, total); RunSpecTest(&Spec::SeparationSpaces, "6.3", "Separation Spaces", passed, total); RunSpecTest(&Spec::LinePrefixes, "6.4", "Line Prefixes", passed, total); RunSpecTest(&Spec::EmptyLines, "6.5", "Empty Lines", passed, total); RunSpecTest(&Spec::LineFolding, "6.6", "Line Folding", passed, total); RunSpecTest(&Spec::BlockFolding, "6.7", "Block Folding", passed, total); RunSpecTest(&Spec::FlowFolding, "6.8", "Flow Folding", passed, total); RunSpecTest(&Spec::SeparatedComment, "6.9", "Separated Comment", passed, total); RunSpecTest(&Spec::CommentLines, "6.10", "Comment Lines", passed, total); RunSpecTest(&Spec::MultiLineComments, "6.11", "Multi-Line Comments", passed, total); RunSpecTest(&Spec::SeparationSpacesII, "6.12", "Separation Spaces", passed, total); RunSpecTest(&Spec::ReservedDirectives, "6.13", "Reserved Directives", passed, total); RunSpecTest(&Spec::YAMLDirective, "6.14", "YAML Directive", passed, total); RunSpecTest(&Spec::InvalidRepeatedYAMLDirective, "6.15", "Invalid Repeated YAML Directive", passed, total); RunSpecTest(&Spec::TagDirective, "6.16", "Tag Directive", passed, total); RunSpecTest(&Spec::InvalidRepeatedTagDirective, "6.17", "Invalid Repeated Tag Directive", passed, total); RunSpecTest(&Spec::PrimaryTagHandle, "6.18", "Primary Tag Handle", passed, total); RunSpecTest(&Spec::SecondaryTagHandle, "6.19", "SecondaryTagHandle", passed, total); RunSpecTest(&Spec::TagHandles, "6.20", "TagHandles", passed, total); RunSpecTest(&Spec::LocalTagPrefix, "6.21", "LocalTagPrefix", passed, total); RunSpecTest(&Spec::GlobalTagPrefix, "6.22", "GlobalTagPrefix", passed, total); RunSpecTest(&Spec::NodeProperties, "6.23", "NodeProperties", passed, total); RunSpecTest(&Spec::VerbatimTags, "6.24", "Verbatim Tags", passed, total); RunSpecTest(&Spec::InvalidVerbatimTags, "6.25", "Invalid Verbatim Tags", passed, total); RunSpecTest(&Spec::TagShorthands, "6.26", "Tag Shorthands", passed, total); RunSpecTest(&Spec::InvalidTagShorthands, "6.27", "Invalid Tag Shorthands", passed, total); RunSpecTest(&Spec::NonSpecificTags, "6.28", "Non Specific Tags", passed, total); RunSpecTest(&Spec::NodeAnchors, "6.29", "Node Anchors", passed, total); RunSpecTest(&Spec::AliasNodes, "7.1", "Alias Nodes", passed, total); RunSpecTest(&Spec::EmptyNodes, "7.2", "Empty Nodes", passed, total); RunSpecTest(&Spec::CompletelyEmptyNodes, "7.3", "Completely Empty Nodes", passed, total); RunSpecTest(&Spec::DoubleQuotedImplicitKeys, "7.4", "Double Quoted Implicit Keys", passed, total); RunSpecTest(&Spec::DoubleQuotedLineBreaks, "7.5", "Double Quoted Line Breaks", passed, total); RunSpecTest(&Spec::DoubleQuotedLines, "7.6", "Double Quoted Lines", passed, total); RunSpecTest(&Spec::SingleQuotedCharacters, "7.7", "Single Quoted Characters", passed, total); RunSpecTest(&Spec::SingleQuotedImplicitKeys, "7.8", "Single Quoted Implicit Keys", passed, total); RunSpecTest(&Spec::SingleQuotedLines, "7.9", "Single Quoted Lines", passed, total); RunSpecTest(&Spec::PlainCharacters, "7.10", "Plain Characters", passed, total); RunSpecTest(&Spec::PlainImplicitKeys, "7.11", "Plain Implicit Keys", passed, total); RunSpecTest(&Spec::PlainLines, "7.12", "Plain Lines", passed, total); RunSpecTest(&Spec::FlowSequence, "7.13", "Flow Sequence", passed, total); RunSpecTest(&Spec::FlowSequenceEntries, "7.14", "Flow Sequence Entries", passed, total); RunSpecTest(&Spec::FlowMappings, "7.15", "Flow Mappings", passed, total); RunSpecTest(&Spec::FlowMappingEntries, "7.16", "Flow Mapping Entries", passed, total); RunSpecTest(&Spec::FlowMappingSeparateValues, "7.17", "Flow Mapping Separate Values", passed, total); RunSpecTest(&Spec::FlowMappingAdjacentValues, "7.18", "Flow Mapping Adjacent Values", passed, total); RunSpecTest(&Spec::SinglePairFlowMappings, "7.19", "Single Pair Flow Mappings", passed, total); RunSpecTest(&Spec::SinglePairExplicitEntry, "7.20", "Single Pair Explicit Entry", passed, total); RunSpecTest(&Spec::SinglePairImplicitEntries, "7.21", "Single Pair Implicit Entries", passed, total); RunSpecTest(&Spec::InvalidImplicitKeys, "7.22", "Invalid Implicit Keys", passed, total); RunSpecTest(&Spec::FlowContent, "7.23", "Flow Content", passed, total); RunSpecTest(&Spec::FlowNodes, "7.24", "FlowNodes", passed, total); RunSpecTest(&Spec::BlockScalarHeader, "8.1", "Block Scalar Header", passed, total); RunSpecTest(&Spec::BlockIndentationHeader, "8.2", "Block Indentation Header", passed, total); RunSpecTest(&Spec::InvalidBlockScalarIndentationIndicators, "8.3", "Invalid Block Scalar Indentation Indicators", passed, total); RunSpecTest(&Spec::ChompingFinalLineBreak, "8.4", "Chomping Final Line Break", passed, total); RunSpecTest(&Spec::ChompingTrailingLines, "8.5", "Chomping Trailing Lines", passed, total); RunSpecTest(&Spec::EmptyScalarChomping, "8.6", "Empty Scalar Chomping", passed, total); RunSpecTest(&Spec::LiteralScalar, "8.7", "Literal Scalar", passed, total); RunSpecTest(&Spec::LiteralContent, "8.8", "Literal Content", passed, total); RunSpecTest(&Spec::FoldedScalar, "8.9", "Folded Scalar", passed, total); RunSpecTest(&Spec::FoldedLines, "8.10", "Folded Lines", passed, total); RunSpecTest(&Spec::MoreIndentedLines, "8.11", "More Indented Lines", passed, total); RunSpecTest(&Spec::EmptySeparationLines, "8.12", "Empty Separation Lines", passed, total); RunSpecTest(&Spec::FinalEmptyLines, "8.13", "Final Empty Lines", passed, total); RunSpecTest(&Spec::BlockSequence, "8.14", "Block Sequence", passed, total); RunSpecTest(&Spec::BlockSequenceEntryTypes, "8.15", "Block Sequence Entry Types", passed, total); RunSpecTest(&Spec::BlockMappings, "8.16", "Block Mappings", passed, total); RunSpecTest(&Spec::ExplicitBlockMappingEntries, "8.17", "Explicit Block Mapping Entries", passed, total); RunSpecTest(&Spec::ImplicitBlockMappingEntries, "8.18", "Implicit Block Mapping Entries", passed, total); RunSpecTest(&Spec::CompactBlockMappings, "8.19", "Compact Block Mappings", passed, total); RunSpecTest(&Spec::BlockNodeTypes, "8.20", "Block Node Types", passed, total); RunSpecTest(&Spec::BlockScalarNodes, "8.21", "Block Scalar Nodes", passed, total); RunSpecTest(&Spec::BlockCollectionNodes, "8.22", "Block Collection Nodes", passed, total); std::cout << "Spec tests: " << passed << "/" << total << " passed\n"; return passed == total; } } SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/test/emittertests.cpp0000664000175000017500000012002011723131175030615 0ustar dandan#include "tests.h" #include "yaml-cpp/yaml.h" #include namespace Test { namespace Emitter { //////////////////////////////////////////////////////////////////////////////////////////////////////// // correct emitting void SimpleScalar(YAML::Emitter& out, std::string& desiredOutput) { out << "Hello, World!"; desiredOutput = "Hello, World!"; } void SimpleSeq(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::BeginSeq; out << "eggs"; out << "bread"; out << "milk"; out << YAML::EndSeq; desiredOutput = "- eggs\n- bread\n- milk"; } void SimpleFlowSeq(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::Flow; out << YAML::BeginSeq; out << "Larry"; out << "Curly"; out << "Moe"; out << YAML::EndSeq; desiredOutput = "[Larry, Curly, Moe]"; } void EmptyFlowSeq(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::Flow; out << YAML::BeginSeq; out << YAML::EndSeq; desiredOutput = "[]"; } void NestedBlockSeq(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::BeginSeq; out << "item 1"; out << YAML::BeginSeq << "subitem 1" << "subitem 2" << YAML::EndSeq; out << YAML::EndSeq; desiredOutput = "- item 1\n-\n - subitem 1\n - subitem 2"; } void NestedFlowSeq(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::BeginSeq; out << "one"; out << YAML::Flow << YAML::BeginSeq << "two" << "three" << YAML::EndSeq; out << YAML::EndSeq; desiredOutput = "- one\n- [two, three]"; } void SimpleMap(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::BeginMap; out << YAML::Key << "name"; out << YAML::Value << "Ryan Braun"; out << YAML::Key << "position"; out << YAML::Value << "3B"; out << YAML::EndMap; desiredOutput = "name: Ryan Braun\nposition: 3B"; } void SimpleFlowMap(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::Flow; out << YAML::BeginMap; out << YAML::Key << "shape"; out << YAML::Value << "square"; out << YAML::Key << "color"; out << YAML::Value << "blue"; out << YAML::EndMap; desiredOutput = "{shape: square, color: blue}"; } void MapAndList(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::BeginMap; out << YAML::Key << "name"; out << YAML::Value << "Barack Obama"; out << YAML::Key << "children"; out << YAML::Value << YAML::BeginSeq << "Sasha" << "Malia" << YAML::EndSeq; out << YAML::EndMap; desiredOutput = "name: Barack Obama\nchildren:\n - Sasha\n - Malia"; } void ListAndMap(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::BeginSeq; out << "item 1"; out << YAML::BeginMap; out << YAML::Key << "pens" << YAML::Value << 8; out << YAML::Key << "pencils" << YAML::Value << 14; out << YAML::EndMap; out << "item 2"; out << YAML::EndSeq; desiredOutput = "- item 1\n- pens: 8\n pencils: 14\n- item 2"; } void NestedBlockMap(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::BeginMap; out << YAML::Key << "name"; out << YAML::Value << "Fred"; out << YAML::Key << "grades"; out << YAML::Value; out << YAML::BeginMap; out << YAML::Key << "algebra" << YAML::Value << "A"; out << YAML::Key << "physics" << YAML::Value << "C+"; out << YAML::Key << "literature" << YAML::Value << "B"; out << YAML::EndMap; out << YAML::EndMap; desiredOutput = "name: Fred\ngrades:\n algebra: A\n physics: C+\n literature: B"; } void NestedFlowMap(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::Flow; out << YAML::BeginMap; out << YAML::Key << "name"; out << YAML::Value << "Fred"; out << YAML::Key << "grades"; out << YAML::Value; out << YAML::BeginMap; out << YAML::Key << "algebra" << YAML::Value << "A"; out << YAML::Key << "physics" << YAML::Value << "C+"; out << YAML::Key << "literature" << YAML::Value << "B"; out << YAML::EndMap; out << YAML::EndMap; desiredOutput = "{name: Fred, grades: {algebra: A, physics: C+, literature: B}}"; } void MapListMix(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::BeginMap; out << YAML::Key << "name"; out << YAML::Value << "Bob"; out << YAML::Key << "position"; out << YAML::Value; out << YAML::Flow << YAML::BeginSeq << 2 << 4 << YAML::EndSeq; out << YAML::Key << "invincible" << YAML::Value << YAML::OnOffBool << false; out << YAML::EndMap; desiredOutput = "name: Bob\nposition: [2, 4]\ninvincible: off"; } void SimpleLongKey(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::LongKey; out << YAML::BeginMap; out << YAML::Key << "height"; out << YAML::Value << "5'9\""; out << YAML::Key << "weight"; out << YAML::Value << 145; out << YAML::EndMap; desiredOutput = "? height\n: 5'9\"\n? weight\n: 145"; } void SingleLongKey(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::BeginMap; out << YAML::Key << "age"; out << YAML::Value << "24"; out << YAML::LongKey << YAML::Key << "height"; out << YAML::Value << "5'9\""; out << YAML::Key << "weight"; out << YAML::Value << 145; out << YAML::EndMap; desiredOutput = "age: 24\n? height\n: 5'9\"\nweight: 145"; } void ComplexLongKey(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::LongKey; out << YAML::BeginMap; out << YAML::Key << YAML::BeginSeq << 1 << 3 << YAML::EndSeq; out << YAML::Value << "monster"; out << YAML::Key << YAML::Flow << YAML::BeginSeq << 2 << 0 << YAML::EndSeq; out << YAML::Value << "demon"; out << YAML::EndMap; desiredOutput = "?\n - 1\n - 3\n: monster\n? [2, 0]\n: demon"; } void AutoLongKey(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::BeginMap; out << YAML::Key << YAML::BeginSeq << 1 << 3 << YAML::EndSeq; out << YAML::Value << "monster"; out << YAML::Key << YAML::Flow << YAML::BeginSeq << 2 << 0 << YAML::EndSeq; out << YAML::Value << "demon"; out << YAML::Key << "the origin"; out << YAML::Value << "angel"; out << YAML::EndMap; desiredOutput = "?\n - 1\n - 3\n: monster\n? [2, 0]\n: demon\nthe origin: angel"; } void ScalarFormat(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::BeginSeq; out << "simple scalar"; out << YAML::SingleQuoted << "explicit single-quoted scalar"; out << YAML::DoubleQuoted << "explicit double-quoted scalar"; out << "auto-detected\ndouble-quoted scalar"; out << "a non-\"auto-detected\" double-quoted scalar"; out << YAML::Literal << "literal scalar\nthat may span\nmany, many\nlines and have \"whatever\" crazy\tsymbols that we like"; out << YAML::EndSeq; desiredOutput = "- simple scalar\n- 'explicit single-quoted scalar'\n- \"explicit double-quoted scalar\"\n- \"auto-detected\\x0adouble-quoted scalar\"\n- a non-\"auto-detected\" double-quoted scalar\n- |\n literal scalar\n that may span\n many, many\n lines and have \"whatever\" crazy\tsymbols that we like"; } void AutoLongKeyScalar(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::BeginMap; out << YAML::Key << YAML::Literal << "multi-line\nscalar"; out << YAML::Value << "and its value"; out << YAML::EndMap; desiredOutput = "? |\n multi-line\n scalar\n: and its value"; } void LongKeyFlowMap(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::Flow; out << YAML::BeginMap; out << YAML::Key << "simple key"; out << YAML::Value << "and value"; out << YAML::LongKey << YAML::Key << "long key"; out << YAML::Value << "and its value"; out << YAML::EndMap; desiredOutput = "{simple key: and value, ? long key: and its value}"; } void BlockMapAsKey(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::BeginMap; out << YAML::Key; out << YAML::BeginMap; out << YAML::Key << "key" << YAML::Value << "value"; out << YAML::Key << "next key" << YAML::Value << "next value"; out << YAML::EndMap; out << YAML::Value; out << "total value"; out << YAML::EndMap; desiredOutput = "?\n key: value\n next key: next value\n: total value"; } void AliasAndAnchor(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::BeginSeq; out << YAML::Anchor("fred"); out << YAML::BeginMap; out << YAML::Key << "name" << YAML::Value << "Fred"; out << YAML::Key << "age" << YAML::Value << 42; out << YAML::EndMap; out << YAML::Alias("fred"); out << YAML::EndSeq; desiredOutput = "- &fred\n name: Fred\n age: 42\n- *fred"; } void AliasAndAnchorWithNull(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::BeginSeq; out << YAML::Anchor("fred") << YAML::Null; out << YAML::Alias("fred"); out << YAML::EndSeq; desiredOutput = "- &fred ~\n- *fred"; } void AliasAndAnchorInFlow(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::Flow << YAML::BeginSeq; out << YAML::Anchor("fred"); out << YAML::BeginMap; out << YAML::Key << "name" << YAML::Value << "Fred"; out << YAML::Key << "age" << YAML::Value << 42; out << YAML::EndMap; out << YAML::Alias("fred"); out << YAML::EndSeq; desiredOutput = "[&fred {name: Fred, age: 42}, *fred]"; } void SimpleVerbatimTag(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::VerbatimTag("!foo") << "bar"; desiredOutput = "! bar"; } void VerbatimTagInBlockSeq(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::BeginSeq; out << YAML::VerbatimTag("!foo") << "bar"; out << "baz"; out << YAML::EndSeq; desiredOutput = "- ! bar\n- baz"; } void VerbatimTagInFlowSeq(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::Flow << YAML::BeginSeq; out << YAML::VerbatimTag("!foo") << "bar"; out << "baz"; out << YAML::EndSeq; desiredOutput = "[! bar, baz]"; } void VerbatimTagInFlowSeqWithNull(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::Flow << YAML::BeginSeq; out << YAML::VerbatimTag("!foo") << YAML::Null; out << "baz"; out << YAML::EndSeq; desiredOutput = "[! ~, baz]"; } void VerbatimTagInBlockMap(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::BeginMap; out << YAML::Key << YAML::VerbatimTag("!foo") << "bar"; out << YAML::Value << YAML::VerbatimTag("!waz") << "baz"; out << YAML::EndMap; desiredOutput = "! bar: ! baz"; } void VerbatimTagInFlowMap(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::Flow << YAML::BeginMap; out << YAML::Key << YAML::VerbatimTag("!foo") << "bar"; out << YAML::Value << "baz"; out << YAML::EndMap; desiredOutput = "{! bar: baz}"; } void VerbatimTagInFlowMapWithNull(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::Flow << YAML::BeginMap; out << YAML::Key << YAML::VerbatimTag("!foo") << YAML::Null; out << YAML::Value << "baz"; out << YAML::EndMap; desiredOutput = "{! ~: baz}"; } void VerbatimTagWithEmptySeq(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::VerbatimTag("!foo") << YAML::BeginSeq << YAML::EndSeq; desiredOutput = "!\n[]"; } void VerbatimTagWithEmptyMap(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::VerbatimTag("!bar") << YAML::BeginMap << YAML::EndMap; desiredOutput = "!\n{}"; } void VerbatimTagWithEmptySeqAndMap(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::BeginSeq; out << YAML::VerbatimTag("!foo") << YAML::BeginSeq << YAML::EndSeq; out << YAML::VerbatimTag("!bar") << YAML::BeginMap << YAML::EndMap; out << YAML::EndSeq; desiredOutput = "- !\n []\n- !\n {}"; } void ByKindTagWithScalar(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::BeginSeq; out << YAML::DoubleQuoted << "12"; out << "12"; out << YAML::TagByKind << "12"; out << YAML::EndSeq; desiredOutput = "- \"12\"\n- 12\n- ! 12"; } void LocalTagWithScalar(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::LocalTag("foo") << "bar"; desiredOutput = "!foo bar"; } void BadLocalTag(YAML::Emitter& out, std::string& desiredError) { out << YAML::LocalTag("e!far") << "bar"; desiredError = "invalid tag"; } void ComplexDoc(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::BeginMap; out << YAML::Key << "receipt"; out << YAML::Value << "Oz-Ware Purchase Invoice"; out << YAML::Key << "date"; out << YAML::Value << "2007-08-06"; out << YAML::Key << "customer"; out << YAML::Value; out << YAML::BeginMap; out << YAML::Key << "given"; out << YAML::Value << "Dorothy"; out << YAML::Key << "family"; out << YAML::Value << "Gale"; out << YAML::EndMap; out << YAML::Key << "items"; out << YAML::Value; out << YAML::BeginSeq; out << YAML::BeginMap; out << YAML::Key << "part_no"; out << YAML::Value << "A4786"; out << YAML::Key << "descrip"; out << YAML::Value << "Water Bucket (Filled)"; out << YAML::Key << "price"; out << YAML::Value << 1.47; out << YAML::Key << "quantity"; out << YAML::Value << 4; out << YAML::EndMap; out << YAML::BeginMap; out << YAML::Key << "part_no"; out << YAML::Value << "E1628"; out << YAML::Key << "descrip"; out << YAML::Value << "High Heeled \"Ruby\" Slippers"; out << YAML::Key << "price"; out << YAML::Value << 100.27; out << YAML::Key << "quantity"; out << YAML::Value << 1; out << YAML::EndMap; out << YAML::EndSeq; out << YAML::Key << "bill-to"; out << YAML::Value << YAML::Anchor("id001"); out << YAML::BeginMap; out << YAML::Key << "street"; out << YAML::Value << YAML::Literal << "123 Tornado Alley\nSuite 16"; out << YAML::Key << "city"; out << YAML::Value << "East Westville"; out << YAML::Key << "state"; out << YAML::Value << "KS"; out << YAML::EndMap; out << YAML::Key << "ship-to"; out << YAML::Value << YAML::Alias("id001"); out << YAML::EndMap; desiredOutput = "receipt: Oz-Ware Purchase Invoice\ndate: 2007-08-06\ncustomer:\n given: Dorothy\n family: Gale\nitems:\n - part_no: A4786\n descrip: Water Bucket (Filled)\n price: 1.47\n quantity: 4\n - part_no: E1628\n descrip: High Heeled \"Ruby\" Slippers\n price: 100.27\n quantity: 1\nbill-to: &id001\n street: |\n 123 Tornado Alley\n Suite 16\n city: East Westville\n state: KS\nship-to: *id001"; } void STLContainers(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::BeginSeq; std::vector primes; primes.push_back(2); primes.push_back(3); primes.push_back(5); primes.push_back(7); primes.push_back(11); primes.push_back(13); out << YAML::Flow << primes; std::map ages; ages["Daniel"] = 26; ages["Jesse"] = 24; out << ages; out << YAML::EndSeq; desiredOutput = "- [2, 3, 5, 7, 11, 13]\n- Daniel: 26\n Jesse: 24"; } void SimpleComment(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::BeginMap; out << YAML::Key << "method"; out << YAML::Value << "least squares" << YAML::Comment("should we change this method?"); out << YAML::EndMap; desiredOutput = "method: least squares # should we change this method?"; } void MultiLineComment(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::BeginSeq; out << "item 1" << YAML::Comment("really really long\ncomment that couldn't possibly\nfit on one line"); out << "item 2"; out << YAML::EndSeq; desiredOutput = "- item 1 # really really long\n # comment that couldn't possibly\n # fit on one line\n- item 2"; } void ComplexComments(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::BeginMap; out << YAML::LongKey << YAML::Key << "long key" << YAML::Comment("long key"); out << YAML::Value << "value"; out << YAML::EndMap; desiredOutput = "? long key # long key\n: value"; } void InitialComment(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::Comment("A comment describing the purpose of the file."); out << YAML::BeginMap << YAML::Key << "key" << YAML::Value << "value" << YAML::EndMap; desiredOutput = "# A comment describing the purpose of the file.\nkey: value"; } void InitialCommentWithDocIndicator(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::BeginDoc << YAML::Comment("A comment describing the purpose of the file."); out << YAML::BeginMap << YAML::Key << "key" << YAML::Value << "value" << YAML::EndMap; desiredOutput = "---\n# A comment describing the purpose of the file.\nkey: value"; } void CommentInFlowSeq(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::Flow << YAML::BeginSeq << "foo" << YAML::Comment("foo!") << "bar" << YAML::EndSeq; desiredOutput = "[foo # foo!\n, bar]"; } void CommentInFlowMap(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::Flow << YAML::BeginMap; out << YAML::Key << "foo" << YAML::Value << "foo value"; out << YAML::Key << "bar" << YAML::Value << "bar value" << YAML::Comment("bar!"); out << YAML::Key << "baz" << YAML::Value << "baz value" << YAML::Comment("baz!"); out << YAML::EndMap; desiredOutput = "{foo: foo value, bar: bar value # bar!\n, baz: baz value # baz!\n}"; } void Indentation(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::Indent(4); out << YAML::BeginSeq; out << YAML::BeginMap; out << YAML::Key << "key 1" << YAML::Value << "value 1"; out << YAML::Key << "key 2" << YAML::Value << YAML::BeginSeq << "a" << "b" << "c" << YAML::EndSeq; out << YAML::EndMap; out << YAML::EndSeq; desiredOutput = "- key 1: value 1\n key 2:\n - a\n - b\n - c"; } void SimpleGlobalSettings(YAML::Emitter& out, std::string& desiredOutput) { out.SetIndent(4); out.SetMapFormat(YAML::LongKey); out << YAML::BeginSeq; out << YAML::BeginMap; out << YAML::Key << "key 1" << YAML::Value << "value 1"; out << YAML::Key << "key 2" << YAML::Value << YAML::Flow << YAML::BeginSeq << "a" << "b" << "c" << YAML::EndSeq; out << YAML::EndMap; out << YAML::EndSeq; desiredOutput = "- ? key 1\n : value 1\n ? key 2\n : [a, b, c]"; } void ComplexGlobalSettings(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::BeginSeq; out << YAML::Block; out << YAML::BeginMap; out << YAML::Key << "key 1" << YAML::Value << "value 1"; out << YAML::Key << "key 2" << YAML::Value; out.SetSeqFormat(YAML::Flow); out << YAML::BeginSeq << "a" << "b" << "c" << YAML::EndSeq; out << YAML::EndMap; out << YAML::BeginMap; out << YAML::Key << YAML::BeginSeq << 1 << 2 << YAML::EndSeq; out << YAML::Value << YAML::BeginMap << YAML::Key << "a" << YAML::Value << "b" << YAML::EndMap; out << YAML::EndMap; out << YAML::EndSeq; desiredOutput = "- key 1: value 1\n key 2: [a, b, c]\n- ? [1, 2]\n :\n a: b"; } void Null(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::BeginSeq; out << YAML::Null; out << YAML::BeginMap; out << YAML::Key << "null value" << YAML::Value << YAML::Null; out << YAML::Key << YAML::Null << YAML::Value << "null key"; out << YAML::EndMap; out << YAML::EndSeq; desiredOutput = "- ~\n- null value: ~\n ~: null key"; } void EscapedUnicode(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::EscapeNonAscii << "\x24 \xC2\xA2 \xE2\x82\xAC \xF0\xA4\xAD\xA2"; desiredOutput = "\"$ \\xa2 \\u20ac \\U00024b62\""; } void Unicode(YAML::Emitter& out, std::string& desiredOutput) { out << "\x24 \xC2\xA2 \xE2\x82\xAC \xF0\xA4\xAD\xA2"; desiredOutput = "\x24 \xC2\xA2 \xE2\x82\xAC \xF0\xA4\xAD\xA2"; } void DoubleQuotedUnicode(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::DoubleQuoted << "\x24 \xC2\xA2 \xE2\x82\xAC \xF0\xA4\xAD\xA2"; desiredOutput = "\"\x24 \xC2\xA2 \xE2\x82\xAC \xF0\xA4\xAD\xA2\""; } struct Foo { Foo(): x(0) {} Foo(int x_, const std::string& bar_): x(x_), bar(bar_) {} int x; std::string bar; }; YAML::Emitter& operator << (YAML::Emitter& out, const Foo& foo) { out << YAML::BeginMap; out << YAML::Key << "x" << YAML::Value << foo.x; out << YAML::Key << "bar" << YAML::Value << foo.bar; out << YAML::EndMap; return out; } void UserType(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::BeginSeq; out << Foo(5, "hello"); out << Foo(3, "goodbye"); out << YAML::EndSeq; desiredOutput = "- x: 5\n bar: hello\n- x: 3\n bar: goodbye"; } void UserTypeInContainer(YAML::Emitter& out, std::string& desiredOutput) { std::vector fv; fv.push_back(Foo(5, "hello")); fv.push_back(Foo(3, "goodbye")); out << fv; desiredOutput = "- x: 5\n bar: hello\n- x: 3\n bar: goodbye"; } template YAML::Emitter& operator << (YAML::Emitter& out, const T *v) { if(v) out << *v; else out << YAML::Null; return out; } void PointerToInt(YAML::Emitter& out, std::string& desiredOutput) { int foo = 5; int *bar = &foo; int *baz = 0; out << YAML::BeginSeq; out << bar << baz; out << YAML::EndSeq; desiredOutput = "- 5\n- ~"; } void PointerToUserType(YAML::Emitter& out, std::string& desiredOutput) { Foo foo(5, "hello"); Foo *bar = &foo; Foo *baz = 0; out << YAML::BeginSeq; out << bar << baz; out << YAML::EndSeq; desiredOutput = "- x: 5\n bar: hello\n- ~"; } void NewlineAtEnd(YAML::Emitter& out, std::string& desiredOutput) { out << "Hello" << YAML::Newline << YAML::Newline; desiredOutput = "Hello\n\n"; } void NewlineInBlockSequence(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::BeginSeq; out << "a" << YAML::Newline << "b" << "c" << YAML::Newline << "d"; out << YAML::EndSeq; desiredOutput = "- a\n\n- b\n- c\n\n- d"; } void NewlineInFlowSequence(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::Flow << YAML::BeginSeq; out << "a" << YAML::Newline << "b" << "c" << YAML::Newline << "d"; out << YAML::EndSeq; desiredOutput = "[a\n, b, c\n, d]"; } void NewlineInBlockMap(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::BeginMap; out << YAML::Key << "a" << YAML::Value << "foo" << YAML::Newline; out << YAML::Key << "b" << YAML::Newline << YAML::Value << "bar"; out << YAML::LongKey << YAML::Key << "c" << YAML::Newline << YAML::Value << "car"; out << YAML::EndMap; desiredOutput = "a: foo\n\nb: bar\n? c\n\n: car"; } void NewlineInFlowMap(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::Flow << YAML::BeginMap; out << YAML::Key << "a" << YAML::Value << "foo" << YAML::Newline; out << YAML::Key << "b" << YAML::Value << "bar"; out << YAML::EndMap; desiredOutput = "{a: foo\n, b: bar}"; } void LotsOfNewlines(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::BeginSeq; out << "a" << YAML::Newline; out << YAML::BeginSeq; out << "b" << "c" << YAML::Newline; out << YAML::EndSeq; out << YAML::Newline; out << YAML::BeginMap; out << YAML::Newline << YAML::Key << "d" << YAML::Value << YAML::Newline << "e"; out << YAML::LongKey << YAML::Key << "f" << YAML::Newline << YAML::Value << "foo"; out << YAML::EndMap; out << YAML::EndSeq; desiredOutput = "- a\n\n-\n - b\n - c\n\n\n-\n d: e\n ? f\n\n : foo"; } void Binary(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::Binary(reinterpret_cast("Hello, World!"), 13); desiredOutput = "!!binary \"SGVsbG8sIFdvcmxkIQ==\""; } void LongBinary(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::Binary(reinterpret_cast("Man is distinguished, not only by his reason, but by this singular passion from other animals, which is a lust of the mind, that by a perseverance of delight in the continued and indefatigable generation of knowledge, exceeds the short vehemence of any carnal pleasure.\n"), 270); desiredOutput = "!!binary \"TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlzIHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2YgdGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGludWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRoZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4K\""; } void EmptyBinary(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::Binary(reinterpret_cast(""), 0); desiredOutput = "!!binary \"\""; } void ColonAtEndOfScalar(YAML::Emitter& out, std::string& desiredOutput) { out << "a:"; desiredOutput = "\"a:\""; } void ColonAsScalar(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::BeginMap; out << YAML::Key << "apple" << YAML::Value << ":"; out << YAML::Key << "banana" << YAML::Value << ":"; out << YAML::EndMap; desiredOutput = "apple: \":\"\nbanana: \":\""; } void ColonAtEndOfScalarInFlow(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::Flow << YAML::BeginMap << YAML::Key << "C:" << YAML::Value << "C:" << YAML::EndMap; desiredOutput = "{\"C:\": \"C:\"}"; } void BoolFormatting(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::BeginSeq; out << YAML::TrueFalseBool << YAML::UpperCase << true; out << YAML::TrueFalseBool << YAML::CamelCase << true; out << YAML::TrueFalseBool << YAML::LowerCase << true; out << YAML::TrueFalseBool << YAML::UpperCase << false; out << YAML::TrueFalseBool << YAML::CamelCase << false; out << YAML::TrueFalseBool << YAML::LowerCase << false; out << YAML::YesNoBool << YAML::UpperCase << true; out << YAML::YesNoBool << YAML::CamelCase << true; out << YAML::YesNoBool << YAML::LowerCase << true; out << YAML::YesNoBool << YAML::UpperCase << false; out << YAML::YesNoBool << YAML::CamelCase << false; out << YAML::YesNoBool << YAML::LowerCase << false; out << YAML::OnOffBool << YAML::UpperCase << true; out << YAML::OnOffBool << YAML::CamelCase << true; out << YAML::OnOffBool << YAML::LowerCase << true; out << YAML::OnOffBool << YAML::UpperCase << false; out << YAML::OnOffBool << YAML::CamelCase << false; out << YAML::OnOffBool << YAML::LowerCase << false; out << YAML::ShortBool << YAML::UpperCase << true; out << YAML::ShortBool << YAML::CamelCase << true; out << YAML::ShortBool << YAML::LowerCase << true; out << YAML::ShortBool << YAML::UpperCase << false; out << YAML::ShortBool << YAML::CamelCase << false; out << YAML::ShortBool << YAML::LowerCase << false; out << YAML::EndSeq; desiredOutput = "- TRUE\n- True\n- true\n- FALSE\n- False\n- false\n" "- YES\n- Yes\n- yes\n- NO\n- No\n- no\n" "- ON\n- On\n- on\n- OFF\n- Off\n- off\n" "- Y\n- Y\n- y\n- N\n- N\n- n"; } void DocStartAndEnd(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::BeginDoc; out << YAML::BeginSeq << 1 << 2 << 3 << YAML::EndSeq; out << YAML::BeginDoc; out << "Hi there!"; out << YAML::EndDoc; out << YAML::EndDoc; out << YAML::EndDoc; out << YAML::BeginDoc; out << YAML::VerbatimTag("foo") << "bar"; desiredOutput = "---\n- 1\n- 2\n- 3\n---\nHi there!\n...\n...\n...\n---\n! bar"; } void ImplicitDocStart(YAML::Emitter& out, std::string& desiredOutput) { out << "Hi"; out << "Bye"; out << "Oops"; desiredOutput = "Hi\n---\nBye\n---\nOops"; } void EmptyString(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::BeginMap; out << YAML::Key << "key" << YAML::Value << ""; out << YAML::EndMap; desiredOutput = "key: \"\""; } void SingleChar(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::BeginSeq; out << 'a'; out << ':'; out << (char)0x10; out << '\n'; out << ' '; out << '\t'; out << YAML::EndSeq; desiredOutput = "- a\n- \":\"\n- \"\\x10\"\n- \"\\n\"\n- \" \"\n- \"\\t\""; } void DefaultPrecision(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::BeginSeq; out << 1.234f; out << 3.14159265358979; out << YAML::EndSeq; desiredOutput = "- 1.234\n- 3.14159265358979"; } void SetPrecision(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::BeginSeq; out << YAML::FloatPrecision(3) << 1.234f; out << YAML::DoublePrecision(6) << 3.14159265358979; out << YAML::EndSeq; desiredOutput = "- 1.23\n- 3.14159"; } void DashInBlockContext(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::BeginMap; out << YAML::Key << "key" << YAML::Value << "-"; out << YAML::EndMap; desiredOutput = "key: \"-\""; } void HexAndOct(YAML::Emitter& out, std::string& desiredOutput) { out << YAML::Flow << YAML::BeginSeq; out << 31; out << YAML::Hex << 31; out << YAML::Oct << 31; out << YAML::EndSeq; desiredOutput = "[31, 0x1f, 037]"; } //////////////////////////////////////////////////////////////////////////////////////////////////////// // incorrect emitting void ExtraEndSeq(YAML::Emitter& out, std::string& desiredError) { desiredError = YAML::ErrorMsg::UNEXPECTED_END_SEQ; out << YAML::BeginSeq; out << "Hello"; out << "World"; out << YAML::EndSeq; out << YAML::EndSeq; } void ExtraEndMap(YAML::Emitter& out, std::string& desiredError) { desiredError = YAML::ErrorMsg::UNEXPECTED_END_MAP; out << YAML::BeginMap; out << YAML::Key << "Hello" << YAML::Value << "World"; out << YAML::EndMap; out << YAML::EndMap; } void BadSingleQuoted(YAML::Emitter& out, std::string& desiredError) { desiredError = YAML::ErrorMsg::SINGLE_QUOTED_CHAR; out << YAML::SingleQuoted << "Hello\nWorld"; } void InvalidAnchor(YAML::Emitter& out, std::string& desiredError) { desiredError = YAML::ErrorMsg::INVALID_ANCHOR; out << YAML::BeginSeq; out << YAML::Anchor("new\nline") << "Test"; out << YAML::EndSeq; } void InvalidAlias(YAML::Emitter& out, std::string& desiredError) { desiredError = YAML::ErrorMsg::INVALID_ALIAS; out << YAML::BeginSeq; out << YAML::Alias("new\nline"); out << YAML::EndSeq; } void MissingKey(YAML::Emitter& out, std::string& desiredError) { desiredError = YAML::ErrorMsg::EXPECTED_KEY_TOKEN; out << YAML::BeginMap; out << YAML::Key << "key" << YAML::Value << "value"; out << "missing key" << YAML::Value << "value"; out << YAML::EndMap; } void MissingValue(YAML::Emitter& out, std::string& desiredError) { desiredError = YAML::ErrorMsg::EXPECTED_VALUE_TOKEN; out << YAML::BeginMap; out << YAML::Key << "key" << "value"; out << YAML::EndMap; } void UnexpectedKey(YAML::Emitter& out, std::string& desiredError) { desiredError = YAML::ErrorMsg::UNEXPECTED_KEY_TOKEN; out << YAML::BeginSeq; out << YAML::Key << "hi"; out << YAML::EndSeq; } void UnexpectedValue(YAML::Emitter& out, std::string& desiredError) { desiredError = YAML::ErrorMsg::UNEXPECTED_VALUE_TOKEN; out << YAML::BeginSeq; out << YAML::Value << "hi"; out << YAML::EndSeq; } } namespace { void RunEmitterTest(void (*test)(YAML::Emitter&, std::string&), const std::string& name, int& passed, int& total) { YAML::Emitter out; std::string desiredOutput; test(out, desiredOutput); std::string output = out.c_str(); std::string lastError = out.GetLastError(); if(output == desiredOutput) { try { std::stringstream stream(output); YAML::Parser parser; YAML::Node node; parser.GetNextDocument(node); passed++; } catch(const YAML::Exception& e) { std::cout << "Emitter test failed: " << name << "\n"; std::cout << "Parsing output error: " << e.what() << "\n"; } } else { std::cout << "Emitter test failed: " << name << "\n"; std::cout << "Output:\n"; std::cout << output << "<<<\n"; std::cout << "Desired output:\n"; std::cout << desiredOutput << "<<<\n"; if(!out.good()) std::cout << "Emitter error: " << lastError << "\n"; } total++; } void RunEmitterErrorTest(void (*test)(YAML::Emitter&, std::string&), const std::string& name, int& passed, int& total) { YAML::Emitter out; std::string desiredError; test(out, desiredError); std::string lastError = out.GetLastError(); if(!out.good() && lastError == desiredError) { passed++; } else { std::cout << "Emitter test failed: " << name << "\n"; if(out.good()) std::cout << "No error detected\n"; else std::cout << "Detected error: " << lastError << "\n"; std::cout << "Expected error: " << desiredError << "\n"; } total++; } } bool RunEmitterTests() { int passed = 0; int total = 0; RunEmitterTest(&Emitter::SimpleScalar, "simple scalar", passed, total); RunEmitterTest(&Emitter::SimpleSeq, "simple seq", passed, total); RunEmitterTest(&Emitter::SimpleFlowSeq, "simple flow seq", passed, total); RunEmitterTest(&Emitter::EmptyFlowSeq, "empty flow seq", passed, total); RunEmitterTest(&Emitter::NestedBlockSeq, "nested block seq", passed, total); RunEmitterTest(&Emitter::NestedFlowSeq, "nested flow seq", passed, total); RunEmitterTest(&Emitter::SimpleMap, "simple map", passed, total); RunEmitterTest(&Emitter::SimpleFlowMap, "simple flow map", passed, total); RunEmitterTest(&Emitter::MapAndList, "map and list", passed, total); RunEmitterTest(&Emitter::ListAndMap, "list and map", passed, total); RunEmitterTest(&Emitter::NestedBlockMap, "nested block map", passed, total); RunEmitterTest(&Emitter::NestedFlowMap, "nested flow map", passed, total); RunEmitterTest(&Emitter::MapListMix, "map list mix", passed, total); RunEmitterTest(&Emitter::SimpleLongKey, "simple long key", passed, total); RunEmitterTest(&Emitter::SingleLongKey, "single long key", passed, total); RunEmitterTest(&Emitter::ComplexLongKey, "complex long key", passed, total); RunEmitterTest(&Emitter::AutoLongKey, "auto long key", passed, total); RunEmitterTest(&Emitter::ScalarFormat, "scalar format", passed, total); RunEmitterTest(&Emitter::AutoLongKeyScalar, "auto long key scalar", passed, total); RunEmitterTest(&Emitter::LongKeyFlowMap, "long key flow map", passed, total); RunEmitterTest(&Emitter::BlockMapAsKey, "block map as key", passed, total); RunEmitterTest(&Emitter::AliasAndAnchor, "alias and anchor", passed, total); RunEmitterTest(&Emitter::AliasAndAnchorWithNull, "alias and anchor with null", passed, total); RunEmitterTest(&Emitter::AliasAndAnchorInFlow, "alias and anchor in flow", passed, total); RunEmitterTest(&Emitter::SimpleVerbatimTag, "simple verbatim tag", passed, total); RunEmitterTest(&Emitter::VerbatimTagInBlockSeq, "verbatim tag in block seq", passed, total); RunEmitterTest(&Emitter::VerbatimTagInFlowSeq, "verbatim tag in flow seq", passed, total); RunEmitterTest(&Emitter::VerbatimTagInFlowSeqWithNull, "verbatim tag in flow seq with null", passed, total); RunEmitterTest(&Emitter::VerbatimTagInBlockMap, "verbatim tag in block map", passed, total); RunEmitterTest(&Emitter::VerbatimTagInFlowMap, "verbatim tag in flow map", passed, total); RunEmitterTest(&Emitter::VerbatimTagInFlowMapWithNull, "verbatim tag in flow map with null", passed, total); RunEmitterTest(&Emitter::VerbatimTagWithEmptySeq, "verbatim tag with empty seq", passed, total); RunEmitterTest(&Emitter::VerbatimTagWithEmptyMap, "verbatim tag with empty map", passed, total); RunEmitterTest(&Emitter::VerbatimTagWithEmptySeqAndMap, "verbatim tag with empty seq and map", passed, total); RunEmitterTest(&Emitter::ByKindTagWithScalar, "by-kind tag with scalar", passed, total); RunEmitterTest(&Emitter::LocalTagWithScalar, "local tag with scalar", passed, total); RunEmitterTest(&Emitter::ComplexDoc, "complex doc", passed, total); RunEmitterTest(&Emitter::STLContainers, "STL containers", passed, total); RunEmitterTest(&Emitter::SimpleComment, "simple comment", passed, total); RunEmitterTest(&Emitter::MultiLineComment, "multi-line comment", passed, total); RunEmitterTest(&Emitter::ComplexComments, "complex comments", passed, total); RunEmitterTest(&Emitter::InitialComment, "initial comment", passed, total); RunEmitterTest(&Emitter::InitialCommentWithDocIndicator, "initial comment with doc indicator", passed, total); RunEmitterTest(&Emitter::CommentInFlowSeq, "comment in flow seq", passed, total); RunEmitterTest(&Emitter::CommentInFlowMap, "comment in flow map", passed, total); RunEmitterTest(&Emitter::Indentation, "indentation", passed, total); RunEmitterTest(&Emitter::SimpleGlobalSettings, "simple global settings", passed, total); RunEmitterTest(&Emitter::ComplexGlobalSettings, "complex global settings", passed, total); RunEmitterTest(&Emitter::Null, "null", passed, total); RunEmitterTest(&Emitter::EscapedUnicode, "escaped unicode", passed, total); RunEmitterTest(&Emitter::Unicode, "unicode", passed, total); RunEmitterTest(&Emitter::DoubleQuotedUnicode, "double quoted unicode", passed, total); RunEmitterTest(&Emitter::UserType, "user type", passed, total); RunEmitterTest(&Emitter::UserTypeInContainer, "user type in container", passed, total); RunEmitterTest(&Emitter::PointerToInt, "pointer to int", passed, total); RunEmitterTest(&Emitter::PointerToUserType, "pointer to user type", passed, total); RunEmitterTest(&Emitter::NewlineAtEnd, "newline at end", passed, total); RunEmitterTest(&Emitter::NewlineInBlockSequence, "newline in block sequence", passed, total); RunEmitterTest(&Emitter::NewlineInFlowSequence, "newline in flow sequence", passed, total); RunEmitterTest(&Emitter::NewlineInBlockMap, "newline in block map", passed, total); RunEmitterTest(&Emitter::NewlineInFlowMap, "newline in flow map", passed, total); RunEmitterTest(&Emitter::LotsOfNewlines, "lots of newlines", passed, total); RunEmitterTest(&Emitter::Binary, "binary", passed, total); RunEmitterTest(&Emitter::LongBinary, "long binary", passed, total); RunEmitterTest(&Emitter::EmptyBinary, "empty binary", passed, total); RunEmitterTest(&Emitter::ColonAtEndOfScalar, "colon at end of scalar", passed, total); RunEmitterTest(&Emitter::ColonAsScalar, "colon as scalar", passed, total); RunEmitterTest(&Emitter::ColonAtEndOfScalarInFlow, "colon at end of scalar in flow", passed, total); RunEmitterTest(&Emitter::BoolFormatting, "bool formatting", passed, total); RunEmitterTest(&Emitter::DocStartAndEnd, "doc start and end", passed, total); RunEmitterTest(&Emitter::ImplicitDocStart, "implicit doc start", passed, total); RunEmitterTest(&Emitter::EmptyString, "empty string", passed, total); RunEmitterTest(&Emitter::SingleChar, "single char", passed, total); RunEmitterTest(&Emitter::DefaultPrecision, "default precision", passed, total); RunEmitterTest(&Emitter::SetPrecision, "set precision", passed, total); RunEmitterTest(&Emitter::DashInBlockContext, "dash in block context", passed, total); RunEmitterTest(&Emitter::HexAndOct, "hex and oct", passed, total); RunEmitterErrorTest(&Emitter::ExtraEndSeq, "extra EndSeq", passed, total); RunEmitterErrorTest(&Emitter::ExtraEndMap, "extra EndMap", passed, total); RunEmitterErrorTest(&Emitter::BadSingleQuoted, "bad single quoted string", passed, total); RunEmitterErrorTest(&Emitter::InvalidAnchor, "invalid anchor", passed, total); RunEmitterErrorTest(&Emitter::InvalidAlias, "invalid alias", passed, total); RunEmitterErrorTest(&Emitter::MissingKey, "missing key", passed, total); RunEmitterErrorTest(&Emitter::MissingValue, "missing value", passed, total); RunEmitterErrorTest(&Emitter::UnexpectedKey, "unexpected key", passed, total); RunEmitterErrorTest(&Emitter::UnexpectedValue, "unexpected value", passed, total); RunEmitterErrorTest(&Emitter::BadLocalTag, "bad local tag", passed, total); std::cout << "Emitter tests: " << passed << "/" << total << " passed\n"; return passed == total; } } SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/test/main.cpp0000664000175000017500000000007711723131175027016 0ustar dandan#include "tests.h" int main() { Test::RunAll(); return 0; } SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/test/CMakeLists.txt0000664000175000017500000000055211723131175030124 0ustar dandanfile(GLOB test_headers [a-z]*.h) file(GLOB test_sources [a-z]*.cpp) file(GLOB test_old_api_sources old-api/[a-z]*.cpp) list(APPEND test_sources ${test_old_api_sources}) include_directories(${YAML_CPP_SOURCE_DIR}/test) add_executable(run-tests ${test_sources} ${test_headers} ) target_link_libraries(run-tests yaml-cpp) add_test(yaml-reader-test run-tests) SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/test/parsertests.h0000664000175000017500000000062211723131175030112 0ustar dandan#ifndef PARSERTESTS_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #define PARSERTESTS_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #if defined(_MSC_VER) || (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 #pragma once #endif namespace Test { bool RunParserTests(); } #endif // PARSERTESTS_H_62B23520_7C8E_11DE_8A39_0800200C9A66 SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/test/spectests.h0000664000175000017500000001222411723131175027551 0ustar dandan#ifndef SPECTESTS_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #define SPECTESTS_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #if defined(_MSC_VER) || (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 #pragma once #endif #include namespace Test { struct TEST { TEST(): ok(false) {} TEST(bool ok_): ok(ok_) {} TEST(const char *error_): ok(false), error(error_) {} bool ok; std::string error; }; namespace Spec { // 2.1 TEST SeqScalars(); // 2.2 TEST MappingScalarsToScalars(); // 2.3 TEST MappingScalarsToSequences(); // 2.4 TEST SequenceOfMappings(); // 2.5 TEST SequenceOfSequences(); // 2.6 TEST MappingOfMappings(); // 2.7 TEST TwoDocumentsInAStream(); // 2.8 TEST PlayByPlayFeed(); // 2.9 TEST SingleDocumentWithTwoComments(); // 2.10 TEST SimpleAnchor(); // 2.11 TEST MappingBetweenSequences(); // 2.12 TEST CompactNestedMapping(); // 2.13 TEST InLiteralsNewlinesArePreserved(); // 2.14 TEST InFoldedScalarsNewlinesBecomeSpaces(); // 2.15 TEST FoldedNewlinesArePreservedForMoreIndentedAndBlankLines(); // 2.16 TEST IndentationDeterminesScope(); // 2.17 TEST QuotedScalars(); // 2.18 TEST MultiLineFlowScalars(); // TODO: 2.19 - 2.22 schema tags // 2.23 TEST VariousExplicitTags(); // 2.24 TEST GlobalTags(); // 2.25 TEST UnorderedSets(); // 2.26 TEST OrderedMappings(); // 2.27 TEST Invoice(); // 2.28 TEST LogFile(); // TODO: 5.1 - 5.2 BOM // 5.3 TEST BlockStructureIndicators(); // 5.4 TEST FlowStructureIndicators(); // 5.5 TEST CommentIndicator(); // 5.6 TEST NodePropertyIndicators(); // 5.7 TEST BlockScalarIndicators(); // 5.8 TEST QuotedScalarIndicators(); // TODO: 5.9 directive // TODO: 5.10 reserved indicator // 5.11 TEST LineBreakCharacters(); // 5.12 TEST TabsAndSpaces(); // 5.13 TEST EscapedCharacters(); // 5.14 TEST InvalidEscapedCharacters(); // 6.1 TEST IndentationSpaces(); // 6.2 TEST IndentationIndicators(); // 6.3 TEST SeparationSpaces(); // 6.4 TEST LinePrefixes(); // 6.5 TEST EmptyLines(); // 6.6 TEST LineFolding(); // 6.7 TEST BlockFolding(); // 6.8 TEST FlowFolding(); // 6.9 TEST SeparatedComment(); // 6.10 TEST CommentLines(); // 6.11 TEST MultiLineComments(); // 6.12 TEST SeparationSpacesII(); // 6.13 TEST ReservedDirectives(); // 6.14 TEST YAMLDirective(); // 6.15 TEST InvalidRepeatedYAMLDirective(); // 6.16 TEST TagDirective(); // 6.17 TEST InvalidRepeatedTagDirective(); // 6.18 TEST PrimaryTagHandle(); // 6.19 TEST SecondaryTagHandle(); // 6.20 TEST TagHandles(); // 6.21 TEST LocalTagPrefix(); // 6.22 TEST GlobalTagPrefix(); // 6.23 TEST NodeProperties(); // 6.24 TEST VerbatimTags(); // 6.25 TEST InvalidVerbatimTags(); // 6.26 TEST TagShorthands(); // 6.27 TEST InvalidTagShorthands(); // 6.28 TEST NonSpecificTags(); // 6.29 TEST NodeAnchors(); // 7.1 TEST AliasNodes(); // 7.2 TEST EmptyNodes(); // 7.3 TEST CompletelyEmptyNodes(); // 7.4 TEST DoubleQuotedImplicitKeys(); // 7.5 TEST DoubleQuotedLineBreaks(); // 7.6 TEST DoubleQuotedLines(); // 7.7 TEST SingleQuotedCharacters(); // 7.8 TEST SingleQuotedImplicitKeys(); // 7.9 TEST SingleQuotedLines(); // 7.10 TEST PlainCharacters(); // 7.11 TEST PlainImplicitKeys(); // 7.12 TEST PlainLines(); // 7.13 TEST FlowSequence(); // 7.14 TEST FlowSequenceEntries(); // 7.15 TEST FlowMappings(); // 7.16 TEST FlowMappingEntries(); // 7.17 TEST FlowMappingSeparateValues(); // 7.18 TEST FlowMappingAdjacentValues(); // 7.19 TEST SinglePairFlowMappings(); // 7.20 TEST SinglePairExplicitEntry(); // 7.21 TEST SinglePairImplicitEntries(); // 7.22 TEST InvalidImplicitKeys(); // 7.23 TEST FlowContent(); // 7.24 TEST FlowNodes(); // 8.1 TEST BlockScalarHeader(); // 8.2 TEST BlockIndentationHeader(); // 8.3 TEST InvalidBlockScalarIndentationIndicators(); // 8.4 TEST ChompingFinalLineBreak(); // 8.5 TEST ChompingTrailingLines(); // 8.6 TEST EmptyScalarChomping(); // 8.7 TEST LiteralScalar(); // 8.8 TEST LiteralContent(); // 8.9 TEST FoldedScalar(); // 8.10 TEST FoldedLines(); // 8.11 TEST MoreIndentedLines(); // 8.12 TEST EmptySeparationLines(); // 8.13 TEST FinalEmptyLines(); // 8.14 TEST BlockSequence(); // 8.15 TEST BlockSequenceEntryTypes(); // 8.16 TEST BlockMappings(); // 8.17 TEST ExplicitBlockMappingEntries(); // 8.18 TEST ImplicitBlockMappingEntries(); // 8.19 TEST CompactBlockMappings(); // 8.20 TEST BlockNodeTypes(); // 8.21 TEST BlockScalarNodes(); // 8.22 TEST BlockCollectionNodes(); } bool RunSpecTests(); } #endif // SPECTESTS_H_62B23520_7C8E_11DE_8A39_0800200C9A66 SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/CMakeLists.txt0000664000175000017500000001772411723131175027156 0ustar dandan### ### CMake settings ### ## Due to Mac OSX we need to keep compatibility with CMake 2.6 # see http://www.cmake.org/Wiki/CMake_Policies cmake_minimum_required(VERSION 2.6) # see http://www.cmake.org/cmake/help/cmake-2-8-docs.html#policy:CMP0012 if(POLICY CMP0012) cmake_policy(SET CMP0012 OLD) endif() # see http://www.cmake.org/cmake/help/cmake-2-8-docs.html#policy:CMP0015 if(POLICY CMP0015) cmake_policy(SET CMP0015 OLD) endif() include(CheckCXXCompilerFlag) ### ### Project settings ### project(YAML_CPP) set(YAML_CPP_VERSION_MAJOR "0") set(YAML_CPP_VERSION_MINOR "3") set(YAML_CPP_VERSION_PATCH "0") set(YAML_CPP_VERSION "${YAML_CPP_VERSION_MAJOR}.${YAML_CPP_VERSION_MINOR}.${YAML_CPP_VERSION_PATCH}") enable_testing() ### ### Project options ### ## Project stuff option(YAML_CPP_BUILD_TOOLS "Enable testing and parse tools" ON) option(YAML_CPP_BUILD_CONTRIB "Enable contrib stuff in library" ON) ## Build options # --> General # see http://www.cmake.org/cmake/help/cmake2.6docs.html#variable:BUILD_SHARED_LIBS # http://www.cmake.org/cmake/help/cmake2.6docs.html#command:add_library option(BUILD_SHARED_LIBS "Build Shared Libraries" OFF) # --> Apple option(APPLE_UNIVERSAL_BIN "Apple: Build universal binary" OFF) # --> Microsoft Visual C++ # see http://msdn.microsoft.com/en-us/library/aa278396(v=VS.60).aspx # http://msdn.microsoft.com/en-us/library/2kzt1wy3(v=VS.71).aspx option(MSVC_SHARED_RT "MSVC: Build with shared runtime libs (/MD)" ON) option(MSVC_STHREADED_RT "MSVC: Build with single-threaded static runtime libs (/ML until VS .NET 2003)" OFF) ### ### Sources, headers, directories and libs ### set(header_directory "include/yaml-cpp/") file(GLOB sources "src/[a-zA-Z]*.cpp") file(GLOB public_headers "include/yaml-cpp/[a-zA-Z]*.h") file(GLOB private_headers "src/[a-zA-Z]*.h") if(YAML_CPP_BUILD_CONTRIB) file(GLOB contrib_sources "src/contrib/[a-zA-Z]*.cpp") file(GLOB contrib_public_headers "include/yaml-cpp/contrib/[a-zA-Z]*.h") file(GLOB contrib_private_headers "src/contrib/[a-zA-Z]*.h") else() add_definitions(-DYAML_CPP_NO_CONTRIB) endif() if(VERBOSE) message(STATUS "sources: ${sources}") message(STATUS "public_headers: ${public_headers}") message(STATUS "private_headers: ${private_headers}") message(STATUS "contrib_sources: ${contrib_sources}") message(STATUS "contrib_public_headers: ${contrib_public_headers}") message(STATUS "contrib_private_headers: ${contrib_private_headers}") endif() include_directories(${YAML_CPP_SOURCE_DIR}/include) include_directories(${YAML_CPP_SOURCE_DIR}/src) ### ### General compilation settings ### if(BUILD_SHARED_LIBS) set(LABEL_SUFFIX "shared") else() set(LABEL_SUFFIX "static") endif() if(APPLE) if(APPLE_UNIVERSAL_BIN) set(CMAKE_OSX_ARCHITECTURES ppc;i386) endif() endif() if(IPHONE) set(CMAKE_OSX_SYSROOT "iphoneos4.2") set(CMAKE_OSX_ARCHITECTURES "armv6;armv7") endif() if(WIN32) if(BUILD_SHARED_LIBS) add_definitions(-D${PROJECT_NAME}_DLL) # use or build Windows DLL endif() if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) set(CMAKE_INSTALL_PREFIX "C:/") endif() endif() # GCC specialities if(CMAKE_COMPILER_IS_GNUCXX) ### General stuff if(WIN32) set(CMAKE_SHARED_LIBRARY_PREFIX "") # DLLs do not have a "lib" prefix set(CMAKE_IMPORT_LIBRARY_PREFIX "") # same for DLL import libs set(CMAKE_LINK_DEF_FILE_FLAG "") # CMake workaround (2.8.3) endif() ### Project stuff if(NOT CMAKE_CONFIGURATION_TYPES AND NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE Release) endif() # set(CMAKE_CXX_FLAGS_RELEASE "-O2") set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g") set(CMAKE_CXX_FLAGS_DEBUG "-g") set(CMAKE_CXX_FLAGS_MINSIZEREL "-Os") # set(GCC_EXTRA_OPTIONS "") # set(FLAG_TESTED "-Wextra") check_cxx_compiler_flag(${FLAG_TESTED} FLAG_WEXTRA) if(FLAG_WEXTRA) set(GCC_EXTRA_OPTIONS "${GCC_EXTRA_OPTIONS} ${FLAG_TESTED}") endif() # set(CMAKE_CXX_FLAGS "-Wall ${GCC_EXTRA_OPTIONS} -pedantic -Wno-long-long ${CMAKE_CXX_FLAGS}") # add_custom_target(debuggable $(MAKE) clean COMMAND ${CMAKE_COMMAND} -DCMAKE_BUILD_TYPE=Debug ${CMAKE_SOURCE_DIR} COMMENT "Adjusting settings for debug compilation" VERBATIM) add_custom_target(releasable $(MAKE) clean COMMAND ${CMAKE_COMMAND} -DCMAKE_BUILD_TYPE=Release ${CMAKE_SOURCE_DIR} COMMENT "Adjusting settings for release compilation" VERBATIM) endif() # Microsoft VisualC++ specialities if(MSVC) ### General stuff # a) Change MSVC runtime library settings (/MD[d], /MT[d], /ML[d] (single-threaded until VS 2003)) # plus set lib suffix for later use and project label accordingly # see http://msdn.microsoft.com/en-us/library/aa278396(v=VS.60).aspx # http://msdn.microsoft.com/en-us/library/2kzt1wy3(v=VS.71).aspx set(LIB_RT_SUFFIX "md") # CMake defaults to /MD for MSVC set(LIB_RT_OPTION "/MD") # if(NOT MSVC_SHARED_RT) # User wants to have static runtime libraries (/MT, /ML) if(MSVC_STHREADED_RT) # User wants to have old single-threaded static runtime libraries set(LIB_RT_SUFFIX "ml") set(LIB_RT_OPTION "/ML") if(NOT ${MSVC_VERSION} LESS 1400) message(FATAL_ERROR "Single-threaded static runtime libraries (/ML) only available until VS .NET 2003 (7.1).") endif() else() set(LIB_RT_SUFFIX "mt") set(LIB_RT_OPTION "/MT") endif() # correct linker options foreach(flag_var CMAKE_C_FLAGS CMAKE_CXX_FLAGS) foreach(config_name "" DEBUG RELEASE MINSIZEREL RELWITHDEBINFO) set(var_name "${flag_var}") if(NOT "${config_name}" STREQUAL "") set(var_name "${var_name}_${config_name}") endif() string(REPLACE "/MD" "${LIB_RT_OPTION}" ${var_name} "${${var_name}}") endforeach() endforeach() endif() # set(LABEL_SUFFIX "${LABEL_SUFFIX} ${LIB_RT_SUFFIX}") # b) Change prefix for static libraries set(CMAKE_STATIC_LIBRARY_PREFIX "lib") # to distinguish static libraries from DLL import libs # c) Correct suffixes for static libraries if(NOT BUILD_SHARED_LIBS) ### General stuff set(LIB_TARGET_SUFFIX "${LIB_SUFFIX}${LIB_RT_SUFFIX}") endif() ### Project stuff # /W3 = set warning level; see http://msdn.microsoft.com/en-us/library/thxezb7y.aspx # /wd4127 = disable warning C4127 "conditional expression is constant"; see http://msdn.microsoft.com/en-us/library/6t66728h.aspx # /wd4355 = disable warning C4355 "'this' : used in base member initializer list"; http://msdn.microsoft.com/en-us/library/3c594ae3.aspx set(CMAKE_CXX_FLAGS "/W3 /wd4127 /wd4355 /D_SCL_SECURE_NO_WARNINGS ${CMAKE_CXX_FLAGS}") endif() ### ### General install settings ### if(WIN32) set(_library_dir bin) # .dll are in PATH, like executables else() set(_library_dir lib) endif() set(INCLUDE_INSTALL_ROOT_DIR include) set(INCLUDE_INSTALL_DIR ${INCLUDE_INSTALL_ROOT_DIR}/yaml-cpp) set(LIB_INSTALL_DIR "${_library_dir}${LIB_SUFFIX}") set(_INSTALL_DESTINATIONS RUNTIME DESTINATION bin LIBRARY DESTINATION ${LIB_INSTALL_DIR} ARCHIVE DESTINATION "lib${LIB_SUFFIX}" ) ### ### Library ### add_library(yaml-cpp ${sources} ${public_headers} ${private_headers} ${contrib_sources} ${contrib_public_headers} ${contrib_private_headers} ) set_target_properties(yaml-cpp PROPERTIES VERSION "${YAML_CPP_VERSION}" SOVERSION "${YAML_CPP_VERSION_MAJOR}.${YAML_CPP_VERSION_MINOR}" PROJECT_LABEL "yaml-cpp ${LABEL_SUFFIX}" ) if(IPHONE) set_target_properties(yaml-cpp PROPERTIES XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET "3.0" ) endif() if(MSVC) if(NOT BUILD_SHARED_LIBS) # correct library names set_target_properties(yaml-cpp PROPERTIES DEBUG_POSTFIX "${LIB_TARGET_SUFFIX}d" RELEASE_POSTFIX "${LIB_TARGET_SUFFIX}" MINSIZEREL_POSTFIX "${LIB_TARGET_SUFFIX}" RELWITHDEBINFO_POSTFIX "${LIB_TARGET_SUFFIX}" ) endif() endif() install(TARGETS yaml-cpp ${_INSTALL_DESTINATIONS}) install( DIRECTORY ${header_directory} DESTINATION ${INCLUDE_INSTALL_DIR} FILES_MATCHING PATTERN "*.h" ) if(UNIX) set(PC_FILE ${CMAKE_BINARY_DIR}/yaml-cpp.pc) configure_file("yaml-cpp.pc.cmake" ${PC_FILE} @ONLY) install(FILES ${PC_FILE} DESTINATION ${LIB_INSTALL_DIR}/pkgconfig) endif() ### ### Extras ### if(YAML_CPP_BUILD_TOOLS) add_subdirectory(test) add_subdirectory(util) endif() SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/yaml-cpp.pc.cmake0000664000175000017500000000045611723131175027535 0ustar dandanprefix=@CMAKE_INSTALL_PREFIX@ exec_prefix=@CMAKE_INSTALL_PREFIX@ libdir=${prefix}/@LIB_INSTALL_DIR@ includedir=${prefix}/@INCLUDE_INSTALL_ROOT_DIR@ Name: Yaml-cpp Description: A YAML parser and emitter for C++ Version: @YAML_CPP_VERSION@ Requires: Libs: -L${libdir} -lyaml-cpp Cflags: -I${includedir} SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/include/0000775000175000017500000000000012110505246026021 5ustar dandanSuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/include/yaml-cpp/0000775000175000017500000000000012110505246027543 5ustar dandan././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/include/yaml-cpp/exceptions.hSuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/include/yaml-cpp/exception0000664000175000017500000001560011723131175031473 0ustar dandan#ifndef EXCEPTIONS_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #define EXCEPTIONS_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #if defined(_MSC_VER) || (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 #pragma once #endif #include "yaml-cpp/mark.h" #include "yaml-cpp/traits.h" #include #include #include namespace YAML { // error messages namespace ErrorMsg { const char * const YAML_DIRECTIVE_ARGS = "YAML directives must have exactly one argument"; const char * const YAML_VERSION = "bad YAML version: "; const char * const YAML_MAJOR_VERSION = "YAML major version too large"; const char * const REPEATED_YAML_DIRECTIVE= "repeated YAML directive"; const char * const TAG_DIRECTIVE_ARGS = "TAG directives must have exactly two arguments"; const char * const REPEATED_TAG_DIRECTIVE = "repeated TAG directive"; const char * const CHAR_IN_TAG_HANDLE = "illegal character found while scanning tag handle"; const char * const TAG_WITH_NO_SUFFIX = "tag handle with no suffix"; const char * const END_OF_VERBATIM_TAG = "end of verbatim tag not found"; const char * const END_OF_MAP = "end of map not found"; const char * const END_OF_MAP_FLOW = "end of map flow not found"; const char * const END_OF_SEQ = "end of sequence not found"; const char * const END_OF_SEQ_FLOW = "end of sequence flow not found"; const char * const MULTIPLE_TAGS = "cannot assign multiple tags to the same node"; const char * const MULTIPLE_ANCHORS = "cannot assign multiple anchors to the same node"; const char * const MULTIPLE_ALIASES = "cannot assign multiple aliases to the same node"; const char * const ALIAS_CONTENT = "aliases can't have any content, *including* tags"; const char * const INVALID_HEX = "bad character found while scanning hex number"; const char * const INVALID_UNICODE = "invalid unicode: "; const char * const INVALID_ESCAPE = "unknown escape character: "; const char * const UNKNOWN_TOKEN = "unknown token"; const char * const DOC_IN_SCALAR = "illegal document indicator in scalar"; const char * const EOF_IN_SCALAR = "illegal EOF in scalar"; const char * const CHAR_IN_SCALAR = "illegal character in scalar"; const char * const TAB_IN_INDENTATION = "illegal tab when looking for indentation"; const char * const FLOW_END = "illegal flow end"; const char * const BLOCK_ENTRY = "illegal block entry"; const char * const MAP_KEY = "illegal map key"; const char * const MAP_VALUE = "illegal map value"; const char * const ALIAS_NOT_FOUND = "alias not found after *"; const char * const ANCHOR_NOT_FOUND = "anchor not found after &"; const char * const CHAR_IN_ALIAS = "illegal character found while scanning alias"; const char * const CHAR_IN_ANCHOR = "illegal character found while scanning anchor"; const char * const ZERO_INDENT_IN_BLOCK = "cannot set zero indentation for a block scalar"; const char * const CHAR_IN_BLOCK = "unexpected character in block scalar"; const char * const AMBIGUOUS_ANCHOR = "cannot assign the same alias to multiple nodes"; const char * const UNKNOWN_ANCHOR = "the referenced anchor is not defined"; const char * const INVALID_SCALAR = "invalid scalar"; const char * const KEY_NOT_FOUND = "key not found"; const char * const BAD_DEREFERENCE = "bad dereference"; const char * const UNMATCHED_GROUP_TAG = "unmatched group tag"; const char * const UNEXPECTED_END_SEQ = "unexpected end sequence token"; const char * const UNEXPECTED_END_MAP = "unexpected end map token"; const char * const SINGLE_QUOTED_CHAR = "invalid character in single-quoted string"; const char * const INVALID_ANCHOR = "invalid anchor"; const char * const INVALID_ALIAS = "invalid alias"; const char * const INVALID_TAG = "invalid tag"; const char * const EXPECTED_KEY_TOKEN = "expected key token"; const char * const EXPECTED_VALUE_TOKEN = "expected value token"; const char * const UNEXPECTED_KEY_TOKEN = "unexpected key token"; const char * const UNEXPECTED_VALUE_TOKEN = "unexpected value token"; template inline const std::string KEY_NOT_FOUND_WITH_KEY(const T&, typename disable_if >::type * = 0) { return KEY_NOT_FOUND; } inline const std::string KEY_NOT_FOUND_WITH_KEY(const std::string& key) { std::stringstream stream; stream << KEY_NOT_FOUND << ": " << key; return stream.str(); } template inline const std::string KEY_NOT_FOUND_WITH_KEY(const T& key, typename enable_if >::type * = 0) { std::stringstream stream; stream << KEY_NOT_FOUND << ": " << key; return stream.str(); } } class Exception: public std::runtime_error { public: Exception(const Mark& mark_, const std::string& msg_) : std::runtime_error(build_what(mark_, msg_)), mark(mark_), msg(msg_) {} virtual ~Exception() throw() {} Mark mark; std::string msg; private: static const std::string build_what(const Mark& mark, const std::string& msg) { std::stringstream output; output << "yaml-cpp: error at line " << mark.line+1 << ", column " << mark.column+1 << ": " << msg; return output.str(); } }; class ParserException: public Exception { public: ParserException(const Mark& mark_, const std::string& msg_) : Exception(mark_, msg_) {} }; class RepresentationException: public Exception { public: RepresentationException(const Mark& mark_, const std::string& msg_) : Exception(mark_, msg_) {} }; // representation exceptions class InvalidScalar: public RepresentationException { public: InvalidScalar(const Mark& mark_) : RepresentationException(mark_, ErrorMsg::INVALID_SCALAR) {} }; class KeyNotFound: public RepresentationException { public: template KeyNotFound(const Mark& mark_, const T& key_) : RepresentationException(mark_, ErrorMsg::KEY_NOT_FOUND_WITH_KEY(key_)) {} }; template class TypedKeyNotFound: public KeyNotFound { public: TypedKeyNotFound(const Mark& mark_, const T& key_) : KeyNotFound(mark_, key_), key(key_) {} virtual ~TypedKeyNotFound() throw() {} T key; }; template inline TypedKeyNotFound MakeTypedKeyNotFound(const Mark& mark, const T& key) { return TypedKeyNotFound (mark, key); } class BadDereference: public RepresentationException { public: BadDereference() : RepresentationException(Mark::null(), ErrorMsg::BAD_DEREFERENCE) {} }; class EmitterException: public Exception { public: EmitterException(const std::string& msg_) : Exception(Mark::null(), msg_) {} }; } #endif // EXCEPTIONS_H_62B23520_7C8E_11DE_8A39_0800200C9A66 ././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/include/yaml-cpp/nodeimpl.hSuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/include/yaml-cpp/nodeimpl.0000664000175000017500000000402711723131175031363 0ustar dandan#ifndef NODEIMPL_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #define NODEIMPL_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #if defined(_MSC_VER) || (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 #pragma once #endif #include "yaml-cpp/nodeutil.h" #include namespace YAML { // implementation of templated things template inline const T Node::to() const { T value; *this >> value; return value; } template inline typename enable_if >::type operator >> (const Node& node, T& value) { if(!ConvertScalar(node, value)) throw InvalidScalar(node.m_mark); } template inline const Node *Node::FindValue(const T& key) const { switch(m_type) { case NodeType::Null: case NodeType::Scalar: throw BadDereference(); case NodeType::Sequence: return FindFromNodeAtIndex(*this, key); case NodeType::Map: return FindValueForKey(key); } assert(false); throw BadDereference(); } template inline const Node *Node::FindValueForKey(const T& key) const { for(Iterator it=begin();it!=end();++it) { T t; if(it.first().Read(t)) { if(key == t) return &it.second(); } } return 0; } template inline const Node& Node::GetValue(const T& key) const { if(const Node *pValue = FindValue(key)) return *pValue; throw MakeTypedKeyNotFound(m_mark, key); } template inline const Node& Node::operator [] (const T& key) const { return GetValue(key); } inline const Node *Node::FindValue(const char *key) const { return FindValue(std::string(key)); } inline const Node *Node::FindValue(char *key) const { return FindValue(std::string(key)); } inline const Node& Node::operator [] (const char *key) const { return GetValue(std::string(key)); } inline const Node& Node::operator [] (char *key) const { return GetValue(std::string(key)); } } #endif // NODEIMPL_H_62B23520_7C8E_11DE_8A39_0800200C9A66 SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/include/yaml-cpp/emitter.h0000664000175000017500000001414611723131175031400 0ustar dandan#ifndef EMITTER_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #define EMITTER_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #if defined(_MSC_VER) || (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 #pragma once #endif #include "yaml-cpp/dll.h" #include "yaml-cpp/binary.h" #include "yaml-cpp/emittermanip.h" #include "yaml-cpp/ostream.h" #include "yaml-cpp/noncopyable.h" #include "yaml-cpp/null.h" #include #include #include namespace YAML { class EmitterState; class YAML_CPP_API Emitter: private noncopyable { public: Emitter(); ~Emitter(); // output const char *c_str() const; unsigned size() const; // state checking bool good() const; const std::string GetLastError() const; // global setters bool SetOutputCharset(EMITTER_MANIP value); bool SetStringFormat(EMITTER_MANIP value); bool SetBoolFormat(EMITTER_MANIP value); bool SetIntBase(EMITTER_MANIP value); bool SetSeqFormat(EMITTER_MANIP value); bool SetMapFormat(EMITTER_MANIP value); bool SetIndent(unsigned n); bool SetPreCommentIndent(unsigned n); bool SetPostCommentIndent(unsigned n); bool SetFloatPrecision(unsigned n); bool SetDoublePrecision(unsigned n); // local setters Emitter& SetLocalValue(EMITTER_MANIP value); Emitter& SetLocalIndent(const _Indent& indent); Emitter& SetLocalPrecision(const _Precision& precision); // overloads of write Emitter& Write(const std::string& str); Emitter& Write(bool b); Emitter& Write(char ch); Emitter& Write(const _Alias& alias); Emitter& Write(const _Anchor& anchor); Emitter& Write(const _Tag& tag); Emitter& Write(const _Comment& comment); Emitter& Write(const _Null& null); Emitter& Write(const Binary& binary); template Emitter& WriteIntegralType(T value); template Emitter& WriteStreamable(T value); private: void PreWriteIntegralType(std::stringstream& str); void PreWriteStreamable(std::stringstream& str); void PostWriteIntegralType(const std::stringstream& str); void PostWriteStreamable(const std::stringstream& str); template void SetStreamablePrecision(std::stringstream&) {} unsigned GetFloatPrecision() const; unsigned GetDoublePrecision() const; private: void PreAtomicWrite(); bool GotoNextPreAtomicState(); void PostAtomicWrite(); void EmitSeparationIfNecessary(); void EmitBeginDoc(); void EmitEndDoc(); void EmitBeginSeq(); void EmitEndSeq(); void EmitBeginMap(); void EmitEndMap(); void EmitKey(); void EmitValue(); void EmitNewline(); void EmitKindTag(); void EmitTag(bool verbatim, const _Tag& tag); const char *ComputeFullBoolName(bool b) const; bool CanEmitNewline() const; private: ostream m_stream; std::auto_ptr m_pState; }; template inline Emitter& Emitter::WriteIntegralType(T value) { if(!good()) return *this; std::stringstream str; PreWriteIntegralType(str); str << value; PostWriteIntegralType(str); return *this; } template inline Emitter& Emitter::WriteStreamable(T value) { if(!good()) return *this; std::stringstream str; PreWriteStreamable(str); SetStreamablePrecision(str); str << value; PostWriteStreamable(str); return *this; } template<> inline void Emitter::SetStreamablePrecision(std::stringstream& str) { str.precision(GetFloatPrecision()); } template<> inline void Emitter::SetStreamablePrecision(std::stringstream& str) { str.precision(GetDoublePrecision()); } // overloads of insertion inline Emitter& operator << (Emitter& emitter, const std::string& v) { return emitter.Write(v); } inline Emitter& operator << (Emitter& emitter, bool v) { return emitter.Write(v); } inline Emitter& operator << (Emitter& emitter, char v) { return emitter.Write(v); } inline Emitter& operator << (Emitter& emitter, unsigned char v) { return emitter.Write(static_cast(v)); } inline Emitter& operator << (Emitter& emitter, const _Alias& v) { return emitter.Write(v); } inline Emitter& operator << (Emitter& emitter, const _Anchor& v) { return emitter.Write(v); } inline Emitter& operator << (Emitter& emitter, const _Tag& v) { return emitter.Write(v); } inline Emitter& operator << (Emitter& emitter, const _Comment& v) { return emitter.Write(v); } inline Emitter& operator << (Emitter& emitter, const _Null& v) { return emitter.Write(v); } inline Emitter& operator << (Emitter& emitter, const Binary& b) { return emitter.Write(b); } inline Emitter& operator << (Emitter& emitter, const char *v) { return emitter.Write(std::string(v)); } inline Emitter& operator << (Emitter& emitter, int v) { return emitter.WriteIntegralType(v); } inline Emitter& operator << (Emitter& emitter, unsigned int v) { return emitter.WriteIntegralType(v); } inline Emitter& operator << (Emitter& emitter, short v) { return emitter.WriteIntegralType(v); } inline Emitter& operator << (Emitter& emitter, unsigned short v) { return emitter.WriteIntegralType(v); } inline Emitter& operator << (Emitter& emitter, long v) { return emitter.WriteIntegralType(v); } inline Emitter& operator << (Emitter& emitter, unsigned long v) { return emitter.WriteIntegralType(v); } inline Emitter& operator << (Emitter& emitter, long long v) { return emitter.WriteIntegralType(v); } inline Emitter& operator << (Emitter& emitter, unsigned long long v) { return emitter.WriteIntegralType(v); } inline Emitter& operator << (Emitter& emitter, float v) { return emitter.WriteStreamable(v); } inline Emitter& operator << (Emitter& emitter, double v) { return emitter.WriteStreamable(v); } inline Emitter& operator << (Emitter& emitter, EMITTER_MANIP value) { return emitter.SetLocalValue(value); } inline Emitter& operator << (Emitter& emitter, _Indent indent) { return emitter.SetLocalIndent(indent); } inline Emitter& operator << (Emitter& emitter, _Precision precision) { return emitter.SetLocalPrecision(precision); } } #endif // EMITTER_H_62B23520_7C8E_11DE_8A39_0800200C9A66 ././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/include/yaml-cpp/nodereadimpl.hSuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/include/yaml-cpp/nodereadi0000664000175000017500000000440411723131175031427 0ustar dandan#ifndef NODEREADIMPL_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #define NODEREADIMPL_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #if defined(_MSC_VER) || (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 #pragma once #endif namespace YAML { // implementation for Node::Read // (the goal is to call ConvertScalar if we can, and fall back to operator >> if not) // thanks to litb from stackoverflow.com // http://stackoverflow.com/questions/1386183/how-to-call-a-templated-function-if-it-exists-and-something-else-otherwise/1386390#1386390 // Note: this doesn't work on gcc 3.2, but does on gcc 3.4 and above. I'm not sure about 3.3. #if __GNUC__ && (__GNUC__ < 3 || (__GNUC__ == 3 && __GNUC_MINOR__ <= 3)) // trick doesn't work? Just fall back to ConvertScalar. // This means that we can't use any user-defined types as keys in a map template inline bool Node::Read(T& value) const { return ConvertScalar(*this, value); } #else // usual case: the trick! template struct read_impl; // ConvertScalar available template<> struct read_impl { template static bool read(const Node& node, T& value) { return ConvertScalar(node, value); } }; // ConvertScalar not available template<> struct read_impl { template static bool read(const Node& node, T& value) { try { node >> value; } catch(const Exception&) { return false; } return true; } }; namespace fallback { // sizeof > 1 struct flag { char c[2]; }; flag Convert(...); int operator,(flag, flag); template char operator,(flag, T const&); char operator,(int, flag); int operator,(char, flag); } template inline bool Node::Read(T& value) const { using namespace fallback; return read_impl::read(*this, value); } #endif // done with trick // the main conversion function template inline bool ConvertScalar(const Node& node, T& value) { std::string scalar; if(!node.GetScalar(scalar)) return false; return Convert(scalar, value); } } #endif // NODEREADIMPL_H_62B23520_7C8E_11DE_8A39_0800200C9A66 SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/include/yaml-cpp/binary.h0000664000175000017500000000420111723131175031202 0ustar dandan#ifndef BASE64_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #define BASE64_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #if defined(_MSC_VER) || (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 #pragma once #endif #include #include namespace YAML { class Node; std::string EncodeBase64(const unsigned char *data, std::size_t size); std::vector DecodeBase64(const std::string& input); class Binary { public: Binary(): m_unownedData(0), m_unownedSize(0) {} Binary(const unsigned char *data, std::size_t size): m_unownedData(data), m_unownedSize(size) {} bool owned() const { return !m_unownedData; } std::size_t size() const { return owned() ? m_data.size() : m_unownedSize; } const unsigned char *data() const { return owned() ? &m_data[0] : m_unownedData; } void swap(std::vector& rhs) { if(m_unownedData) { m_data.swap(rhs); rhs.clear(); rhs.resize(m_unownedSize); std::copy(m_unownedData, m_unownedData + m_unownedSize, &rhs[0]); m_unownedData = 0; m_unownedSize = 0; } else { m_data.swap(rhs); } } bool operator == (const Binary& rhs) const { const std::size_t s = size(); if(s != rhs.size()) return false; const unsigned char *d1 = data(); const unsigned char *d2 = rhs.data(); for(std::size_t i=0;i m_data; const unsigned char *m_unownedData; std::size_t m_unownedSize; }; void operator >> (const Node& node, Binary& binary); } #endif // BASE64_H_62B23520_7C8E_11DE_8A39_0800200C9A66 SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/include/yaml-cpp/ostream.h0000664000175000017500000000164511723131175031401 0ustar dandan#ifndef OSTREAM_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #define OSTREAM_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #if defined(_MSC_VER) || (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 #pragma once #endif #include namespace YAML { class ostream { public: ostream(); ~ostream(); void reserve(unsigned size); void put(char ch); const char *str() const { return m_buffer; } unsigned row() const { return m_row; } unsigned col() const { return m_col; } unsigned pos() const { return m_pos; } private: char *m_buffer; unsigned m_pos; unsigned m_size; unsigned m_row, m_col; }; ostream& operator << (ostream& out, const char *str); ostream& operator << (ostream& out, const std::string& str); ostream& operator << (ostream& out, char ch); } #endif // OSTREAM_H_62B23520_7C8E_11DE_8A39_0800200C9A66 SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/include/yaml-cpp/ltnode.h0000664000175000017500000000071711723131175031213 0ustar dandan#ifndef LTNODE_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #define LTNODE_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #if defined(_MSC_VER) || (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 #pragma once #endif namespace YAML { class Node; struct ltnode { bool operator()(const Node *pNode1, const Node *pNode2) const; }; } #endif // LTNODE_H_62B23520_7C8E_11DE_8A39_0800200C9A66 SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/include/yaml-cpp/contrib/0000775000175000017500000000000012110505246031203 5ustar dandan././@LongLink0000000000000000000000000000016000000000000011562 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/include/yaml-cpp/contrib/anchordict.hSuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/include/yaml-cpp/contrib/a0000664000175000017500000000175611723131175031364 0ustar dandan#ifndef ANCHORDICT_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #define ANCHORDICT_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #if defined(_MSC_VER) || (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 #pragma once #endif #include #include "../anchor.h" namespace YAML { /// AnchorDict /// . An object that stores and retrieves values correlating to anchor_t /// values. /// . Efficient implementation that can make assumptions about how anchor_t /// values are assigned by the Parser class. template class AnchorDict { public: void Register(anchor_t anchor, T value) { if (anchor > m_data.size()) { m_data.resize(anchor); } m_data[anchor - 1] = value; } T Get(anchor_t anchor) const { return m_data[anchor - 1]; } private: std::vector m_data; }; } #endif // ANCHORDICT_H_62B23520_7C8E_11DE_8A39_0800200C9A66 ././@LongLink0000000000000000000000000000016200000000000011564 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/include/yaml-cpp/contrib/graphbuilder.hSuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/include/yaml-cpp/contrib/g0000664000175000017500000001215011723131175031360 0ustar dandan#ifndef GRAPHBUILDER_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #define GRAPHBUILDER_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #if defined(_MSC_VER) || (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 #pragma once #endif #include "yaml-cpp/mark.h" #include namespace YAML { class Parser; // GraphBuilderInterface // . Abstraction of node creation // . pParentNode is always NULL or the return value of one of the NewXXX() // functions. class GraphBuilderInterface { public: // Create and return a new node with a null value. virtual void *NewNull(const Mark& mark, void *pParentNode) = 0; // Create and return a new node with the given tag and value. virtual void *NewScalar(const Mark& mark, const std::string& tag, void *pParentNode, const std::string& value) = 0; // Create and return a new sequence node virtual void *NewSequence(const Mark& mark, const std::string& tag, void *pParentNode) = 0; // Add pNode to pSequence. pNode was created with one of the NewXxx() // functions and pSequence with NewSequence(). virtual void AppendToSequence(void *pSequence, void *pNode) = 0; // Note that no moew entries will be added to pSequence virtual void SequenceComplete(void *pSequence) {(void)pSequence;} // Create and return a new map node virtual void *NewMap(const Mark& mark, const std::string& tag, void *pParentNode) = 0; // Add the pKeyNode => pValueNode mapping to pMap. pKeyNode and pValueNode // were created with one of the NewXxx() methods and pMap with NewMap(). virtual void AssignInMap(void *pMap, void *pKeyNode, void *pValueNode) = 0; // Note that no more assignments will be made in pMap virtual void MapComplete(void *pMap) {(void)pMap;} // Return the node that should be used in place of an alias referencing // pNode (pNode by default) virtual void *AnchorReference(const Mark& mark, void *pNode) {(void)mark; return pNode;} }; // Typesafe wrapper for GraphBuilderInterface. Assumes that Impl defines // Node, Sequence, and Map types. Sequence and Map must derive from Node // (unless Node is defined as void). Impl must also implement function with // all of the same names as the virtual functions in GraphBuilderInterface // -- including the ones with default implementations -- but with the // prototypes changed to accept an explicit Node*, Sequence*, or Map* where // appropriate. template class GraphBuilder : public GraphBuilderInterface { public: typedef typename Impl::Node Node; typedef typename Impl::Sequence Sequence; typedef typename Impl::Map Map; GraphBuilder(Impl& impl) : m_impl(impl) { Map* pMap = NULL; Sequence* pSeq = NULL; Node* pNode = NULL; // Type consistency checks pNode = pMap; pNode = pSeq; } GraphBuilderInterface& AsBuilderInterface() {return *this;} virtual void *NewNull(const Mark& mark, void* pParentNode) { return CheckType(m_impl.NewNull(mark, AsNode(pParentNode))); } virtual void *NewScalar(const Mark& mark, const std::string& tag, void *pParentNode, const std::string& value) { return CheckType(m_impl.NewScalar(mark, tag, AsNode(pParentNode), value)); } virtual void *NewSequence(const Mark& mark, const std::string& tag, void *pParentNode) { return CheckType(m_impl.NewSequence(mark, tag, AsNode(pParentNode))); } virtual void AppendToSequence(void *pSequence, void *pNode) { m_impl.AppendToSequence(AsSequence(pSequence), AsNode(pNode)); } virtual void SequenceComplete(void *pSequence) { m_impl.SequenceComplete(AsSequence(pSequence)); } virtual void *NewMap(const Mark& mark, const std::string& tag, void *pParentNode) { return CheckType(m_impl.NewMap(mark, tag, AsNode(pParentNode))); } virtual void AssignInMap(void *pMap, void *pKeyNode, void *pValueNode) { m_impl.AssignInMap(AsMap(pMap), AsNode(pKeyNode), AsNode(pValueNode)); } virtual void MapComplete(void *pMap) { m_impl.MapComplete(AsMap(pMap)); } virtual void *AnchorReference(const Mark& mark, void *pNode) { return CheckType(m_impl.AnchorReference(mark, AsNode(pNode))); } private: Impl& m_impl; // Static check for pointer to T template static T* CheckType(U* p) {return p;} static Node *AsNode(void *pNode) {return static_cast(pNode);} static Sequence *AsSequence(void *pSeq) {return static_cast(pSeq);} static Map *AsMap(void *pMap) {return static_cast(pMap);} }; void *BuildGraphOfNextDocument(Parser& parser, GraphBuilderInterface& graphBuilder); template typename Impl::Node *BuildGraphOfNextDocument(Parser& parser, Impl& impl) { GraphBuilder graphBuilder(impl); return static_cast(BuildGraphOfNextDocument( parser, graphBuilder )); } } #endif // GRAPHBUILDER_H_62B23520_7C8E_11DE_8A39_0800200C9A66 SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/include/yaml-cpp/node.h0000664000175000017500000000650211723131175030651 0ustar dandan#ifndef NODE_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #define NODE_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #if defined(_MSC_VER) || (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 #pragma once #endif #include "yaml-cpp/dll.h" #include "yaml-cpp/exceptions.h" #include "yaml-cpp/mark.h" #include "yaml-cpp/noncopyable.h" #include "yaml-cpp/conversion.h" #include "yaml-cpp/iterator.h" #include "yaml-cpp/ltnode.h" #include #include #include #include #include namespace YAML { class AliasManager; class Content; class NodeOwnership; class Scanner; class Emitter; class EventHandler; struct NodeType { enum value { Null, Scalar, Sequence, Map }; }; class YAML_CPP_API Node: private noncopyable { public: friend class NodeOwnership; friend class NodeBuilder; Node(); ~Node(); void Clear(); std::auto_ptr Clone() const; void EmitEvents(EventHandler& eventHandler) const; void EmitEvents(AliasManager& am, EventHandler& eventHandler) const; NodeType::value Type() const { return m_type; } bool IsAliased() const; // file location of start of this node const Mark GetMark() const { return m_mark; } // accessors Iterator begin() const; Iterator end() const; std::size_t size() const; // extraction of scalars bool GetScalar(std::string& s) const; // we can specialize this for other values template bool Read(T& value) const; template const T to() const; template friend YAML_CPP_API typename enable_if >::type operator >> (const Node& node, T& value); // retrieval for maps and sequences template const Node *FindValue(const T& key) const; template const Node& operator [] (const T& key) const; // specific to maps const Node *FindValue(const char *key) const; const Node *FindValue(char *key) const; const Node& operator [] (const char *key) const; const Node& operator [] (char *key) const; // for tags const std::string& Tag() const { return m_tag; } // emitting friend YAML_CPP_API Emitter& operator << (Emitter& out, const Node& node); // ordering int Compare(const Node& rhs) const; friend bool operator < (const Node& n1, const Node& n2); private: explicit Node(NodeOwnership& owner); Node& CreateNode(); void Init(NodeType::value type, const Mark& mark, const std::string& tag); void MarkAsAliased(); void SetScalarData(const std::string& data); void Append(Node& node); void Insert(Node& key, Node& value); // helper for sequences template friend struct _FindFromNodeAtIndex; const Node *FindAtIndex(std::size_t i) const; // helper for maps template const Node& GetValue(const T& key) const; template const Node *FindValueForKey(const T& key) const; private: std::auto_ptr m_pOwnership; Mark m_mark; std::string m_tag; typedef std::vector node_seq; typedef std::map node_map; NodeType::value m_type; std::string m_scalarData; node_seq m_seqData; node_map m_mapData; }; } #include "yaml-cpp/nodeimpl.h" #include "yaml-cpp/nodereadimpl.h" #endif // NODE_H_62B23520_7C8E_11DE_8A39_0800200C9A66 SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/include/yaml-cpp/traits.h0000664000175000017500000000377511723131175031243 0ustar dandan#ifndef TRAITS_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #define TRAITS_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #if defined(_MSC_VER) || (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 #pragma once #endif namespace YAML { template struct is_numeric { enum { value = false }; }; template <> struct is_numeric { enum { value = true }; }; template <> struct is_numeric { enum { value = true }; }; template <> struct is_numeric { enum { value = true }; }; template <> struct is_numeric { enum { value = true }; }; template <> struct is_numeric { enum { value = true }; }; template <> struct is_numeric { enum { value = true }; }; template <> struct is_numeric { enum { value = true }; }; template <> struct is_numeric { enum { value = true }; }; #if defined(_MSC_VER) && (_MSC_VER < 1310) template <> struct is_numeric <__int64> { enum { value = true }; }; template <> struct is_numeric { enum { value = true }; }; #else template <> struct is_numeric { enum { value = true }; }; template <> struct is_numeric { enum { value = true }; }; #endif template <> struct is_numeric { enum { value = true }; }; template <> struct is_numeric { enum { value = true }; }; template <> struct is_numeric { enum { value = true }; }; template struct enable_if_c { typedef T type; }; template struct enable_if_c {}; template struct enable_if : public enable_if_c {}; template struct disable_if_c { typedef T type; }; template struct disable_if_c {}; template struct disable_if : public disable_if_c {}; } #endif // TRAITS_H_62B23520_7C8E_11DE_8A39_0800200C9A66 ././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/include/yaml-cpp/stlemitter.hSuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/include/yaml-cpp/stlemitte0000664000175000017500000000257711723131175031520 0ustar dandan#ifndef STLEMITTER_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #define STLEMITTER_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #if defined(_MSC_VER) || (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 #pragma once #endif #include #include #include #include namespace YAML { template inline Emitter& EmitSeq(Emitter& emitter, const Seq& seq) { emitter << BeginSeq; for(typename Seq::const_iterator it=seq.begin();it!=seq.end();++it) emitter << *it; emitter << EndSeq; return emitter; } template inline Emitter& operator << (Emitter& emitter, const std::vector& v) { return EmitSeq(emitter, v); } template inline Emitter& operator << (Emitter& emitter, const std::list& v) { return EmitSeq(emitter, v); } template inline Emitter& operator << (Emitter& emitter, const std::set& v) { return EmitSeq(emitter, v); } template inline Emitter& operator << (Emitter& emitter, const std::map& m) { typedef typename std::map map; emitter << BeginMap; for(typename map::const_iterator it=m.begin();it!=m.end();++it) emitter << Key << it->first << Value << it->second; emitter << EndMap; return emitter; } } #endif // STLEMITTER_H_62B23520_7C8E_11DE_8A39_0800200C9A66 ././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/include/yaml-cpp/eventhandler.hSuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/include/yaml-cpp/eventhand0000664000175000017500000000211111723131175031442 0ustar dandan#ifndef EVENTHANDLER_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #define EVENTHANDLER_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #if defined(_MSC_VER) || (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 #pragma once #endif #include "yaml-cpp/anchor.h" #include namespace YAML { struct Mark; class EventHandler { public: virtual ~EventHandler() {} virtual void OnDocumentStart(const Mark& mark) = 0; virtual void OnDocumentEnd() = 0; virtual void OnNull(const Mark& mark, anchor_t anchor) = 0; virtual void OnAlias(const Mark& mark, anchor_t anchor) = 0; virtual void OnScalar(const Mark& mark, const std::string& tag, anchor_t anchor, const std::string& value) = 0; virtual void OnSequenceStart(const Mark& mark, const std::string& tag, anchor_t anchor) = 0; virtual void OnSequenceEnd() = 0; virtual void OnMapStart(const Mark& mark, const std::string& tag, anchor_t anchor) = 0; virtual void OnMapEnd() = 0; }; } #endif // EVENTHANDLER_H_62B23520_7C8E_11DE_8A39_0800200C9A66 ././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/include/yaml-cpp/noncopyable.hSuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/include/yaml-cpp/noncopyab0000664000175000017500000000117611723131175031470 0ustar dandan#ifndef NONCOPYABLE_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #define NONCOPYABLE_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #if defined(_MSC_VER) || (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 #pragma once #endif #include "yaml-cpp/dll.h" namespace YAML { // this is basically boost::noncopyable class YAML_CPP_API noncopyable { protected: noncopyable() {} ~noncopyable() {} private: noncopyable(const noncopyable&); const noncopyable& operator = (const noncopyable&); }; } #endif // NONCOPYABLE_H_62B23520_7C8E_11DE_8A39_0800200C9A66 ././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/include/yaml-cpp/conversion.hSuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/include/yaml-cpp/conversio0000664000175000017500000000430611723131175031505 0ustar dandan#ifndef CONVERSION_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #define CONVERSION_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #if defined(_MSC_VER) || (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 #pragma once #endif #include "yaml-cpp/null.h" #include "yaml-cpp/traits.h" #include #include #include namespace YAML { // traits for conversion template struct is_scalar_convertible { enum { value = is_numeric::value }; }; template<> struct is_scalar_convertible { enum { value = true }; }; template<> struct is_scalar_convertible { enum { value = true }; }; template<> struct is_scalar_convertible<_Null> { enum { value = true }; }; // actual conversion inline bool Convert(const std::string& input, std::string& output) { output = input; return true; } YAML_CPP_API bool Convert(const std::string& input, bool& output); YAML_CPP_API bool Convert(const std::string& input, _Null& output); inline bool IsInfinity(const std::string& input) { return input == ".inf" || input == ".Inf" || input == ".INF" || input == "+.inf" || input == "+.Inf" || input == "+.INF"; } inline bool IsNegativeInfinity(const std::string& input) { return input == "-.inf" || input == "-.Inf" || input == "-.INF"; } inline bool IsNaN(const std::string& input) { return input == ".nan" || input == ".NaN" || input == ".NAN"; } template inline bool Convert(const std::string& input, T& output, typename enable_if >::type * = 0) { std::stringstream stream(input); stream.unsetf(std::ios::dec); if((stream >> output) && (stream >> std::ws).eof()) return true; if(std::numeric_limits::has_infinity) { if(IsInfinity(input)) { output = std::numeric_limits::infinity(); return true; } else if(IsNegativeInfinity(input)) { output = -std::numeric_limits::infinity(); return true; } } if(std::numeric_limits::has_quiet_NaN && IsNaN(input)) { output = std::numeric_limits::quiet_NaN(); return true; } return false; } } #endif // CONVERSION_H_62B23520_7C8E_11DE_8A39_0800200C9A66 ././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/include/yaml-cpp/emittermanip.hSuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/include/yaml-cpp/emitterma0000664000175000017500000000615111723131175031465 0ustar dandan#ifndef EMITTERMANIP_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #define EMITTERMANIP_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #if defined(_MSC_VER) || (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 #pragma once #endif #include namespace YAML { enum EMITTER_MANIP { // general manipulators Auto, TagByKind, Newline, // output character set EmitNonAscii, EscapeNonAscii, // string manipulators // Auto, // duplicate SingleQuoted, DoubleQuoted, Literal, // bool manipulators YesNoBool, // yes, no TrueFalseBool, // true, false OnOffBool, // on, off UpperCase, // TRUE, N LowerCase, // f, yes CamelCase, // No, Off LongBool, // yes, On ShortBool, // y, t // int manipulators Dec, Hex, Oct, // document manipulators BeginDoc, EndDoc, // sequence manipulators BeginSeq, EndSeq, Flow, Block, // map manipulators BeginMap, EndMap, Key, Value, // Flow, // duplicate // Block, // duplicate // Auto, // duplicate LongKey }; struct _Indent { _Indent(int value_): value(value_) {} int value; }; inline _Indent Indent(int value) { return _Indent(value); } struct _Alias { _Alias(const std::string& content_): content(content_) {} std::string content; }; inline _Alias Alias(const std::string content) { return _Alias(content); } struct _Anchor { _Anchor(const std::string& content_): content(content_) {} std::string content; }; inline _Anchor Anchor(const std::string content) { return _Anchor(content); } struct _Tag { struct Type { enum value { Verbatim, PrimaryHandle, NamedHandle }; }; explicit _Tag(const std::string& prefix_, const std::string& content_, Type::value type_) : prefix(prefix_), content(content_), type(type_) { } std::string prefix; std::string content; Type::value type; }; inline _Tag VerbatimTag(const std::string content) { return _Tag("", content, _Tag::Type::Verbatim); } inline _Tag LocalTag(const std::string content) { return _Tag("", content, _Tag::Type::PrimaryHandle); } inline _Tag LocalTag(const std::string& prefix, const std::string content) { return _Tag(prefix, content, _Tag::Type::NamedHandle); } inline _Tag SecondaryTag(const std::string content) { return _Tag("", content, _Tag::Type::NamedHandle); } struct _Comment { _Comment(const std::string& content_): content(content_) {} std::string content; }; inline _Comment Comment(const std::string content) { return _Comment(content); } struct _Precision { _Precision(int floatPrecision_, int doublePrecision_): floatPrecision(floatPrecision_), doublePrecision(doublePrecision_) {} int floatPrecision; int doublePrecision; }; inline _Precision FloatPrecision(int n) { return _Precision(n, -1); } inline _Precision DoublePrecision(int n) { return _Precision(-1, n); } inline _Precision Precision(int n) { return _Precision(n, n); } } #endif // EMITTERMANIP_H_62B23520_7C8E_11DE_8A39_0800200C9A66 SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/include/yaml-cpp/null.h0000664000175000017500000000124011723131175030670 0ustar dandan#ifndef NULL_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #define NULL_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #if defined(_MSC_VER) || (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 #pragma once #endif #include "yaml-cpp/dll.h" namespace YAML { class Node; struct YAML_CPP_API _Null {}; inline bool operator == (const _Null&, const _Null&) { return true; } inline bool operator != (const _Null&, const _Null&) { return false; } YAML_CPP_API bool IsNull(const Node& node); // old API only extern YAML_CPP_API _Null Null; } #endif // NULL_H_62B23520_7C8E_11DE_8A39_0800200C9A66 ././@LongLink0000000000000000000000000000015400000000000011565 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/include/yaml-cpp/emitfromevents.hSuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/include/yaml-cpp/emitfrome0000664000175000017500000000253411723131175031466 0ustar dandan#ifndef EMITFROMEVENTS_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #define EMITFROMEVENTS_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #if defined(_MSC_VER) || (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 #pragma once #endif #include "yaml-cpp/eventhandler.h" #include namespace YAML { class Emitter; class EmitFromEvents: public EventHandler { public: EmitFromEvents(Emitter& emitter); virtual void OnDocumentStart(const Mark& mark); virtual void OnDocumentEnd(); virtual void OnNull(const Mark& mark, anchor_t anchor); virtual void OnAlias(const Mark& mark, anchor_t anchor); virtual void OnScalar(const Mark& mark, const std::string& tag, anchor_t anchor, const std::string& value); virtual void OnSequenceStart(const Mark& mark, const std::string& tag, anchor_t anchor); virtual void OnSequenceEnd(); virtual void OnMapStart(const Mark& mark, const std::string& tag, anchor_t anchor); virtual void OnMapEnd(); private: void BeginNode(); void EmitProps(const std::string& tag, anchor_t anchor); private: Emitter& m_emitter; struct State { enum value { WaitingForSequenceEntry, WaitingForKey, WaitingForValue }; }; std::stack m_stateStack; }; } #endif // EMITFROMEVENTS_H_62B23520_7C8E_11DE_8A39_0800200C9A66 SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/include/yaml-cpp/mark.h0000664000175000017500000000120711723131175030653 0ustar dandan#ifndef MARK_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #define MARK_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #if defined(_MSC_VER) || (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 #pragma once #endif #include "yaml-cpp/dll.h" namespace YAML { struct YAML_CPP_API Mark { Mark(): pos(0), line(0), column(0) {} static const Mark null() { return Mark(-1, -1, -1); } int pos; int line, column; private: Mark(int pos_, int line_, int column_): pos(pos_), line(line_), column(column_) {} }; } #endif // MARK_H_62B23520_7C8E_11DE_8A39_0800200C9A66 SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/include/yaml-cpp/parser.h0000664000175000017500000000220511723131175031214 0ustar dandan#ifndef PARSER_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #define PARSER_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #if defined(_MSC_VER) || (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 #pragma once #endif #include "yaml-cpp/dll.h" #include "yaml-cpp/noncopyable.h" #include #include namespace YAML { struct Directives; struct Mark; struct Token; class EventHandler; class Node; class Scanner; class YAML_CPP_API Parser: private noncopyable { public: Parser(); Parser(std::istream& in); ~Parser(); operator bool() const; void Load(std::istream& in); bool HandleNextDocument(EventHandler& eventHandler); bool GetNextDocument(Node& document); // old API only void PrintTokens(std::ostream& out); private: void ParseDirectives(); void HandleDirective(const Token& token); void HandleYamlDirective(const Token& token); void HandleTagDirective(const Token& token); private: std::auto_ptr m_pScanner; std::auto_ptr m_pDirectives; }; } #endif // PARSER_H_62B23520_7C8E_11DE_8A39_0800200C9A66 SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/include/yaml-cpp/yaml.h0000664000175000017500000000104711723131175030665 0ustar dandan#ifndef YAML_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #define YAML_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #if defined(_MSC_VER) || (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 #pragma once #endif #include "yaml-cpp/parser.h" #include "yaml-cpp/emitter.h" #include "yaml-cpp/stlemitter.h" #include "yaml-cpp/exceptions.h" #include "yaml-cpp/node.h" #include "yaml-cpp/stlnode.h" #include "yaml-cpp/iterator.h" #endif // YAML_H_62B23520_7C8E_11DE_8A39_0800200C9A66 ././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/include/yaml-cpp/iterator.hSuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/include/yaml-cpp/iterator.0000664000175000017500000000201711723131175031402 0ustar dandan#ifndef ITERATOR_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #define ITERATOR_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #if defined(_MSC_VER) || (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 #pragma once #endif #include "yaml-cpp/dll.h" #include namespace YAML { class Node; struct IterPriv; class YAML_CPP_API Iterator { public: Iterator(); Iterator(std::auto_ptr pData); Iterator(const Iterator& rhs); ~Iterator(); Iterator& operator = (const Iterator& rhs); Iterator& operator ++ (); Iterator operator ++ (int); const Node& operator * () const; const Node *operator -> () const; const Node& first() const; const Node& second() const; friend YAML_CPP_API bool operator == (const Iterator& it, const Iterator& jt); friend YAML_CPP_API bool operator != (const Iterator& it, const Iterator& jt); private: std::auto_ptr m_pData; }; } #endif // ITERATOR_H_62B23520_7C8E_11DE_8A39_0800200C9A66 ././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/include/yaml-cpp/nodeutil.hSuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/include/yaml-cpp/nodeutil.0000664000175000017500000000340211723131175031373 0ustar dandan#ifndef NODEUTIL_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #define NODEUTIL_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #if defined(_MSC_VER) || (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 #pragma once #endif namespace YAML { template struct is_same_type { enum { value = false }; }; template struct is_same_type { enum { value = true }; }; template struct is_index_type_with_check { enum { value = false }; }; template <> struct is_index_type_with_check { enum { value = true }; }; #define MAKE_INDEX_TYPE(Type) \ template <> struct is_index_type_with_check::value> { enum { value = true }; } MAKE_INDEX_TYPE(int); MAKE_INDEX_TYPE(unsigned); MAKE_INDEX_TYPE(short); MAKE_INDEX_TYPE(unsigned short); MAKE_INDEX_TYPE(long); MAKE_INDEX_TYPE(unsigned long); #undef MAKE_INDEX_TYPE template struct is_index_type: public is_index_type_with_check {}; // messing around with template stuff to get the right overload for operator [] for a sequence template struct _FindFromNodeAtIndex { const Node *pRet; _FindFromNodeAtIndex(const Node&, const T&): pRet(0) {} }; template struct _FindFromNodeAtIndex { const Node *pRet; _FindFromNodeAtIndex(const Node& node, const T& key): pRet(node.FindAtIndex(static_cast(key))) {} }; template inline const Node *FindFromNodeAtIndex(const Node& node, const T& key) { return _FindFromNodeAtIndex::value>(node, key).pRet; } } #endif // NODEUTIL_H_62B23520_7C8E_11DE_8A39_0800200C9A66 SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/include/yaml-cpp/anchor.h0000664000175000017500000000067511723131175031203 0ustar dandan#ifndef ANCHOR_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #define ANCHOR_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #if defined(_MSC_VER) || (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 #pragma once #endif #include namespace YAML { typedef std::size_t anchor_t; const anchor_t NullAnchor = 0; } #endif // ANCHOR_H_62B23520_7C8E_11DE_8A39_0800200C9A66 SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/include/yaml-cpp/stlnode.h0000664000175000017500000000146711723131175031401 0ustar dandan#ifndef STLNODE_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #define STLNODE_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #if defined(_MSC_VER) || (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 #pragma once #endif #include #include namespace YAML { template void operator >> (const Node& node, std::vector& v) { v.clear(); v.resize(node.size()); for(unsigned i=0;i> v[i]; } template void operator >> (const Node& node, std::map& m) { m.clear(); for(Iterator it=node.begin();it!=node.end();++it) { K k; V v; it.first() >> k; it.second() >> v; m[k] = v; } } } #endif // STLNODE_H_62B23520_7C8E_11DE_8A39_0800200C9A66 SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/include/yaml-cpp/dll.h0000664000175000017500000000252111723131175030474 0ustar dandan#ifndef DLL_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #define DLL_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #if defined(_MSC_VER) || (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 #pragma once #endif // The following ifdef block is the standard way of creating macros which make exporting // from a DLL simpler. All files within this DLL are compiled with the yaml_cpp_EXPORTS // symbol defined on the command line. this symbol should not be defined on any project // that uses this DLL. This way any other project whose source files include this file see // YAML_CPP_API functions as being imported from a DLL, whereas this DLL sees symbols // defined with this macro as being exported. #undef YAML_CPP_API #ifdef YAML_CPP_DLL // Using or Building YAML-CPP DLL (definition defined manually) #ifdef yaml_cpp_EXPORTS // Building YAML-CPP DLL (definition created by CMake or defined manually) // #pragma message( "Defining YAML_CPP_API for DLL export" ) #define YAML_CPP_API __declspec(dllexport) #else // yaml_cpp_EXPORTS // #pragma message( "Defining YAML_CPP_API for DLL import" ) #define YAML_CPP_API __declspec(dllimport) #endif // yaml_cpp_EXPORTS #else //YAML_CPP_DLL #define YAML_CPP_API #endif // YAML_CPP_DLL #endif // DLL_H_62B23520_7C8E_11DE_8A39_0800200C9A66 ././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/include/yaml-cpp/aliasmanager.hSuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/include/yaml-cpp/aliasmana0000664000175000017500000000140511723131175031421 0ustar dandan#ifndef ALIASMANAGER_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #define ALIASMANAGER_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #if defined(_MSC_VER) || (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 #pragma once #endif #include "yaml-cpp/anchor.h" #include namespace YAML { class Node; class AliasManager { public: AliasManager(); void RegisterReference(const Node& node); anchor_t LookupAnchor(const Node& node) const; private: anchor_t _CreateNewAnchor(); private: typedef std::map AnchorByIdentity; AnchorByIdentity m_anchorByIdentity; anchor_t m_curAnchor; }; } #endif // ALIASMANAGER_H_62B23520_7C8E_11DE_8A39_0800200C9A66 SuperCollider-3.6.3-Source-linux~repack/external_libraries/yaml-cpp-0.3.0/install.txt0000664000175000017500000000121511723131175026611 0ustar dandan*** With CMake *** yaml-cpp uses CMake to support cross-platform building. In a UNIX-like system, the basic steps to build are: 1. Download and install CMake (if you don't have root privileges, just install to a local directory, like ~/bin) 2. From the source directory, run: mkdir build cd build cmake .. and then the usual make make install 3. To clean up, just remove the 'build' directory. *** Without CMake *** If you don't want to use CMake, just add all .cpp files to a makefile. yaml-cpp does not need any special build settings, so no 'configure' file is necessary. (Note: this is pretty tedious. It's sooo much easier to use CMake.) SuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/0000775000175000017500000000000012110505246024664 5ustar dandanSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/libs/0000775000175000017500000000000012110505246025615 5ustar dandanSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/libs/integer/0000775000175000017500000000000012110505246027252 5ustar dandanSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/libs/integer/example/0000775000175000017500000000000012110505246030705 5ustar dandan././@LongLink0000000000000000000000000000016000000000000011562 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/libs/integer/example/endian_example.cppSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/libs/integer/example/endian_0000644000175000017500000000403711562456103032236 0ustar dandan// endian_example.cpp -------------------------------------------------------// // Copyright Beman Dawes, 2006 // Distributed under the Boost Software License, Version 1.0. // See http://www.boost.org/LICENSE_1_0.txt // See library home page at http://www.boost.org/libs/endian //----------------------------------------------------------------------------// #define _CRT_SECURE_NO_DEPRECATE // quiet VC++ 8.0 foolishness #include #include #include #include using namespace boost::integer; namespace { // This is an extract from a very widely used GIS file format. I have no idea // why a designer would mix big and little endians in the same file - but // this is a real-world format and users wishing to write low level code // manipulating these files have to deal with the mixed endianness. struct header { big32_t file_code; big32_t file_length; little32_t version; little32_t shape_type; }; const char * filename = "test.dat"; } int main() { assert( sizeof( header ) == 16 ); // requirement for interoperability header h; h.file_code = 0x04030201; h.file_length = sizeof( header ); h.version = -1; h.shape_type = 0x04030201; // Low-level I/O such as POSIX read/write or fread/fwrite is sometimes // used for binary file operations when ultimate efficiency is important. // Such I/O is often performed in some C++ wrapper class, but to drive home the // point that endian integers are often used in fairly low-level code that // does bulk I/O operations, fopen/fwrite is used for I/O in this example. std::FILE * fi; if ( !(fi = std::fopen( filename, "wb" )) ) // MUST BE BINARY { std::cout << "could not open " << filename << '\n'; return 1; } if ( std::fwrite( &h, sizeof( header ), 1, fi ) != 1 ) { std::cout << "write failure for " << filename << '\n'; return 1; } std::fclose( fi ); std::cout << "created file " << filename << '\n'; return 0; } ././@LongLink0000000000000000000000000000016400000000000011566 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/libs/integer/example/endian_hello_world.cppSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/libs/integer/example/endian_0000644000175000017500000000150311562456103032231 0ustar dandan// endian_io_test.cpp ----------------------------------------------------------------// // Copyright Beman Dawes, 2009 // Distributed under the Boost Software License, Version 1.0. // See http://www.boost.org/LICENSE_1_0.txt // See library home page at http://www.boost.org/libs/endian #include #include #include #include using namespace boost; using namespace boost::integer; int main() { int_least32_t v = 0x31323334L; // = ASCII { '1', '2', '3', '4' } // value chosen to work on text stream big32_t b(v); little32_t l(v); std::cout << "Hello, endian world!\n\n"; std::cout << v << ' ' << b << ' ' << l << '\n'; std::cout <= v <= ' ' <= b <= ' ' <= l <= '\n'; } SuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/libs/integer/zip-endian.bat0000644000175000017500000000303411562456103032005 0ustar dandanecho create zip file... if $%1 == $ goto error rmdir /s \temp\%1 2>nul pushd . mkdir \temp\%1 cd \temp\%1 md doc\html md boost\integer md libs\integer\doc md libs\integer\example md libs\integer\test popd copy ..\..\boost.png \temp\%1 copy ..\..\boost\doc\html\minimal.css \temp\%1\doc\html copy ..\..\boost\binary_stream.hpp \temp\%1\boost copy ..\..\boost\integer\endian.hpp \temp\%1\boost\integer copy ..\..\boost\integer\endian_binary_stream.hpp \temp\%1\boost\integer copy ..\..\boost\integer\cover_operators.hpp \temp\%1\boost\integer copy ..\..\libs\integer\doc\endian.html \temp\%1\libs\integer\doc copy ..\..\libs\integer\example\endian_example.cpp \temp\%1\libs\integer\example copy ..\..\libs\integer\example\endian_hello_world.cpp \temp\%1\libs\integer\example copy ..\..\libs\integer\test\endian_test.cpp \temp\%1\libs\integer\test copy ..\..\libs\integer\test\binary_stream_test.cpp \temp\%1\libs\integer\test copy ..\..\libs\integer\test\endian_binary_stream_test.cpp \temp\%1\libs\integer\test copy ..\..\libs\integer\test\endian_in_union_test.cpp \temp\%1\libs\integer\test copy ..\..\libs\integer\test\endian_operations_test.cpp \temp\%1\libs\integer\test copy ..\..\libs\integer\test\scoped_enum_emulation_test.cpp \temp\%1\libs\integer\test copy ..\..\libs\integer\test\Jamfile.* \temp\%1\libs\integer\test pushd \temp zip -r %1.zip %1 popd move \temp\%1.zip . goto done :error echo usage: zip-endian version echo version will be used for both the .zip name and the highest level directory name echo example: zip-endian endian-1.0 :doneSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/libs/integer/test/0000775000175000017500000000000012110505246030231 5ustar dandan././@LongLink0000000000000000000000000000017000000000000011563 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/libs/integer/test/endian_binary_stream_test.cppSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/libs/integer/test/endian_bin0000644000175000017500000001730011562456103032250 0ustar dandan// endian_binary_stream_test.cpp -----------------------------------------------------// // Copyright Beman Dawes 2009 // Distributed under the Boost Software License, Version 1.0. // See http://www.boost.org/LICENSE_1_0.txt #include #include #include using namespace boost; using namespace boost::integer; using namespace std; namespace { int errors = 0; void verify( bool x, const char * file, int line ) { if ( x ) return; ++errors; cout << file << "(" << line << ") : error: predicate is false\n" << endl; } } #define BOOST_VERIFY(predicate) verify( predicate, __FILE__, __LINE__ ) int main() { std::stringstream ss( std::ios_base::in | std::ios_base::out | std::ios_base::binary ); // big tests big8_t big8_t_1(0x01), big8_t_2; ss <= big8_t_1; ss >= big8_t_2; BOOST_VERIFY( big8_t_1 == big8_t_2 ); big16_t big16_t_1(0x0102), big16_t_2; ss <= big16_t_1; ss >= big16_t_2; BOOST_VERIFY( big16_t_1 == big16_t_2 ); big24_t big24_t_1(0x010203L), big24_t_2; ss <= big24_t_1; ss >= big24_t_2; BOOST_VERIFY( big24_t_1 == big24_t_2 ); big32_t big32_t_1(0x01020304L), big32_t_2; ss <= big32_t_1; ss >= big32_t_2; BOOST_VERIFY( big32_t_1 == big32_t_2 ); big40_t big40_t_1(0x0102030405LL), big40_t_2; ss <= big40_t_1; ss >= big40_t_2; BOOST_VERIFY( big40_t_1 == big40_t_2 ); big48_t big48_t_1(0x010203040506LL), big48_t_2; ss <= big48_t_1; ss >= big48_t_2; BOOST_VERIFY( big48_t_1 == big48_t_2 ); big56_t big56_t_1(0x01020304050607LL), big56_t_2; ss <= big56_t_1; ss >= big56_t_2; BOOST_VERIFY( big56_t_1 == big56_t_2 ); big64_t big64_t_1(0x0102030405060808LL), big64_t_2; ss <= big64_t_1; ss >= big64_t_2; BOOST_VERIFY( big64_t_1 == big64_t_2 ); // ubig tests ubig8_t ubig8_t_1(0x01), ubig8_t_2; ss <= ubig8_t_1; ss >= ubig8_t_2; BOOST_VERIFY( ubig8_t_1 == ubig8_t_2 ); ubig16_t ubig16_t_1(0x0102), ubig16_t_2; ss <= ubig16_t_1; ss >= ubig16_t_2; BOOST_VERIFY( ubig16_t_1 == ubig16_t_2 ); ubig24_t ubig24_t_1(0x010203L), ubig24_t_2; ss <= ubig24_t_1; ss >= ubig24_t_2; BOOST_VERIFY( ubig24_t_1 == ubig24_t_2 ); ubig32_t ubig32_t_1(0x01020304L), ubig32_t_2; ss <= ubig32_t_1; ss >= ubig32_t_2; BOOST_VERIFY( ubig32_t_1 == ubig32_t_2 ); ubig40_t ubig40_t_1(0x0102030405LL), ubig40_t_2; ss <= ubig40_t_1; ss >= ubig40_t_2; BOOST_VERIFY( ubig40_t_1 == ubig40_t_2 ); ubig48_t ubig48_t_1(0x010203040506LL), ubig48_t_2; ss <= ubig48_t_1; ss >= ubig48_t_2; BOOST_VERIFY( ubig48_t_1 == ubig48_t_2 ); ubig56_t ubig56_t_1(0x01020304050607LL), ubig56_t_2; ss <= ubig56_t_1; ss >= ubig56_t_2; BOOST_VERIFY( ubig56_t_1 == ubig56_t_2 ); ubig64_t ubig64_t_1(0x0102030405060808LL), ubig64_t_2; ss <= ubig64_t_1; ss >= ubig64_t_2; BOOST_VERIFY( ubig64_t_1 == ubig64_t_2 ); // little tests little8_t little8_t_1(0x01), little8_t_2; ss <= little8_t_1; ss >= little8_t_2; BOOST_VERIFY( little8_t_1 == little8_t_2 ); little16_t little16_t_1(0x0102), little16_t_2; ss <= little16_t_1; ss >= little16_t_2; BOOST_VERIFY( little16_t_1 == little16_t_2 ); little24_t little24_t_1(0x010203L), little24_t_2; ss <= little24_t_1; ss >= little24_t_2; BOOST_VERIFY( little24_t_1 == little24_t_2 ); little32_t little32_t_1(0x01020304L), little32_t_2; ss <= little32_t_1; ss >= little32_t_2; BOOST_VERIFY( little32_t_1 == little32_t_2 ); little40_t little40_t_1(0x0102030405LL), little40_t_2; ss <= little40_t_1; ss >= little40_t_2; BOOST_VERIFY( little40_t_1 == little40_t_2 ); little48_t little48_t_1(0x010203040506LL), little48_t_2; ss <= little48_t_1; ss >= little48_t_2; BOOST_VERIFY( little48_t_1 == little48_t_2 ); little56_t little56_t_1(0x01020304050607LL), little56_t_2; ss <= little56_t_1; ss >= little56_t_2; BOOST_VERIFY( little56_t_1 == little56_t_2 ); little64_t little64_t_1(0x0102030405060808LL), little64_t_2; ss <= little64_t_1; ss >= little64_t_2; BOOST_VERIFY( little64_t_1 == little64_t_2 ); // ulittle tests ulittle8_t ulittle8_t_1(0x01), ulittle8_t_2; ss <= ulittle8_t_1; ss >= ulittle8_t_2; BOOST_VERIFY( ulittle8_t_1 == ulittle8_t_2 ); ulittle16_t ulittle16_t_1(0x0102), ulittle16_t_2; ss <= ulittle16_t_1; ss >= ulittle16_t_2; BOOST_VERIFY( ulittle16_t_1 == ulittle16_t_2 ); ulittle24_t ulittle24_t_1(0x010203L), ulittle24_t_2; ss <= ulittle24_t_1; ss >= ulittle24_t_2; BOOST_VERIFY( ulittle24_t_1 == ulittle24_t_2 ); ulittle32_t ulittle32_t_1(0x01020304L), ulittle32_t_2; ss <= ulittle32_t_1; ss >= ulittle32_t_2; BOOST_VERIFY( ulittle32_t_1 == ulittle32_t_2 ); ulittle40_t ulittle40_t_1(0x0102030405LL), ulittle40_t_2; ss <= ulittle40_t_1; ss >= ulittle40_t_2; BOOST_VERIFY( ulittle40_t_1 == ulittle40_t_2 ); ulittle48_t ulittle48_t_1(0x010203040506LL), ulittle48_t_2; ss <= ulittle48_t_1; ss >= ulittle48_t_2; BOOST_VERIFY( ulittle48_t_1 == ulittle48_t_2 ); ulittle56_t ulittle56_t_1(0x01020304050607LL), ulittle56_t_2; ss <= ulittle56_t_1; ss >= ulittle56_t_2; BOOST_VERIFY( ulittle56_t_1 == ulittle56_t_2 ); ulittle64_t ulittle64_t_1(0x0102030405060808LL), ulittle64_t_2; ss <= ulittle64_t_1; ss >= ulittle64_t_2; BOOST_VERIFY( ulittle64_t_1 == ulittle64_t_2 ); // native tests native8_t native8_t_1(0x01), native8_t_2; ss <= native8_t_1; ss >= native8_t_2; BOOST_VERIFY( native8_t_1 == native8_t_2 ); native16_t native16_t_1(0x0102), native16_t_2; ss <= native16_t_1; ss >= native16_t_2; BOOST_VERIFY( native16_t_1 == native16_t_2 ); native24_t native24_t_1(0x010203L), native24_t_2; ss <= native24_t_1; ss >= native24_t_2; BOOST_VERIFY( native24_t_1 == native24_t_2 ); native32_t native32_t_1(0x01020304L), native32_t_2; ss <= native32_t_1; ss >= native32_t_2; BOOST_VERIFY( native32_t_1 == native32_t_2 ); native40_t native40_t_1(0x0102030405LL), native40_t_2; ss <= native40_t_1; ss >= native40_t_2; BOOST_VERIFY( native40_t_1 == native40_t_2 ); native48_t native48_t_1(0x010203040506LL), native48_t_2; ss <= native48_t_1; ss >= native48_t_2; BOOST_VERIFY( native48_t_1 == native48_t_2 ); native56_t native56_t_1(0x01020304050607LL), native56_t_2; ss <= native56_t_1; ss >= native56_t_2; BOOST_VERIFY( native56_t_1 == native56_t_2 ); native64_t native64_t_1(0x0102030405060808LL), native64_t_2; ss <= native64_t_1; ss >= native64_t_2; BOOST_VERIFY( native64_t_1 == native64_t_2 ); // unative tests unative8_t unative8_t_1(0x01), unative8_t_2; ss <= unative8_t_1; ss >= unative8_t_2; BOOST_VERIFY( unative8_t_1 == unative8_t_2 ); unative16_t unative16_t_1(0x0102), unative16_t_2; ss <= unative16_t_1; ss >= unative16_t_2; BOOST_VERIFY( unative16_t_1 == unative16_t_2 ); unative24_t unative24_t_1(0x010203L), unative24_t_2; ss <= unative24_t_1; ss >= unative24_t_2; BOOST_VERIFY( unative24_t_1 == unative24_t_2 ); unative32_t unative32_t_1(0x01020304L), unative32_t_2; ss <= unative32_t_1; ss >= unative32_t_2; BOOST_VERIFY( unative32_t_1 == unative32_t_2 ); unative40_t unative40_t_1(0x0102030405LL), unative40_t_2; ss <= unative40_t_1; ss >= unative40_t_2; BOOST_VERIFY( unative40_t_1 == unative40_t_2 ); unative48_t unative48_t_1(0x010203040506LL), unative48_t_2; ss <= unative48_t_1; ss >= unative48_t_2; BOOST_VERIFY( unative48_t_1 == unative48_t_2 ); unative56_t unative56_t_1(0x01020304050607LL), unative56_t_2; ss <= unative56_t_1; ss >= unative56_t_2; BOOST_VERIFY( unative56_t_1 == unative56_t_2 ); unative64_t unative64_t_1(0x0102030405060808LL), unative64_t_2; ss <= unative64_t_1; ss >= unative64_t_2; BOOST_VERIFY( unative64_t_1 == unative64_t_2 ); cout << errors << " error(s) detected\n"; return errors; } ././@LongLink0000000000000000000000000000017100000000000011564 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/libs/integer/test/scoped_enum_emulation_test.cppSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/libs/integer/test/scoped_enu0000644000175000017500000000211011562456103032277 0ustar dandan// scoped_enum_emulation_test.cpp ----------------------------------------------------// // Copyright Beman Dawes, 2009 // Distributed under the Boost Software License, Version 1.0. // See http://www.boost.org/LICENSE_1_0.txt // See documentation at http://www.boost.org/libs/utility/scoped_enum_emulation.html #include #include BOOST_SCOPED_ENUM_START(traffic_light) { red=0, yellow, green }; BOOST_SCOPED_ENUM_END BOOST_SCOPED_ENUM_START(algae) { green=0, red, cyan }; BOOST_SCOPED_ENUM_END struct color { BOOST_SCOPED_ENUM_START(value_t) { red, green, blue }; BOOST_SCOPED_ENUM_END BOOST_SCOPED_ENUM(value_t) value; }; void foo( BOOST_SCOPED_ENUM(algae) arg ) { BOOST_ASSERT( arg == algae::cyan ); } int main() { BOOST_SCOPED_ENUM(traffic_light) signal( traffic_light::red ); BOOST_SCOPED_ENUM(algae) sample( algae::red ); BOOST_ASSERT( signal == traffic_light::red ); BOOST_ASSERT( sample == algae::red ); foo( algae::cyan ); color tracker; tracker.value = color::value_t::blue; return 0; } SuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/libs/integer/test/Jamfile.v20000644000175000017500000000116511562456103032061 0ustar dandan# Boost Endian Library test Jamfile # Copyright Beman Dawes 2006 # Distributed under the Boost Software License, Version 1.0. # See http://www.boost.org/LICENSE_1_0.txt # See library home page at http://www.boost.org/libs/integer/doc/endian.html import testing ; test-suite "endian" : [ run binary_stream_test.cpp ] [ run endian_binary_stream_test.cpp ] [ run endian_test.cpp ] [ run endian_operations_test.cpp : : : gcc:-Wno-sign-compare ] [ run endian_in_union_test.cpp ] [ run scoped_enum_emulation_test.cpp ] ; ././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/libs/integer/test/endian_test.cppSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/libs/integer/test/endian_tes0000644000175000017500000005101311562456103032272 0ustar dandan// endian_test.cpp ---------------------------------------------------------// // Copyright Beman Dawes 1999-2008 // Distributed under the Boost Software License, Version 1.0. // See http://www.boost.org/LICENSE_1_0.txt // See library home page at http://www.boost.org/libs/endian //----------------------------------------------------------------------------// // This test probes for correct endianess, size, and value. // See endian_operations_test for tests of operator correctness and interaction // between operand types. //----------------------------------------------------------------------------// #include #include #include #include #include #include #include // for atoi(), exit() #include // for memcmp() using namespace std; // Not the best programming practice, but I using namespace boost; // want to verify this combination of using using namespace boost::integer; // namespaces works. See endian_operations_test // // for tests that don't do "using namespace". #define VERIFY(predicate) verify( predicate, __LINE__ ) #define VERIFY_SIZE(actual, expected) verify_size( actual, expected, __LINE__ ) #define VERIFY_VALUE_AND_OPS(endian_t,expected_t,expected) verify_value_and_ops( expected, __LINE__ ) #define VERIFY_BIG_REPRESENTATION(t) verify_representation( true, __LINE__ ) #define VERIFY_LITTLE_REPRESENTATION(t) verify_representation( false, __LINE__ ) #define VERIFY_NATIVE_REPRESENTATION(t) verify_native_representation( __LINE__ ) namespace { int err_count; void verify( bool x, int line ) { if ( x ) return; ++err_count; cout << "Error: verify failed on line " << line << endl; } void verify_size( size_t actual, size_t expected, int line ) { if ( actual == expected ) return; ++err_count; cout << "Error: verify size failed on line " << line << endl; cout << " A structure with an expected sizeof() " << expected << " had an actual sizeof() " << actual << "\n This will cause common uses of to fail\n"; } template void verify_value_and_ops( const Base & expected, int line ) { Endian v( expected ); verify( v == expected, line ); Endian v2; v2.operator=( expected ); verify( v2 == expected, line ); ++v; // verify integer_cover_operators being applied to this type - // will fail to compile if no endian<> specialization is present } const char * big_rep = "\x12\x34\x56\x78\x9A\xBC\xDE\xF0"; const char * little_rep = "\xF0\xDE\xBC\x9A\x78\x56\x34\x12"; template void verify_representation( bool is_big, int line ) { int silence = 0; Endian x ( static_cast (0x123456789abcdef0LL + silence) ); // will truncate if ( is_big ) verify( memcmp( &x, reinterpret_cast(big_rep)+8-sizeof(Endian), sizeof(Endian) ) == 0, line ); else verify( memcmp( &x, little_rep, sizeof(Endian) ) == 0, line ); } template inline void verify_native_representation( int line ) { # ifdef BOOST_BIG_ENDIAN verify_representation( true, line ); # else verify_representation( false, line ); # endif } // detect_endianness -----------------------------------------------------// void detect_endianness() { union View { long long i; unsigned char c[8]; }; View v = { 0x0102030405060708LL }; // initialize v.i if ( memcmp( v.c, "\10\7\6\5\4\3\2\1", 8) == 0 ) { cout << "This machine is little-endian.\n"; # ifdef BOOST_BIG_INTEGER_OPERATORS cout << "yet boost/detail/endian.hpp defines BOOST_BIG_INTEGER_OPERATORS.\n" "You must fix boost/detail/endian.hpp for boost/endian.hpp to work correctly.\n" "Please report the fix to the Boost mailing list.\n"; exit(1); # endif } else if ( memcmp( v.c, "\1\2\3\4\5\6\7\10", 8) == 0 ) { cout << "This machine is big-endian.\n"; # ifdef BOOST_LITTLE_INTEGER_OPERATORS cout << "yet boost/detail/endian.hpp defines BOOST__LITTLE_INTEGER_OPERATORS.\n" "You must fix boost/detail/endian.hpp for boost/endian.hpp to work correctly.\n" "Please report the fix to the Boost mailing list.\n"; exit(1); # endif } else { cout << "This machine is neither strict big-endian nor strict little-endian\n" "You must modify boost/endian.hpp for it to work correctly.\n"; exit(1); } cout << "That should not matter and is presented for your information only.\n"; } // detect_endianness // check_size ------------------------------------------------------------// void check_size() { VERIFY( numeric_limits::digits == 7 ); VERIFY( numeric_limits::digits == 8 ); VERIFY_SIZE( sizeof( big8_t ), 1 ); VERIFY_SIZE( sizeof( big16_t ), 2 ); VERIFY_SIZE( sizeof( big24_t ), 3 ); VERIFY_SIZE( sizeof( big32_t ), 4 ); VERIFY_SIZE( sizeof( big40_t ), 5 ); VERIFY_SIZE( sizeof( big48_t ), 6 ); VERIFY_SIZE( sizeof( big56_t ), 7 ); VERIFY_SIZE( sizeof( big64_t ), 8 ); VERIFY_SIZE( sizeof( ubig8_t ), 1 ); VERIFY_SIZE( sizeof( ubig16_t ), 2 ); VERIFY_SIZE( sizeof( ubig24_t ), 3 ); VERIFY_SIZE( sizeof( ubig32_t ), 4 ); VERIFY_SIZE( sizeof( ubig40_t ), 5 ); VERIFY_SIZE( sizeof( ubig48_t ), 6 ); VERIFY_SIZE( sizeof( ubig56_t ), 7 ); VERIFY_SIZE( sizeof( ubig64_t ), 8 ); VERIFY_SIZE( sizeof( little8_t ), 1 ); VERIFY_SIZE( sizeof( little16_t ), 2 ); VERIFY_SIZE( sizeof( little24_t ), 3 ); VERIFY_SIZE( sizeof( little32_t ), 4 ); VERIFY_SIZE( sizeof( little40_t ), 5 ); VERIFY_SIZE( sizeof( little48_t ), 6 ); VERIFY_SIZE( sizeof( little56_t ), 7 ); VERIFY_SIZE( sizeof( little64_t ), 8 ); VERIFY_SIZE( sizeof( ulittle8_t ), 1 ); VERIFY_SIZE( sizeof( ulittle16_t ), 2 ); VERIFY_SIZE( sizeof( ulittle24_t ), 3 ); VERIFY_SIZE( sizeof( ulittle32_t ), 4 ); VERIFY_SIZE( sizeof( ulittle40_t ), 5 ); VERIFY_SIZE( sizeof( ulittle48_t ), 6 ); VERIFY_SIZE( sizeof( ulittle56_t ), 7 ); VERIFY_SIZE( sizeof( ulittle64_t ), 8 ); VERIFY_SIZE( sizeof( native8_t ), 1 ); VERIFY_SIZE( sizeof( native16_t ), 2 ); VERIFY_SIZE( sizeof( native24_t ), 3 ); VERIFY_SIZE( sizeof( native32_t ), 4 ); VERIFY_SIZE( sizeof( native40_t ), 5 ); VERIFY_SIZE( sizeof( native48_t ), 6 ); VERIFY_SIZE( sizeof( native56_t ), 7 ); VERIFY_SIZE( sizeof( native64_t ), 8 ); VERIFY_SIZE( sizeof( unative8_t ), 1 ); VERIFY_SIZE( sizeof( unative16_t ), 2 ); VERIFY_SIZE( sizeof( unative24_t ), 3 ); VERIFY_SIZE( sizeof( unative32_t ), 4 ); VERIFY_SIZE( sizeof( unative40_t ), 5 ); VERIFY_SIZE( sizeof( unative48_t ), 6 ); VERIFY_SIZE( sizeof( unative56_t ), 7 ); VERIFY_SIZE( sizeof( unative64_t ), 8 ); VERIFY_SIZE( sizeof( aligned_big16_t ), 2 ); VERIFY_SIZE( sizeof( aligned_big32_t ), 4 ); VERIFY_SIZE( sizeof( aligned_big64_t ), 8 ); VERIFY_SIZE( sizeof( aligned_ubig16_t ), 2 ); VERIFY_SIZE( sizeof( aligned_ubig32_t ), 4 ); VERIFY_SIZE( sizeof( aligned_ubig64_t ), 8 ); VERIFY_SIZE( sizeof( aligned_little16_t ), 2 ); VERIFY_SIZE( sizeof( aligned_little32_t ), 4 ); VERIFY_SIZE( sizeof( aligned_little64_t ), 8 ); VERIFY_SIZE( sizeof( aligned_ulittle16_t ), 2 ); VERIFY_SIZE( sizeof( aligned_ulittle32_t ), 4 ); VERIFY_SIZE( sizeof( aligned_ulittle64_t ), 8 ); } // check_size // check_alignment -------------------------------------------------------// void check_alignment() { // structs with offsets % 2 == 1 for type of size > 1 to ensure no alignment // bytes added for any size > 1 struct big_struct { big8_t v0; big16_t v1; big24_t v3; char v6; big32_t v7; big40_t v11; char v16; big48_t v17; big56_t v23; char v30; big64_t v31; }; struct ubig_struct { ubig8_t v0; ubig16_t v1; ubig24_t v3; char v6; ubig32_t v7; ubig40_t v11; char v16; ubig48_t v17; ubig56_t v23; char v30; ubig64_t v31; }; struct little_struct { little8_t v0; little16_t v1; little24_t v3; char v6; little32_t v7; little40_t v11; char v16; little48_t v17; little56_t v23; char v30; little64_t v31; }; struct ulittle_struct { ulittle8_t v0; ulittle16_t v1; ulittle24_t v3; char v6; ulittle32_t v7; ulittle40_t v11; char v16; ulittle48_t v17; ulittle56_t v23; char v30; ulittle64_t v31; }; struct native_struct { native8_t v0; native16_t v1; native24_t v3; char v6; native32_t v7; native40_t v11; char v16; native48_t v17; native56_t v23; char v30; native64_t v31; }; struct unative_struct { unative8_t v0; unative16_t v1; unative24_t v3; char v6; unative32_t v7; unative40_t v11; char v16; unative48_t v17; unative56_t v23; char v30; unative64_t v31; }; int saved_err_count = err_count; VERIFY_SIZE( sizeof(big_struct), 39 ); VERIFY_SIZE( sizeof(ubig_struct), 39 ); VERIFY_SIZE( sizeof(little_struct), 39 ); VERIFY_SIZE( sizeof(ulittle_struct), 39 ); VERIFY_SIZE( sizeof(native_struct), 39 ); VERIFY_SIZE( sizeof(unative_struct), 39 ); if ( saved_err_count == err_count ) { cout << "Size and alignment for structures of endian types are as expected.\n"; } } // check_alignment // check_representation_and_range_and_ops --------------------------------// void check_representation_and_range_and_ops() { VERIFY_BIG_REPRESENTATION( big8_t ); VERIFY_VALUE_AND_OPS( big8_t, int_least8_t, 0x7f ); VERIFY_VALUE_AND_OPS( big8_t, int_least8_t, -0x80 ); VERIFY_BIG_REPRESENTATION( big16_t ); VERIFY_VALUE_AND_OPS( big16_t, int_least16_t, 0x7fff ); VERIFY_VALUE_AND_OPS( big16_t, int_least16_t, -0x8000 ); VERIFY_BIG_REPRESENTATION( big24_t ); VERIFY_VALUE_AND_OPS( big24_t, int_least32_t, 0x7fffff ); VERIFY_VALUE_AND_OPS( big24_t, int_least32_t, -0x800000 ); VERIFY_BIG_REPRESENTATION( big32_t ); VERIFY_VALUE_AND_OPS( big32_t, int_least32_t, 0x7fffffff ); VERIFY_VALUE_AND_OPS( big32_t, int_least32_t, -0x7fffffff-1 ); VERIFY_BIG_REPRESENTATION( big40_t ); VERIFY_VALUE_AND_OPS( big40_t, int_least64_t, 0x7fffffffffLL ); VERIFY_VALUE_AND_OPS( big40_t, int_least64_t, -0x8000000000LL ); VERIFY_BIG_REPRESENTATION( big48_t ); VERIFY_VALUE_AND_OPS( big48_t, int_least64_t, 0x7fffffffffffLL ); VERIFY_VALUE_AND_OPS( big48_t, int_least64_t, -0x800000000000LL ); VERIFY_BIG_REPRESENTATION( big56_t ); VERIFY_VALUE_AND_OPS( big56_t, int_least64_t, 0x7fffffffffffffLL ); VERIFY_VALUE_AND_OPS( big56_t, int_least64_t, -0x80000000000000LL ); VERIFY_BIG_REPRESENTATION( big64_t ); VERIFY_VALUE_AND_OPS( big64_t, int_least64_t, 0x7fffffffffffffffLL ); VERIFY_VALUE_AND_OPS( big64_t, int_least64_t, -0x7fffffffffffffffLL-1 ); VERIFY_BIG_REPRESENTATION( ubig8_t ); VERIFY_VALUE_AND_OPS( ubig8_t, uint_least8_t, 0xff ); VERIFY_BIG_REPRESENTATION( ubig16_t ); VERIFY_VALUE_AND_OPS( ubig16_t, uint_least16_t, 0xffff ); VERIFY_BIG_REPRESENTATION( ubig24_t ); VERIFY_VALUE_AND_OPS( ubig24_t, uint_least32_t, 0xffffff ); VERIFY_BIG_REPRESENTATION( ubig32_t ); VERIFY_VALUE_AND_OPS( ubig32_t, uint_least32_t, 0xffffffff ); VERIFY_BIG_REPRESENTATION( ubig40_t ); VERIFY_VALUE_AND_OPS( ubig40_t, uint_least64_t, 0xffffffffffLL ); VERIFY_BIG_REPRESENTATION( ubig48_t ); VERIFY_VALUE_AND_OPS( ubig48_t, uint_least64_t, 0xffffffffffffLL ); VERIFY_BIG_REPRESENTATION( ubig56_t ); VERIFY_VALUE_AND_OPS( ubig56_t, uint_least64_t, 0xffffffffffffffLL ); VERIFY_BIG_REPRESENTATION( ubig64_t ); VERIFY_VALUE_AND_OPS( ubig64_t, uint_least64_t, 0xffffffffffffffffLL ); VERIFY_LITTLE_REPRESENTATION( little8_t ); VERIFY_VALUE_AND_OPS( little8_t, int_least8_t, 0x7f ); VERIFY_VALUE_AND_OPS( little8_t, int_least8_t, -0x80 ); VERIFY_LITTLE_REPRESENTATION( little16_t ); VERIFY_VALUE_AND_OPS( little16_t, int_least16_t, 0x7fff ); VERIFY_VALUE_AND_OPS( little16_t, int_least16_t, -0x8000 ); VERIFY_LITTLE_REPRESENTATION( little24_t ); VERIFY_VALUE_AND_OPS( little24_t, int_least32_t, 0x7fffff ); VERIFY_VALUE_AND_OPS( little24_t, int_least32_t, -0x800000 ); VERIFY_LITTLE_REPRESENTATION( little32_t ); VERIFY_VALUE_AND_OPS( little32_t, int_least32_t, 0x7fffffff ); VERIFY_VALUE_AND_OPS( little32_t, int_least32_t, -0x7fffffff-1 ); VERIFY_LITTLE_REPRESENTATION( little40_t ); VERIFY_VALUE_AND_OPS( little40_t, int_least64_t, 0x7fffffffffLL ); VERIFY_VALUE_AND_OPS( little40_t, int_least64_t, -0x8000000000LL ); VERIFY_LITTLE_REPRESENTATION( little48_t ); VERIFY_VALUE_AND_OPS( little48_t, int_least64_t, 0x7fffffffffffLL ); VERIFY_VALUE_AND_OPS( little48_t, int_least64_t, -0x800000000000LL ); VERIFY_LITTLE_REPRESENTATION( little56_t ); VERIFY_VALUE_AND_OPS( little56_t, int_least64_t, 0x7fffffffffffffLL ); VERIFY_VALUE_AND_OPS( little56_t, int_least64_t, -0x80000000000000LL ); VERIFY_LITTLE_REPRESENTATION( little64_t ); VERIFY_VALUE_AND_OPS( little64_t, int_least64_t, 0x7fffffffffffffffLL ); VERIFY_VALUE_AND_OPS( little64_t, int_least64_t, -0x7fffffffffffffffLL-1 ); VERIFY_LITTLE_REPRESENTATION( ulittle8_t ); VERIFY_VALUE_AND_OPS( ulittle8_t, uint_least8_t, 0xff ); VERIFY_LITTLE_REPRESENTATION( ulittle16_t ); VERIFY_VALUE_AND_OPS( ulittle16_t, uint_least16_t, 0xffff ); VERIFY_LITTLE_REPRESENTATION( ulittle24_t ); VERIFY_VALUE_AND_OPS( ulittle24_t, uint_least32_t, 0xffffff ); VERIFY_LITTLE_REPRESENTATION( ulittle32_t ); VERIFY_VALUE_AND_OPS( ulittle32_t, uint_least32_t, 0xffffffff ); VERIFY_LITTLE_REPRESENTATION( ulittle40_t ); VERIFY_VALUE_AND_OPS( ulittle40_t, uint_least64_t, 0xffffffffffLL ); VERIFY_LITTLE_REPRESENTATION( ulittle48_t ); VERIFY_VALUE_AND_OPS( ulittle48_t, uint_least64_t, 0xffffffffffffLL ); VERIFY_LITTLE_REPRESENTATION( ulittle56_t ); VERIFY_VALUE_AND_OPS( ulittle56_t, uint_least64_t, 0xffffffffffffffLL ); VERIFY_LITTLE_REPRESENTATION( ulittle64_t ); VERIFY_VALUE_AND_OPS( ulittle64_t, uint_least64_t, 0xffffffffffffffffLL ); VERIFY_NATIVE_REPRESENTATION( native8_t ); VERIFY_VALUE_AND_OPS( native8_t, int_least8_t, 0x7f ); VERIFY_VALUE_AND_OPS( native8_t, int_least8_t, -0x80 ); VERIFY_NATIVE_REPRESENTATION( native16_t ); VERIFY_VALUE_AND_OPS( native16_t, int_least16_t, 0x7fff ); VERIFY_VALUE_AND_OPS( native16_t, int_least16_t, -0x8000 ); VERIFY_NATIVE_REPRESENTATION( native24_t ); VERIFY_VALUE_AND_OPS( native24_t, int_least32_t, 0x7fffff ); VERIFY_VALUE_AND_OPS( native24_t, int_least32_t, -0x800000 ); VERIFY_NATIVE_REPRESENTATION( native32_t ); VERIFY_VALUE_AND_OPS( native32_t, int_least32_t, 0x7fffffff ); VERIFY_VALUE_AND_OPS( native32_t, int_least32_t, -0x7fffffff-1 ); VERIFY_NATIVE_REPRESENTATION( native40_t ); VERIFY_VALUE_AND_OPS( native40_t, int_least64_t, 0x7fffffffffLL ); VERIFY_VALUE_AND_OPS( native40_t, int_least64_t, -0x8000000000LL ); VERIFY_NATIVE_REPRESENTATION( native48_t ); VERIFY_VALUE_AND_OPS( native48_t, int_least64_t, 0x7fffffffffffLL ); VERIFY_VALUE_AND_OPS( native48_t, int_least64_t, -0x800000000000LL ); VERIFY_NATIVE_REPRESENTATION( native56_t ); VERIFY_VALUE_AND_OPS( native56_t, int_least64_t, 0x7fffffffffffffLL ); VERIFY_VALUE_AND_OPS( native56_t, int_least64_t, -0x80000000000000LL ); VERIFY_NATIVE_REPRESENTATION( native64_t ); VERIFY_VALUE_AND_OPS( native64_t, int_least64_t, 0x7fffffffffffffffLL ); VERIFY_VALUE_AND_OPS( native64_t, int_least64_t, -0x7fffffffffffffffLL-1 ); VERIFY_NATIVE_REPRESENTATION( unative8_t ); VERIFY_VALUE_AND_OPS( unative8_t, uint_least8_t, 0xff ); VERIFY_NATIVE_REPRESENTATION( unative16_t ); VERIFY_VALUE_AND_OPS( unative16_t, uint_least16_t, 0xffff ); VERIFY_NATIVE_REPRESENTATION( unative24_t ); VERIFY_VALUE_AND_OPS( unative24_t, uint_least32_t, 0xffffff ); VERIFY_NATIVE_REPRESENTATION( unative32_t ); VERIFY_VALUE_AND_OPS( unative32_t, uint_least32_t, 0xffffffff ); VERIFY_NATIVE_REPRESENTATION( unative40_t ); VERIFY_VALUE_AND_OPS( unative40_t, uint_least64_t, 0xffffffffffLL ); VERIFY_NATIVE_REPRESENTATION( unative48_t ); VERIFY_VALUE_AND_OPS( unative48_t, uint_least64_t, 0xffffffffffffLL ); VERIFY_NATIVE_REPRESENTATION( unative56_t ); VERIFY_VALUE_AND_OPS( unative56_t, uint_least64_t, 0xffffffffffffffLL ); VERIFY_NATIVE_REPRESENTATION( unative64_t ); VERIFY_VALUE_AND_OPS( unative64_t, uint_least64_t, 0xffffffffffffffffLL ); VERIFY_BIG_REPRESENTATION( aligned_big16_t ); VERIFY_VALUE_AND_OPS( aligned_big16_t, int_least16_t, 0x7fff ); VERIFY_VALUE_AND_OPS( aligned_big16_t, int_least16_t, -0x8000 ); VERIFY_BIG_REPRESENTATION( aligned_big32_t ); VERIFY_VALUE_AND_OPS( aligned_big32_t, int_least32_t, 0x7fffffff ); VERIFY_VALUE_AND_OPS( aligned_big32_t, int_least32_t, -0x7fffffff-1 ); VERIFY_BIG_REPRESENTATION( aligned_big64_t ); VERIFY_VALUE_AND_OPS( aligned_big64_t, int_least64_t, 0x7fffffffffffffffLL ); VERIFY_VALUE_AND_OPS( aligned_big64_t, int_least64_t, -0x7fffffffffffffffLL-1 ); VERIFY_BIG_REPRESENTATION( aligned_ubig16_t ); VERIFY_VALUE_AND_OPS( aligned_ubig16_t, uint_least16_t, 0xffff ); VERIFY_BIG_REPRESENTATION( aligned_ubig32_t ); VERIFY_VALUE_AND_OPS( aligned_ubig32_t, uint_least32_t, 0xffffffff ); VERIFY_BIG_REPRESENTATION( aligned_ubig64_t ); VERIFY_VALUE_AND_OPS( aligned_ubig64_t, uint_least64_t, 0xffffffffffffffffLL ); VERIFY_LITTLE_REPRESENTATION( aligned_little16_t ); VERIFY_VALUE_AND_OPS( aligned_little16_t, int_least16_t, 0x7fff ); VERIFY_VALUE_AND_OPS( aligned_little16_t, int_least16_t, -0x8000 ); VERIFY_LITTLE_REPRESENTATION( aligned_little32_t ); VERIFY_VALUE_AND_OPS( aligned_little32_t, int_least32_t, 0x7fffffff ); VERIFY_VALUE_AND_OPS( aligned_little32_t, int_least32_t, -0x7fffffff-1 ); VERIFY_LITTLE_REPRESENTATION( aligned_little64_t ); VERIFY_VALUE_AND_OPS( aligned_little64_t, int_least64_t, 0x7fffffffffffffffLL ); VERIFY_VALUE_AND_OPS( aligned_little64_t, int_least64_t, -0x7fffffffffffffffLL-1 ); VERIFY_LITTLE_REPRESENTATION( aligned_ulittle16_t ); VERIFY_VALUE_AND_OPS( aligned_ulittle16_t, uint_least16_t, 0xffff ); VERIFY_LITTLE_REPRESENTATION( aligned_ulittle32_t ); VERIFY_VALUE_AND_OPS( aligned_ulittle32_t, uint_least32_t, 0xffffffff ); VERIFY_LITTLE_REPRESENTATION( aligned_ulittle64_t ); VERIFY_VALUE_AND_OPS( aligned_ulittle64_t, uint_least64_t, 0xffffffffffffffffLL ); } // check_representation_and_range long iterations = 10000000; template< class Endian > Endian timing_test( const char * s) { cout << s << " timing test, " << iterations << " iterations: "; progress_timer t; Endian v = 1; for ( long i = 0; i < iterations; ++i ) { v += 1; v *= 3; ++v; v *= i; if ( i == 0 ) VERIFY_VALUE_AND_OPS( Endian, typename Endian::value_type, 21 ); } return v; } } // unnamed namespace int main( int argc, char * argv[] ) { cout << "Usage: " << argv[0] << " [#],\n where # specifies iteration count\n" " default iteration count is 1000000" << endl; if ( argc > 1 ) iterations = atol( argv[1] ); if ( iterations < 1 ) iterations = 1; detect_endianness(); check_size(); check_alignment(); check_representation_and_range_and_ops(); //timing_test ( "big32_t" ); //timing_test( "aligned_big32_t" ); //timing_test ( "little32_t" ); //timing_test( "aligned_little32_t" ); cout << "\n" << err_count << " errors detected\nTest " << (err_count==0 ? "passed\n\n" : "failed\n\n"); return err_count ? 1 : 0; } // main SuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/libs/integer/test/test.bat0000644000175000017500000000070411562456103031706 0ustar dandanset ENDIAN_LOCATE_ROOT=%TEMP%\endian-regr md %ENDIAN_LOCATE_ROOT% 2>nul echo Begin test processing... bjam --dump-tests includes=/boost/trunk "-sALL_LOCATE_TARGET=%ENDIAN_LOCATE_ROOT%" %* >bjam.log 2>&1 echo Begin log processing... process_jam_log %ENDIAN_LOCATE_ROOT% #include #include namespace bi = boost::integer; #ifdef _MSC_VER # pragma warning( disable : 4244 ) // conversion ..., possible loss of data # pragma warning( disable : 4018 ) // signed/unsigned mismatch #endif template struct default_construct { static void test() { T1 o1; o1 = 1; // quiet warnings } }; template struct construct { static void test() { T2 o2(1); T1 o1(o2); ++o1; // quiet gcc unused variable warning } }; template struct initialize { static void test() { T1 o2(2); T1 o1 = o2; ++o1; // quiet gcc unused variable warning } }; template struct assign { static void test() { T2 o2; o2 = 1; T1 o1; o1 = o2; } }; template struct relational { static void test() { T1 o1(1); T2 o2(2); if ( o1 == o2 ) return; if ( o1 != o2 ) return; if ( o1 < o2 ) return; if ( o1 <= o2 ) return; if ( o1 > o2 ) return; if ( o1 >= o2 ) return; } }; template struct op_plus { static void test() { T1 o1(1); T2 o2(2); T1 o3; o3 = +o1; o3 = o1 + o2; o1 += o2; } }; template struct op_star { static void test() { T1 o1(1); T2 o2(2); T1 o3; o3 = o1 * o2; o1 *= o2; } }; template class Test, class T1> void op_test_aux() { #ifdef BOOST_SHORT_ENDIAN_TEST Test::test(); Test::test(); Test::test(); Test::test(); #else Test::test(); Test::test(); Test::test(); Test::test(); Test::test(); Test::test(); Test::test(); Test::test(); Test::test(); Test::test(); Test::test(); Test::test(); Test::test(); Test::test(); Test::test(); Test::test(); Test::test(); Test::test(); Test::test(); Test::test(); Test::test(); Test::test(); Test::test(); Test::test(); Test::test(); Test::test(); Test::test(); Test::test(); Test::test(); Test::test(); Test::test(); Test::test(); Test::test(); Test::test(); Test::test(); Test::test(); Test::test(); Test::test(); Test::test(); Test::test(); Test::test(); Test::test(); Test::test(); Test::test(); Test::test(); Test::test(); Test::test(); Test::test(); Test::test(); Test::test(); Test::test(); Test::test(); Test::test(); Test::test(); Test::test(); Test::test(); Test::test(); Test::test(); Test::test(); #endif } template class Test> void op_test() { #ifdef BOOST_SHORT_ENDIAN_TEST op_test_aux(); op_test_aux(); op_test_aux(); op_test_aux(); op_test_aux(); #else op_test_aux(); op_test_aux(); op_test_aux(); op_test_aux(); op_test_aux(); op_test_aux(); op_test_aux(); op_test_aux(); op_test_aux(); op_test_aux(); op_test_aux(); op_test_aux(); op_test_aux(); op_test_aux(); op_test_aux(); op_test_aux(); op_test_aux(); op_test_aux(); op_test_aux(); op_test_aux(); op_test_aux(); op_test_aux(); op_test_aux(); op_test_aux(); op_test_aux(); op_test_aux(); op_test_aux(); op_test_aux(); op_test_aux(); op_test_aux(); op_test_aux(); op_test_aux(); op_test_aux(); op_test_aux(); op_test_aux(); op_test_aux(); op_test_aux(); op_test_aux(); op_test_aux(); op_test_aux(); op_test_aux(); op_test_aux(); op_test_aux(); op_test_aux(); op_test_aux(); op_test_aux(); op_test_aux(); op_test_aux(); op_test_aux(); op_test_aux(); op_test_aux(); op_test_aux(); op_test_aux(); op_test_aux(); op_test_aux(); op_test_aux(); op_test_aux(); op_test_aux(); op_test_aux(); #endif } int main() { bi::endian_log = false; // make sure some simple things work bi::big32_t o1(1); bi::big32_t o2(2L); bi::big32_t o3(3LL); bi::big64_t o4(1); // use cases; if BOOST_ENDIAN_LOG is defined, will output to clog info on // what overloads and conversions are actually being performed. bi::endian_log = true; std::clog << "set up test values\n"; bi::big32_t big(12345); bi::ulittle16_t ulittle(10); bi::big64_t result; std::clog << "\nresult = +big\n"; result = +big; std::clog << "\nresult = -big\n"; result = -big; std::clog << "\n++big\n"; ++big; std::clog << "\nresult = big++\n"; result = big++; std::clog << "\n--big\n"; --big; std::clog << "\nbig--\n"; big--; std::clog << "\nresult = big * big\n"; result = big * big; std::clog << "\nresult = big * big\n"; result = big * big; std::clog << "\nresult = big * ulittle\n"; result = big * ulittle; std::clog << "\nbig *= ulittle\n"; big *= ulittle; std::clog << "\nresult = ulittle * big\n"; result = ulittle * big; std::clog << "\nresult = big * 5\n"; result = big * 5; std::clog << "\nbig *= 5\n"; big *= 5; std::clog << "\nresult = 5 * big\n"; result = 5 * big; std::clog << "\nresult = ulittle * 5\n"; result = ulittle * 5; std::clog << "\nresult = 5 * ulittle\n"; result = 5 * ulittle; std::clog << "\nresult = 5 * 10\n"; result = 5 * 10; std::clog << "\n"; bi::endian_log = false; // perform the indicated test on ~60*60 operand types op_test(); op_test(); // includes copy construction op_test(); op_test(); op_test(); op_test(); op_test(); return 0; } ././@LongLink0000000000000000000000000000015500000000000011566 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/libs/integer/test/endian-in-sandbox/SuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/libs/integer/test/endian-in-0000775000175000017500000000000012110505246032071 5ustar dandan././@LongLink0000000000000000000000000000020000000000000011555 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/libs/integer/test/endian-in-sandbox/binary_stream_test/SuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/libs/integer/test/endian-in-0000775000175000017500000000000012110505246032071 5ustar dandan././@LongLink0000000000000000000000000000023100000000000011561 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/libs/integer/test/endian-in-sandbox/binary_stream_test/binary_stream_test.vcprojSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/libs/integer/test/endian-in-0000644000175000017500000000745111562456103032107 0ustar dandan ././@LongLink0000000000000000000000000000017400000000000011567 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/libs/integer/test/endian-in-sandbox/endian_example/SuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/libs/integer/test/endian-in-0000775000175000017500000000000012110505246032071 5ustar dandan././@LongLink0000000000000000000000000000022100000000000011560 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/libs/integer/test/endian-in-sandbox/endian_example/endian_example.vcprojSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/libs/integer/test/endian-in-0000644000175000017500000000745011562456103032106 0ustar dandan ././@LongLink0000000000000000000000000000017300000000000011566 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/libs/integer/test/endian-in-sandbox/common.vspropsSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/libs/integer/test/endian-in-0000644000175000017500000000112411562456103032076 0ustar dandan ././@LongLink0000000000000000000000000000020400000000000011561 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/libs/integer/test/endian-in-sandbox/endian_operations_test/SuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/libs/integer/test/endian-in-0000775000175000017500000000000012110505246032071 5ustar dandan././@LongLink0000000000000000000000000000024100000000000011562 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/libs/integer/test/endian-in-sandbox/endian_operations_test/endian_operations_test.vcprojSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/libs/integer/test/endian-in-0000644000175000017500000000736111562456103032107 0ustar dandan ././@LongLink0000000000000000000000000000020000000000000011555 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/libs/integer/test/endian-in-sandbox/endian_hello_world/SuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/libs/integer/test/endian-in-0000775000175000017500000000000012110505246032071 5ustar dandan././@LongLink0000000000000000000000000000023100000000000011561 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/libs/integer/test/endian-in-sandbox/endian_hello_world/endian_hello_world.vcprojSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/libs/integer/test/endian-in-0000644000175000017500000000746411562456103032113 0ustar dandan ././@LongLink0000000000000000000000000000021000000000000011556 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/libs/integer/test/endian-in-sandbox/scoped_enum_emulation_test/SuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/libs/integer/test/endian-in-0000775000175000017500000000000012110505246032071 5ustar dandan././@LongLink0000000000000000000000000000025100000000000011563 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/libs/integer/test/endian-in-sandbox/scoped_enum_emulation_test/scoped_enum_emulation_test.vcprojSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/libs/integer/test/endian-in-0000644000175000017500000000750111562456103032103 0ustar dandan ././@LongLink0000000000000000000000000000017100000000000011564 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/libs/integer/test/endian-in-sandbox/endian_test/SuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/libs/integer/test/endian-in-0000775000175000017500000000000012110505246032071 5ustar dandan././@LongLink0000000000000000000000000000021300000000000011561 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/libs/integer/test/endian-in-sandbox/endian_test/endian_test.vcprojSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/libs/integer/test/endian-in-0000644000175000017500000000736411562456103032112 0ustar dandan ././@LongLink0000000000000000000000000000020700000000000011564 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/libs/integer/test/endian-in-sandbox/endian_binary_stream_test/SuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/libs/integer/test/endian-in-0000775000175000017500000000000012110505246032071 5ustar dandan././@LongLink0000000000000000000000000000024700000000000011570 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/libs/integer/test/endian-in-sandbox/endian_binary_stream_test/endian_binary_stream_test.vcprojSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/libs/integer/test/endian-in-0000644000175000017500000000747611562456103032116 0ustar dandan ././@LongLink0000000000000000000000000000020200000000000011557 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/libs/integer/test/endian-in-sandbox/endian_in_union_test/SuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/libs/integer/test/endian-in-0000775000175000017500000000000012110505246032071 5ustar dandan././@LongLink0000000000000000000000000000023500000000000011565 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/libs/integer/test/endian-in-sandbox/endian_in_union_test/endian_in_union_test.vcprojSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/libs/integer/test/endian-in-0000644000175000017500000000735311562456103032110 0ustar dandan ././@LongLink0000000000000000000000000000020200000000000011557 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/libs/integer/test/endian-in-sandbox/endian-in-sandbox.slnSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/libs/integer/test/endian-in-0000644000175000017500000001036111562456103032101 0ustar dandan Microsoft Visual Studio Solution File, Format Version 10.00 # Visual C++ Express 2008 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "endian_test", "endian_test\endian_test.vcproj", "{74C201F3-8308-40BE-BC0F-24974DEAF405}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "endian_in_union_test", "endian_in_union_test\endian_in_union_test.vcproj", "{3926C6DC-9D1E-4227-BEF5-81F5EC621A75}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "endian_operations_test", "endian_operations_test\endian_operations_test.vcproj", "{A0060A5B-673C-4AD8-BD08-A5C643B1A1CB}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "scoped_enum_emulation_test", "scoped_enum_emulation_test\scoped_enum_emulation_test.vcproj", "{8420E151-B23B-4651-B526-6AB11EF1E278}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "endian_example", "endian_example\endian_example.vcproj", "{8638A3D8-D121-40BF-82E5-127F1B1B2CB2}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "endian_hello_world", "endian_hello_world\endian_hello_world.vcproj", "{1AAEBB4E-501E-417E-9531-04469AF5DD8B}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "binary_stream_test", "binary_stream_test\binary_stream_test.vcproj", "{1382D085-FF3F-4573-8709-E10D3D74D620}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "endian_binary_stream_test", "endian_binary_stream_test\endian_binary_stream_test.vcproj", "{AD46E04C-C1E1-446E-8D5F-E11B6C438181}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {74C201F3-8308-40BE-BC0F-24974DEAF405}.Debug|Win32.ActiveCfg = Debug|Win32 {74C201F3-8308-40BE-BC0F-24974DEAF405}.Debug|Win32.Build.0 = Debug|Win32 {74C201F3-8308-40BE-BC0F-24974DEAF405}.Release|Win32.ActiveCfg = Release|Win32 {74C201F3-8308-40BE-BC0F-24974DEAF405}.Release|Win32.Build.0 = Release|Win32 {3926C6DC-9D1E-4227-BEF5-81F5EC621A75}.Debug|Win32.ActiveCfg = Debug|Win32 {3926C6DC-9D1E-4227-BEF5-81F5EC621A75}.Debug|Win32.Build.0 = Debug|Win32 {3926C6DC-9D1E-4227-BEF5-81F5EC621A75}.Release|Win32.ActiveCfg = Release|Win32 {3926C6DC-9D1E-4227-BEF5-81F5EC621A75}.Release|Win32.Build.0 = Release|Win32 {A0060A5B-673C-4AD8-BD08-A5C643B1A1CB}.Debug|Win32.ActiveCfg = Debug|Win32 {A0060A5B-673C-4AD8-BD08-A5C643B1A1CB}.Debug|Win32.Build.0 = Debug|Win32 {A0060A5B-673C-4AD8-BD08-A5C643B1A1CB}.Release|Win32.ActiveCfg = Release|Win32 {A0060A5B-673C-4AD8-BD08-A5C643B1A1CB}.Release|Win32.Build.0 = Release|Win32 {8420E151-B23B-4651-B526-6AB11EF1E278}.Debug|Win32.ActiveCfg = Debug|Win32 {8420E151-B23B-4651-B526-6AB11EF1E278}.Debug|Win32.Build.0 = Debug|Win32 {8420E151-B23B-4651-B526-6AB11EF1E278}.Release|Win32.ActiveCfg = Release|Win32 {8420E151-B23B-4651-B526-6AB11EF1E278}.Release|Win32.Build.0 = Release|Win32 {8638A3D8-D121-40BF-82E5-127F1B1B2CB2}.Debug|Win32.ActiveCfg = Debug|Win32 {8638A3D8-D121-40BF-82E5-127F1B1B2CB2}.Debug|Win32.Build.0 = Debug|Win32 {8638A3D8-D121-40BF-82E5-127F1B1B2CB2}.Release|Win32.ActiveCfg = Release|Win32 {8638A3D8-D121-40BF-82E5-127F1B1B2CB2}.Release|Win32.Build.0 = Release|Win32 {1AAEBB4E-501E-417E-9531-04469AF5DD8B}.Debug|Win32.ActiveCfg = Debug|Win32 {1AAEBB4E-501E-417E-9531-04469AF5DD8B}.Debug|Win32.Build.0 = Debug|Win32 {1AAEBB4E-501E-417E-9531-04469AF5DD8B}.Release|Win32.ActiveCfg = Release|Win32 {1AAEBB4E-501E-417E-9531-04469AF5DD8B}.Release|Win32.Build.0 = Release|Win32 {1382D085-FF3F-4573-8709-E10D3D74D620}.Debug|Win32.ActiveCfg = Debug|Win32 {1382D085-FF3F-4573-8709-E10D3D74D620}.Debug|Win32.Build.0 = Debug|Win32 {1382D085-FF3F-4573-8709-E10D3D74D620}.Release|Win32.ActiveCfg = Release|Win32 {1382D085-FF3F-4573-8709-E10D3D74D620}.Release|Win32.Build.0 = Release|Win32 {AD46E04C-C1E1-446E-8D5F-E11B6C438181}.Debug|Win32.ActiveCfg = Debug|Win32 {AD46E04C-C1E1-446E-8D5F-E11B6C438181}.Debug|Win32.Build.0 = Debug|Win32 {AD46E04C-C1E1-446E-8D5F-E11B6C438181}.Release|Win32.ActiveCfg = Release|Win32 {AD46E04C-C1E1-446E-8D5F-E11B6C438181}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal ././@LongLink0000000000000000000000000000016100000000000011563 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/libs/integer/test/binary_stream_test.cppSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/libs/integer/test/binary_str0000644000175000017500000000536211562456103032343 0ustar dandan// binary_stream_test.cpp ------------------------------------------------------------// // Copyright Beman Dawes 2009 // Distributed under the Boost Software License, Version 1.0. // See http://www.boost.org/LICENSE_1_0.txt #include #include #include #include using namespace boost; using namespace std; namespace { int errors = 0; void verify( bool x, const char * file, int line ) { if ( x ) return; ++errors; cout << file << "(" << line << ") : error: predicate is false\n" << endl; } } #define BOOST_VERIFY(predicate) verify( predicate, __FILE__, __LINE__ ) int main() { std::stringstream ss( std::ios_base::in | std::ios_base::out | std::ios_base::binary ); short short_1(0x0102), short_2; ss <= short_1; ss >= short_2; BOOST_VERIFY( short_1 == short_2 ); unsigned short ushort_1(0x0102), ushort_2; ss <= ushort_1; ss >= ushort_2; BOOST_VERIFY( ushort_1 == ushort_2 ); int int_1(0x01020304), int_2; ss <= int_1; ss >= int_2; BOOST_VERIFY( int_1 == int_2 ); unsigned int uint_1(0x01020304), uint_2; ss <= uint_1; ss >= uint_2; BOOST_VERIFY( uint_1 == uint_2 ); long long_1(0x01020304L), long_2; ss <= long_1; ss >= long_2; BOOST_VERIFY( long_1 == long_2 ); unsigned long ulong_1(0x01020304UL), ulong_2; ss <= ulong_1; ss >= ulong_2; BOOST_VERIFY( ulong_1 == ulong_2 ); long long long_long_1(0x0102030405060708LL), long_long_2; ss <= long_long_1; ss >= long_long_2; BOOST_VERIFY( long_long_1 == long_long_2 ); unsigned long long ulong_long_1(0x0102030405060708ULL), ulong_long_2; ss <= ulong_long_1; ss >= ulong_long_2; BOOST_VERIFY( ulong_long_1 == ulong_long_2 ); float float_1(1.2F), float_2; ss <= float_1; ss >= float_2; BOOST_VERIFY( float_1 == float_2 ); double double_1(1.2), double_2; ss <= double_1; ss >= double_2; BOOST_VERIFY( double_1 == double_2 ); long double long_double_1(1.2), long_double_2; ss <= long_double_1; ss >= long_double_2; BOOST_VERIFY( long_double_1 == long_double_2 ); char char_1(0x01), char_2; ss <= char_1; ss >= char_2; BOOST_VERIFY( char_1 == char_2 ); signed char schar_1(0x01), schar_2; ss <= schar_1; ss >= schar_2; BOOST_VERIFY( schar_1 == schar_2 ); unsigned char uchar_1(0x01), uchar_2; ss <= uchar_1; ss >= uchar_2; BOOST_VERIFY( uchar_1 == uchar_2 ); wchar_t wchar_t_1(L'1'), wchar_t_2; ss <= wchar_t_1; ss >= wchar_t_2; BOOST_VERIFY( wchar_t_1 == wchar_t_2 ); string string_1("foobar"), string_2; ss <= string_1.c_str(); ss >= string_2; BOOST_VERIFY( string_1 == string_2 ); ss <= string_1; ss >= string_2; BOOST_VERIFY( string_1 == string_2 ); cout << errors << " error(s) detected\n"; return errors; } ././@LongLink0000000000000000000000000000016300000000000011565 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/libs/integer/test/endian_in_union_test.cppSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/libs/integer/test/endian_in_0000644000175000017500000000400611562456103032244 0ustar dandan// endian_in_union_test.cpp -------------------------------------------------// // Copyright Beman Dawes 2008 // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // See library home page at http://www.boost.org/libs/endian //----------------------------------------------------------------------------// #define BOOST_ENDIAN_FORCE_PODNESS #include #include using namespace boost::integer; union U { big8_t big8; big16_t big16; big24_t big24; big32_t big32; big40_t big40; big48_t big48; big56_t big56; big64_t big64; ubig8_t ubig8; ubig16_t ubig16; ubig24_t ubig24; ubig32_t ubig32; ubig40_t ubig40; ubig48_t ubig48; ubig56_t ubig56; ubig64_t ubig64; little8_t little8; little16_t little16; little24_t little24; little32_t little32; little40_t little40; little48_t little48; little56_t little56; little64_t little64; ulittle8_t ulittle8; ulittle16_t ulittle16; ulittle24_t ulittle24; ulittle32_t ulittle32; ulittle40_t ulittle40; ulittle48_t ulittle48; ulittle56_t ulittle56; ulittle64_t ulittle64; native8_t native8; native16_t native16; native24_t native24; native32_t native32; native40_t native40; native48_t native48; native56_t native56; native64_t native64; unative8_t unative8; unative16_t unative16; unative24_t unative24; unative32_t unative32; unative40_t unative40; unative48_t unative48; unative56_t unative56; unative64_t unative64; }; U foo; int main() { return 0; } SuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/libs/integer/doc/0000775000175000017500000000000012110505246030017 5ustar dandanSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/libs/integer/doc/endian.html0000644000175000017500000007764711562456103032175 0ustar dandan Boost Endian Integers
boost.png (6897 bytes) Endian Integers
Boost Home  Tutorial
Contents
Introduction
Hello endian world
Limitations
Feature set
Typedefs
    Comment on naming
Class template endian
    Synopsis
    Members
FAQ
Binary I/O warnings and cautions
Example
Design
Experience
C++0x
Compilation
Acknowledgements
Headers
<boost/integer/endian.hpp>
<boost/integer/endian_binary_stream.hpp>
<boost/binary_stream.hpp>

Introduction

Header <boost/integer/endian.hpp> provides integer-like byte-holder binary types with explicit control over byte order, value type, size, and alignment. Typedefs provide easy-to-use names for common configurations.

These types provide portable byte-holders for integer data, independent of particular computer architectures. Use cases almost always involve I/O, either via files or network connections. Although data portability is the primary motivation, these integer byte-holders may also be used to reduce memory use, file size, or network activity since they provide binary integer sizes not otherwise available.

Such integer byte-holder types are traditionally called endian types. See the Wikipedia for a full exploration of endianness, including definitions of big endian and little endian.

Boost endian integers provide the same full set of C++ assignment, arithmetic, and relational operators as C++ standard integral types, with the standard semantics.

Unary arithmetic operators are +, -, ~, !, prefix and postfix -- and ++. Binary arithmetic operators are +, +=, -, -=, *, *=, /, /=, %/ %=, &, &=, |, |=, ^, ^=, <<, <<=, >>, >>=. Binary relational operators are ==, !=, <, <=, >, >=.

Automatic conversion is provided to the underlying integer value type.

Header <boost/integer/endian_binary_stream.hpp> provides operators <= and => for unformatted binary (as opposed to formatted character) stream insertion and extraction of endian types.

Header <boost/binary_stream.hpp> provides operators <= and => for unformatted binary (as opposed to formatted character) stream insertion and extraction of built-in and std::string types.

Hello endian world

#include <boost/integer/endian.hpp>
#include <boost/integer/endian_binary_stream.hpp>
#include <boost/binary_stream.hpp>
#include <iostream>

using namespace boost;
using namespace boost::integer;

int main()
{
  int_least32_t v = 0x31323334L;  // = ASCII { '1', '2', '3', '4' }
                                  // value chosen to work on text stream
  big32_t    b(v);
  little32_t l(v);

  std::cout << "Hello, endian world!\n\n";

  std::cout << v << ' ' << b << ' ' << l << '\n';
  std::cout <= v <= ' ' <= b <= ' ' <= l <= '\n';
}

On a little-endian CPU, this program outputs:

Hello, endian world!

825373492 825373492 825373492
4321 1234 4321

Limitations

Requires <climits> CHAR_BIT == 8. If CHAR_BIT is some other value, compilation will result in an #error. This restriction is in place because the design, implementation, testing, and documentation has only considered issues related to 8-bit bytes, and there have been no real-world use cases presented for other sizes.

In C++03, endian does not meet the requirements for POD types because it has constructors, private data members, and a base class. This means that common use cases are relying on unspecified behavior in that the C++ Standard does not guarantee memory layout for non-POD types. This has not been a problem in practice since all known C++ compilers do layout memory as if endian were a POD type. In C++0x, it will be possible to specify the default constructor as trivial, and private data members and base classes will no longer disqualify a type from being a POD. Thus under C++0x, endian will no longer be relying on unspecified behavior.

Feature set

  • Big endian| little endian | native endian byte ordering.
  • Signed | unsigned
  • Unaligned | aligned
  • 1-8 byte (unaligned) | 2, 4, 8 byte (aligned)
  • Choice of integer value type

Typedefs

One class template is provided:

template <endianness::enum_t E, typename T, std::size_t n_bytes,
  alignment::enum_t A = alignment::unaligned>
class endian;

Sixty typedefs, such as big32_t, provide convenient naming conventions for common use cases:

Name Endianness Sign Sizes in bits (n) Alignment
bign_t big signed 8,16,24,32,40,48,56,64 unaligned
ubign_t big unsigned 8,16,24,32,40,48,56,64 unaligned
littlen_t little signed 8,16,24,32,40,48,56,64 unaligned
ulittlen_t little unsigned 8,16,24,32,40,48,56,64 unaligned
nativen_t native signed 8,16,24,32,40,48,56,64 unaligned
unativen_t native unsigned 8,16,24,32,40,48,56,64 unaligned
aligned_bign_t big signed 16,32,64 aligned
aligned_ubign_t big unsigned 16,32,64 aligned
aligned_littlen_t little signed 16,32,64 aligned
aligned_ulittlen_t little unsigned 16,32,64 aligned

The unaligned types do not cause compilers to insert padding bytes in classes and structs. This is an important characteristic that can be exploited to minimize wasted space in memory, files, and network transmissions.

Warning: Code that uses aligned types is inherently non-portable because alignment requirements vary between hardware architectures and because alignment may be affected by compiler switches or pragmas. Furthermore, aligned types are only available on architectures with 16, 32, and 64-bit integer types.

Note: One-byte big-endian, little-endian, and native-endian types provide identical functionality. All three names are provided to improve code readability and searchability.

Comment on naming

When first exposed to endian types, programmers often fit them into a mental model based on the <cstdint> types. Using that model, it is natural to expect a 56-bit big-endian signed integer to be named int_big56_t rather than big56_t.

As experience using these type grows, the realization creeps in that they are lousy arithmetic integers - they are really byte holders that for convenience support arithmetic operations - and that for use in internal interfaces or anything more than trivial arithmetic computations it is far better to convert values of these endian types to traditional integer types.

That seems to lead to formation of a new mental model specific to endian byte-holder types. In that model, the endianness is the key feature, and the integer aspect is downplayed. Once that mental transition is made, a name like big56_t is a good reflection of the mental model

Class template endian

An endian is an integer byte-holder with user-specified endianness, value type, size, and alignment. The usual operations on integers are supplied.

Synopsis

namespace boost
{
  namespace integer
  {
     
    enum class endianness { big, little, native };  // scoped enum emulated on C++03
    enum class alignment  { unaligned, aligned };   // scoped enum emulated on C++03

    template <endianness E, typename T, std::size_t n_bits,
      alignment A = alignment::unaligned>
    class endian : integer_cover_operators< endian<E, T, n_bits, A>, T >
    {
    public:
      typedef T value_type;
      endian() = default;       // = default replaced by {} on C++03
      explicit endian(T v);
      endian & operator=(T v);
      operator T() const;
    };

    // unaligned big endian signed integer types
    typedef endian< endianness::big, int_least8_t, 8 >   big8_t;
    typedef endian< endianness::big, int_least16_t, 16 > big16_t;
    typedef endian< endianness::big, int_least32_t, 24 > big24_t;
    typedef endian< endianness::big, int_least32_t, 32 > big32_t;
    typedef endian< endianness::big, int_least64_t, 40 > big40_t;
    typedef endian< endianness::big, int_least64_t, 48 > big48_t;
    typedef endian< endianness::big, int_least64_t, 56 > big56_t;
    typedef endian< endianness::big, int_least64_t, 64 > big64_t;

    // unaligned big endian unsigned integer types
    typedef endian< endianness::big, uint_least8_t, 8 >   ubig8_t;
    typedef endian< endianness::big, uint_least16_t, 16 > ubig16_t;
    typedef endian< endianness::big, uint_least32_t, 24 > ubig24_t;
    typedef endian< endianness::big, uint_least32_t, 32 > ubig32_t;
    typedef endian< endianness::big, uint_least64_t, 40 > ubig40_t;
    typedef endian< endianness::big, uint_least64_t, 48 > ubig48_t;
    typedef endian< endianness::big, uint_least64_t, 56 > ubig56_t;
    typedef endian< endianness::big, uint_least64_t, 64 > ubig64_t;

    // unaligned little endian signed integer types
    typedef endian< endianness::little, int_least8_t, 8 >   little8_t;
    typedef endian< endianness::little, int_least16_t, 16 > little16_t;
    typedef endian< endianness::little, int_least32_t, 24 > little24_t;
    typedef endian< endianness::little, int_least32_t, 32 > little32_t;
    typedef endian< endianness::little, int_least64_t, 40 > little40_t;
    typedef endian< endianness::little, int_least64_t, 48 > little48_t;
    typedef endian< endianness::little, int_least64_t, 56 > little56_t;
    typedef endian< endianness::little, int_least64_t, 64 > little64_t;

    // unaligned little endian unsigned integer types
    typedef endian< endianness::little, uint_least8_t, 8 >   ulittle8_t;
    typedef endian< endianness::little, uint_least16_t, 16 > ulittle16_t;
    typedef endian< endianness::little, uint_least32_t, 24 > ulittle24_t;
    typedef endian< endianness::little, uint_least32_t, 32 > ulittle32_t;
    typedef endian< endianness::little, uint_least64_t, 40 > ulittle40_t;
    typedef endian< endianness::little, uint_least64_t, 48 > ulittle48_t;
    typedef endian< endianness::little, uint_least64_t, 56 > ulittle56_t;
    typedef endian< endianness::little, uint_least64_t, 64 > ulittle64_t;

    // unaligned native endian signed integer types
    typedef endian< endianness::native, int_least8_t, 8 >   native8_t;
    typedef endian< endianness::native, int_least16_t, 16 > native16_t;
    typedef endian< endianness::native, int_least32_t, 24 > native24_t;
    typedef endian< endianness::native, int_least32_t, 32 > native32_t;
    typedef endian< endianness::native, int_least64_t, 40 > native40_t;
    typedef endian< endianness::native, int_least64_t, 48 > native48_t;
    typedef endian< endianness::native, int_least64_t, 56 > native56_t;
    typedef endian< endianness::native, int_least64_t, 64 > native64_t;

    // unaligned native endian unsigned integer types
    typedef endian< endianness::native, uint_least8_t, 8 >   unative8_t;
    typedef endian< endianness::native, uint_least16_t, 16 > unative16_t;
    typedef endian< endianness::native, uint_least32_t, 24 > unative24_t;
    typedef endian< endianness::native, uint_least32_t, 32 > unative32_t;
    typedef endian< endianness::native, uint_least64_t, 40 > unative40_t;
    typedef endian< endianness::native, uint_least64_t, 48 > unative48_t;
    typedef endian< endianness::native, uint_least64_t, 56 > unative56_t;
    typedef endian< endianness::native, uint_least64_t, 64 > unative64_t;

    // These types only present if platform has exact size integers:

    // aligned big endian signed integer types
    typedef endian< endianness::big, int16_t, 16, alignment::aligned >  aligned_big16_t;
    typedef endian< endianness::big, int32_t, 32, alignment::aligned >  aligned_big32_t;
    typedef endian< endianness::big, int64_t, 64, alignment::aligned >  aligned_big64_t;

    // aligned big endian unsigned integer types
    typedef endian< endianness::big, uint16_t, 16, alignment::aligned > aligned_ubig16_t;
    typedef endian< endianness::big, uint32_t, 32, alignment::aligned > aligned_ubig32_t;
    typedef endian< endianness::big, uint64_t, 64, alignment::aligned > aligned_ubig64_t;

    // aligned little endian signed integer types
    typedef endian< endianness::little, int16_t, 16, alignment::aligned > aligned_little2_t;
    typedef endian< endianness::little, int32_t, 32, alignment::aligned > aligned_little4_t;
    typedef endian< endianness::little, int64_t, 64, alignment::aligned > aligned_little8_t;

    // aligned little endian unsigned integer types
    typedef endian< endianness::little, uint16_t, 16, alignment::aligned > aligned_ulittle2_t;
    typedef endian< endianness::little, uint32_t, 32, alignment::aligned > aligned_ulittle4_t;
    typedef endian< endianness::little, uint64_t, 64, alignment::aligned > aligned_ulittle8_t;


    // aligned native endian typedefs are not provided because
    // <cstdint> types are superior for this use case

  } // namespace integer
} // namespace boost

Members

endian() = default;  // C++03: endian(){}

Effects: Constructs an object of type endian<E, T, n_bits, A>.

explicit endian(T v);

Effects: Constructs an object of type endian<E, T, n_bits, A>.

Postcondition: x == v, where x is the constructed object.

endian & operator=(T v);

Postcondition: x == v, where x is the constructed object.

Returns: *this.

operator T() const;

Returns: The current value stored in *this, converted to value_type.

Other operators

Other operators on endian objects are forwarded to the equivalent operator on value_type.

FAQ

Why bother with endian types? External data portability and both speed and space efficiency. Availability of additional binary integer sizes and alignments is important in some applications.

Why not just use Boost.Serialization? Serialization involves a conversion for every object involved in I/O. Endian objects require no conversion or copying. They are already in the desired format for binary I/O. Thus they can be read or written in bulk.

Why bother with binary I/O? Why not just use C++ Standard Library stream inserters and extractors? Using binary rather than character representations can be more space efficient, with a side benefit of faster I/O. CPU time is minimized because conversions to and from string are eliminated. Furthermore, binary integers are fixed size, and so fixed-size disk records are possible, easing sorting and allowing direct access. Disadvantages, such as the inability to use text utilities on the resulting files, limit usefulness to applications where the binary I/O advantages are paramount.

Do these types have any uses outside of I/O? Probably not, except for native endianness which can be used for fine grained control over size and alignment.

Is there is a performance hit when doing arithmetic using these types? Yes, for sure, compared to arithmetic operations on native integer types. However, these types are usually be faster, and sometimes much faster, for I/O compared to stream inserters and extractors, or to serialization.

Are endian types POD's? Yes for C++0x. No for C++03, although several macros are available to force PODness in all cases.

What are the implications endian types not being POD's of C++03? They can't be used in unions. In theory, compilers aren't required to align or lay out storage in portable ways, although this problem has never been observed in a real compiler.

Which is better, big-endian or little-endian? Big-endian tends to be a bit more of an industry standard, but little-endian may be preferred for applications that run primarily on x86 (Intel/AMD) and other little-endian CPU's. The Wikipedia article gives more pros and cons.

What good is native endianness? It provides alignment and size guarantees not available from the built-in types. It eases generic programming.

Why bother with the aligned endian types? Aligned integer operations may be faster (20 times, in one measurement) if the endianness and alignment of the type matches the endianness and alignment requirements of the machine. On common CPU architectures, that optimization is only available for aligned types. That allows I/O of maximally efficient types on an application's primary platform, yet produces data files are portable to all platforms. The code, however, is likely to be more fragile and less portable than with the unaligned types.

These types are really just byte-holders. Why provide the arithmetic operations at all? Providing a full set of operations reduces program clutter and makes code both easier to write and to read. Consider incrementing a variable in a record. It is very convenient to write:

    ++record.foo;

Rather than:

    int temp( record.foo);
    ++temp;
    record.foo = temp;

Why do binary stream insertion and extraction use operators <= and >= rather than <<= and >>=? <<= and >>= associate right-to-left, which is the opposite of << and >>, so would be very confusing and error prone. <= and >= associate left-to-right.

Binary I/O warnings and cautions

Warning:  Use only on streams opened with filemode std::ios_base::binary. Thus unformatted binary I/O should not be with the standard streams (cout, cin, etc.) since they are opened in text mode. Use on text streams may produce incorrect results, such as insertion of unwanted characters or premature end-of-file. For example, on Windows 0x0D would become 0x0D, 0x0A.

Caution: When mixing formatted (i.e. operator << or >>) and unformatted (i.e. operator <= or >=) stream I/O, be aware that << and >> take precedence over <= and >=. Use parentheses to force correct order of evaluation. For example:

my_stream << foo <= bar;    // no parentheses needed
(my_stream <= foo) << bar;  // parentheses required 

As a practical matter, it may be easier and safer to never mix the character and binary insertion or extraction operators in the same statement.

Example

The endian_example.cpp program writes a binary file containing four byte big-endian and little-endian integers:

#include <iostream>
#include <cassert>
#include <cstdio>
#include <boost/integer/endian.hpp>

using namespace boost::integer;

namespace 
{
  // This is an extract from a very widely used GIS file format. I have no idea
  // why a designer would mix big and little endians in the same file - but
  // this is a real-world format and users wishing to write low level code
  // manipulating these files have to deal with the mixed endianness.

  struct header
  {
    big32_t     file_code;
    big32_t     file_length;
    little32_t  version;
    little32_t  shape_type;
  };

  const char * filename = "test.dat";
}

int main()
{
  assert( sizeof( header ) == 16 );  // requirement for interoperability

  header h;

  h.file_code   = 0x04030201;
  h.file_length = sizeof( header );
  h.version     = -1;
  h.shape_type  = 0x04030201;

  // Low-level I/O such as POSIX read/write or <cstdio> fread/fwrite is sometimes
  // used for binary file operations when ultimate efficiency is important.
  // Such I/O is often performed in some C++ wrapper class, but to drive home the
  // point that endian integers are often used in fairly low-level code that
  // does bulk I/O operations, <cstdio> fopen/fwrite is used for I/O in this example.

  std::FILE * fi;

  if ( !(fi = std::fopen( filename, "wb" )) )  // MUST BE BINARY
  {
    std::cout << "could not open " << filename << '\n';
    return 1;
  }

  if ( std::fwrite( &h, sizeof( header ), 1, fi ) != 1 ) 
  {
    std::cout << "write failure for " << filename << '\n';
    return 1;
  }

  std::fclose( fi );

  std::cout << "created file " << filename << '\n';
  return 0;
}

After compiling and executing endian_example.cpp, a hex dump of test.dat shows:

0403 0201 0000 0010 ffff ffff 0102 0304

Design considerations for Boost.Endian

  • Must be suitable for I/O - in other words, must be memcpyable.
  • Must provide exactly the size and internal byte ordering specified.
  • Must work correctly when the internal integer representation has more bits that the sum of the bits in the external byte representation. Sign extension must work correctly when the internal integer representation type has more bits than the sum of the bits in the external bytes. For example, using a 64-bit integer internally to represent 40-bit (5 byte) numbers must work for both positive and negative values.
  • Must work correctly (including using the same defined external representation) regardless of whether a compiler treats char as signed or unsigned.
  • Unaligned types must not cause compilers to insert padding bytes.
  • The implementation should supply optimizations only in very limited circumstances. Experience has shown that optimizations of endian integers often become pessimizations. While this may be obvious when changing machines or compilers, it also happens when changing compiler switches, compiler versions, or CPU models of the same architecture.
  • It is better software engineering if the same implementation works regardless of the CPU endianness. In other words, #ifdefs should be avoided where possible.

Experience

Classes with similar functionality have been independently developed by several Boost programmers and used very successful in high-value, high-use applications for many years. These independently developed endian libraries often evolved from C libraries that were also widely used. Endian integers have proven widely useful across a wide range of computer architectures and applications.

C++0x

The availability of the C++0x Defaulted Functions feature is detected automatically, and will be used if present to ensure that objects of class endian are trivial, and thus POD's.

Compilation

Boost.Endian is implemented entirely within headers, with no need to link to any Boost object libraries.

Several macros allow user control over features:

  • BOOST_ENDIAN_NO_CTORS causes class endian to have no constructors. The intended use is for compiling user code that must be portable between compilers regardless of C++0x Defaulted Functions support. Use of constructors will always fail,
     
  • BOOST_ENDIAN_FORCE_PODNESS causes BOOST_ENDIAN_NO_CTORS to be defined if the compiler does not support C++0x Defaulted Functions. This is ensures that , and so can be used in unions. In C++0x, class endian objects are POD's even though they have constructors.

Acknowledgements

Original design developed by Darin Adler based on classes developed by Mark Borgerding. Four original class templates combined into a single endian class template by Beman Dawes, who put the library together, provided documentation, and added the typedefs. He also added the unrolled_byte_loops sign partial specialization to correctly extend the sign when cover integer size differs from endian representation size.

Comments and suggestions were received from Benaka Moorthi, Christopher Kohlhoff, Cliff Green, Gennaro Proto, Jeff Flinn, John Maddock, Kim Barrett, Marsh Ray, Martin Bonner, Matias Capeletto, Rene Rivera, Scott McMurray, Sebastian Redl, Tomas Puverle, and Yuval Ronen.


Last revised: 19 March, 2009

© Copyright Beman Dawes, 2006-2009

Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at www.boost.org/ LICENSE_1_0.txt)

SuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/boost/0000775000175000017500000000000012110505246026012 5ustar dandanSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/boost/integer/0000775000175000017500000000000012110505246027447 5ustar dandanSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/boost/integer/endian.hpp0000664000175000017500000004173312057624166031443 0ustar dandan// Boost endian.hpp header file -------------------------------------------------------// // (C) Copyright Darin Adler 2000 // (C) Copyright Beman Dawes 2006, 2009 // Distributed under the Boost Software License, Version 1.0. // See http://www.boost.org/LICENSE_1_0.txt // See library home page at http://www.boost.org/libs/endian //--------------------------------------------------------------------------------------// // Original design developed by Darin Adler based on classes developed by Mark // Borgerding. Four original class templates were combined into a single endian // class template by Beman Dawes, who also added the unrolled_byte_loops sign // partial specialization to correctly extend the sign when cover integer size // differs from endian representation size. // TODO: When a compiler supporting constexpr becomes available, try possible uses. #ifndef BOOST_ENDIAN_HPP #define BOOST_ENDIAN_HPP #ifdef BOOST_ENDIAN_LOG # include #endif #if defined(__BORLANDC__) || defined( __CODEGEARC__) # pragma pack(push, 1) #endif #include #include #define BOOST_MINIMAL_INTEGER_COVER_OPERATORS #define BOOST_NO_IO_COVER_OPERATORS #include #undef BOOST_NO_IO_COVER_OPERATORS #undef BOOST_MINIMAL_INTEGER_COVER_OPERATORS #include #include #include #include #include #include # if CHAR_BIT != 8 # error Platforms with CHAR_BIT != 8 are not supported # endif # ifdef BOOST_NO_DEFAULTED_FUNCTIONS # define BOOST_ENDIAN_DEFAULT_CONSTRUCT {} // C++03 # else # define BOOST_ENDIAN_DEFAULT_CONSTRUCT = default; // C++0x # endif # if defined(BOOST_NO_DEFAULTED_FUNCTIONS) && defined(BOOST_ENDIAN_FORCE_PODNESS) # define BOOST_ENDIAN_NO_CTORS # endif namespace boost { namespace detail { // Unrolled loops for loading and storing streams of bytes. template ::value > struct unrolled_byte_loops { typedef unrolled_byte_loops next; static T load_big(const unsigned char* bytes) { return *(bytes - 1) | (next::load_big(bytes - 1) << 8); } static T load_little(const unsigned char* bytes) { return *bytes | (next::load_little(bytes + 1) << 8); } static void store_big(char* bytes, T value) { *(bytes - 1) = static_cast(value); next::store_big(bytes - 1, value >> 8); } static void store_little(char* bytes, T value) { *bytes = static_cast(value); next::store_little(bytes + 1, value >> 8); } }; template struct unrolled_byte_loops { static T load_big(const unsigned char* bytes) { return *(bytes - 1); } static T load_little(const unsigned char* bytes) { return *bytes; } static void store_big(char* bytes, T value) { *(bytes - 1) = static_cast(value); } static void store_little(char* bytes, T value) { *bytes = static_cast(value); } }; template struct unrolled_byte_loops { static T load_big(const unsigned char* bytes) { return *reinterpret_cast(bytes - 1); } static T load_little(const unsigned char* bytes) { return *reinterpret_cast(bytes); } static void store_big(char* bytes, T value) { *(bytes - 1) = static_cast(value); } static void store_little(char* bytes, T value) { *bytes = static_cast(value); } }; template inline T load_big_endian(const void* bytes) { return unrolled_byte_loops::load_big (static_cast(bytes) + n_bytes); } template inline T load_little_endian(const void* bytes) { return unrolled_byte_loops::load_little (static_cast(bytes)); } template inline void store_big_endian(void* bytes, T value) { unrolled_byte_loops::store_big (static_cast(bytes) + n_bytes, value); } template inline void store_little_endian(void* bytes, T value) { unrolled_byte_loops::store_little (static_cast(bytes), value); } } // namespace detail namespace integer { # ifdef BOOST_ENDIAN_LOG bool endian_log(true); # endif // endian class template and specializations ---------------------------------------// BOOST_SCOPED_ENUM_START(endianness) { big, little, native }; BOOST_SCOPED_ENUM_END BOOST_SCOPED_ENUM_START(alignment) { unaligned, aligned }; BOOST_SCOPED_ENUM_END template class endian; // Specializations that represent unaligned bytes. // Taking an integer type as a parameter provides a nice way to pass both // the size and signedness of the desired integer and get the appropriate // corresponding integer type for the interface. // unaligned big endian specialization template class endian< endianness::big, T, n_bits, alignment::unaligned > : cover_operators< endian< endianness::big, T, n_bits >, T > { BOOST_STATIC_ASSERT( (n_bits/8)*8 == n_bits ); public: typedef T value_type; # ifndef BOOST_ENDIAN_NO_CTORS endian() BOOST_ENDIAN_DEFAULT_CONSTRUCT explicit endian(T val) { # ifdef BOOST_ENDIAN_LOG if ( endian_log ) std::clog << "big, unaligned, " << n_bits << "-bits, construct(" << val << ")\n"; # endif detail::store_big_endian(m_value, val); } # endif endian & operator=(T val) { detail::store_big_endian(m_value, val); return *this; } operator T() const { # ifdef BOOST_ENDIAN_LOG if ( endian_log ) std::clog << "big, unaligned, " << n_bits << "-bits, convert(" << detail::load_big_endian(m_value) << ")\n"; # endif return detail::load_big_endian(m_value); } private: char m_value[n_bits/8]; }; // unaligned little endian specialization template class endian< endianness::little, T, n_bits, alignment::unaligned > : cover_operators< endian< endianness::little, T, n_bits >, T > { BOOST_STATIC_ASSERT( (n_bits/8)*8 == n_bits ); public: typedef T value_type; # ifndef BOOST_ENDIAN_NO_CTORS endian() BOOST_ENDIAN_DEFAULT_CONSTRUCT explicit endian(T val) { # ifdef BOOST_ENDIAN_LOG if ( endian_log ) std::clog << "little, unaligned, " << n_bits << "-bits, construct(" << val << ")\n"; # endif detail::store_little_endian(m_value, val); } # endif endian & operator=(T val) { detail::store_little_endian(m_value, val); return *this; } operator T() const { # ifdef BOOST_ENDIAN_LOG if ( endian_log ) std::clog << "little, unaligned, " << n_bits << "-bits, convert(" << detail::load_little_endian(m_value) << ")\n"; # endif return detail::load_little_endian(m_value); } private: char m_value[n_bits/8]; }; // unaligned native endian specialization template class endian< endianness::native, T, n_bits, alignment::unaligned > : cover_operators< endian< endianness::native, T, n_bits >, T > { BOOST_STATIC_ASSERT( (n_bits/8)*8 == n_bits ); public: typedef T value_type; # ifndef BOOST_ENDIAN_NO_CTORS endian() BOOST_ENDIAN_DEFAULT_CONSTRUCT # ifdef BOOST_BIG_ENDIAN explicit endian(T val) { detail::store_big_endian(m_value, val); } # else explicit endian(T val) { detail::store_little_endian(m_value, val); } # endif # endif # ifdef BOOST_BIG_ENDIAN endian & operator=(T val) { detail::store_big_endian(m_value, val); return *this; } operator T() const { return detail::load_big_endian(m_value); } # else endian & operator=(T val) { detail::store_little_endian(m_value, val); return *this; } operator T() const { return detail::load_little_endian(m_value); } # endif private: char m_value[n_bits/8]; }; // Specializations that mimic built-in integer types. // These typically have the same alignment as the underlying types. // aligned big endian specialization template class endian< endianness::big, T, n_bits, alignment::aligned > : cover_operators< endian< endianness::big, T, n_bits, alignment::aligned >, T > { BOOST_STATIC_ASSERT( (n_bits/8)*8 == n_bits ); BOOST_STATIC_ASSERT( sizeof(T) == n_bits/8 ); public: typedef T value_type; # ifndef BOOST_ENDIAN_NO_CTORS endian() BOOST_ENDIAN_DEFAULT_CONSTRUCT # ifdef BOOST_BIG_ENDIAN endian(T val) : m_value(val) { } # else explicit endian(T val) { detail::store_big_endian(&m_value, val); } # endif # endif # ifdef BOOST_BIG_ENDIAN endian & operator=(T val) { m_value = val; return *this; } operator T() const { return m_value; } # else endian & operator=(T val) { detail::store_big_endian(&m_value, val); return *this; } operator T() const { return detail::load_big_endian(&m_value); } # endif private: T m_value; }; // aligned little endian specialization template class endian< endianness::little, T, n_bits, alignment::aligned > : cover_operators< endian< endianness::little, T, n_bits, alignment::aligned >, T > { BOOST_STATIC_ASSERT( (n_bits/8)*8 == n_bits ); BOOST_STATIC_ASSERT( sizeof(T) == n_bits/8 ); public: typedef T value_type; # ifndef BOOST_ENDIAN_NO_CTORS endian() BOOST_ENDIAN_DEFAULT_CONSTRUCT # ifdef BOOST_LITTLE_ENDIAN endian(T val) : m_value(val) { } # else explicit endian(T val) { detail::store_little_endian(&m_value, val); } # endif # endif # ifdef BOOST_LITTLE_ENDIAN endian & operator=(T val) { m_value = val; return *this; } operator T() const { return m_value; } #else endian & operator=(T val) { detail::store_little_endian(&m_value, val); return *this; } operator T() const { return detail::load_little_endian(&m_value); } #endif private: T m_value; }; // naming convention typedefs ------------------------------------------------------// // unaligned big endian signed integer types typedef endian< endianness::big, int_least8_t, 8 > big8_t; typedef endian< endianness::big, int_least16_t, 16 > big16_t; typedef endian< endianness::big, int_least32_t, 24 > big24_t; typedef endian< endianness::big, int_least32_t, 32 > big32_t; typedef endian< endianness::big, int_least64_t, 40 > big40_t; typedef endian< endianness::big, int_least64_t, 48 > big48_t; typedef endian< endianness::big, int_least64_t, 56 > big56_t; typedef endian< endianness::big, int_least64_t, 64 > big64_t; // unaligned big endian unsigned integer types typedef endian< endianness::big, uint_least8_t, 8 > ubig8_t; typedef endian< endianness::big, uint_least16_t, 16 > ubig16_t; typedef endian< endianness::big, uint_least32_t, 24 > ubig24_t; typedef endian< endianness::big, uint_least32_t, 32 > ubig32_t; typedef endian< endianness::big, uint_least64_t, 40 > ubig40_t; typedef endian< endianness::big, uint_least64_t, 48 > ubig48_t; typedef endian< endianness::big, uint_least64_t, 56 > ubig56_t; typedef endian< endianness::big, uint_least64_t, 64 > ubig64_t; // unaligned little endian signed integer types typedef endian< endianness::little, int_least8_t, 8 > little8_t; typedef endian< endianness::little, int_least16_t, 16 > little16_t; typedef endian< endianness::little, int_least32_t, 24 > little24_t; typedef endian< endianness::little, int_least32_t, 32 > little32_t; typedef endian< endianness::little, int_least64_t, 40 > little40_t; typedef endian< endianness::little, int_least64_t, 48 > little48_t; typedef endian< endianness::little, int_least64_t, 56 > little56_t; typedef endian< endianness::little, int_least64_t, 64 > little64_t; // unaligned little endian unsigned integer types typedef endian< endianness::little, uint_least8_t, 8 > ulittle8_t; typedef endian< endianness::little, uint_least16_t, 16 > ulittle16_t; typedef endian< endianness::little, uint_least32_t, 24 > ulittle24_t; typedef endian< endianness::little, uint_least32_t, 32 > ulittle32_t; typedef endian< endianness::little, uint_least64_t, 40 > ulittle40_t; typedef endian< endianness::little, uint_least64_t, 48 > ulittle48_t; typedef endian< endianness::little, uint_least64_t, 56 > ulittle56_t; typedef endian< endianness::little, uint_least64_t, 64 > ulittle64_t; // unaligned native endian signed integer types typedef endian< endianness::native, int_least8_t, 8 > native8_t; typedef endian< endianness::native, int_least16_t, 16 > native16_t; typedef endian< endianness::native, int_least32_t, 24 > native24_t; typedef endian< endianness::native, int_least32_t, 32 > native32_t; typedef endian< endianness::native, int_least64_t, 40 > native40_t; typedef endian< endianness::native, int_least64_t, 48 > native48_t; typedef endian< endianness::native, int_least64_t, 56 > native56_t; typedef endian< endianness::native, int_least64_t, 64 > native64_t; // unaligned native endian unsigned integer types typedef endian< endianness::native, uint_least8_t, 8 > unative8_t; typedef endian< endianness::native, uint_least16_t, 16 > unative16_t; typedef endian< endianness::native, uint_least32_t, 24 > unative24_t; typedef endian< endianness::native, uint_least32_t, 32 > unative32_t; typedef endian< endianness::native, uint_least64_t, 40 > unative40_t; typedef endian< endianness::native, uint_least64_t, 48 > unative48_t; typedef endian< endianness::native, uint_least64_t, 56 > unative56_t; typedef endian< endianness::native, uint_least64_t, 64 > unative64_t; #define BOOST_HAS_INT16_T #define BOOST_HAS_INT32_T #define BOOST_HAS_INT64_T // These types only present if platform has exact size integers: // aligned big endian signed integer types // aligned big endian unsigned integer types // aligned little endian signed integer types // aligned little endian unsigned integer types // aligned native endian typedefs are not provided because // types are superior for this use case # if defined(BOOST_HAS_INT16_T) typedef endian< endianness::big, int16_t, 16, alignment::aligned > aligned_big16_t; typedef endian< endianness::big, uint16_t, 16, alignment::aligned > aligned_ubig16_t; typedef endian< endianness::little, int16_t, 16, alignment::aligned > aligned_little16_t; typedef endian< endianness::little, uint16_t, 16, alignment::aligned > aligned_ulittle16_t; # endif # if defined(BOOST_HAS_INT32_T) typedef endian< endianness::big, int32_t, 32, alignment::aligned > aligned_big32_t; typedef endian< endianness::big, uint32_t, 32, alignment::aligned > aligned_ubig32_t; typedef endian< endianness::little, int32_t, 32, alignment::aligned > aligned_little32_t; typedef endian< endianness::little, uint32_t, 32, alignment::aligned > aligned_ulittle32_t; # endif # if defined(BOOST_HAS_INT64_T) typedef endian< endianness::big, int64_t, 64, alignment::aligned > aligned_big64_t; typedef endian< endianness::big, uint64_t, 64, alignment::aligned > aligned_ubig64_t; typedef endian< endianness::little, int64_t, 64, alignment::aligned > aligned_little64_t; typedef endian< endianness::little, uint64_t, 64, alignment::aligned > aligned_ulittle64_t; # endif } // namespace integer } // namespace boost #if defined(__BORLANDC__) || defined( __CODEGEARC__) # pragma pack(pop) #endif #endif // BOOST_ENDIAN_HPP ././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/boost/integer/cover_operators.hppSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/boost/integer/cover_operator0000644000175000017500000000753211562456103032437 0ustar dandan// boost/integer/cover_operators.hpp ----------------------------------------// // Copyright Darin Adler 2000 // Copyright Beman Dawes 2008 // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) //----------------------------------------------------------------------------// // If the class being covered has a non-explicit conversion to an integer type // then a smaller number of cover operations are needed. Define the macro // BOOST_MINIMAL_INTEGER_COVER_OPERATORS to indicate this. // Define BOOST_NO_IO_COVER_OPERATORS if I/O cover operations are not desired. //----------------------------------------------------------------------------// #ifndef BOOST_INTEGER_COVER_OPERATORS_HPP #define BOOST_INTEGER_COVER_OPERATORS_HPP # ifndef BOOST_MINIMAL_INTEGER_COVER_OPERATORS # include # endif #include namespace boost { namespace integer { // A class that adds integer operators to an integer cover class template class cover_operators # ifndef BOOST_MINIMAL_INTEGER_COVER_OPERATORS : boost::operators # endif { // The other operations take advantage of the type conversion that's // built into unary +. // Unary operations. friend IntegerType operator+(const T& x) { return x; } # ifndef BOOST_MINIMAL_INTEGER_COVER_OPERATORS friend IntegerType operator-(const T& x) { return -+x; } friend IntegerType operator~(const T& x) { return ~+x; } friend IntegerType operator!(const T& x) { return !+x; } // The basic ordering operations. friend bool operator==(const T& x, IntegerType y) { return +x == y; } friend bool operator<(const T& x, IntegerType y) { return +x < y; } # endif // The basic arithmetic operations. friend T& operator+=(T& x, IntegerType y) { return x = +x + y; } friend T& operator-=(T& x, IntegerType y) { return x = +x - y; } friend T& operator*=(T& x, IntegerType y) { return x = +x * y; } friend T& operator/=(T& x, IntegerType y) { return x = +x / y; } friend T& operator%=(T& x, IntegerType y) { return x = +x % y; } friend T& operator&=(T& x, IntegerType y) { return x = +x & y; } friend T& operator|=(T& x, IntegerType y) { return x = +x | y; } friend T& operator^=(T& x, IntegerType y) { return x = +x ^ y; } friend T& operator<<=(T& x, IntegerType y) { return x = +x << y; } friend T& operator>>=(T& x, IntegerType y) { return x = +x >> y; } // A few binary arithmetic operations not covered by operators base class. friend IntegerType operator<<(const T& x, IntegerType y) { return +x << y; } friend IntegerType operator>>(const T& x, IntegerType y) { return +x >> y; } // Auto-increment and auto-decrement can be defined in terms of the // arithmetic operations. friend T& operator++(T& x) { return x += 1; } friend T& operator--(T& x) { return x -= 1; } # ifdef BOOST_MINIMAL_INTEGER_COVER_OPERATORS friend T operator++(T& x, int) { T tmp(x); x += 1; return tmp; } friend T operator--(T& x, int) { T tmp(x); x -= 1; return tmp; } # endif # ifndef BOOST_NO_IO_COVER_OPERATORS // TODO: stream I/O needs to be templatized on the stream type, so will // work with wide streams, etc. // Stream input and output. friend std::ostream& operator<<(std::ostream& s, const T& x) { return s << +x; } friend std::istream& operator>>(std::istream& s, T& x) { IntegerType i; if (s >> i) x = i; return s; } # endif }; } // namespace integer } // namespace boost #endif // BOOST_INTEGER_COVER_OPERATORS_HPP ././@LongLink0000000000000000000000000000015700000000000011570 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/boost/integer/endian_binary_stream.hppSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/boost/integer/endian_binary_0000644000175000017500000001625211562456103032346 0ustar dandan// boost/integer/endian_binary_stream.hpp --------------------------------------------// // Copyright Beman Dawes 2009 // Distributed under the Boost Software License, Version 1.0. // See http://www.boost.org/LICENSE_1_0.txt // See library home page at http://www.boost.org/libs/endian #ifndef BOOST_ENDIAN_BINARY_STREAM_HPP #define BOOST_ENDIAN_BINARY_STREAM_HPP #include #include #include #include // unformatted binary (as opposed to formatted character) stream insertion // and extraction. // Warning: Use only on streams opened with filemode std::ios_base::binary. Thus // unformatted binary I/O should not be with the standard streams (cout, cin, etc.) // since they are opened in text mode. Use on text streams may produce incorrect // results, such as insertion of unwanted characters or premature end-of-file. // For example, on Windows 0x0D would become 0x0D, 0x0A. // Caution: When mixing formatted (i.e. operator << or >>) and unformatted (i.e. // operator <= or >=) be aware that << and >> take precedence over <= and >=. Use // parentheses to force correct order of evaluation. For example: // // my_stream << foo <= bar; // no parentheses needed // (my_stream <= foo) << bar; // parentheses required // This implementation uses reinterpret_cast<>() when needed to convert one pointer // type to another. See 5.2.10 [expr.reinterpret.cast], Reinterpret cast, para 7. namespace boost { namespace integer { template< class T > struct is_endian { static const bool value = false; }; template<> struct is_endian { static const bool value = true; }; template<> struct is_endian { static const bool value = true; }; template<> struct is_endian { static const bool value = true; }; template<> struct is_endian { static const bool value = true; }; template<> struct is_endian { static const bool value = true; }; template<> struct is_endian { static const bool value = true; }; template<> struct is_endian { static const bool value = true; }; template<> struct is_endian { static const bool value = true; }; template<> struct is_endian { static const bool value = true; }; template<> struct is_endian { static const bool value = true; }; template<> struct is_endian { static const bool value = true; }; template<> struct is_endian { static const bool value = true; }; template<> struct is_endian { static const bool value = true; }; template<> struct is_endian { static const bool value = true; }; template<> struct is_endian { static const bool value = true; }; template<> struct is_endian { static const bool value = true; }; template<> struct is_endian { static const bool value = true; }; template<> struct is_endian { static const bool value = true; }; template<> struct is_endian { static const bool value = true; }; template<> struct is_endian { static const bool value = true; }; template<> struct is_endian { static const bool value = true; }; template<> struct is_endian { static const bool value = true; }; template<> struct is_endian { static const bool value = true; }; template<> struct is_endian { static const bool value = true; }; template<> struct is_endian { static const bool value = true; }; template<> struct is_endian { static const bool value = true; }; template<> struct is_endian { static const bool value = true; }; template<> struct is_endian { static const bool value = true; }; template<> struct is_endian { static const bool value = true; }; template<> struct is_endian { static const bool value = true; }; template<> struct is_endian { static const bool value = true; }; template<> struct is_endian { static const bool value = true; }; template<> struct is_endian { static const bool value = true; }; template<> struct is_endian { static const bool value = true; }; template<> struct is_endian { static const bool value = true; }; template<> struct is_endian { static const bool value = true; }; template<> struct is_endian { static const bool value = true; }; template<> struct is_endian { static const bool value = true; }; template<> struct is_endian { static const bool value = true; }; template<> struct is_endian { static const bool value = true; }; template<> struct is_endian { static const bool value = true; }; template<> struct is_endian { static const bool value = true; }; template<> struct is_endian { static const bool value = true; }; template<> struct is_endian { static const bool value = true; }; template<> struct is_endian { static const bool value = true; }; template<> struct is_endian { static const bool value = true; }; template<> struct is_endian { static const bool value = true; }; template<> struct is_endian { static const bool value = true; }; # if defined(BOOST_HAS_INT16_T) template<> struct is_endian { static const bool value = true; }; template<> struct is_endian { static const bool value = true; }; template<> struct is_endian { static const bool value = true; }; template<> struct is_endian { static const bool value = true; }; # endif # if defined(BOOST_HAS_INT32_T) template<> struct is_endian { static const bool value = true; }; template<> struct is_endian { static const bool value = true; }; template<> struct is_endian { static const bool value = true; }; template<> struct is_endian { static const bool value = true; }; # endif # if defined(BOOST_HAS_INT64_T) template<> struct is_endian { static const bool value = true; }; template<> struct is_endian { static const bool value = true; }; template<> struct is_endian { static const bool value = true; }; template<> struct is_endian { static const bool value = true; }; # endif template < class Endian > inline typename boost::enable_if< is_endian, std::ostream & >::type operator<=( std::ostream & os, const Endian & e ) { return os.write( reinterpret_cast(&e), sizeof(e) ); } template < class Endian > inline typename boost::enable_if< is_endian, std::istream & >::type operator>=( std::istream & is, Endian & e ) { return is.read( reinterpret_cast(&e), sizeof(e) ); } } // namespace integer } // namespace boost #endif // BOOST_ENDIAN_BINARY_STREAM_HPP SuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/boost/binary_stream.hpp0000644000175000017500000001601511562456103031372 0ustar dandan// boost/binary_stream.hpp ----------------------------------------------------------// // Copyright Beman Dawes 2009 // Distributed under the Boost Software License, Version 1.0. // See http://www.boost.org/LICENSE_1_0.txt // See documentation at http://www.boost.org/libs/utility #ifndef BOOST_BINARY_STREAM_HPP #define BOOST_BINARY_STREAM_HPP #include #include #include #include #include // for strlen #ifndef BOOST_NO_CWCHAR # include // for wcslen #endif // unformatted binary (as opposed to formatted character-set) input and output // Caution: Use only on streams opened with filemode std::ios_base::binary. Thus // unformatted binary I/O should not be with the standard streams (cout, cin, etc.) // since they are opened in text mode. Use on text streams may produce incorrect // results, such as insertion of unwanted characters or premature end-of-file. // For example, on Windows 0x0D would become 0x0D, 0x0A. // Caution: When mixing formatted (i.e. operator << or >>) and unformatted (i.e. // operator <= or >=) be aware that << and >> take precedence over <= and >=. Use // parentheses to force correct order of evaluation. For example: // // my_stream << foo <= bar; // no parentheses needed // (my_stream <= foo) << bar; // parentheses required // This implementation uses reinterpret_cast<>() when needed to convert one pointer // type to another. See 5.2.10 [expr.reinterpret.cast], Reinterpret cast, para 7. namespace boost { // built-in types ------------------------------------------------------------------// // omission of bool and void* is deliberate; any semantics would be questionable inline std::ostream& operator<=(std::ostream& os, short v) { return os.write( reinterpret_cast(&v), sizeof(v) ); } inline std::istream& operator>=(std::istream& is, short& v) { return is.read( reinterpret_cast(&v), sizeof(v) ); } inline std::ostream& operator<=(std::ostream& os, unsigned short v) { return os.write( reinterpret_cast(&v), sizeof(v) ); } inline std::istream& operator>=(std::istream& is, unsigned short& v) { return is.read( reinterpret_cast(&v), sizeof(v) ); } inline std::ostream& operator<=(std::ostream& os, int v) { return os.write( reinterpret_cast(&v), sizeof(v) ); } inline std::istream& operator>=(std::istream& is, int& v) { return is.read( reinterpret_cast(&v), sizeof(v) ); } inline std::ostream& operator<=(std::ostream& os, unsigned int v) { return os.write( reinterpret_cast(&v), sizeof(v) ); } inline std::istream& operator>=(std::istream& is, unsigned int& v) { return is.read( reinterpret_cast(&v), sizeof(v) ); } inline std::ostream& operator<=(std::ostream& os, long v) { return os.write( reinterpret_cast(&v), sizeof(v) ); } inline std::istream& operator>=(std::istream& is, long& v) { return is.read( reinterpret_cast(&v), sizeof(v) ); } inline std::ostream& operator<=(std::ostream& os, unsigned long v) { return os.write( reinterpret_cast(&v), sizeof(v) ); } inline std::istream& operator>=(std::istream& is, unsigned long& v) { return is.read( reinterpret_cast(&v), sizeof(v) ); } inline std::ostream& operator<=(std::ostream& os, long long v) { return os.write( reinterpret_cast(&v), sizeof(v) ); } inline std::istream& operator>=(std::istream& is, long long& v) { return is.read( reinterpret_cast(&v), sizeof(v) ); } inline std::ostream& operator<=(std::ostream& os, unsigned long long v) { return os.write( reinterpret_cast(&v), sizeof(v) ); } inline std::istream& operator>=(std::istream& is, unsigned long long& v) { return is.read( reinterpret_cast(&v), sizeof(v) ); } inline std::ostream& operator<=(std::ostream& os, float v) { return os.write( reinterpret_cast(&v), sizeof(v) ); } inline std::istream& operator>=(std::istream& is, float& v) { return is.read( reinterpret_cast(&v), sizeof(v) ); } inline std::ostream& operator<=(std::ostream& os, double v) { return os.write( reinterpret_cast(&v), sizeof(v) ); } inline std::istream& operator>=(std::istream& is, double& v) { return is.read( reinterpret_cast(&v), sizeof(v) ); } inline std::ostream& operator<=(std::ostream& os, long double v) { return os.write( reinterpret_cast(&v), sizeof(v) ); } inline std::istream& operator>=(std::istream& is, long double& v) { return is.read( reinterpret_cast(&v), sizeof(v) ); } inline std::ostream& operator<=(std::ostream& os, char c) { return os.put( c ); } inline std::istream& operator>=(std::istream& is, char& c) { return is.get( c ); } inline std::ostream& operator<=(std::ostream& os, signed char c) { return os.put( c ); } inline std::istream& operator>=(std::istream& is, signed char& c) { return is.get( reinterpret_cast(c) ); } inline std::ostream& operator<=(std::ostream& os, unsigned char c) { return os.put( c ); } inline std::istream& operator>=(std::istream& is, unsigned char& c) { return is.get( reinterpret_cast(c) ); } inline std::ostream& operator<=(std::ostream& os, wchar_t v) { return os.write( reinterpret_cast(&v), sizeof(v) ); } inline std::istream& operator>=(std::istream& is, wchar_t& v) { return is.read( reinterpret_cast(&v), sizeof(v) ); } // strings -------------------------------------------------------------------------// inline std::ostream& operator<=(std::ostream& os, const char* p) { return os.write( p, std::strlen(p)+1 ); } inline std::ostream& operator<=(std::ostream& os, const signed char* p) { return os.write( reinterpret_cast(p), std::strlen(reinterpret_cast(p))+1 ); } inline std::ostream& operator<=(std::ostream& os, const unsigned char* p) { return os.write( reinterpret_cast(p), std::strlen(reinterpret_cast(p))+1 ); } #ifndef BOOST_NO_CWCHAR inline std::ostream& operator<=(std::ostream& os, const wchar_t* p) { return os.write( reinterpret_cast(p), (std::wcslen(p)+1)*sizeof(wchar_t) ); } #endif // Caution: note the asymmetry between output and input; a string with embedded // nulls will be output with the embedded nulls, but input will stop at the first null. // So it probably isn't a good idea to use these functions for strings with nulls. inline std::ostream& operator<=(std::ostream& os, const std::string& s) { return os.write( s.c_str(), s.size()+1 ); } inline std::istream& operator>=(std::istream& is, std::string& s) { return getline(is, s, '\0'); } #ifndef BOOST_NO_STD_WSTRING inline std::ostream& operator<=(std::ostream& os, const std::wstring& s) { return os.write( reinterpret_cast(s.c_str()), (s.size()+1)*sizeof(wchar_t) ); } // TODO: provide input function #endif } // namespace boost #endif // BOOST_BINARY_STREAM_HPP SuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/doc/0000775000175000017500000000000012110505246025431 5ustar dandanSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/doc/html/0000775000175000017500000000000012110505246026375 5ustar dandanSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost_endian/doc/html/minimal.css0000644000175000017500000000150211562456103030540 0ustar dandan/* © Copyright Beman Dawes, 2007 Distributed under the Boost Software License, Version 1.0. See www.boost.org/LICENSE_1_0.txt */ /******************************************************************************* Body *******************************************************************************/ body { font-family: sans-serif; margin: 1em; } /******************************************************************************* Table *******************************************************************************/ table { margin: 0.5em; } /******************************************************************************* Font sizes *******************************************************************************/ p, td, li, blockquote { font-size: 10pt; } pre { font-size: 9pt; } /*** end ***/SuperCollider-3.6.3-Source-linux~repack/external_libraries/extract_boost.sh0000664000175000017500000000146212106676016025450 0ustar dandan#!/bin/sh # shell script to extract subset of boost # # run from the root of the supercollider repository # # required argument: root of the boost source tree BOOST_ROOT=$1 bcp --boost=${BOOST_ROOT} \ --scan common/*pp \ --scan lang/*/*pp \ --scan server/supernova/*/*pp \ --scan editors/sc-ide/*/*pp \ --scan editors/sc-ide/*/*/*pp \ --scan external_libraries/boost*/*/*pp \ --scan external_libraries/boost*/*/*/*pp \ --scan external_libraries/boost*/*/*/*/*pp \ --scan external_libraries/threadpool/boost/*/*pp \ --scan external_libraries/threadpool/boost/*/*/*pp \ --scan testsuite/supernova/*pp \ external_libraries/boost # nor do we need tests and the bjam build files rm -rf external_libraries/boost/Jamroot rm -rf external_libraries/boost/libs/*/build rm -rf external_libraries/boost/libs/*/test SuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/0000775000175000017500000000000012110505246025136 5ustar dandanSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/libs/0000775000175000017500000000000012110505246026067 5ustar dandanSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/libs/atomic/0000775000175000017500000000000012110505246027343 5ustar dandanSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/libs/atomic/src/0000775000175000017500000000000012110505246030132 5ustar dandan././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/libs/atomic/src/lockpool.cppSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/libs/atomic/src/lockpool.c0000664000175000017500000000020712110501517032114 0ustar dandan#include namespace boost { namespace atomics { namespace detail { lockpool::lock_type lockpool::pool_[41]; } } } SuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/boost/0000775000175000017500000000000012110505246026264 5ustar dandanSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/boost/lockfree/0000775000175000017500000000000012110505246030056 5ustar dandanSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/boost/lockfree/stack.hpp0000664000175000017500000004076512110501517031705 0ustar dandan// Copyright (C) 2008, 2009, 2010, 2011 Tim Blechmann // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #ifndef BOOST_LOCKFREE_STACK_HPP_INCLUDED #define BOOST_LOCKFREE_STACK_HPP_INCLUDED #include #include #include #include #include #include #include #include #include #include #include #include namespace boost { namespace lockfree { namespace detail { typedef parameter::parameters, boost::parameter::optional > stack_signature; } /** The stack class provides a multi-writer/multi-reader stack, pushing and popping is lock-free, * construction/destruction has to be synchronized. It uses a freelist for memory management, * freed nodes are pushed to the freelist and not returned to the OS before the stack is destroyed. * * \b Policies: * * - \c boost::lockfree::fixed_sized<>, defaults to \c boost::lockfree::fixed_sized
* Can be used to completely disable dynamic memory allocations during push in order to ensure lockfree behavior.
* If the data structure is configured as fixed-sized, the internal nodes are stored inside an array and they are addressed * by array indexing. This limits the possible size of the stack to the number of elements that can be addressed by the index * type (usually 2**16-2), but on platforms that lack double-width compare-and-exchange instructions, this is the best way * to achieve lock-freedom. * * - \c boost::lockfree::capacity<>, optional
* If this template argument is passed to the options, the size of the stack is set at compile-time.
* It this option implies \c fixed_sized * * - \c boost::lockfree::allocator<>, defaults to \c boost::lockfree::allocator>
* Specifies the allocator that is used for the internal freelist * * \b Requirements: * - T must have a copy constructor * */ #ifndef BOOST_DOXYGEN_INVOKED template #else template #endif class stack: boost::noncopyable { private: #ifndef BOOST_DOXYGEN_INVOKED BOOST_STATIC_ASSERT(boost::has_trivial_assign::value); BOOST_STATIC_ASSERT(boost::has_trivial_destructor::value); typedef typename detail::stack_signature::bind::type bound_args; static const bool has_capacity = detail::extract_capacity::has_capacity; static const size_t capacity = detail::extract_capacity::capacity; static const bool fixed_sized = detail::extract_fixed_sized::value; static const bool node_based = !(has_capacity || fixed_sized); static const bool compile_time_sized = has_capacity; struct node { node(T const & val): v(val) {} typedef typename detail::select_tagged_handle::handle_type handle_t; handle_t next; const T v; }; typedef typename detail::extract_allocator::type node_allocator; typedef typename detail::select_freelist::type pool_t; typedef typename pool_t::tagged_node_handle tagged_node_handle; // check compile-time capacity BOOST_STATIC_ASSERT((mpl::if_c::const_max>, mpl::true_ >::type::value)); struct implementation_defined { typedef node_allocator allocator; typedef std::size_t size_type; }; #endif public: typedef T value_type; typedef typename implementation_defined::allocator allocator; typedef typename implementation_defined::size_type size_type; /** * \return true, if implementation is lock-free. * * \warning It only checks, if the top stack node and the freelist can be modified in a lock-free manner. * On most platforms, the whole implementation is lock-free, if this is true. Using c++0x-style atomics, * there is no possibility to provide a completely accurate implementation, because one would need to test * every internal node, which is impossible if further nodes will be allocated from the operating system. * * */ bool is_lock_free (void) const { return tos.is_lock_free() && pool.is_lock_free(); } //! Construct stack // @{ stack(void): pool(node_allocator(), has_capacity ? capacity : 0) { BOOST_STATIC_ASSERT(has_capacity); initialize(); } template explicit stack(typename node_allocator::template rebind::other const & alloc): pool(alloc, has_capacity ? capacity : 0) { BOOST_STATIC_ASSERT(has_capacity); initialize(); } explicit stack(allocator const & alloc): pool(alloc, has_capacity ? capacity : 0) { BOOST_STATIC_ASSERT(has_capacity); initialize(); } // @} //! Construct stack, allocate n nodes for the freelist. // @{ explicit stack(size_type n): pool(node_allocator(), n) { BOOST_STATIC_ASSERT(!has_capacity); initialize(); } template stack(size_type n, typename node_allocator::template rebind::other const & alloc): pool(alloc, n) { BOOST_STATIC_ASSERT(!has_capacity); initialize(); } // @} /** Allocate n nodes for freelist * * \pre only valid if no capacity<> argument given * \note thread-safe, may block if memory allocator blocks * * */ void reserve(size_type n) { BOOST_STATIC_ASSERT(!has_capacity); pool.reserve(n); } /** Allocate n nodes for freelist * * \pre only valid if no capacity<> argument given * \note not thread-safe, may block if memory allocator blocks * * */ void reserve_unsafe(size_type n) { BOOST_STATIC_ASSERT(!has_capacity); pool.reserve_unsafe(n); } /** Destroys stack, free all nodes from freelist. * * \note not thread-safe * * */ ~stack(void) { T dummy; while(unsynchronized_pop(dummy)) {} } private: #ifndef BOOST_DOXYGEN_INVOKED void initialize(void) { tos.store(tagged_node_handle(pool.null_handle(), 0)); } void link_nodes_atomic(node * new_top_node, node * end_node) { tagged_node_handle old_tos = tos.load(detail::memory_order_relaxed); for (;;) { tagged_node_handle new_tos (pool.get_handle(new_top_node), old_tos.get_tag()); end_node->next = pool.get_handle(old_tos); if (tos.compare_exchange_weak(old_tos, new_tos)) break; } } void link_nodes_unsafe(node * new_top_node, node * end_node) { tagged_node_handle old_tos = tos.load(detail::memory_order_relaxed); tagged_node_handle new_tos (pool.get_handle(new_top_node), old_tos.get_tag()); end_node->next = pool.get_pointer(old_tos); tos.store(new_tos, memory_order_relaxed); } template tuple prepare_node_list(ConstIterator begin, ConstIterator end, ConstIterator & ret) { ConstIterator it = begin; node * end_node = pool.template construct(*it++); if (end_node == NULL) { ret = begin; return make_tuple(NULL, NULL); } node * new_top_node = end_node; end_node->next = NULL; try { /* link nodes */ for (; it != end; ++it) { node * newnode = pool.template construct(*it); if (newnode == NULL) break; newnode->next = new_top_node; new_top_node = newnode; } } catch (...) { for (node * current_node = new_top_node; current_node != NULL;) { node * next = current_node->next; pool.template destruct(current_node); current_node = next; } throw; } ret = it; return make_tuple(new_top_node, end_node); } #endif public: /** Pushes object t to the stack. * * \post object will be pushed to the stack, if internal node can be allocated * \returns true, if the push operation is successful. * * \note Thread-safe. If internal memory pool is exhausted and the memory pool is not fixed-sized, a new node will be allocated * from the OS. This may not be lock-free. * \throws if memory allocator throws * */ bool push(T const & v) { return do_push(v); } /** Pushes object t to the stack. * * \post object will be pushed to the stack, if internal node can be allocated * \returns true, if the push operation is successful. * * \note Thread-safe and non-blocking. If internal memory pool is exhausted, the push operation will fail * */ bool bounded_push(T const & v) { return do_push(v); } #ifndef BOOST_DOXYGEN_INVOKED private: template bool do_push(T const & v) { node * newnode = pool.template construct(v); if (newnode == 0) return false; link_nodes_atomic(newnode, newnode); return true; } template ConstIterator do_push(ConstIterator begin, ConstIterator end) { node * new_top_node; node * end_node; ConstIterator ret; tie(new_top_node, end_node) = prepare_node_list(begin, end, ret); if (new_top_node) link_nodes_atomic(new_top_node, end_node); return ret; } public: #endif /** Pushes as many objects from the range [begin, end) as freelist node can be allocated. * * \return iterator to the first element, which has not been pushed * * \note Operation is applied atomically * \note Thread-safe. If internal memory pool is exhausted and the memory pool is not fixed-sized, a new node will be allocated * from the OS. This may not be lock-free. * \throws if memory allocator throws */ template ConstIterator push(ConstIterator begin, ConstIterator end) { return do_push(begin, end); } /** Pushes as many objects from the range [begin, end) as freelist node can be allocated. * * \return iterator to the first element, which has not been pushed * * \note Operation is applied atomically * \note Thread-safe and non-blocking. If internal memory pool is exhausted, the push operation will fail * \throws if memory allocator throws */ template ConstIterator bounded_push(ConstIterator begin, ConstIterator end) { return do_push(begin, end); } /** Pushes object t to the stack. * * \post object will be pushed to the stack, if internal node can be allocated * \returns true, if the push operation is successful. * * \note Not thread-safe. If internal memory pool is exhausted and the memory pool is not fixed-sized, a new node will be allocated * from the OS. This may not be lock-free. * \throws if memory allocator throws * */ bool unsynchronized_push(T const & v) { node * newnode = pool.template construct(v); if (newnode == 0) return false; link_nodes_unsafe(newnode, newnode); return true; } /** Pushes as many objects from the range [begin, end) as freelist node can be allocated. * * \return iterator to the first element, which has not been pushed * * \note Not thread-safe. If internal memory pool is exhausted and the memory pool is not fixed-sized, a new node will be allocated * from the OS. This may not be lock-free. * \throws if memory allocator throws */ template ConstIterator unsynchronized_push(ConstIterator begin, ConstIterator end) { node * new_top_node; node * end_node; ConstIterator ret; tie(new_top_node, end_node) = prepare_node_list(begin, end, ret); if (new_top_node) link_nodes_unsafe(new_top_node, end_node); return ret; } /** Pops object from stack. * * \post if pop operation is successful, object will be copied to ret. * \returns true, if the pop operation is successful, false if stack was empty. * * \note Thread-safe and non-blocking * * */ bool pop(T & ret) { return pop(ret); } /** Pops object from stack. * * \pre type T must be convertible to U * \post if pop operation is successful, object will be copied to ret. * \returns true, if the pop operation is successful, false if stack was empty. * * \note Thread-safe and non-blocking * * */ template bool pop(U & ret) { BOOST_STATIC_ASSERT((boost::is_convertible::value)); tagged_node_handle old_tos = tos.load(detail::memory_order_consume); for (;;) { node * old_tos_pointer = pool.get_pointer(old_tos); if (!old_tos_pointer) return false; tagged_node_handle new_tos(old_tos_pointer->next, old_tos.get_tag() + 1); if (tos.compare_exchange_weak(old_tos, new_tos)) { detail::copy_payload(old_tos_pointer->v, ret); pool.template destruct(old_tos); return true; } } } /** Pops object from stack. * * \post if pop operation is successful, object will be copied to ret. * \returns true, if the pop operation is successful, false if stack was empty. * * \note Not thread-safe, but non-blocking * * */ bool unsynchronized_pop(T & ret) { return unsynchronized_pop(ret); } /** Pops object from stack. * * \pre type T must be convertible to U * \post if pop operation is successful, object will be copied to ret. * \returns true, if the pop operation is successful, false if stack was empty. * * \note Not thread-safe, but non-blocking * * */ template bool unsynchronized_pop(U & ret) { BOOST_STATIC_ASSERT((boost::is_convertible::value)); tagged_node_handle old_tos = tos.load(detail::memory_order_relaxed); node * old_tos_pointer = pool.get_pointer(old_tos); if (!pool.get_pointer(old_tos)) return false; node * new_tos_ptr = pool.get_pointer(old_tos_pointer->next); tagged_node_handle new_tos(pool.get_handle(new_tos_ptr), old_tos.get_tag() + 1); tos.store(new_tos, memory_order_relaxed); detail::copy_payload(old_tos_pointer->v, ret); pool.template destruct(old_tos); return true; } /** * \return true, if stack is empty. * * \note It only guarantees that at some point during the execution of the function the stack has been empty. * It is rarely practical to use this value in program logic, because the the stack can be modified by other threads. * */ bool empty(void) const { return pool.get_pointer(tos.load()) == NULL; } private: #ifndef BOOST_DOXYGEN_INVOKED detail::atomic tos; static const int padding_size = BOOST_LOCKFREE_CACHELINE_BYTES - sizeof(tagged_node_handle); char padding[padding_size]; pool_t pool; #endif }; } /* namespace lockfree */ } /* namespace boost */ #endif /* BOOST_LOCKFREE_STACK_HPP_INCLUDED */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/boost/lockfree/queue.hpp0000664000175000017500000004072012110501517031713 0ustar dandan// lock-free queue queue from // Michael, M. M. and Scott, M. L., // "simple, fast and practical non-blocking and blocking concurrent queue algorithms" // // Copyright (C) 2008, 2009, 2010, 2011 Tim Blechmann // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #ifndef BOOST_LOCKFREE_FIFO_HPP_INCLUDED #define BOOST_LOCKFREE_FIFO_HPP_INCLUDED #include /* std::auto_ptr */ #include #include #include #include #include #include #include #include #include namespace boost { namespace lockfree { namespace detail { typedef parameter::parameters, boost::parameter::optional > queue_signature; } /* namespace detail */ /** The queue class provides a multi-writer/multi-reader queue, pushing and popping is lock-free, * construction/destruction has to be synchronized. It uses a freelist for memory management, * freed nodes are pushed to the freelist and not returned to the OS before the queue is destroyed. * * \b Policies: * - \ref boost::lockfree::fixed_sized, defaults to \c boost::lockfree::fixed_sized \n * Can be used to completely disable dynamic memory allocations during push in order to ensure lockfree behavior. \n * If the data structure is configured as fixed-sized, the internal nodes are stored inside an array and they are addressed * by array indexing. This limits the possible size of the queue to the number of elements that can be addressed by the index * type (usually 2**16-2), but on platforms that lack double-width compare-and-exchange instructions, this is the best way * to achieve lock-freedom. * * - \ref boost::lockfree::capacity, optional \n * If this template argument is passed to the options, the size of the queue is set at compile-time.\n * It this option implies \c fixed_sized * * - \ref boost::lockfree::allocator, defaults to \c boost::lockfree::allocator> \n * Specifies the allocator that is used for the internal freelist * * \b Requirements: * - T must have a copy constructor * - T must have a trivial assignment operator * - T must have a trivial destructor * * */ #ifndef BOOST_DOXYGEN_INVOKED template #else template #endif class queue: boost::noncopyable { private: #ifndef BOOST_DOXYGEN_INVOKED typedef typename detail::queue_signature::bind::type bound_args; static const bool has_capacity = detail::extract_capacity::has_capacity; static const size_t capacity = detail::extract_capacity::capacity; static const bool fixed_sized = detail::extract_fixed_sized::value; static const bool node_based = !(has_capacity || fixed_sized); static const bool compile_time_sized = has_capacity; struct BOOST_LOCKFREE_CACHELINE_ALIGNMENT node { typedef typename detail::select_tagged_handle::tagged_handle_type tagged_node_handle; typedef typename detail::select_tagged_handle::handle_type handle_type; node(T const & v, handle_type null_handle): data(v)//, next(tagged_node_handle(0, 0)) { /* increment tag to avoid ABA problem */ tagged_node_handle old_next = next.load(memory_order_relaxed); tagged_node_handle new_next (null_handle, old_next.get_tag()+1); next.store(new_next, memory_order_release); } node (handle_type null_handle): next(tagged_node_handle(null_handle, 0)) {} node(void) {} atomic next; T data; }; typedef typename detail::extract_allocator::type node_allocator; typedef typename detail::select_freelist::type pool_t; typedef typename pool_t::tagged_node_handle tagged_node_handle; typedef typename detail::select_tagged_handle::handle_type handle_type; void initialize(void) { node * n = pool.template construct(pool.null_handle()); tagged_node_handle dummy_node(pool.get_handle(n), 0); head_.store(dummy_node, memory_order_relaxed); tail_.store(dummy_node, memory_order_release); } struct implementation_defined { typedef node_allocator allocator; typedef std::size_t size_type; }; #endif public: typedef T value_type; typedef typename implementation_defined::allocator allocator; typedef typename implementation_defined::size_type size_type; /** * \return true, if implementation is lock-free. * * \warning It only checks, if the queue head and tail nodes and the freelist can be modified in a lock-free manner. * On most platforms, the whole implementation is lock-free, if this is true. Using c++0x-style atomics, there is * no possibility to provide a completely accurate implementation, because one would need to test every internal * node, which is impossible if further nodes will be allocated from the operating system. * */ bool is_lock_free (void) const { return head_.is_lock_free() && tail_.is_lock_free() && pool.is_lock_free(); } //! Construct queue // @{ queue(void): head_(tagged_node_handle(0, 0)), tail_(tagged_node_handle(0, 0)), pool(node_allocator(), has_capacity ? capacity : 0) { BOOST_STATIC_ASSERT(has_capacity); initialize(); } template explicit queue(typename node_allocator::template rebind::other const & alloc): head_(tagged_node_handle(0, 0)), tail_(tagged_node_handle(0, 0)), pool(alloc, has_capacity ? capacity : 0) { BOOST_STATIC_ASSERT(has_capacity); initialize(); } explicit queue(allocator const & alloc): head_(tagged_node_handle(0, 0)), tail_(tagged_node_handle(0, 0)), pool(alloc, has_capacity ? capacity : 0) { BOOST_STATIC_ASSERT(has_capacity); initialize(); } // @} //! Construct queue, allocate n nodes for the freelist. // @{ explicit queue(size_type n): head_(tagged_node_handle(0, 0)), tail_(tagged_node_handle(0, 0)), pool(node_allocator(), n + 1) { BOOST_STATIC_ASSERT(!has_capacity); initialize(); } template queue(size_type n, typename node_allocator::template rebind::other const & alloc): head_(tagged_node_handle(0, 0)), tail_(tagged_node_handle(0, 0)), pool(alloc, n + 1) { BOOST_STATIC_ASSERT(!has_capacity); initialize(); } // @} /** \copydoc boost::lockfree::stack::reserve * */ void reserve(size_type n) { pool.template reserve(n); } /** \copydoc boost::lockfree::stack::reserve_unsafe * */ void reserve_unsafe(size_type n) { pool.template reserve(n); } /** Destroys queue, free all nodes from freelist. * */ ~queue(void) { T dummy; while(unsynchronized_pop(dummy)) {} pool.template destruct(head_.load(memory_order_relaxed)); } /** Check if the queue is empty * * \return true, if the queue is empty, false otherwise * \note The result is only accurate, if no other thread modifies the queue. Therefore it is rarely practical to use this * value in program logic. * */ bool empty(void) { return pool.get_handle(head_.load()) == pool.get_handle(tail_.load()); } /** Pushes object t to the queue. * * \post object will be pushed to the queue, if internal node can be allocated * \returns true, if the push operation is successful. * * \note Thread-safe. If internal memory pool is exhausted and the memory pool is not fixed-sized, a new node will be allocated * from the OS. This may not be lock-free. * */ bool push(T const & t) { return do_push(t); } /** Pushes object t to the queue. * * \post object will be pushed to the queue, if internal node can be allocated * \returns true, if the push operation is successful. * * \note Thread-safe and non-blocking. If internal memory pool is exhausted, operation will fail * \throws if memory allocator throws * */ bool bounded_push(T const & t) { return do_push(t); } private: #ifndef BOOST_DOXYGEN_INVOKED template bool do_push(T const & t) { using detail::likely; node * n = pool.template construct(t, pool.null_handle()); handle_type node_handle = pool.get_handle(n); if (n == NULL) return false; for (;;) { tagged_node_handle tail = tail_.load(memory_order_acquire); node * tail_node = pool.get_pointer(tail); tagged_node_handle next = tail_node->next.load(memory_order_acquire); node * next_ptr = pool.get_pointer(next); tagged_node_handle tail2 = tail_.load(memory_order_acquire); if (likely(tail == tail2)) { if (next_ptr == 0) { tagged_node_handle new_tail_next(node_handle, next.get_tag() + 1); if ( tail_node->next.compare_exchange_weak(next, new_tail_next) ) { tagged_node_handle new_tail(node_handle, tail.get_tag() + 1); tail_.compare_exchange_strong(tail, new_tail); return true; } } else { tagged_node_handle new_tail(pool.get_handle(next_ptr), tail.get_tag() + 1); tail_.compare_exchange_strong(tail, new_tail); } } } } #endif public: /** Pushes object t to the queue. * * \post object will be pushed to the queue, if internal node can be allocated * \returns true, if the push operation is successful. * * \note Not Thread-safe. If internal memory pool is exhausted and the memory pool is not fixed-sized, a new node will be allocated * from the OS. This may not be lock-free. * \throws if memory allocator throws * */ bool unsynchronized_push(T const & t) { node * n = pool.template construct(t, pool.null_handle()); if (n == NULL) return false; for (;;) { tagged_node_handle tail = tail_.load(memory_order_relaxed); tagged_node_handle next = tail->next.load(memory_order_relaxed); node * next_ptr = next.get_ptr(); if (next_ptr == 0) { tail->next.store(tagged_node_handle(n, next.get_tag() + 1), memory_order_relaxed); tail_.store(tagged_node_handle(n, tail.get_tag() + 1), memory_order_relaxed); return true; } else tail_.store(tagged_node_handle(next_ptr, tail.get_tag() + 1), memory_order_relaxed); } } /** Pops object from queue. * * \post if pop operation is successful, object will be copied to ret. * \returns true, if the pop operation is successful, false if queue was empty. * * \note Thread-safe and non-blocking * */ bool pop (T & ret) { return pop(ret); } /** Pops object from queue. * * \pre type U must be constructible by T and copyable, or T must be convertible to U * \post if pop operation is successful, object will be copied to ret. * \returns true, if the pop operation is successful, false if queue was empty. * * \note Thread-safe and non-blocking * */ template bool pop (U & ret) { using detail::likely; for (;;) { tagged_node_handle head = head_.load(memory_order_acquire); node * head_ptr = pool.get_pointer(head); tagged_node_handle tail = tail_.load(memory_order_acquire); tagged_node_handle next = head_ptr->next.load(memory_order_acquire); node * next_ptr = pool.get_pointer(next); tagged_node_handle head2 = head_.load(memory_order_acquire); if (likely(head == head2)) { if (pool.get_handle(head) == pool.get_handle(tail)) { if (next_ptr == 0) return false; tagged_node_handle new_tail(pool.get_handle(next), tail.get_tag() + 1); tail_.compare_exchange_strong(tail, new_tail); } else { if (next_ptr == 0) /* this check is not part of the original algorithm as published by michael and scott * * however we reuse the tagged_ptr part for the freelist and clear the next part during node * allocation. we can observe a null-pointer here. * */ continue; detail::copy_payload(next_ptr->data, ret); tagged_node_handle new_head(pool.get_handle(next), head.get_tag() + 1); if (head_.compare_exchange_weak(head, new_head)) { pool.template destruct(head); return true; } } } } } /** Pops object from queue. * * \post if pop operation is successful, object will be copied to ret. * \returns true, if the pop operation is successful, false if queue was empty. * * \note Not thread-safe, but non-blocking * * */ bool unsynchronized_pop (T & ret) { return unsynchronized_pop(ret); } /** Pops object from queue. * * \pre type U must be constructible by T and copyable, or T must be convertible to U * \post if pop operation is successful, object will be copied to ret. * \returns true, if the pop operation is successful, false if queue was empty. * * \note Not thread-safe, but non-blocking * * */ template bool unsynchronized_pop (U & ret) { for (;;) { tagged_node_handle head = head_.load(memory_order_relaxed); node * head_ptr = pool.get_pointer(head); tagged_node_handle tail = tail_.load(memory_order_relaxed); tagged_node_handle next = head_ptr->next.load(memory_order_relaxed); node * next_ptr = pool.get_pointer(next); if (pool.get_handle(head) == pool.get_handle(tail)) { if (next_ptr == 0) return false; tagged_node_handle new_tail(pool.get_handle(next), tail.get_tag() + 1); tail_.store(new_tail); } else { if (next_ptr == 0) /* this check is not part of the original algorithm as published by michael and scott * * however we reuse the tagged_ptr part for the freelist and clear the next part during node * allocation. we can observe a null-pointer here. * */ continue; detail::copy_payload(next_ptr->data, ret); tagged_node_handle new_head(pool.get_handle(next), head.get_tag() + 1); head_.store(new_head); pool.template destruct(head); return true; } } } private: #ifndef BOOST_DOXYGEN_INVOKED atomic head_; static const int padding_size = BOOST_LOCKFREE_CACHELINE_BYTES - sizeof(tagged_node_handle); char padding1[padding_size]; atomic tail_; char padding2[padding_size]; pool_t pool; #endif }; } /* namespace lockfree */ } /* namespace boost */ #endif /* BOOST_LOCKFREE_FIFO_HPP_INCLUDED */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/boost/lockfree/detail/0000775000175000017500000000000012110505246031320 5ustar dandan././@LongLink0000000000000000000000000000016400000000000011566 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/boost/lockfree/detail/tagged_ptr_dcas.hppSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/boost/lockfree/detail/tagg0000664000175000017500000000453312110501517032167 0ustar dandan// tagged pointer, for aba prevention // // Copyright (C) 2008 Tim Blechmann // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #ifndef BOOST_LOCKFREE_TAGGED_PTR_DCAS_HPP_INCLUDED #define BOOST_LOCKFREE_TAGGED_PTR_DCAS_HPP_INCLUDED #include #include /* for std::size_t */ namespace boost { namespace lockfree { namespace detail { template class BOOST_LOCKFREE_DCAS_ALIGNMENT tagged_ptr { public: typedef std::size_t tag_t; /** uninitialized constructor */ tagged_ptr(void) BOOST_NOEXCEPT//: ptr(0), tag(0) {} #ifdef BOOST_NO_DEFAULTED_FUNCTIONS tagged_ptr(tagged_ptr const & p): ptr(p.ptr), tag(p.tag) {} #else tagged_ptr(tagged_ptr const & p) = default; #endif explicit tagged_ptr(T * p, tag_t t = 0): ptr(p), tag(t) {} /** unsafe set operation */ /* @{ */ #ifdef BOOST_NO_DEFAULTED_FUNCTIONS tagged_ptr & operator= (tagged_ptr const & p) { set(p.ptr, p.tag); return *this; } #else tagged_ptr & operator= (tagged_ptr const & p) = default; #endif void set(T * p, tag_t t) { ptr = p; tag = t; } /* @} */ /** comparing semantics */ /* @{ */ bool operator== (volatile tagged_ptr const & p) const { return (ptr == p.ptr) && (tag == p.tag); } bool operator!= (volatile tagged_ptr const & p) const { return !operator==(p); } /* @} */ /** pointer access */ /* @{ */ T * get_ptr(void) const volatile { return ptr; } void set_ptr(T * p) volatile { ptr = p; } /* @} */ /** tag access */ /* @{ */ tag_t get_tag() const volatile { return tag; } void set_tag(tag_t t) volatile { tag = t; } /* @} */ /** smart pointer support */ /* @{ */ T & operator*() const { return *ptr; } T * operator->() const { return ptr; } operator bool(void) const { return ptr != 0; } /* @} */ protected: T * ptr; tag_t tag; }; } /* namespace detail */ } /* namespace lockfree */ } /* namespace boost */ #endif /* BOOST_LOCKFREE_TAGGED_PTR_DCAS_HPP_INCLUDED */ ././@LongLink0000000000000000000000000000017600000000000011571 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/boost/lockfree/detail/tagged_ptr_ptrcompression.hppSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/boost/lockfree/detail/tagg0000664000175000017500000000647712110501517032200 0ustar dandan// tagged pointer, for aba prevention // // Copyright (C) 2008, 2009 Tim Blechmann, based on code by Cory Nelson // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #ifndef BOOST_LOCKFREE_TAGGED_PTR_PTRCOMPRESSION_HPP_INCLUDED #define BOOST_LOCKFREE_TAGGED_PTR_PTRCOMPRESSION_HPP_INCLUDED #include #include /* for std::size_t */ #include namespace boost { namespace lockfree { namespace detail { #if defined (__x86_64__) || defined (_M_X64) template class tagged_ptr { typedef boost::uint64_t compressed_ptr_t; typedef boost::uint16_t tag_t; private: union cast_unit { compressed_ptr_t value; tag_t tag[4]; }; static const int tag_index = 3; static const compressed_ptr_t ptr_mask = 0xffffffffffffUL; //(1L<<48L)-1; static T* extract_ptr(volatile compressed_ptr_t const & i) { return (T*)(i & ptr_mask); } static tag_t extract_tag(volatile compressed_ptr_t const & i) { cast_unit cu; cu.value = i; return cu.tag[tag_index]; } static compressed_ptr_t pack_ptr(T * ptr, int tag) { cast_unit ret; ret.value = compressed_ptr_t(ptr); ret.tag[tag_index] = tag; return ret.value; } public: /** uninitialized constructor */ tagged_ptr(void) BOOST_NOEXCEPT//: ptr(0), tag(0) {} /** copy constructor */ #ifdef BOOST_NO_DEFAULTED_FUNCTIONS tagged_ptr(tagged_ptr const & p): ptr(p.ptr) {} #else tagged_ptr(tagged_ptr const & p) = default; #endif explicit tagged_ptr(T * p, tag_t t = 0): ptr(pack_ptr(p, t)) {} /** unsafe set operation */ /* @{ */ #ifdef BOOST_NO_DEFAULTED_FUNCTIONS tagged_ptr & operator= (tagged_ptr const & p) { ptr = p.ptr; return *this; } #else tagged_ptr & operator= (tagged_ptr const & p) = default; #endif void set(T * p, tag_t t) { ptr = pack_ptr(p, t); } /* @} */ /** comparing semantics */ /* @{ */ bool operator== (volatile tagged_ptr const & p) const { return (ptr == p.ptr); } bool operator!= (volatile tagged_ptr const & p) const { return !operator==(p); } /* @} */ /** pointer access */ /* @{ */ T * get_ptr() const volatile { return extract_ptr(ptr); } void set_ptr(T * p) volatile { tag_t tag = get_tag(); ptr = pack_ptr(p, tag); } /* @} */ /** tag access */ /* @{ */ tag_t get_tag() const volatile { return extract_tag(ptr); } void set_tag(tag_t t) volatile { T * p = get_ptr(); ptr = pack_ptr(p, t); } /* @} */ /** smart pointer support */ /* @{ */ T & operator*() const { return *get_ptr(); } T * operator->() const { return get_ptr(); } operator bool(void) const { return get_ptr() != 0; } /* @} */ protected: compressed_ptr_t ptr; }; #else #error unsupported platform #endif } /* namespace detail */ } /* namespace lockfree */ } /* namespace boost */ #endif /* BOOST_LOCKFREE_TAGGED_PTR_PTRCOMPRESSION_HPP_INCLUDED */ ././@LongLink0000000000000000000000000000015500000000000011566 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/boost/lockfree/detail/freelist.hppSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/boost/lockfree/detail/free0000664000175000017500000003621712110501517032172 0ustar dandan// lock-free freelist // // Copyright (C) 2008, 2009, 2011 Tim Blechmann // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #ifndef BOOST_LOCKFREE_FREELIST_HPP_INCLUDED #define BOOST_LOCKFREE_FREELIST_HPP_INCLUDED #include #include #include #include #include #include #include #include namespace boost { namespace lockfree { namespace detail { template > class freelist_stack: Alloc { struct freelist_node { tagged_ptr next; }; typedef tagged_ptr tagged_node_ptr; public: typedef tagged_ptr tagged_node_handle; template freelist_stack (Allocator const & alloc, std::size_t n = 0): Alloc(alloc), pool_(tagged_node_ptr(NULL)) { for (std::size_t i = 0; i != n; ++i) { T * node = Alloc::allocate(1); #ifdef BOOST_LOCKFREE_FREELIST_INIT_RUNS_DTOR destruct(node); #else deallocate(node); #endif } } template void reserve (std::size_t count) { for (std::size_t i = 0; i != count; ++i) { T * node = Alloc::allocate(1); deallocate(node); } } template T * construct (void) { T * node = allocate(); if (node) new(node) T(); return node; } template T * construct (ArgumentType const & arg) { T * node = allocate(); if (node) new(node) T(arg); return node; } template T * construct (ArgumentType1 const & arg1, ArgumentType2 const & arg2) { T * node = allocate(); if (node) new(node) T(arg1, arg2); return node; } template void destruct (tagged_node_handle tagged_ptr) { T * n = tagged_ptr.get_ptr(); n->~T(); deallocate(n); } template void destruct (T * n) { n->~T(); deallocate(n); } ~freelist_stack(void) { tagged_node_ptr current (pool_); while (current) { freelist_node * current_ptr = current.get_ptr(); if (current_ptr) current = current_ptr->next; Alloc::deallocate((T*)current_ptr, 1); } } bool is_lock_free(void) const { return pool_.is_lock_free(); } T * get_handle(T * pointer) const { return pointer; } T * get_handle(tagged_node_handle const & handle) const { return get_pointer(handle); } T * get_pointer(tagged_node_handle const & tptr) const { return tptr.get_ptr(); } T * get_pointer(T * pointer) const { return pointer; } T * null_handle(void) const { return NULL; } private: template T * allocate (void) { if (ThreadSafe) return allocate_impl(); else return allocate_impl_unsafe(); } template T * allocate_impl (void) { tagged_node_ptr old_pool = pool_.load(memory_order_consume); for(;;) { if (!old_pool.get_ptr()) { if (!Bounded) return Alloc::allocate(1); else return 0; } freelist_node * new_pool_ptr = old_pool->next.get_ptr(); tagged_node_ptr new_pool (new_pool_ptr, old_pool.get_tag() + 1); if (pool_.compare_exchange_weak(old_pool, new_pool)) { void * ptr = old_pool.get_ptr(); return reinterpret_cast(ptr); } } } template T * allocate_impl_unsafe (void) { tagged_node_ptr old_pool = pool_.load(memory_order_relaxed); if (!old_pool.get_ptr()) { if (!Bounded) return Alloc::allocate(1); else return 0; } freelist_node * new_pool_ptr = old_pool->next.get_ptr(); tagged_node_ptr new_pool (new_pool_ptr, old_pool.get_tag() + 1); pool_.store(new_pool, memory_order_relaxed); void * ptr = old_pool.get_ptr(); return reinterpret_cast(ptr); } template void deallocate (T * n) { if (ThreadSafe) deallocate_impl(n); else deallocate_impl_unsafe(n); } void deallocate_impl (T * n) { void * node = n; tagged_node_ptr old_pool = pool_.load(memory_order_consume); freelist_node * new_pool_ptr = reinterpret_cast(node); for(;;) { tagged_node_ptr new_pool (new_pool_ptr, old_pool.get_tag()); new_pool->next.set_ptr(old_pool.get_ptr()); if (pool_.compare_exchange_weak(old_pool, new_pool)) return; } } void deallocate_impl_unsafe (T * n) { void * node = n; tagged_node_ptr old_pool = pool_.load(memory_order_relaxed); freelist_node * new_pool_ptr = reinterpret_cast(node); tagged_node_ptr new_pool (new_pool_ptr, old_pool.get_tag()); new_pool->next.set_ptr(old_pool.get_ptr()); pool_.store(new_pool, memory_order_relaxed); } atomic pool_; }; class tagged_index { public: typedef boost::uint16_t tag_t; typedef boost::uint16_t index_t; /** uninitialized constructor */ tagged_index(void) BOOST_NOEXCEPT //: index(0), tag(0) {} /** copy constructor */ #ifdef BOOST_NO_DEFAULTED_FUNCTIONS tagged_index(tagged_index const & rhs): index(rhs.index), tag(rhs.tag) {} #else tagged_index(tagged_index const & rhs) = default; #endif explicit tagged_index(index_t i, tag_t t = 0): index(i), tag(t) {} /** index access */ /* @{ */ index_t get_index() const { return index; } void set_index(index_t i) { index = i; } /* @} */ /** tag access */ /* @{ */ tag_t get_tag() const { return tag; } void set_tag(tag_t t) { tag = t; } /* @} */ bool operator==(tagged_index const & rhs) const { return (index == rhs.index) && (tag == rhs.tag); } protected: index_t index; tag_t tag; }; template struct compiletime_sized_freelist_storage { // array-based freelists only support a 16bit address space. BOOST_STATIC_ASSERT(size < 65536); boost::array data; // unused ... only for API purposes template compiletime_sized_freelist_storage(Allocator const & alloc, std::size_t count) {} T * nodes(void) const { return reinterpret_cast(const_cast(data.data())); } std::size_t node_count(void) const { return size; } }; template > struct runtime_sized_freelist_storage: Alloc { T * nodes_; std::size_t node_count_; template runtime_sized_freelist_storage(Allocator const & alloc, std::size_t count): Alloc(alloc), node_count_(count) { if (count > 65535) boost::throw_exception(std::runtime_error("boost.lockfree: freelist size is limited to a maximum of 65535 objects")); nodes_ = Alloc::allocate(count); } ~runtime_sized_freelist_storage(void) { Alloc::deallocate(nodes_, node_count_); } T * nodes(void) const { return nodes_; } std::size_t node_count(void) const { return node_count_; } }; template > class fixed_size_freelist: NodeStorage { struct freelist_node { tagged_index next; }; typedef tagged_index::index_t index_t; void initialize(void) { T * nodes = NodeStorage::nodes(); for (std::size_t i = 0; i != NodeStorage::node_count(); ++i) { tagged_index * next_index = reinterpret_cast(nodes + i); next_index->set_index(null_handle()); #ifdef BOOST_LOCKFREE_FREELIST_INIT_RUNS_DTOR destruct(nodes + i); #else deallocate(i); #endif } } public: typedef tagged_index tagged_node_handle; template fixed_size_freelist (Allocator const & alloc, std::size_t count): NodeStorage(alloc, count), pool_(tagged_index(count, 0)) { initialize(); } fixed_size_freelist (void): pool_(tagged_index(NodeStorage::node_count(), 0)) { initialize(); } template T * construct (void) { index_t node_index = allocate(); if (node_index == null_handle()) return NULL; T * node = NodeStorage::nodes() + node_index; new(node) T(); return node; } template T * construct (ArgumentType const & arg) { index_t node_index = allocate(); if (node_index == null_handle()) return NULL; T * node = NodeStorage::nodes() + node_index; new(node) T(arg); return node; } template T * construct (ArgumentType1 const & arg1, ArgumentType2 const & arg2) { index_t node_index = allocate(); if (node_index == null_handle()) return NULL; T * node = NodeStorage::nodes() + node_index; new(node) T(arg1, arg2); return node; } template void destruct (tagged_node_handle tagged_index) { index_t index = tagged_index.get_index(); T * n = NodeStorage::nodes() + index; n->~T(); deallocate(index); } template void destruct (T * n) { n->~T(); deallocate(n - NodeStorage::nodes()); } bool is_lock_free(void) const { return pool_.is_lock_free(); } index_t null_handle(void) const { return NodeStorage::node_count(); } index_t get_handle(T * pointer) const { if (pointer == NULL) return null_handle(); else return pointer - NodeStorage::nodes(); } index_t get_handle(tagged_node_handle const & handle) const { return handle.get_index(); } T * get_pointer(tagged_node_handle const & tptr) const { return get_pointer(tptr.get_index()); } T * get_pointer(index_t index) const { if (index == null_handle()) return 0; else return NodeStorage::nodes() + index; } T * get_pointer(T * ptr) const { return ptr; } private: template index_t allocate (void) { if (ThreadSafe) return allocate_impl(); else return allocate_impl_unsafe(); } index_t allocate_impl (void) { tagged_index old_pool = pool_.load(memory_order_consume); for(;;) { index_t index = old_pool.get_index(); if (index == null_handle()) return index; T * old_node = NodeStorage::nodes() + index; tagged_index * next_index = reinterpret_cast(old_node); tagged_index new_pool(next_index->get_index(), old_pool.get_tag() + 1); if (pool_.compare_exchange_weak(old_pool, new_pool)) return old_pool.get_index(); } } index_t allocate_impl_unsafe (void) { tagged_index old_pool = pool_.load(memory_order_consume); index_t index = old_pool.get_index(); if (index == null_handle()) return index; T * old_node = NodeStorage::nodes() + index; tagged_index * next_index = reinterpret_cast(old_node); tagged_index new_pool(next_index->get_index(), old_pool.get_tag() + 1); pool_.store(new_pool, memory_order_relaxed); return old_pool.get_index(); } template void deallocate (index_t index) { if (ThreadSafe) deallocate_impl(index); else deallocate_impl_unsafe(index); } void deallocate_impl (index_t index) { freelist_node * new_pool_node = reinterpret_cast(NodeStorage::nodes() + index); tagged_index old_pool = pool_.load(memory_order_consume); for(;;) { tagged_index new_pool (index, old_pool.get_tag()); new_pool_node->next.set_index(old_pool.get_index()); if (pool_.compare_exchange_weak(old_pool, new_pool)) return; } } void deallocate_impl_unsafe (index_t index) { freelist_node * new_pool_node = reinterpret_cast(NodeStorage::nodes() + index); tagged_index old_pool = pool_.load(memory_order_consume); tagged_index new_pool (index, old_pool.get_tag()); new_pool_node->next.set_index(old_pool.get_index()); pool_.store(new_pool); } atomic pool_; }; template struct select_freelist { typedef typename mpl::if_c, runtime_sized_freelist_storage >::type fixed_sized_storage_type; typedef typename mpl::if_c, freelist_stack >::type type; }; template struct select_tagged_handle { typedef typename mpl::if_c, tagged_index >::type tagged_handle_type; typedef typename mpl::if_c::type handle_type; }; } /* namespace detail */ } /* namespace lockfree */ } /* namespace boost */ #endif /* BOOST_LOCKFREE_FREELIST_HPP_INCLUDED */ ././@LongLink0000000000000000000000000000016100000000000011563 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/boost/lockfree/detail/copy_payload.hppSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/boost/lockfree/detail/copy0000664000175000017500000000226012110501517032212 0ustar dandan// boost lockfree: copy_payload helper // // Copyright (C) 2011 Tim Blechmann // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #ifndef BOOST_LOCKFREE_DETAIL_COPY_PAYLOAD_HPP_INCLUDED #define BOOST_LOCKFREE_DETAIL_COPY_PAYLOAD_HPP_INCLUDED #include #include namespace boost { namespace lockfree { namespace detail { struct copy_convertible { template static void copy(T & t, U & u) { u = t; } }; struct copy_constructible_and_copyable { template static void copy(T & t, U & u) { u = U(t); } }; template void copy_payload(T & t, U & u) { typedef typename boost::mpl::if_::type, copy_convertible, copy_constructible_and_copyable >::type copy_type; copy_type::copy(t, u); } }}} #endif /* BOOST_LOCKFREE_DETAIL_COPY_PAYLOAD_HPP_INCLUDED */ ././@LongLink0000000000000000000000000000015600000000000011567 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/boost/lockfree/detail/parameter.hppSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/boost/lockfree/detail/para0000664000175000017500000000422212110501517032163 0ustar dandan// boost lockfree // // Copyright (C) 2011 Tim Blechmann // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #ifndef BOOST_LOCKFREE_DETAIL_PARAMETER_HPP #define BOOST_LOCKFREE_DETAIL_PARAMETER_HPP #include #include namespace boost { namespace lockfree { namespace detail { namespace mpl = boost::mpl; template struct has_arg { typedef typename parameter::binding::type type; static const bool value = mpl::is_not_void_::type::value; }; template struct extract_capacity { static const bool has_capacity = has_arg::value; typedef typename mpl::if_c::type, mpl::size_t< boost::integer_traits::const_max > >::type capacity_t; static const std::size_t capacity = capacity_t::value; }; template struct extract_allocator { static const bool has_allocator = has_arg::value; typedef typename mpl::if_c::type, std::allocator >::type allocator_arg; typedef typename allocator_arg::template rebind::other type; }; template struct extract_fixed_sized { static const bool has_fixed_sized = has_arg::value; typedef typename mpl::if_c::type, mpl::bool_ >::type type; static const bool value = type::value; }; } /* namespace detail */ } /* namespace lockfree */ } /* namespace boost */ #endif /* BOOST_LOCKFREE_DETAIL_PARAMETER_HPP */ ././@LongLink0000000000000000000000000000015700000000000011570 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/boost/lockfree/detail/tagged_ptr.hppSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/boost/lockfree/detail/tagg0000664000175000017500000000116712110501517032167 0ustar dandan// tagged pointer, for aba prevention // // Copyright (C) 2008 Tim Blechmann // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #ifndef BOOST_LOCKFREE_TAGGED_PTR_HPP_INCLUDED #define BOOST_LOCKFREE_TAGGED_PTR_HPP_INCLUDED #include #include #ifndef BOOST_LOCKFREE_PTR_COMPRESSION #include #else #include #endif #endif /* BOOST_LOCKFREE_TAGGED_PTR_HPP_INCLUDED */ ././@LongLink0000000000000000000000000000015300000000000011564 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/boost/lockfree/detail/prefix.hppSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/boost/lockfree/detail/pref0000664000175000017500000000361612110501517032202 0ustar dandan// Copyright (C) 2009 Tim Blechmann // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #ifndef BOOST_LOCKFREE_PREFIX_HPP_INCLUDED #define BOOST_LOCKFREE_PREFIX_HPP_INCLUDED /* this file defines the following macros: BOOST_LOCKFREE_CACHELINE_BYTES: size of a cache line BOOST_LOCKFREE_PTR_COMPRESSION: use tag/pointer compression to utilize parts of the virtual address space as tag (at least 16bit) BOOST_LOCKFREE_DCAS_ALIGNMENT: symbol used for aligning structs at cache line boundaries */ #define BOOST_LOCKFREE_CACHELINE_BYTES 64 #ifdef _MSC_VER #define BOOST_LOCKFREE_CACHELINE_ALIGNMENT __declspec(align(BOOST_LOCKFREE_CACHELINE_BYTES)) #if defined(_M_IX86) #define BOOST_LOCKFREE_DCAS_ALIGNMENT #elif defined(_M_X64) || defined(_M_IA64) #define BOOST_LOCKFREE_PTR_COMPRESSION 1 #define BOOST_LOCKFREE_DCAS_ALIGNMENT __declspec(align(16)) #endif #endif /* _MSC_VER */ #ifdef __GNUC__ #define BOOST_LOCKFREE_CACHELINE_ALIGNMENT __attribute__((aligned(BOOST_LOCKFREE_CACHELINE_BYTES))) #if defined(__i386__) || defined(__ppc__) #define BOOST_LOCKFREE_DCAS_ALIGNMENT #elif defined(__x86_64__) #define BOOST_LOCKFREE_PTR_COMPRESSION 1 #define BOOST_LOCKFREE_DCAS_ALIGNMENT __attribute__((aligned(16))) #elif defined(__alpha__) // LATER: alpha may benefit from pointer compression. but what is the maximum size of the address space? #define BOOST_LOCKFREE_DCAS_ALIGNMENT #endif #endif /* __GNUC__ */ #ifndef BOOST_LOCKFREE_DCAS_ALIGNMENT #define BOOST_LOCKFREE_DCAS_ALIGNMENT /*BOOST_LOCKFREE_DCAS_ALIGNMENT*/ #endif #ifndef BOOST_LOCKFREE_CACHELINE_ALIGNMENT #define BOOST_LOCKFREE_CACHELINE_ALIGNMENT /*BOOST_LOCKFREE_CACHELINE_ALIGNMENT*/ #endif #endif /* BOOST_LOCKFREE_PREFIX_HPP_INCLUDED */ ././@LongLink0000000000000000000000000000015300000000000011564 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/boost/lockfree/detail/atomic.hppSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/boost/lockfree/detail/atom0000664000175000017500000000232112110501517032176 0ustar dandan// Copyright (C) 2011 Tim Blechmann // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #ifndef BOOST_LOCKFREE_DETAIL_ATOMIC_HPP #define BOOST_LOCKFREE_DETAIL_ATOMIC_HPP #include // at this time, neither gcc (4.7) not clang (3.2) completely implement atomic<> #define BOOST_LOCKFREE_NO_HDR_ATOMIC #if (__cplusplus < 201103L) || defined(BOOST_LOCKFREE_NO_HDR_ATOMIC) #include #else #include #endif namespace boost { namespace lockfree { namespace detail { #if (__cplusplus < 201103L) || defined(BOOST_LOCKFREE_NO_HDR_ATOMIC) using boost::atomic; using boost::memory_order_acquire; using boost::memory_order_consume; using boost::memory_order_relaxed; using boost::memory_order_release; #else using std::atomic; using std::memory_order_acquire; using std::memory_order_consume; using std::memory_order_relaxed; using std::memory_order_release; #endif } using detail::atomic; using detail::memory_order_acquire; using detail::memory_order_consume; using detail::memory_order_relaxed; using detail::memory_order_release; }} #endif /* BOOST_LOCKFREE_DETAIL_ATOMIC_HPP */ ././@LongLink0000000000000000000000000000016100000000000011563 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/boost/lockfree/detail/branch_hints.hppSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/boost/lockfree/detail/bran0000664000175000017500000000153112110501517032162 0ustar dandan// branch hints // Copyright (C) 2007, 2008 Tim Blechmann // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #ifndef BOOST_LOCKFREE_BRANCH_HINTS_HPP_INCLUDED #define BOOST_LOCKFREE_BRANCH_HINTS_HPP_INCLUDED namespace boost { namespace lockfree { namespace detail { /** \brief hint for the branch prediction */ inline bool likely(bool expr) { #ifdef __GNUC__ return __builtin_expect(expr, true); #else return expr; #endif } /** \brief hint for the branch prediction */ inline bool unlikely(bool expr) { #ifdef __GNUC__ return __builtin_expect(expr, false); #else return expr; #endif } } /* namespace detail */ } /* namespace lockfree */ } /* namespace boost */ #endif /* BOOST_LOCKFREE_BRANCH_HINTS_HPP_INCLUDED */ ././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/boost/lockfree/policies.hppSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/boost/lockfree/policies.hp0000664000175000017500000000326212110501517032216 0ustar dandan// boost lockfree // // Copyright (C) 2011 Tim Blechmann // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #ifndef BOOST_LOCKFREE_POLICIES_HPP_INCLUDED #define BOOST_LOCKFREE_POLICIES_HPP_INCLUDED #include #include #include #include namespace boost { namespace lockfree { #ifndef BOOST_DOXYGEN_INVOKED namespace tag { struct allocator ; } namespace tag { struct fixed_sized; } namespace tag { struct capacity; } #endif /** Configures a data structure as \b fixed-sized. * * The internal nodes are stored inside an array and they are addressed by array indexing. This limits the possible size of the * queue to the number of elements that can be addressed by the index type (usually 2**16-2), but on platforms that lack * double-width compare-and-exchange instructions, this is the best way to achieve lock-freedom. * This implies that a data structure is bounded. * */ template struct fixed_sized: boost::parameter::template_keyword > {}; /** Sets the \b capacity of a data structure at compile-time. * * This implies that a data structure is bounded and fixed-sized. * */ template struct capacity: boost::parameter::template_keyword > {}; /** Defines the \b allocator type of a data structure. * */ template struct allocator: boost::parameter::template_keyword {}; } } #endif /* BOOST_LOCKFREE_POLICIES_HPP_INCLUDED */ ././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/boost/lockfree/spsc_queue.hppSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/boost/lockfree/spsc_queue.0000664000175000017500000004655312110501517032245 0ustar dandan// lock-free single-producer/single-consumer ringbuffer // this algorithm is implemented in various projects (linux kernel) // // Copyright (C) 2009, 2011 Tim Blechmann // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #ifndef BOOST_LOCKFREE_SPSC_QUEUE_HPP_INCLUDED #define BOOST_LOCKFREE_SPSC_QUEUE_HPP_INCLUDED #include #include #include #include #include #include #include #include namespace boost { namespace lockfree { namespace detail { typedef parameter::parameters, boost::parameter::optional > ringbuffer_signature; template class ringbuffer_base: boost::noncopyable { #ifndef BOOST_DOXYGEN_INVOKED typedef std::size_t size_t; static const int padding_size = BOOST_LOCKFREE_CACHELINE_BYTES - sizeof(size_t); atomic write_index_; char padding1[padding_size]; /* force read_index and write_index to different cache lines */ atomic read_index_; protected: ringbuffer_base(void): write_index_(0), read_index_(0) {} static size_t next_index(size_t arg, size_t max_size) { size_t ret = arg + 1; while (unlikely(ret >= max_size)) ret -= max_size; return ret; } static size_t read_available(size_t write_index, size_t read_index, size_t max_size) { if (write_index >= read_index) return write_index - read_index; size_t ret = write_index + max_size - read_index; return ret; } static size_t write_available(size_t write_index, size_t read_index, size_t max_size) { size_t ret = read_index - write_index - 1; if (write_index >= read_index) ret += max_size; return ret; } bool push(T const & t, T * buffer, size_t max_size) { size_t write_index = write_index_.load(memory_order_relaxed); // only written from push thread size_t next = next_index(write_index, max_size); if (next == read_index_.load(memory_order_acquire)) return false; /* ringbuffer is full */ buffer[write_index] = t; write_index_.store(next, memory_order_release); return true; } size_t push(const T * input_buffer, size_t input_count, T * internal_buffer, size_t max_size) { size_t write_index = write_index_.load(memory_order_relaxed); // only written from push thread const size_t read_index = read_index_.load(memory_order_acquire); const size_t avail = write_available(write_index, read_index, max_size); if (avail == 0) return 0; input_count = std::min(input_count, avail); size_t new_write_index = write_index + input_count; if (write_index + input_count > max_size) { /* copy data in two sections */ size_t count0 = max_size - write_index; std::copy(input_buffer, input_buffer + count0, internal_buffer + write_index); std::copy(input_buffer + count0, input_buffer + input_count, internal_buffer); new_write_index -= max_size; } else { std::copy(input_buffer, input_buffer + input_count, internal_buffer + write_index); if (new_write_index == max_size) new_write_index = 0; } write_index_.store(new_write_index, memory_order_release); return input_count; } template ConstIterator push(ConstIterator begin, ConstIterator end, T * internal_buffer, size_t max_size) { // FIXME: avoid std::distance and std::advance size_t write_index = write_index_.load(memory_order_relaxed); // only written from push thread const size_t read_index = read_index_.load(memory_order_acquire); const size_t avail = write_available(write_index, read_index, max_size); if (avail == 0) return begin; size_t input_count = std::distance(begin, end); input_count = std::min(input_count, avail); size_t new_write_index = write_index + input_count; ConstIterator last = begin; std::advance(last, input_count); if (write_index + input_count > max_size) { /* copy data in two sections */ size_t count0 = max_size - write_index; ConstIterator midpoint = begin; std::advance(midpoint, count0); std::copy(begin, midpoint, internal_buffer + write_index); std::copy(midpoint, last, internal_buffer); new_write_index -= max_size; } else { std::copy(begin, last, internal_buffer + write_index); if (new_write_index == max_size) new_write_index = 0; } write_index_.store(new_write_index, memory_order_release); return last; } bool pop (T & ret, T * buffer, size_t max_size) { size_t write_index = write_index_.load(memory_order_acquire); size_t read_index = read_index_.load(memory_order_relaxed); // only written from pop thread if (empty(write_index, read_index)) return false; ret = buffer[read_index]; size_t next = next_index(read_index, max_size); read_index_.store(next, memory_order_release); return true; } size_t pop (T * output_buffer, size_t output_count, const T * internal_buffer, size_t max_size) { const size_t write_index = write_index_.load(memory_order_acquire); size_t read_index = read_index_.load(memory_order_relaxed); // only written from pop thread const size_t avail = read_available(write_index, read_index, max_size); if (avail == 0) return 0; output_count = std::min(output_count, avail); size_t new_read_index = read_index + output_count; if (read_index + output_count > max_size) { /* copy data in two sections */ size_t count0 = max_size - read_index; size_t count1 = output_count - count0; std::copy(internal_buffer + read_index, internal_buffer + max_size, output_buffer); std::copy(internal_buffer, internal_buffer + count1, output_buffer + count0); new_read_index -= max_size; } else { std::copy(internal_buffer + read_index, internal_buffer + read_index + output_count, output_buffer); if (new_read_index == max_size) new_read_index = 0; } read_index_.store(new_read_index, memory_order_release); return output_count; } template size_t pop (OutputIterator it, const T * internal_buffer, size_t max_size) { const size_t write_index = write_index_.load(memory_order_acquire); size_t read_index = read_index_.load(memory_order_relaxed); // only written from pop thread const size_t avail = read_available(write_index, read_index, max_size); if (avail == 0) return 0; size_t new_read_index = read_index + avail; if (read_index + avail > max_size) { /* copy data in two sections */ size_t count0 = max_size - read_index; size_t count1 = avail - count0; std::copy(internal_buffer + read_index, internal_buffer + max_size, it); std::copy(internal_buffer, internal_buffer + count1, it); new_read_index -= max_size; } else { std::copy(internal_buffer + read_index, internal_buffer + read_index + avail, it); if (new_read_index == max_size) new_read_index = 0; } read_index_.store(new_read_index, memory_order_release); return avail; } #endif public: /** reset the ringbuffer * * \note Not thread-safe * */ void reset(void) { write_index_.store(0, memory_order_relaxed); read_index_.store(0, memory_order_release); } /** Check if the ringbuffer is empty * * \return true, if the ringbuffer is empty, false otherwise * \note Due to the concurrent nature of the ringbuffer the result may be inaccurate. * */ bool empty(void) { return empty(write_index_.load(memory_order_relaxed), read_index_.load(memory_order_relaxed)); } /** * \return true, if implementation is lock-free. * * */ bool is_lock_free(void) const { return write_index_.is_lock_free() && read_index_.is_lock_free(); } private: bool empty(size_t write_index, size_t read_index) { return write_index == read_index; } }; template class compile_time_sized_ringbuffer: public ringbuffer_base { typedef std::size_t size_t; boost::array array_; public: bool push(T const & t) { return ringbuffer_base::push(t, array_.c_array(), max_size); } bool pop(T & ret) { return ringbuffer_base::pop(ret, array_.c_array(), max_size); } size_t push(T const * t, size_t size) { return ringbuffer_base::push(t, size, array_.c_array(), max_size); } template size_t push(T const (&t)[size]) { return push(t, size); } template ConstIterator push(ConstIterator begin, ConstIterator end) { return ringbuffer_base::push(begin, end, array_.c_array(), max_size); } size_t pop(T * ret, size_t size) { return ringbuffer_base::pop(ret, size, array_.c_array(), max_size); } template size_t pop(T (&ret)[size]) { return pop(ret, size); } template size_t pop(OutputIterator it) { return ringbuffer_base::pop(it, array_.c_array(), max_size); } }; template class runtime_sized_ringbuffer: public ringbuffer_base, private Alloc { typedef std::size_t size_t; size_t max_elements_; typedef typename Alloc::pointer pointer; pointer array_; public: explicit runtime_sized_ringbuffer(size_t max_elements): max_elements_(max_elements) { // TODO: we don't necessarily need to construct all elements array_ = Alloc::allocate(max_elements); for (size_t i = 0; i != max_elements; ++i) Alloc::construct(array_ + i, T()); } template runtime_sized_ringbuffer(typename Alloc::template rebind::other const & alloc, size_t max_elements): Alloc(alloc), max_elements_(max_elements) { // TODO: we don't necessarily need to construct all elements array_ = Alloc::allocate(max_elements); for (size_t i = 0; i != max_elements; ++i) Alloc::construct(array_ + i, T()); } runtime_sized_ringbuffer(Alloc const & alloc, size_t max_elements): Alloc(alloc), max_elements_(max_elements) { // TODO: we don't necessarily need to construct all elements array_ = Alloc::allocate(max_elements); for (size_t i = 0; i != max_elements; ++i) Alloc::construct(array_ + i, T()); } ~runtime_sized_ringbuffer(void) { for (size_t i = 0; i != max_elements_; ++i) Alloc::destroy(array_ + i); Alloc::deallocate(array_, max_elements_); } bool push(T const & t) { return ringbuffer_base::push(t, &*array_, max_elements_); } bool pop(T & ret) { return ringbuffer_base::pop(ret, &*array_, max_elements_); } size_t push(T const * t, size_t size) { return ringbuffer_base::push(t, size, &*array_, max_elements_); } template size_t push(T const (&t)[size]) { return push(t, size); } template ConstIterator push(ConstIterator begin, ConstIterator end) { return ringbuffer_base::push(begin, end, array_, max_elements_); } size_t pop(T * ret, size_t size) { return ringbuffer_base::pop(ret, size, array_, max_elements_); } template size_t pop(T (&ret)[size]) { return pop(ret, size); } template size_t pop(OutputIterator it) { return ringbuffer_base::pop(it, array_, max_elements_); } }; template struct make_ringbuffer { typedef typename ringbuffer_signature::bind::type bound_args; typedef extract_capacity extract_capacity_t; static const bool runtime_sized = !extract_capacity_t::has_capacity; static const size_t capacity = extract_capacity_t::capacity; typedef extract_allocator extract_allocator_t; typedef typename extract_allocator_t::type allocator; // allocator argument is only sane, for run-time sized ringbuffers BOOST_STATIC_ASSERT((mpl::if_, mpl::bool_, mpl::true_ >::type::value)); typedef typename mpl::if_c, compile_time_sized_ringbuffer >::type ringbuffer_type; }; } /* namespace detail */ /** The spsc_queue class provides a single-writer/single-reader fifo queue, pushing and popping is wait-free. * * \b Policies: * - \c boost::lockfree::capacity<>, optional
* If this template argument is passed to the options, the size of the ringbuffer is set at compile-time. * * - \c boost::lockfree::allocator<>, defaults to \c boost::lockfree::allocator>
* Specifies the allocator that is used to allocate the ringbuffer. This option is only valid, if the ringbuffer is configured * to be sized at run-time * * \b Requirements: * - T must have a default constructor * - T must be copyable * */ #ifndef BOOST_DOXYGEN_INVOKED template #else template #endif class spsc_queue: public detail::make_ringbuffer::ringbuffer_type { private: #ifndef BOOST_DOXYGEN_INVOKED typedef typename detail::make_ringbuffer::ringbuffer_type base_type; static const bool runtime_sized = detail::make_ringbuffer::runtime_sized; typedef typename detail::make_ringbuffer::allocator allocator_arg; struct implementation_defined { typedef allocator_arg allocator; typedef std::size_t size_type; }; #endif public: typedef T value_type; typedef typename implementation_defined::allocator allocator; typedef typename implementation_defined::size_type size_type; /** Constructs a spsc_queue * * \pre spsc_queue must be configured to be sized at compile-time */ // @{ spsc_queue(void) { BOOST_STATIC_ASSERT(!runtime_sized); } template explicit spsc_queue(typename allocator::template rebind::other const & alloc) { // just for API compatibility: we don't actually need an allocator BOOST_STATIC_ASSERT(!runtime_sized); } explicit spsc_queue(allocator const & alloc) { // just for API compatibility: we don't actually need an allocator BOOST_STATIC_ASSERT(!runtime_sized); } // @} /** Constructs a spsc_queue for element_count elements * * \pre spsc_queue must be configured to be sized at run-time */ // @{ explicit spsc_queue(size_type element_count): base_type(element_count) { BOOST_STATIC_ASSERT(runtime_sized); } template spsc_queue(size_type element_count, typename allocator::template rebind::other const & alloc): base_type(alloc, element_count) { BOOST_STATIC_ASSERT(runtime_sized); } spsc_queue(size_type element_count, allocator_arg const & alloc): base_type(alloc, element_count) { BOOST_STATIC_ASSERT(runtime_sized); } // @} /** Pushes object t to the ringbuffer. * * \pre only one thread is allowed to push data to the spsc_queue * \post object will be pushed to the spsc_queue, unless it is full. * \return true, if the push operation is successful. * * \note Thread-safe and wait-free * */ bool push(T const & t) { return base_type::push(t); } /** Pops one object from ringbuffer. * * \pre only one thread is allowed to pop data to the spsc_queue * \post if ringbuffer is not empty, object will be copied to ret. * \return true, if the pop operation is successful, false if ringbuffer was empty. * * \note Thread-safe and wait-free */ bool pop(T & ret) { return base_type::pop(ret); } /** Pushes as many objects from the array t as there is space. * * \pre only one thread is allowed to push data to the spsc_queue * \return number of pushed items * * \note Thread-safe and wait-free */ size_type push(T const * t, size_type size) { return base_type::push(t, size); } /** Pushes as many objects from the array t as there is space available. * * \pre only one thread is allowed to push data to the spsc_queue * \return number of pushed items * * \note Thread-safe and wait-free */ template size_type push(T const (&t)[size]) { return push(t, size); } /** Pushes as many objects from the range [begin, end) as there is space . * * \pre only one thread is allowed to push data to the spsc_queue * \return iterator to the first element, which has not been pushed * * \note Thread-safe and wait-free */ template ConstIterator push(ConstIterator begin, ConstIterator end) { return base_type::push(begin, end); } /** Pops a maximum of size objects from ringbuffer. * * \pre only one thread is allowed to pop data to the spsc_queue * \return number of popped items * * \note Thread-safe and wait-free * */ size_type pop(T * ret, size_type size) { return base_type::pop(ret, size); } /** Pops a maximum of size objects from spsc_queue. * * \pre only one thread is allowed to pop data to the spsc_queue * \return number of popped items * * \note Thread-safe and wait-free * */ template size_type pop(T (&ret)[size]) { return pop(ret, size); } /** Pops objects to the output iterator it * * \pre only one thread is allowed to pop data to the spsc_queue * \return number of popped items * * \note Thread-safe and wait-free * */ template size_type pop(OutputIterator it) { return base_type::pop(it); } }; } /* namespace lockfree */ } /* namespace boost */ #endif /* BOOST_LOCKFREE_SPSC_QUEUE_HPP_INCLUDED */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/boost/atomic/0000775000175000017500000000000012110505246027540 5ustar dandanSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/boost/atomic/platform.hpp0000664000175000017500000000333112110501517032072 0ustar dandan// Copyright (c) 2009 Helge Bahmann // // Distributed under the Boost Software License, Version 1.0. // See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // Platform selection file #include #if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) #include #elif 0 && defined(__GNUC__) && defined(__alpha__) /* currently does not work correctly */ #include #include #elif defined(__GNUC__) && (defined(__POWERPC__) || defined(__PPC__)) #include // This list of ARM architecture versions comes from Apple's arm/arch.h header. // I don't know how complete it is. #elif defined(__GNUC__) && (defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) \ || defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6ZK__) \ || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_7A__)) #include #elif defined(__linux__) && defined(__arm__) #include #elif defined(__GNUC__) && defined(__sparc_v9__) #include #elif defined(BOOST_USE_WINDOWS_H) || defined(_WIN32_CE) || defined(BOOST_MSVC) || defined(BOOST_INTEL_WIN) || defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) #include #elif 0 && defined(__GNUC__) /* currently does not work correctly */ #include #include #else #include #endif SuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/boost/atomic/detail/0000775000175000017500000000000012110505246031002 5ustar dandan././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/boost/atomic/detail/gcc-cas.hppSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/boost/atomic/detail/gcc-ca0000664000175000017500000000720112110501517032037 0ustar dandan// Copyright (c) 2011 Helge Bahmann // // Distributed under the Boost Software License, Version 1.0. // See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // Use the gnu builtin __sync_val_compare_and_swap to build // atomic operations for 32 bit and smaller. #ifndef BOOST_ATOMIC_DETAIL_GENERIC_CAS_HPP #define BOOST_ATOMIC_DETAIL_GENERIC_CAS_HPP namespace boost { #define BOOST_ATOMIC_THREAD_FENCE 2 inline void atomic_thread_fence(memory_order order) { switch(order) { case memory_order_relaxed: break; case memory_order_release: case memory_order_consume: case memory_order_acquire: case memory_order_acq_rel: case memory_order_seq_cst: __sync_synchronize(); break; } } namespace atomics { namespace detail { static inline void platform_fence_before(memory_order) { /* empty, as compare_and_swap is synchronizing already */ } static inline void platform_fence_after(memory_order) { /* empty, as compare_and_swap is synchronizing already */ } static inline void platform_fence_before_store(memory_order order) { switch(order) { case memory_order_relaxed: case memory_order_acquire: case memory_order_consume: break; case memory_order_release: case memory_order_acq_rel: case memory_order_seq_cst: __sync_synchronize(); break; } } static inline void platform_fence_after_store(memory_order order) { if (order == memory_order_seq_cst) __sync_synchronize(); } static inline void platform_fence_after_load(memory_order order) { switch(order) { case memory_order_relaxed: case memory_order_release: break; case memory_order_consume: case memory_order_acquire: case memory_order_acq_rel: case memory_order_seq_cst: __sync_synchronize(); break; } } template bool platform_cmpxchg32_strong(T & expected, T desired, volatile T * ptr) { T found = __sync_val_compare_and_swap(ptr, expected, desired); bool success = (found == expected); expected = found; return success; } class atomic_flag { private: atomic_flag(const atomic_flag &) /* = delete */ ; atomic_flag & operator=(const atomic_flag &) /* = delete */ ; uint32_t v_; public: atomic_flag(void) : v_(false) {} void clear(memory_order order = memory_order_seq_cst) volatile { atomics::detail::platform_fence_before_store(order); const_cast(v_) = 0; atomics::detail::platform_fence_after_store(order); } bool test_and_set(memory_order order = memory_order_seq_cst) volatile { atomics::detail::platform_fence_before(order); uint32_t expected = v_; do { if (expected == 1) break; } while (!atomics::detail::platform_cmpxchg32(expected, (uint32_t)1, &v_)); atomics::detail::platform_fence_after(order); return expected; } }; #define BOOST_ATOMIC_FLAG_LOCK_FREE 2 } } } #include #if !defined(BOOST_ATOMIC_FORCE_FALLBACK) #define BOOST_ATOMIC_CHAR_LOCK_FREE 2 #define BOOST_ATOMIC_SHORT_LOCK_FREE 2 #define BOOST_ATOMIC_INT_LOCK_FREE 2 #define BOOST_ATOMIC_LONG_LOCK_FREE (sizeof(long) <= 4 ? 2 : 0) #define BOOST_ATOMIC_LLONG_LOCK_FREE (sizeof(long long) <= 4 ? 2 : 0) #define BOOST_ATOMIC_POINTER_LOCK_FREE (sizeof(void *) <= 4 ? 2 : 0) #define BOOST_ATOMIC_BOOL_LOCK_FREE 2 #include #endif /* !defined(BOOST_ATOMIC_FORCE_FALLBACK) */ #endif ././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/boost/atomic/detail/base.hppSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/boost/atomic/detail/base.h0000664000175000017500000003061412110501517032066 0ustar dandan#ifndef BOOST_ATOMIC_DETAIL_BASE_HPP #define BOOST_ATOMIC_DETAIL_BASE_HPP // Copyright (c) 2009 Helge Bahmann // // Distributed under the Boost Software License, Version 1.0. // See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // Base class definition and fallback implementation. // To be overridden (through partial specialization) by // platform implementations. #include #include #define BOOST_ATOMIC_DECLARE_BASE_OPERATORS \ operator value_type(void) volatile const \ { \ return load(memory_order_seq_cst); \ } \ \ this_type & \ operator=(value_type v) volatile \ { \ store(v, memory_order_seq_cst); \ return *const_cast(this); \ } \ \ bool \ compare_exchange_strong( \ value_type & expected, \ value_type desired, \ memory_order order = memory_order_seq_cst) volatile \ { \ return compare_exchange_strong(expected, desired, order, calculate_failure_order(order)); \ } \ \ bool \ compare_exchange_weak( \ value_type & expected, \ value_type desired, \ memory_order order = memory_order_seq_cst) volatile \ { \ return compare_exchange_weak(expected, desired, order, calculate_failure_order(order)); \ } \ \ #define BOOST_ATOMIC_DECLARE_ADDITIVE_OPERATORS \ value_type \ operator++(int) volatile \ { \ return fetch_add(1); \ } \ \ value_type \ operator++(void) volatile \ { \ return fetch_add(1) + 1; \ } \ \ value_type \ operator--(int) volatile \ { \ return fetch_sub(1); \ } \ \ value_type \ operator--(void) volatile \ { \ return fetch_sub(1) - 1; \ } \ \ value_type \ operator+=(difference_type v) volatile \ { \ return fetch_add(v) + v; \ } \ \ value_type \ operator-=(difference_type v) volatile \ { \ return fetch_sub(v) - v; \ } \ #define BOOST_ATOMIC_DECLARE_BIT_OPERATORS \ value_type \ operator&=(difference_type v) volatile \ { \ return fetch_and(v) & v; \ } \ \ value_type \ operator|=(difference_type v) volatile \ { \ return fetch_or(v) | v; \ } \ \ value_type \ operator^=(difference_type v) volatile \ { \ return fetch_xor(v) ^ v; \ } \ #define BOOST_ATOMIC_DECLARE_POINTER_OPERATORS \ BOOST_ATOMIC_DECLARE_BASE_OPERATORS \ BOOST_ATOMIC_DECLARE_ADDITIVE_OPERATORS \ #define BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS \ BOOST_ATOMIC_DECLARE_BASE_OPERATORS \ BOOST_ATOMIC_DECLARE_ADDITIVE_OPERATORS \ BOOST_ATOMIC_DECLARE_BIT_OPERATORS \ namespace boost { namespace atomics { namespace detail { static inline memory_order calculate_failure_order(memory_order order) { switch(order) { case memory_order_acq_rel: return memory_order_acquire; case memory_order_release: return memory_order_relaxed; default: return order; } } template class base_atomic { private: typedef base_atomic this_type; typedef T value_type; typedef lockpool::scoped_lock guard_type; public: base_atomic(void) {} explicit base_atomic(const value_type & v) { memcpy(&v_, &v, Size); } void store(value_type v, memory_order /*order*/ = memory_order_seq_cst) volatile { guard_type guard(const_cast(v_)); memcpy(const_cast(v_), &v, Size); } value_type load(memory_order /*order*/ = memory_order_seq_cst) volatile const { guard_type guard(const_cast(v_)); value_type v; memcpy(&v, const_cast(v_), Size); return v; } bool compare_exchange_strong( value_type & expected, value_type desired, memory_order /*success_order*/, memory_order /*failure_order*/) volatile { guard_type guard(const_cast(v_)); if (memcmp(const_cast(v_), &expected, Size) == 0) { memcpy(const_cast(v_), &desired, Size); return true; } else { memcpy(&expected, const_cast(v_), Size); return false; } } bool compare_exchange_weak( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { return compare_exchange_strong(expected, desired, success_order, failure_order); } value_type exchange(value_type v, memory_order /*order*/=memory_order_seq_cst) volatile { guard_type guard(const_cast(v_)); value_type tmp; memcpy(&tmp, const_cast(v_), Size); memcpy(const_cast(v_), &v, Size); return tmp; } bool is_lock_free(void) const volatile { return false; } BOOST_ATOMIC_DECLARE_BASE_OPERATORS private: base_atomic(const base_atomic &) /* = delete */ ; void operator=(const base_atomic &) /* = delete */ ; char v_[Size]; }; template class base_atomic { private: typedef base_atomic this_type; typedef T value_type; typedef T difference_type; typedef lockpool::scoped_lock guard_type; public: explicit base_atomic(value_type v) : v_(v) {} base_atomic(void) {} void store(value_type v, memory_order /*order*/ = memory_order_seq_cst) volatile { guard_type guard(const_cast(&v_)); v_ = v; } value_type load(memory_order /*order*/ = memory_order_seq_cst) const volatile { guard_type guard(const_cast(&v_)); value_type v = const_cast(v_); return v; } value_type exchange(value_type v, memory_order /*order*/ = memory_order_seq_cst) volatile { guard_type guard(const_cast(&v_)); value_type old = v_; v_ = v; return old; } bool compare_exchange_strong(value_type & expected, value_type desired, memory_order /*success_order*/, memory_order /*failure_order*/) volatile { guard_type guard(const_cast(&v_)); if (v_ == expected) { v_ = desired; return true; } else { expected = v_; return false; } } bool compare_exchange_weak(value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { return compare_exchange_strong(expected, desired, success_order, failure_order); } value_type fetch_add(difference_type v, memory_order /*order*/ = memory_order_seq_cst) volatile { guard_type guard(const_cast(&v_)); value_type old = v_; v_ += v; return old; } value_type fetch_sub(difference_type v, memory_order /*order*/ = memory_order_seq_cst) volatile { guard_type guard(const_cast(&v_)); value_type old = v_; v_ -= v; return old; } value_type fetch_and(value_type v, memory_order /*order*/ = memory_order_seq_cst) volatile { guard_type guard(const_cast(&v_)); value_type old = v_; v_ &= v; return old; } value_type fetch_or(value_type v, memory_order /*order*/ = memory_order_seq_cst) volatile { guard_type guard(const_cast(&v_)); value_type old = v_; v_ |= v; return old; } value_type fetch_xor(value_type v, memory_order /*order*/ = memory_order_seq_cst) volatile { guard_type guard(const_cast(&v_)); value_type old = v_; v_ ^= v; return old; } bool is_lock_free(void) const volatile { return false; } BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS private: base_atomic(const base_atomic &) /* = delete */ ; void operator=(const base_atomic &) /* = delete */ ; value_type v_; }; template class base_atomic { private: typedef base_atomic this_type; typedef T * value_type; typedef ptrdiff_t difference_type; typedef lockpool::scoped_lock guard_type; public: explicit base_atomic(value_type v) : v_(v) {} base_atomic(void) {} void store(value_type v, memory_order /*order*/ = memory_order_seq_cst) volatile { guard_type guard(const_cast(&v_)); v_ = v; } value_type load(memory_order /*order*/ = memory_order_seq_cst) const volatile { guard_type guard(const_cast(&v_)); value_type v = const_cast(v_); return v; } value_type exchange(value_type v, memory_order /*order*/ = memory_order_seq_cst) volatile { guard_type guard(const_cast(&v_)); value_type old = v_; v_ = v; return old; } bool compare_exchange_strong(value_type & expected, value_type desired, memory_order /*success_order*/, memory_order /*failure_order*/) volatile { guard_type guard(const_cast(&v_)); if (v_ == expected) { v_ = desired; return true; } else { expected = v_; return false; } } bool compare_exchange_weak(value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { return compare_exchange_strong(expected, desired, success_order, failure_order); } value_type fetch_add(difference_type v, memory_order /*order*/ = memory_order_seq_cst) volatile { guard_type guard(const_cast(&v_)); value_type old = v_; v_ += v; return old; } value_type fetch_sub(difference_type v, memory_order /*order*/ = memory_order_seq_cst) volatile { guard_type guard(const_cast(&v_)); value_type old = v_; v_ -= v; return old; } bool is_lock_free(void) const volatile { return false; } BOOST_ATOMIC_DECLARE_POINTER_OPERATORS private: base_atomic(const base_atomic &) /* = delete */ ; void operator=(const base_atomic &) /* = delete */ ; value_type v_; }; template class base_atomic { private: typedef base_atomic this_type; typedef void * value_type; typedef lockpool::scoped_lock guard_type; public: explicit base_atomic(value_type v) : v_(v) {} base_atomic(void) {} void store(value_type v, memory_order /*order*/ = memory_order_seq_cst) volatile { guard_type guard(const_cast(&v_)); v_ = v; } value_type load(memory_order /*order*/ = memory_order_seq_cst) const volatile { guard_type guard(const_cast(&v_)); value_type v = const_cast(v_); return v; } value_type exchange(value_type v, memory_order /*order*/ = memory_order_seq_cst) volatile { guard_type guard(const_cast(&v_)); value_type old = v_; v_ = v; return old; } bool compare_exchange_strong(value_type & expected, value_type desired, memory_order /*success_order*/, memory_order /*failure_order*/) volatile { guard_type guard(const_cast(&v_)); if (v_ == expected) { v_ = desired; return true; } else { expected = v_; return false; } } bool compare_exchange_weak(value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { return compare_exchange_strong(expected, desired, success_order, failure_order); } bool is_lock_free(void) const volatile { return false; } BOOST_ATOMIC_DECLARE_BASE_OPERATORS private: base_atomic(const base_atomic &) /* = delete */ ; void operator=(const base_atomic &) /* = delete */ ; value_type v_; }; } } } #endif ././@LongLink0000000000000000000000000000015600000000000011567 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/boost/atomic/detail/gcc-sparcv9.hppSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/boost/atomic/detail/gcc-sp0000664000175000017500000010306612110501517032104 0ustar dandan#ifndef BOOST_ATOMIC_DETAIL_GCC_SPARC_HPP #define BOOST_ATOMIC_DETAIL_GCC_SPARC_HPP namespace boost { namespace atomics { namespace detail { static inline void platform_fence_before(memory_order order) { switch(order) { case memory_order_relaxed: case memory_order_acquire: case memory_order_consume: break; case memory_order_release: case memory_order_acq_rel: __asm__ __volatile__ ("membar #StoreStore | #LoadStore" ::: "memory"); /* release */ break; case memory_order_seq_cst: __asm__ __volatile__ ("membar #Sync" ::: "memory"); /* seq */ break; } } static inline void platform_fence_after(memory_order order) { switch(order) { case memory_order_relaxed: case memory_order_release: break; case memory_order_acquire: case memory_order_acq_rel: __asm__ __volatile__ ("membar #LoadLoad | #LoadStore" ::: "memory"); /* acquire */ break; case memory_order_consume: /* consume */ break; case memory_order_seq_cst: __asm__ __volatile__ ("membar #Sync" ::: "memory"); /* seq */ break; default:; } } static inline void platform_fence_after_store(memory_order order) { switch(order) { case memory_order_seq_cst: __asm__ __volatile__ ("membar #Sync" ::: "memory"); default:; } } static inline void platform_fence_after_load(memory_order order) { platform_fence_after(order); } } } class atomic_flag { private: atomic_flag(const atomic_flag &) /* = delete */ ; atomic_flag & operator=(const atomic_flag &) /* = delete */ ; uint32_t v_; public: atomic_flag(void) : v_(false) {} void clear(memory_order order = memory_order_seq_cst) volatile { atomics::detail::platform_fence_before(order); const_cast(v_) = 0; atomics::detail::platform_fence_after_store(order); } bool test_and_set(memory_order order = memory_order_seq_cst) volatile { atomics::detail::platform_fence_before(order); uint32_t tmp = 1; __asm__ ( "cas [%1], %2, %0" : "+r" (tmp) : "r" (&v_), "r" (0) : "memory" ); atomics::detail::platform_fence_after(order); return tmp; } }; } /* namespace boost */ #define BOOST_ATOMIC_FLAG_LOCK_FREE 2 #include #if !defined(BOOST_ATOMIC_FORCE_FALLBACK) #define BOOST_ATOMIC_CHAR_LOCK_FREE 2 #define BOOST_ATOMIC_CHAR16_T_LOCK_FREE 2 #define BOOST_ATOMIC_CHAR32_T_LOCK_FREE 2 #define BOOST_ATOMIC_WCHAR_T_LOCK_FREE 2 #define BOOST_ATOMIC_SHORT_LOCK_FREE 2 #define BOOST_ATOMIC_INT_LOCK_FREE 2 #define BOOST_ATOMIC_LONG_LOCK_FREE 2 #define BOOST_ATOMIC_LLONG_LOCK_FREE 0 #define BOOST_ATOMIC_POINTER_LOCK_FREE 2 #define BOOST_ATOMIC_BOOL_LOCK_FREE 2 namespace boost { #define BOOST_ATOMIC_THREAD_FENCE 2 static inline void atomic_thread_fence(memory_order order) { switch(order) { case memory_order_relaxed: break; case memory_order_release: __asm__ __volatile__ ("membar #StoreStore | #LoadStore" ::: "memory"); break; case memory_order_acquire: __asm__ __volatile__ ("membar #LoadLoad | #LoadStore" ::: "memory"); break; case memory_order_acq_rel: __asm__ __volatile__ ("membar #LoadLoad | #LoadStore | #StoreStore" ::: "memory"); break; case memory_order_consume: break; case memory_order_seq_cst: __asm__ __volatile__ ("membar #Sync" ::: "memory"); break; default:; } } #define BOOST_ATOMIC_SIGNAL_FENCE 2 static inline void atomic_signal_fence(memory_order) { __asm__ __volatile__ ("" ::: "memory"); } namespace atomics { namespace detail { /* integral types */ template class base_atomic { typedef base_atomic this_type; typedef T value_type; typedef T difference_type; typedef int32_t storage_type; public: explicit base_atomic(value_type v) : v_(v) {} base_atomic(void) : v_(0) {} void store(value_type v, memory_order order = memory_order_seq_cst) volatile { platform_fence_before(order); const_cast(v_) = v; platform_fence_after_store(order); } value_type load(memory_order order = memory_order_seq_cst) const volatile { value_type v = const_cast(v_); platform_fence_after_load(order); return v; } value_type fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type tmp = load(memory_order_relaxed); do {} while(!compare_exchange_weak(tmp, tmp + v, order, memory_order_relaxed)); return tmp; } value_type fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type tmp = load(memory_order_relaxed); do {} while(!compare_exchange_weak(tmp, tmp - v, order, memory_order_relaxed)); return tmp; } value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type tmp = load(memory_order_relaxed); do {} while(!compare_exchange_weak(tmp, v, order, memory_order_relaxed)); return tmp; } bool compare_exchange_strong( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { platform_fence_before(success_order); storage_type desired_s = desired; __asm__ ( "cas [%1], %2, %0" : "+r" (desired_s) : "r" (&v_), "r" ((storage_type)expected) : "memory" ); desired = desired_s; bool success = (desired == expected); if (success) platform_fence_after(success_order); else platform_fence_after(failure_order); expected = desired; return success; } bool compare_exchange_weak( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { return compare_exchange_strong(expected, desired, success_order, failure_order); } value_type fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type tmp = load(memory_order_relaxed); do {} while(!compare_exchange_weak(tmp, tmp & v, order, memory_order_relaxed)); return tmp; } value_type fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type tmp = load(memory_order_relaxed); do {} while(!compare_exchange_weak(tmp, tmp | v, order, memory_order_relaxed)); return tmp; } value_type fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type tmp = load(memory_order_relaxed); do {} while(!compare_exchange_weak(tmp, tmp ^ v, order, memory_order_relaxed)); return tmp; } bool is_lock_free(void) const volatile { return true; } BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS private: base_atomic(const base_atomic &) /* = delete */ ; void operator=(const base_atomic &) /* = delete */ ; storage_type v_; }; template class base_atomic { typedef base_atomic this_type; typedef T value_type; typedef T difference_type; typedef uint32_t storage_type; public: explicit base_atomic(value_type v) : v_(v) {} base_atomic(void) : v_(0) {} void store(value_type v, memory_order order = memory_order_seq_cst) volatile { platform_fence_before(order); const_cast(v_) = v; platform_fence_after_store(order); } value_type load(memory_order order = memory_order_seq_cst) const volatile { value_type v = const_cast(v_); platform_fence_after_load(order); return v; } value_type fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type tmp = load(memory_order_relaxed); do {} while(!compare_exchange_weak(tmp, tmp + v, order, memory_order_relaxed)); return tmp; } value_type fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type tmp = load(memory_order_relaxed); do {} while(!compare_exchange_weak(tmp, tmp - v, order, memory_order_relaxed)); return tmp; } value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type tmp = load(memory_order_relaxed); do {} while(!compare_exchange_weak(tmp, v, order, memory_order_relaxed)); return tmp; } bool compare_exchange_strong( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { platform_fence_before(success_order); storage_type desired_s = desired; __asm__ ( "cas [%1], %2, %0" : "+r" (desired_s) : "r" (&v_), "r" ((storage_type)expected) : "memory" ); desired = desired_s; bool success = (desired == expected); if (success) platform_fence_after(success_order); else platform_fence_after(failure_order); expected = desired; return success; } bool compare_exchange_weak( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { return compare_exchange_strong(expected, desired, success_order, failure_order); } value_type fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type tmp = load(memory_order_relaxed); do {} while(!compare_exchange_weak(tmp, tmp & v, order, memory_order_relaxed)); return tmp; } value_type fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type tmp = load(memory_order_relaxed); do {} while(!compare_exchange_weak(tmp, tmp | v, order, memory_order_relaxed)); return tmp; } value_type fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type tmp = load(memory_order_relaxed); do {} while(!compare_exchange_weak(tmp, tmp ^ v, order, memory_order_relaxed)); return tmp; } bool is_lock_free(void) const volatile { return true; } BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS private: base_atomic(const base_atomic &) /* = delete */ ; void operator=(const base_atomic &) /* = delete */ ; storage_type v_; }; template class base_atomic { typedef base_atomic this_type; typedef T value_type; typedef T difference_type; typedef int32_t storage_type; public: explicit base_atomic(value_type v) : v_(v) {} base_atomic(void) : v_(0) {} void store(value_type v, memory_order order = memory_order_seq_cst) volatile { platform_fence_before(order); const_cast(v_) = v; platform_fence_after_store(order); } value_type load(memory_order order = memory_order_seq_cst) const volatile { value_type v = const_cast(v_); platform_fence_after_load(order); return v; } value_type fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type tmp = load(memory_order_relaxed); do {} while(!compare_exchange_weak(tmp, tmp + v, order, memory_order_relaxed)); return tmp; } value_type fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type tmp = load(memory_order_relaxed); do {} while(!compare_exchange_weak(tmp, tmp - v, order, memory_order_relaxed)); return tmp; } value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type tmp = load(memory_order_relaxed); do {} while(!compare_exchange_weak(tmp, v, order, memory_order_relaxed)); return tmp; } bool compare_exchange_strong( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { platform_fence_before(success_order); storage_type desired_s = desired; __asm__ ( "cas [%1], %2, %0" : "+r" (desired_s) : "r" (&v_), "r" ((storage_type)expected) : "memory" ); desired = desired_s; bool success = (desired == expected); if (success) platform_fence_after(success_order); else platform_fence_after(failure_order); expected = desired; return success; } bool compare_exchange_weak( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { return compare_exchange_strong(expected, desired, success_order, failure_order); } value_type fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type tmp = load(memory_order_relaxed); do {} while(!compare_exchange_weak(tmp, tmp & v, order, memory_order_relaxed)); return tmp; } value_type fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type tmp = load(memory_order_relaxed); do {} while(!compare_exchange_weak(tmp, tmp | v, order, memory_order_relaxed)); return tmp; } value_type fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type tmp = load(memory_order_relaxed); do {} while(!compare_exchange_weak(tmp, tmp ^ v, order, memory_order_relaxed)); return tmp; } bool is_lock_free(void) const volatile { return true; } BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS private: base_atomic(const base_atomic &) /* = delete */ ; void operator=(const base_atomic &) /* = delete */ ; storage_type v_; }; template class base_atomic { typedef base_atomic this_type; typedef T value_type; typedef T difference_type; typedef uint32_t storage_type; public: explicit base_atomic(value_type v) : v_(v) {} base_atomic(void) : v_(0) {} void store(value_type v, memory_order order = memory_order_seq_cst) volatile { platform_fence_before(order); const_cast(v_) = v; platform_fence_after_store(order); } value_type load(memory_order order = memory_order_seq_cst) const volatile { value_type v = const_cast(v_); platform_fence_after_load(order); return v; } value_type fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type tmp = load(memory_order_relaxed); do {} while(!compare_exchange_weak(tmp, tmp + v, order, memory_order_relaxed)); return tmp; } value_type fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type tmp = load(memory_order_relaxed); do {} while(!compare_exchange_weak(tmp, tmp - v, order, memory_order_relaxed)); return tmp; } value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type tmp = load(memory_order_relaxed); do {} while(!compare_exchange_weak(tmp, v, order, memory_order_relaxed)); return tmp; } bool compare_exchange_strong( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { platform_fence_before(success_order); storage_type desired_s = desired; __asm__ ( "cas [%1], %2, %0" : "+r" (desired_s) : "r" (&v_), "r" ((storage_type)expected) : "memory" ); desired = desired_s; bool success = (desired == expected); if (success) platform_fence_after(success_order); else platform_fence_after(failure_order); expected = desired; return success; } bool compare_exchange_weak( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { return compare_exchange_strong(expected, desired, success_order, failure_order); } value_type fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type tmp = load(memory_order_relaxed); do {} while(!compare_exchange_weak(tmp, tmp & v, order, memory_order_relaxed)); return tmp; } value_type fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type tmp = load(memory_order_relaxed); do {} while(!compare_exchange_weak(tmp, tmp | v, order, memory_order_relaxed)); return tmp; } value_type fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type tmp = load(memory_order_relaxed); do {} while(!compare_exchange_weak(tmp, tmp ^ v, order, memory_order_relaxed)); return tmp; } bool is_lock_free(void) const volatile { return true; } BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS private: base_atomic(const base_atomic &) /* = delete */ ; void operator=(const base_atomic &) /* = delete */ ; storage_type v_; }; template class base_atomic { typedef base_atomic this_type; typedef T value_type; typedef T difference_type; public: explicit base_atomic(value_type v) : v_(v) {} base_atomic(void) {} void store(value_type v, memory_order order = memory_order_seq_cst) volatile { platform_fence_before(order); const_cast(v_) = v; platform_fence_after_store(order); } value_type load(memory_order order = memory_order_seq_cst) const volatile { value_type v = const_cast(v_); platform_fence_after_load(order); return v; } value_type fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type tmp = load(memory_order_relaxed); do {} while(!compare_exchange_weak(tmp, tmp + v, order, memory_order_relaxed)); return tmp; } value_type fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type tmp = load(memory_order_relaxed); do {} while(!compare_exchange_weak(tmp, tmp - v, order, memory_order_relaxed)); return tmp; } value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type tmp = load(memory_order_relaxed); do {} while(!compare_exchange_weak(tmp, v, order, memory_order_relaxed)); return tmp; } bool compare_exchange_strong( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { platform_fence_before(success_order); __asm__ ( "cas [%1], %2, %0" : "+r" (desired) : "r" (&v_), "r" (expected) : "memory" ); bool success = (desired == expected); if (success) platform_fence_after(success_order); else platform_fence_after(failure_order); expected = desired; return success; } bool compare_exchange_weak( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { return compare_exchange_strong(expected, desired, success_order, failure_order); } value_type fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type tmp = load(memory_order_relaxed); do {} while(!compare_exchange_weak(tmp, tmp & v, order, memory_order_relaxed)); return tmp; } value_type fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type tmp = load(memory_order_relaxed); do {} while(!compare_exchange_weak(tmp, tmp | v, order, memory_order_relaxed)); return tmp; } value_type fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type tmp = load(memory_order_relaxed); do {} while(!compare_exchange_weak(tmp, tmp ^ v, order, memory_order_relaxed)); return tmp; } bool is_lock_free(void) const volatile { return true; } BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS private: base_atomic(const base_atomic &) /* = delete */ ; void operator=(const base_atomic &) /* = delete */ ; value_type v_; }; /* pointer types */ template class base_atomic { typedef base_atomic this_type; typedef void * value_type; public: explicit base_atomic(value_type v) : v_(v) {} base_atomic(void) {} void store(value_type v, memory_order order = memory_order_seq_cst) volatile { platform_fence_before(order); const_cast(v_) = v; platform_fence_after_store(order); } value_type load(memory_order order = memory_order_seq_cst) const volatile { value_type v = const_cast(v_); platform_fence_after_load(order); return v; } value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type tmp = load(memory_order_relaxed); do {} while(!compare_exchange_weak(tmp, v, order, memory_order_relaxed)); return tmp; } bool compare_exchange_strong( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { platform_fence_before(success_order); __asm__ ( "cas [%1], %2, %0" : "+r" (desired) : "r" (&v_), "r" (expected) : "memory" ); bool success = (desired == expected); if (success) platform_fence_after(success_order); else platform_fence_after(failure_order); expected = desired; return success; } bool compare_exchange_weak(value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { return compare_exchange_strong(expected, desired, success_order, failure_order); } bool is_lock_free(void) const volatile { return true; } BOOST_ATOMIC_DECLARE_BASE_OPERATORS private: base_atomic(const base_atomic &) /* = delete */ ; void operator=(const base_atomic &) /* = delete */ ; value_type v_; }; template class base_atomic { typedef base_atomic this_type; typedef T * value_type; typedef ptrdiff_t difference_type; public: explicit base_atomic(value_type v) : v_(v) {} base_atomic(void) {} void store(value_type v, memory_order order = memory_order_seq_cst) volatile { platform_fence_before(order); const_cast(v_) = v; platform_fence_after_store(order); } value_type load(memory_order order = memory_order_seq_cst) const volatile { value_type v = const_cast(v_); platform_fence_after_load(order); return v; } value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type tmp = load(memory_order_relaxed); do {} while(!compare_exchange_weak(tmp, v, order, memory_order_relaxed)); return tmp; } bool compare_exchange_strong( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { platform_fence_before(success_order); __asm__ ( "cas [%1], %2, %0" : "+r" (desired) : "r" (&v_), "r" (expected) : "memory" ); bool success = (desired == expected); if (success) platform_fence_after(success_order); else platform_fence_after(failure_order); expected = desired; return success; } bool compare_exchange_weak( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { return compare_exchange_strong(expected, desired, success_order, failure_order); } value_type fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile { value_type tmp = load(memory_order_relaxed); do {} while(!compare_exchange_weak(tmp, tmp + v, order, memory_order_relaxed)); return tmp; } value_type fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile { value_type tmp = load(memory_order_relaxed); do {} while(!compare_exchange_weak(tmp, tmp - v, order, memory_order_relaxed)); return tmp; } bool is_lock_free(void) const volatile { return true; } BOOST_ATOMIC_DECLARE_POINTER_OPERATORS private: base_atomic(const base_atomic &) /* = delete */ ; void operator=(const base_atomic &) /* = delete */ ; value_type v_; }; /* generic types */ template class base_atomic { typedef base_atomic this_type; typedef T value_type; typedef uint32_t storage_type; public: explicit base_atomic(value_type v) { v_ = 0; memcpy(&v_, &v, sizeof(value_type)); } base_atomic(void) {} void store(value_type v, memory_order order = memory_order_seq_cst) volatile { storage_type tmp = 0; memcpy(&tmp, &v, sizeof(value_type)); platform_fence_before(order); const_cast(v_) = tmp; platform_fence_after_store(order); } value_type load(memory_order order = memory_order_seq_cst) const volatile { storage_type tmp = const_cast(v_); platform_fence_after_load(order); value_type v; memcpy(&v, &tmp, sizeof(value_type)); return v; } value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type tmp = load(memory_order_relaxed); do {} while(!compare_exchange_weak(tmp, v, order, memory_order_relaxed)); return tmp; } bool compare_exchange_strong( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { storage_type expected_s = 0, desired_s = 0; memcpy(&expected_s, &expected, sizeof(value_type)); memcpy(&desired_s, &desired, sizeof(value_type)); platform_fence_before(success_order); __asm__ ( "cas [%1], %2, %0" : "+r" (desired_s) : "r" (&v_), "r" (expected_s) : "memory" ); bool success = (desired_s == expected_s); if (success) platform_fence_after(success_order); else platform_fence_after(failure_order); memcpy(&expected, &desired_s, sizeof(value_type)); return success; } bool compare_exchange_weak( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { return compare_exchange_strong(expected, desired, success_order, failure_order); } bool is_lock_free(void) const volatile { return true; } BOOST_ATOMIC_DECLARE_BASE_OPERATORS private: base_atomic(const base_atomic &) /* = delete */ ; void operator=(const base_atomic &) /* = delete */ ; storage_type v_; }; template class base_atomic { typedef base_atomic this_type; typedef T value_type; typedef uint32_t storage_type; public: explicit base_atomic(value_type v) { v_ = 0; memcpy(&v_, &v, sizeof(value_type)); } base_atomic(void) {} void store(value_type v, memory_order order = memory_order_seq_cst) volatile { storage_type tmp = 0; memcpy(&tmp, &v, sizeof(value_type)); platform_fence_before(order); const_cast(v_) = tmp; platform_fence_after_store(order); } value_type load(memory_order order = memory_order_seq_cst) const volatile { storage_type tmp = const_cast(v_); platform_fence_after_load(order); value_type v; memcpy(&v, &tmp, sizeof(value_type)); return v; } value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type tmp = load(memory_order_relaxed); do {} while(!compare_exchange_weak(tmp, v, order, memory_order_relaxed)); return tmp; } bool compare_exchange_strong( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { storage_type expected_s = 0, desired_s = 0; memcpy(&expected_s, &expected, sizeof(value_type)); memcpy(&desired_s, &desired, sizeof(value_type)); platform_fence_before(success_order); __asm__ ( "cas [%1], %2, %0" : "+r" (desired_s) : "r" (&v_), "r" (expected_s) : "memory" ); bool success = (desired_s == expected_s); if (success) platform_fence_after(success_order); else platform_fence_after(failure_order); memcpy(&expected, &desired_s, sizeof(value_type)); return success; } bool compare_exchange_weak( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { return compare_exchange_strong(expected, desired, success_order, failure_order); } bool is_lock_free(void) const volatile { return true; } BOOST_ATOMIC_DECLARE_BASE_OPERATORS private: base_atomic(const base_atomic &) /* = delete */ ; void operator=(const base_atomic &) /* = delete */ ; storage_type v_; }; template class base_atomic { typedef base_atomic this_type; typedef T value_type; typedef uint32_t storage_type; public: explicit base_atomic(value_type v) { memcpy(&v_, &v, sizeof(value_type)); } base_atomic(void) {} void store(value_type v, memory_order order = memory_order_seq_cst) volatile { storage_type tmp; memcpy(&tmp, &v, sizeof(value_type)); platform_fence_before(order); const_cast(v_) = tmp; platform_fence_after_store(order); } value_type load(memory_order order = memory_order_seq_cst) const volatile { storage_type tmp = const_cast(v_); platform_fence_after_load(order); value_type v; memcpy(&v, &tmp, sizeof(value_type)); return v; } value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type tmp = load(memory_order_relaxed); do {} while(!compare_exchange_weak(tmp, v, order, memory_order_relaxed)); return tmp; } bool compare_exchange_strong( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { storage_type expected_s, desired_s; memcpy(&expected_s, &expected, sizeof(value_type)); memcpy(&desired_s, &desired, sizeof(value_type)); platform_fence_before(success_order); __asm__ ( "cas [%1], %2, %0" : "+r" (desired_s) : "r" (&v_), "r" (expected_s) : "memory" ); bool success = (desired_s == expected_s); if (success) platform_fence_after(success_order); else platform_fence_after(failure_order); memcpy(&expected, &desired_s, sizeof(value_type)); return success; } bool compare_exchange_weak( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { return compare_exchange_strong(expected, desired, success_order, failure_order); } bool is_lock_free(void) const volatile { return true; } BOOST_ATOMIC_DECLARE_BASE_OPERATORS private: base_atomic(const base_atomic &) /* = delete */ ; void operator=(const base_atomic &) /* = delete */ ; storage_type v_; }; #endif /* !defined(BOOST_ATOMIC_FORCE_FALLBACK) */ } } } #endif ././@LongLink0000000000000000000000000000015600000000000011567 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/boost/atomic/detail/interlocked.hppSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/boost/atomic/detail/interl0000664000175000017500000000645312110501517032227 0ustar dandan#ifndef BOOST_ATOMIC_DETAIL_INTERLOCKED_HPP #define BOOST_ATOMIC_DETAIL_INTERLOCKED_HPP // Copyright (c) 2009 Helge Bahmann // // Distributed under the Boost Software License, Version 1.0. // See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #include namespace boost { namespace atomics { namespace detail { static inline void x86_full_fence(void) { long tmp; BOOST_INTERLOCKED_EXCHANGE(&tmp, 0); } static inline void platform_fence_before(memory_order) { } static inline void platform_fence_after(memory_order) { } static inline void platform_fence_before_store(memory_order) { } static inline void platform_fence_after_store(memory_order order) { if (order == memory_order_seq_cst) x86_full_fence(); } static inline void platform_fence_after_load(memory_order order) { if (order == memory_order_seq_cst) { x86_full_fence(); } } template bool platform_cmpxchg32_strong(T & expected, T desired, volatile T * ptr) { T prev = expected; expected = (T)BOOST_INTERLOCKED_COMPARE_EXCHANGE((long *)(ptr), (long)desired, (long)expected); bool success = (prev==expected); return success; } #if defined(_WIN64) template bool platform_cmpxchg64_strong(T & expected, T desired, volatile T * ptr) { T prev = expected; expected = (T) _InterlockedCompareExchange64((long long *)(ptr), (long long)desired, (long long)expected); bool success = (prev==expected); return success; } template void platform_store64(T value, volatile T * ptr) { *ptr = value; } template T platform_load64(volatile T * ptr) { return *ptr; } #endif } } #define BOOST_ATOMIC_THREAD_FENCE 2 static inline void atomic_thread_fence(memory_order order) { if (order == memory_order_seq_cst) { atomics::detail::x86_full_fence(); } } class atomic_flag { private: atomic_flag(const atomic_flag &) /* = delete */ ; atomic_flag & operator=(const atomic_flag &) /* = delete */ ; uint32_t v_; public: atomic_flag(void) : v_(false) {} void clear(memory_order order = memory_order_seq_cst) volatile { atomics::detail::platform_fence_before_store(order); const_cast(v_) = 0; atomics::detail::platform_fence_after_store(order); } bool test_and_set(memory_order order = memory_order_seq_cst) volatile { atomics::detail::platform_fence_before(order); uint32_t expected = v_; do { if (expected == 1) break; } while (!atomics::detail::platform_cmpxchg32(expected, (uint32_t)1, &v_)); atomics::detail::platform_fence_after(order); return expected; } }; } #define BOOST_ATOMIC_FLAG_LOCK_FREE 2 #include #if !defined(BOOST_ATOMIC_FORCE_FALLBACK) #define BOOST_ATOMIC_CHAR_LOCK_FREE 2 #define BOOST_ATOMIC_SHORT_LOCK_FREE 2 #define BOOST_ATOMIC_INT_LOCK_FREE 2 #define BOOST_ATOMIC_LONG_LOCK_FREE 2 #define BOOST_ATOMIC_LLONG_LOCK_FREE 0 #define BOOST_ATOMIC_POINTER_LOCK_FREE 2 #define BOOST_ATOMIC_BOOL_LOCK_FREE 2 #include #if defined(_WIN64) #include #endif #endif /* !defined(BOOST_ATOMIC_FORCE_FALLBACK) */ #endif ././@LongLink0000000000000000000000000000015600000000000011567 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/boost/atomic/detail/cas32strong.hppSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/boost/atomic/detail/cas32s0000664000175000017500000005734312110501517032034 0ustar dandan#ifndef BOOST_ATOMIC_DETAIL_CAS32STRONG_HPP #define BOOST_ATOMIC_DETAIL_CAS32STRONG_HPP // Distributed under the Boost Software License, Version 1.0. // See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // // Copyright (c) 2011 Helge Bahmann // Build 8-, 16- and 32-bit atomic operations from // a platform_cmpxchg32_strong primitive. #include #include namespace boost { namespace atomics { namespace detail { /* integral types */ template class base_atomic { typedef base_atomic this_type; typedef T value_type; typedef T difference_type; typedef uint32_t storage_type; public: explicit base_atomic(value_type v) : v_(v) {} base_atomic(void) {} void store(value_type v, memory_order order = memory_order_seq_cst) volatile { platform_fence_before_store(order); const_cast(v_) = v; platform_fence_after_store(order); } value_type load(memory_order order = memory_order_seq_cst) const volatile { value_type v = const_cast(v_); platform_fence_after_load(order); return v; } value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, v, order, memory_order_relaxed)); return original; } bool compare_exchange_weak( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { return compare_exchange_strong(expected, desired, success_order, failure_order); } bool compare_exchange_strong( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { platform_fence_before(success_order); storage_type expected_s = (storage_type) expected; storage_type desired_s = (storage_type) desired; bool success = platform_cmpxchg32_strong(expected_s, desired_s, &v_); if (success) { platform_fence_after(success_order); } else { platform_fence_after(failure_order); expected = (value_type) expected_s; } return success; } value_type fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, original + v, order, memory_order_relaxed)); return original; } value_type fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, original - v, order, memory_order_relaxed)); return original; } value_type fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, original & v, order, memory_order_relaxed)); return original; } value_type fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, original | v, order, memory_order_relaxed)); return original; } value_type fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, original ^ v, order, memory_order_relaxed)); return original; } bool is_lock_free(void) const volatile { return true; } BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS private: base_atomic(const base_atomic &) /* = delete */ ; void operator=(const base_atomic &) /* = delete */ ; storage_type v_; }; template class base_atomic { typedef base_atomic this_type; typedef T value_type; typedef T difference_type; typedef uint32_t storage_type; public: explicit base_atomic(value_type v) : v_(v) {} base_atomic(void) {} void store(value_type v, memory_order order = memory_order_seq_cst) volatile { platform_fence_before_store(order); const_cast(v_) = v; platform_fence_after_store(order); } value_type load(memory_order order = memory_order_seq_cst) const volatile { value_type v = const_cast(v_); platform_fence_after_load(order); return v; } value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, v, order, memory_order_relaxed)); return original; } bool compare_exchange_weak( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { return compare_exchange_strong(expected, desired, success_order, failure_order); } bool compare_exchange_strong( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { platform_fence_before(success_order); storage_type expected_s = (storage_type) expected; storage_type desired_s = (storage_type) desired; bool success = platform_cmpxchg32_strong(expected_s, desired_s, &v_); if (success) { platform_fence_after(success_order); } else { platform_fence_after(failure_order); expected = (value_type) expected_s; } return success; } value_type fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, original + v, order, memory_order_relaxed)); return original; } value_type fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, original - v, order, memory_order_relaxed)); return original; } value_type fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, original & v, order, memory_order_relaxed)); return original; } value_type fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, original | v, order, memory_order_relaxed)); return original; } value_type fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, original ^ v, order, memory_order_relaxed)); return original; } bool is_lock_free(void) const volatile { return true; } BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS private: base_atomic(const base_atomic &) /* = delete */ ; void operator=(const base_atomic &) /* = delete */ ; storage_type v_; }; template class base_atomic { typedef base_atomic this_type; typedef T value_type; typedef T difference_type; public: explicit base_atomic(value_type v) : v_(v) {} base_atomic(void) {} void store(value_type v, memory_order order = memory_order_seq_cst) volatile { platform_fence_before_store(order); const_cast(v_) = v; platform_fence_after_store(order); } value_type load(memory_order order = memory_order_seq_cst) const volatile { value_type v = const_cast(v_); platform_fence_after_load(order); return v; } value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, v, order, memory_order_relaxed)); return original; } bool compare_exchange_weak( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { return compare_exchange_strong(expected, desired, success_order, failure_order); } bool compare_exchange_strong( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { platform_fence_before(success_order); bool success = platform_cmpxchg32_strong(expected, desired, &v_); if (success) { platform_fence_after(success_order); } else { platform_fence_after(failure_order); } return success; } value_type fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, original + v, order, memory_order_relaxed)); return original; } value_type fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, original - v, order, memory_order_relaxed)); return original; } value_type fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, original & v, order, memory_order_relaxed)); return original; } value_type fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, original | v, order, memory_order_relaxed)); return original; } value_type fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, original ^ v, order, memory_order_relaxed)); return original; } bool is_lock_free(void) const volatile { return true; } BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS private: base_atomic(const base_atomic &) /* = delete */ ; void operator=(const base_atomic &) /* = delete */ ; value_type v_; }; /* pointer types */ template class base_atomic { typedef base_atomic this_type; typedef void * value_type; typedef ptrdiff_t difference_type; public: explicit base_atomic(value_type v) : v_(v) {} base_atomic(void) {} void store(value_type v, memory_order order = memory_order_seq_cst) volatile { platform_fence_before_store(order); const_cast(v_) = v; platform_fence_after_store(order); } value_type load(memory_order order = memory_order_seq_cst) const volatile { value_type v = const_cast(v_); platform_fence_after_load(order); return v; } value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, v, order, memory_order_relaxed)); return original; } bool compare_exchange_weak( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { return compare_exchange_strong(expected, desired, success_order, failure_order); } bool compare_exchange_strong( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { platform_fence_before(success_order); bool success = platform_cmpxchg32_strong(expected, desired, &v_); if (success) { platform_fence_after(success_order); } else { platform_fence_after(failure_order); } return success; } value_type fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, original + v, order, memory_order_relaxed)); return original; } value_type fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, original - v, order, memory_order_relaxed)); return original; } bool is_lock_free(void) const volatile { return true; } BOOST_ATOMIC_DECLARE_BASE_OPERATORS private: base_atomic(const base_atomic &) /* = delete */ ; void operator=(const base_atomic &) /* = delete */ ; value_type v_; }; template class base_atomic { typedef base_atomic this_type; typedef T * value_type; typedef ptrdiff_t difference_type; public: explicit base_atomic(value_type v) : v_(v) {} base_atomic(void) {} void store(value_type v, memory_order order = memory_order_seq_cst) volatile { platform_fence_before_store(order); const_cast(v_) = v; platform_fence_after_store(order); } value_type load(memory_order order = memory_order_seq_cst) const volatile { value_type v = const_cast(v_); platform_fence_after_load(order); return v; } value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, v, order, memory_order_relaxed)); return original; } bool compare_exchange_weak( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { return compare_exchange_strong(expected, desired, success_order, failure_order); } bool compare_exchange_strong( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { platform_fence_before(success_order); bool success = platform_cmpxchg32_strong(expected, desired, &v_); if (success) { platform_fence_after(success_order); } else { platform_fence_after(failure_order); } return success; } value_type fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, original + v, order, memory_order_relaxed)); return original; } value_type fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, original - v, order, memory_order_relaxed)); return original; } bool is_lock_free(void) const volatile { return true; } BOOST_ATOMIC_DECLARE_POINTER_OPERATORS private: base_atomic(const base_atomic &) /* = delete */ ; void operator=(const base_atomic &) /* = delete */ ; value_type v_; }; /* generic types */ template class base_atomic { typedef base_atomic this_type; typedef T value_type; typedef uint32_t storage_type; public: explicit base_atomic(value_type v) : v_(0) { memcpy(&v_, &v, sizeof(value_type)); } base_atomic(void) : v_(0) {} void store(value_type v, memory_order order = memory_order_seq_cst) volatile { storage_type tmp = 0; memcpy(&tmp, &v, sizeof(value_type)); platform_fence_before_store(order); const_cast(v_) = tmp; platform_fence_after_store(order); } value_type load(memory_order order = memory_order_seq_cst) const volatile { storage_type tmp = const_cast(v_); platform_fence_after_load(order); value_type v; memcpy(&v, &tmp, sizeof(value_type)); return v; } value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, v, order, memory_order_relaxed)); return original; } bool compare_exchange_weak( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { return compare_exchange_strong(expected, desired, success_order, failure_order); } bool compare_exchange_strong( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { storage_type expected_s = 0, desired_s = 0; memcpy(&expected_s, &expected, sizeof(value_type)); memcpy(&desired_s, &desired, sizeof(value_type)); platform_fence_before(success_order); bool success = platform_cmpxchg32_strong(expected_s, desired_s, &v_); if (success) { platform_fence_after(success_order); } else { platform_fence_after(failure_order); memcpy(&expected, &expected_s, sizeof(value_type)); } return success; } bool is_lock_free(void) const volatile { return true; } BOOST_ATOMIC_DECLARE_BASE_OPERATORS private: base_atomic(const base_atomic &) /* = delete */ ; void operator=(const base_atomic &) /* = delete */ ; storage_type v_; }; template class base_atomic { typedef base_atomic this_type; typedef T value_type; typedef uint32_t storage_type; public: explicit base_atomic(value_type v) : v_(0) { memcpy(&v_, &v, sizeof(value_type)); } base_atomic(void) : v_(0) {} void store(value_type v, memory_order order = memory_order_seq_cst) volatile { storage_type tmp = 0; memcpy(&tmp, &v, sizeof(value_type)); platform_fence_before_store(order); const_cast(v_) = tmp; platform_fence_after_store(order); } value_type load(memory_order order = memory_order_seq_cst) const volatile { storage_type tmp = const_cast(v_); platform_fence_after_load(order); value_type v; memcpy(&v, &tmp, sizeof(value_type)); return v; } value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, v, order, memory_order_relaxed)); return original; } bool compare_exchange_weak( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { return compare_exchange_strong(expected, desired, success_order, failure_order); } bool compare_exchange_strong( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { storage_type expected_s = 0, desired_s = 0; memcpy(&expected_s, &expected, sizeof(value_type)); memcpy(&desired_s, &desired, sizeof(value_type)); platform_fence_before(success_order); bool success = platform_cmpxchg32_strong(expected_s, desired_s, &v_); if (success) { platform_fence_after(success_order); } else { platform_fence_after(failure_order); memcpy(&expected, &expected_s, sizeof(value_type)); } return success; } bool is_lock_free(void) const volatile { return true; } BOOST_ATOMIC_DECLARE_BASE_OPERATORS private: base_atomic(const base_atomic &) /* = delete */ ; void operator=(const base_atomic &) /* = delete */ ; storage_type v_; }; template class base_atomic { typedef base_atomic this_type; typedef T value_type; typedef uint32_t storage_type; public: explicit base_atomic(value_type v) : v_(0) { memcpy(&v_, &v, sizeof(value_type)); } base_atomic(void) : v_(0) {} void store(value_type v, memory_order order = memory_order_seq_cst) volatile { storage_type tmp = 0; memcpy(&tmp, &v, sizeof(value_type)); platform_fence_before_store(order); const_cast(v_) = tmp; platform_fence_after_store(order); } value_type load(memory_order order = memory_order_seq_cst) const volatile { storage_type tmp = const_cast(v_); platform_fence_after_load(order); value_type v; memcpy(&v, &tmp, sizeof(value_type)); return v; } value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, v, order, memory_order_relaxed)); return original; } bool compare_exchange_weak( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { return compare_exchange_strong(expected, desired, success_order, failure_order); } bool compare_exchange_strong( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { storage_type expected_s = 0, desired_s = 0; memcpy(&expected_s, &expected, sizeof(value_type)); memcpy(&desired_s, &desired, sizeof(value_type)); platform_fence_before(success_order); bool success = platform_cmpxchg32_strong(expected_s, desired_s, &v_); if (success) { platform_fence_after(success_order); } else { platform_fence_after(failure_order); memcpy(&expected, &expected_s, sizeof(value_type)); } return success; } bool is_lock_free(void) const volatile { return true; } BOOST_ATOMIC_DECLARE_BASE_OPERATORS private: base_atomic(const base_atomic &) /* = delete */ ; void operator=(const base_atomic &) /* = delete */ ; storage_type v_; }; } } } #endif ././@LongLink0000000000000000000000000000015300000000000011564 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/boost/atomic/detail/lockpool.hppSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/boost/atomic/detail/lockpo0000664000175000017500000000330112110501517032206 0ustar dandan#ifndef BOOST_ATOMIC_DETAIL_LOCKPOOL_HPP #define BOOST_ATOMIC_DETAIL_LOCKPOOL_HPP // Copyright (c) 2011 Helge Bahmann // // Distributed under the Boost Software License, Version 1.0. // See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #ifndef BOOST_ATOMIC_FLAG_LOCK_FREE #include #endif namespace boost { namespace atomics { namespace detail { #ifndef BOOST_ATOMIC_FLAG_LOCK_FREE class lockpool { public: typedef mutex lock_type; class scoped_lock { private: mutex::scoped_lock guard; public: explicit scoped_lock(const volatile void * addr) : guard( lock_for(addr) ) { } }; private: static mutex pool_[41]; static mutex & lock_for(const volatile void * addr) { std::size_t index = reinterpret_cast(addr) % 41; return pool_[index]; } }; #else class lockpool { public: typedef atomic_flag lock_type; class scoped_lock { private: atomic_flag & flag_; scoped_lock(const scoped_lock &) /* = delete */; void operator=(const scoped_lock &) /* = delete */; public: explicit scoped_lock(const volatile void * addr) : flag_( lock_for(addr) ) { do { } while (flag_.test_and_set(memory_order_acquire)); } ~scoped_lock(void) { flag_.clear(memory_order_release); } }; private: static atomic_flag pool_[41]; static lock_type & lock_for(const volatile void * addr) { std::size_t index = reinterpret_cast(addr) % 41; return pool_[index]; } }; #endif } } } #endif ././@LongLink0000000000000000000000000000015600000000000011567 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/boost/atomic/detail/generic-cas.hppSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/boost/atomic/detail/generi0000664000175000017500000001374412110501517032204 0ustar dandan#ifndef BOOST_ATOMIC_DETAIL_GENERIC_CAS_HPP #define BOOST_ATOMIC_DETAIL_GENERIC_CAS_HPP // Copyright (c) 2009 Helge Bahmann // // Distributed under the Boost Software License, Version 1.0. // See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #include #include #include #include /* fallback implementation for various compilation targets; this is *not* efficient, particularly because all operations are fully fenced (full memory barriers before and after each operation) */ #if defined(__GNUC__) namespace boost { namespace atomics { namespace detail { static inline int32_t fenced_compare_exchange_strong_32(volatile int32_t *ptr, int32_t expected, int32_t desired) { return __sync_val_compare_and_swap_4(ptr, expected, desired); } #define BOOST_ATOMIC_HAVE_CAS32 1 #if defined(__amd64__) || defined(__i686__) static inline int64_t fenced_compare_exchange_strong_64(int64_t *ptr, int64_t expected, int64_t desired) { return __sync_val_compare_and_swap_8(ptr, expected, desired); } #define BOOST_ATOMIC_HAVE_CAS64 1 #endif }}} #elif defined(__ICL) || defined(_MSC_VER) #if defined(_MSC_VER) #include #include #endif namespace boost { namespace atomics { namespace detail { static inline int32_t fenced_compare_exchange_strong(int32_t *ptr, int32_t expected, int32_t desired) { return _InterlockedCompareExchange(reinterpret_cast(ptr), desired, expected); } #define BOOST_ATOMIC_HAVE_CAS32 1 #if defined(_WIN64) static inline int64_t fenced_compare_exchange_strong(int64_t *ptr, int64_t expected, int64_t desired) { return _InterlockedCompareExchange64(ptr, desired, expected); } #define BOOST_ATOMIC_HAVE_CAS64 1 #endif }}} #elif (defined(__ICC) || defined(__ECC)) namespace boost { namespace atomics { namespace detail { static inline int32_t fenced_compare_exchange_strong_32(int32_t *ptr, int32_t expected, int32_t desired) { return _InterlockedCompareExchange((void*)ptr, desired, expected); } #define BOOST_ATOMIC_HAVE_CAS32 1 #if defined(__x86_64) static inline int64_t fenced_compare_exchange_strong(int64_t *ptr, int64_t expected, int64_t desired) { return cas64(ptr, expected, desired); } #define BOOST_ATOMIC_HAVE_CAS64 1 #elif defined(__ECC) //IA-64 version static inline int64_t fenced_compare_exchange_strong(int64_t *ptr, int64_t expected, int64_t desired) { return _InterlockedCompareExchange64((void*)ptr, desired, expected); } #define BOOST_ATOMIC_HAVE_CAS64 1 #endif }}} #elif (defined(__SUNPRO_CC) && defined(__sparc)) #include namespace boost { namespace atomics { namespace detail { static inline int32_t fenced_compare_exchange_strong_32(int32_t *ptr, int32_t expected, int32_t desired) { return atomic_cas_32((volatile unsigned int*)ptr, expected, desired); } #define BOOST_ATOMIC_HAVE_CAS32 1 /* FIXME: check for 64 bit mode */ static inline int64_t fenced_compare_exchange_strong_64(int64_t *ptr, int64_t expected, int64_t desired) { return atomic_cas_64((volatile unsigned long long*)ptr, expected, desired); } #define BOOST_ATOMIC_HAVE_CAS64 1 }}} #endif namespace boost { namespace atomics { namespace detail { #ifdef BOOST_ATOMIC_HAVE_CAS32 template class atomic_generic_cas32 { private: typedef atomic_generic_cas32 this_type; public: explicit atomic_generic_cas32(T v) : i((int32_t)v) {} atomic_generic_cas32() {} T load(memory_order order=memory_order_seq_cst) const volatile { T expected=(T)i; do { } while(!const_cast(this)->compare_exchange_weak(expected, expected, order, memory_order_relaxed)); return expected; } void store(T v, memory_order order=memory_order_seq_cst) volatile { exchange(v); } bool compare_exchange_strong( T &expected, T desired, memory_order success_order, memory_order failure_order) volatile { T found; found=(T)fenced_compare_exchange_strong_32(&i, (int32_t)expected, (int32_t)desired); bool success=(found==expected); expected=found; return success; } bool compare_exchange_weak( T &expected, T desired, memory_order success_order, memory_order failure_order) volatile { return compare_exchange_strong(expected, desired, success_order, failure_order); } T exchange(T r, memory_order order=memory_order_seq_cst) volatile { T expected=(T)i; do { } while(!compare_exchange_weak(expected, r, order, memory_order_relaxed)); return expected; } bool is_lock_free(void) const volatile {return true;} typedef T integral_type; private: mutable int32_t i; }; template class platform_atomic_integral : public build_atomic_from_exchange > { public: typedef build_atomic_from_exchange > super; explicit platform_atomic_integral(T v) : super(v) {} platform_atomic_integral(void) {} }; template class platform_atomic_integral: public build_atomic_from_larger_type, T> { public: typedef build_atomic_from_larger_type, T> super; explicit platform_atomic_integral(T v) : super(v) {} platform_atomic_integral(void) {} }; template class platform_atomic_integral: public build_atomic_from_larger_type, T> { public: typedef build_atomic_from_larger_type, T> super; explicit platform_atomic_integral(T v) : super(v) {} platform_atomic_integral(void) {} }; #endif } } } #endif ././@LongLink0000000000000000000000000000015600000000000011567 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/boost/atomic/detail/cas64strong.hppSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/boost/atomic/detail/cas64s0000664000175000017500000002706412110501517032036 0ustar dandan#ifndef BOOST_ATOMIC_DETAIL_CAS64STRONG_HPP #define BOOST_ATOMIC_DETAIL_CAS64STRONG_HPP // Distributed under the Boost Software License, Version 1.0. // See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // // Copyright (c) 2011 Helge Bahmann // Build 64-bit atomic operation from platform_cmpxchg64_strong // primitive. It is assumed that 64-bit loads/stores are not // atomic, so they are funnelled through cmpxchg as well. #include #include namespace boost { namespace atomics { namespace detail { /* integral types */ template class base_atomic { typedef base_atomic this_type; typedef T value_type; typedef T difference_type; public: explicit base_atomic(value_type v) : v_(v) {} base_atomic(void) {} void store(value_type v, memory_order order = memory_order_seq_cst) volatile { platform_fence_before_store(order); platform_store64(v, &v_); platform_fence_after_store(order); } value_type load(memory_order order = memory_order_seq_cst) const volatile { value_type v = platform_load64(&v_); platform_fence_after_load(order); return v; } value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, v, order, memory_order_relaxed)); return original; } bool compare_exchange_weak( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { return compare_exchange_strong(expected, desired, success_order, failure_order); } bool compare_exchange_strong( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { platform_fence_before(success_order); bool success = platform_cmpxchg64_strong(expected, desired, &v_); if (success) { platform_fence_after(success_order); } else { platform_fence_after(failure_order); } return success; } value_type fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, original + v, order, memory_order_relaxed)); return original; } value_type fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, original - v, order, memory_order_relaxed)); return original; } value_type fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, original & v, order, memory_order_relaxed)); return original; } value_type fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, original | v, order, memory_order_relaxed)); return original; } value_type fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, original ^ v, order, memory_order_relaxed)); return original; } bool is_lock_free(void) const volatile { return true; } BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS private: base_atomic(const base_atomic &) /* = delete */ ; void operator=(const base_atomic &) /* = delete */ ; value_type v_; }; /* pointer types */ template class base_atomic { typedef base_atomic this_type; typedef void * value_type; typedef ptrdiff_t difference_type; public: explicit base_atomic(value_type v) : v_(v) {} base_atomic(void) {} void store(value_type v, memory_order order = memory_order_seq_cst) volatile { platform_fence_before_store(order); platform_store64(v, &v_); platform_fence_after_store(order); } value_type load(memory_order order = memory_order_seq_cst) const volatile { value_type v = platform_load64(&v_); platform_fence_after_load(order); return v; } value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, v, order, memory_order_relaxed)); return original; } bool compare_exchange_weak( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { return compare_exchange_strong(expected, desired, success_order, failure_order); } bool compare_exchange_strong( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { platform_fence_before(success_order); bool success = platform_cmpxchg64_strong(expected, desired, &v_); if (success) { platform_fence_after(success_order); } else { platform_fence_after(failure_order); } return success; } value_type fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, original + v, order, memory_order_relaxed)); return original; } value_type fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, original - v, order, memory_order_relaxed)); return original; } bool is_lock_free(void) const volatile { return true; } BOOST_ATOMIC_DECLARE_BASE_OPERATORS private: base_atomic(const base_atomic &) /* = delete */ ; void operator=(const base_atomic &) /* = delete */ ; value_type v_; }; template class base_atomic { typedef base_atomic this_type; typedef T * value_type; typedef ptrdiff_t difference_type; public: explicit base_atomic(value_type v) : v_(v) {} base_atomic(void) {} void store(value_type v, memory_order order = memory_order_seq_cst) volatile { platform_fence_before_store(order); platform_store64(v, &v_); platform_fence_after_store(order); } value_type load(memory_order order = memory_order_seq_cst) const volatile { value_type v = platform_load64(&v_); platform_fence_after_load(order); return v; } value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, v, order, memory_order_relaxed)); return original; } bool compare_exchange_weak( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { return compare_exchange_strong(expected, desired, success_order, failure_order); } bool compare_exchange_strong( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { platform_fence_before(success_order); bool success = platform_cmpxchg64_strong(expected, desired, &v_); if (success) { platform_fence_after(success_order); } else { platform_fence_after(failure_order); } return success; } value_type fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, original + v, order, memory_order_relaxed)); return original; } value_type fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, original - v, order, memory_order_relaxed)); return original; } bool is_lock_free(void) const volatile { return true; } BOOST_ATOMIC_DECLARE_POINTER_OPERATORS private: base_atomic(const base_atomic &) /* = delete */ ; void operator=(const base_atomic &) /* = delete */ ; value_type v_; }; /* generic types */ template class base_atomic { typedef base_atomic this_type; typedef T value_type; typedef uint64_t storage_type; public: explicit base_atomic(value_type v) : v_(0) { memcpy(&v_, &v, sizeof(value_type)); } base_atomic(void) : v_(0) {} void store(value_type value, memory_order order = memory_order_seq_cst) volatile { storage_type value_s; memcpy(&value_s, &value, sizeof(value_s)); platform_fence_before_store(order); platform_store64(value_s, &v_); platform_fence_after_store(order); } value_type load(memory_order order = memory_order_seq_cst) const volatile { storage_type value_s = platform_load64(&v_); platform_fence_after_load(order); value_type value; memcpy(&value, &value_s, sizeof(value_s)); return value; } value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, v, order, memory_order_relaxed)); return original; } bool compare_exchange_weak( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { return compare_exchange_strong(expected, desired, success_order, failure_order); } bool compare_exchange_strong( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { storage_type expected_s = 0, desired_s = 0; memcpy(&expected_s, &expected, sizeof(value_type)); memcpy(&desired_s, &desired, sizeof(value_type)); platform_fence_before(success_order); bool success = platform_cmpxchg64_strong(expected_s, desired_s, &v_); if (success) { platform_fence_after(success_order); } else { platform_fence_after(failure_order); memcpy(&expected, &expected_s, sizeof(value_type)); } return success; } bool is_lock_free(void) const volatile { return true; } BOOST_ATOMIC_DECLARE_BASE_OPERATORS private: base_atomic(const base_atomic &) /* = delete */ ; void operator=(const base_atomic &) /* = delete */ ; storage_type v_; }; } } } #endif ././@LongLink0000000000000000000000000000015400000000000011565 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/boost/atomic/detail/linux-arm.hppSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/boost/atomic/detail/linux-0000664000175000017500000001174612110501517032147 0ustar dandan#ifndef BOOST_ATOMIC_DETAIL_LINUX_ARM_HPP #define BOOST_ATOMIC_DETAIL_LINUX_ARM_HPP // Distributed under the Boost Software License, Version 1.0. // See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // // Copyright (c) 2009, 2011 Helge Bahmann // Copyright (c) 2009 Phil Endecott // Linux-specific code by Phil Endecott // Different ARM processors have different atomic instructions. In particular, // architecture versions before v6 (which are still in widespread use, e.g. the // Intel/Marvell XScale chips like the one in the NSLU2) have only atomic swap. // On Linux the kernel provides some support that lets us abstract away from // these differences: it provides emulated CAS and barrier functions at special // addresses that are garaunteed not to be interrupted by the kernel. Using // this facility is slightly slower than inline assembler would be, but much // faster than a system call. // // While this emulated CAS is "strong" in the sense that it does not fail // "spuriously" (i.e.: it never fails to perform the exchange when the value // found equals the value expected), it does not return the found value on // failure. To satisfy the atomic API, compare_exchange_{weak|strong} must // return the found value on failure, and we have to manually load this value // after the emulated CAS reports failure. This in turn introduces a race // between the CAS failing (due to the "wrong" value being found) and subsequently // loading (which might turn up the "right" value). From an application's // point of view this looks like "spurious failure", and therefore the // emulated CAS is only good enough to provide compare_exchange_weak // semantics. #include namespace boost { namespace atomics { namespace detail { static inline void arm_barrier(void) { void (*kernel_dmb)(void) = (void (*)(void)) 0xffff0fa0; kernel_dmb(); } static inline void platform_fence_before(memory_order order) { switch(order) { case memory_order_release: case memory_order_acq_rel: case memory_order_seq_cst: arm_barrier(); case memory_order_consume: default:; } } static inline void platform_fence_after(memory_order order) { switch(order) { case memory_order_acquire: case memory_order_acq_rel: case memory_order_seq_cst: arm_barrier(); default:; } } static inline void platform_fence_before_store(memory_order order) { platform_fence_before(order); } static inline void platform_fence_after_store(memory_order order) { if (order == memory_order_seq_cst) arm_barrier(); } static inline void platform_fence_after_load(memory_order order) { platform_fence_after(order); } template bool platform_cmpxchg32(T & expected, T desired, volatile T * ptr) { typedef T (*kernel_cmpxchg32_t)(T oldval, T newval, volatile T * ptr); if (((kernel_cmpxchg32_t) 0xffff0fc0)(expected, desired, ptr) == 0) { return true; } else { expected = *ptr; return false; } } } } #define BOOST_ATOMIC_THREAD_FENCE 2 static inline void atomic_thread_fence(memory_order order) { switch(order) { case memory_order_acquire: case memory_order_release: case memory_order_acq_rel: case memory_order_seq_cst: atomics::detail::arm_barrier(); default:; } } #define BOOST_ATOMIC_SIGNAL_FENCE 2 static inline void atomic_signal_fence(memory_order) { __asm__ __volatile__ ("" ::: "memory"); } class atomic_flag { private: atomic_flag(const atomic_flag &) /* = delete */ ; atomic_flag & operator=(const atomic_flag &) /* = delete */ ; uint32_t v_; public: atomic_flag(void) : v_(false) {} void clear(memory_order order = memory_order_seq_cst) volatile { atomics::detail::platform_fence_before_store(order); const_cast(v_) = 0; atomics::detail::platform_fence_after_store(order); } bool test_and_set(memory_order order = memory_order_seq_cst) volatile { atomics::detail::platform_fence_before(order); uint32_t expected = v_; do { if (expected == 1) break; } while (!atomics::detail::platform_cmpxchg32(expected, (uint32_t)1, &v_)); atomics::detail::platform_fence_after(order); return expected; } }; #define BOOST_ATOMIC_FLAG_LOCK_FREE 2 } #include #if !defined(BOOST_ATOMIC_FORCE_FALLBACK) #define BOOST_ATOMIC_CHAR_LOCK_FREE 2 #define BOOST_ATOMIC_CHAR16_T_LOCK_FREE 2 #define BOOST_ATOMIC_CHAR32_T_LOCK_FREE 2 #define BOOST_ATOMIC_WCHAR_T_LOCK_FREE 2 #define BOOST_ATOMIC_SHORT_LOCK_FREE 2 #define BOOST_ATOMIC_INT_LOCK_FREE 2 #define BOOST_ATOMIC_LONG_LOCK_FREE 2 #define BOOST_ATOMIC_LLONG_LOCK_FREE 0 #define BOOST_ATOMIC_POINTER_LOCK_FREE 2 #define BOOST_ATOMIC_BOOL_LOCK_FREE 2 #include #endif /* !defined(BOOST_ATOMIC_FORCE_FALLBACK) */ #endif ././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/boost/atomic/detail/gcc-x86.hppSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/boost/atomic/detail/gcc-x80000664000175000017500000012300512110501517032014 0ustar dandan#ifndef BOOST_ATOMIC_DETAIL_GCC_X86_HPP #define BOOST_ATOMIC_DETAIL_GCC_X86_HPP // Copyright (c) 2009 Helge Bahmann // // Distributed under the Boost Software License, Version 1.0. // See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) namespace boost { namespace atomics { namespace detail { #if defined(__x86_64__) # define BOOST_ATOMIC_X86_FENCE_INSTR "mfence\n" #else # define BOOST_ATOMIC_X86_FENCE_INSTR "lock ; addl $0, (%%esp)\n" #endif static inline void platform_fence_before(memory_order order) { switch(order) { case memory_order_relaxed: case memory_order_acquire: case memory_order_consume: break; case memory_order_release: case memory_order_acq_rel: __asm__ __volatile__ ("" ::: "memory"); /* release */ break; case memory_order_seq_cst: __asm__ __volatile__ ("" ::: "memory"); /* seq */ break; } } static inline void platform_fence_after(memory_order order) { switch(order) { case memory_order_relaxed: case memory_order_release: break; case memory_order_acquire: case memory_order_acq_rel: __asm__ __volatile__ ("" ::: "memory"); /* acquire */ break; case memory_order_consume: /* consume */ break; case memory_order_seq_cst: __asm__ __volatile__ ("" ::: "memory"); /* seq */ break; default:; } } static inline void platform_fence_after_load(memory_order order) { switch(order) { case memory_order_relaxed: case memory_order_release: break; case memory_order_acquire: case memory_order_acq_rel: __asm__ __volatile__ ("" ::: "memory"); break; case memory_order_consume: break; case memory_order_seq_cst: __asm__ __volatile__ (BOOST_ATOMIC_X86_FENCE_INSTR ::: "memory"); break; default:; } } static inline void platform_fence_before_store(memory_order order) { switch(order) { case memory_order_relaxed: case memory_order_acquire: case memory_order_consume: break; case memory_order_release: case memory_order_acq_rel: __asm__ __volatile__ ("" ::: "memory"); /* release */ break; case memory_order_seq_cst: __asm__ __volatile__ ("" ::: "memory"); /* seq */ break; } } static inline void platform_fence_after_store(memory_order order) { switch(order) { case memory_order_relaxed: case memory_order_release: break; case memory_order_acquire: case memory_order_acq_rel: __asm__ __volatile__ ("" ::: "memory"); /* acquire */ break; case memory_order_consume: /* consume */ break; case memory_order_seq_cst: __asm__ __volatile__ ("" ::: "memory"); /* seq */ break; default:; } } } } class atomic_flag { private: atomic_flag(const atomic_flag &) /* = delete */ ; atomic_flag & operator=(const atomic_flag &) /* = delete */ ; uint32_t v_; public: atomic_flag(void) : v_(false) {} bool test_and_set(memory_order order = memory_order_seq_cst) volatile { uint32_t v = 1; atomics::detail::platform_fence_before(order); __asm__ __volatile__ ( "xchgl %0, %1" : "+r" (v), "+m" (v_) ); atomics::detail::platform_fence_after(order); return v; } void clear(memory_order order = memory_order_seq_cst) volatile { if (order == memory_order_seq_cst) { uint32_t v = 0; __asm__ __volatile__ ( "xchgl %0, %1" : "+r" (v), "+m" (v_) ); } else { atomics::detail::platform_fence_before(order); v_ = 0; } } }; } /* namespace boost */ #define BOOST_ATOMIC_FLAG_LOCK_FREE 2 #include #if !defined(BOOST_ATOMIC_FORCE_FALLBACK) #define BOOST_ATOMIC_CHAR_LOCK_FREE 2 #define BOOST_ATOMIC_CHAR16_T_LOCK_FREE 2 #define BOOST_ATOMIC_CHAR32_T_LOCK_FREE 2 #define BOOST_ATOMIC_WCHAR_T_LOCK_FREE 2 #define BOOST_ATOMIC_SHORT_LOCK_FREE 2 #define BOOST_ATOMIC_INT_LOCK_FREE 2 #define BOOST_ATOMIC_LONG_LOCK_FREE 2 #if defined(__x86_64__) #define BOOST_ATOMIC_LLONG_LOCK_FREE 2 #else #define BOOST_ATOMIC_LLONG_LOCK_FREE 1 #endif #define BOOST_ATOMIC_POINTER_LOCK_FREE 2 #define BOOST_ATOMIC_BOOL_LOCK_FREE 2 namespace boost { #define BOOST_ATOMIC_THREAD_FENCE 2 static inline void atomic_thread_fence(memory_order order) { switch(order) { case memory_order_relaxed: break; case memory_order_release: __asm__ __volatile__ ("" ::: "memory"); break; case memory_order_acquire: __asm__ __volatile__ ("" ::: "memory"); break; case memory_order_acq_rel: __asm__ __volatile__ ("" ::: "memory"); break; case memory_order_consume: break; case memory_order_seq_cst: __asm__ __volatile__ (BOOST_ATOMIC_X86_FENCE_INSTR ::: "memory"); break; default:; } } #define BOOST_ATOMIC_SIGNAL_FENCE 2 static inline void atomic_signal_fence(memory_order) { __asm__ __volatile__ ("" ::: "memory"); } namespace atomics { namespace detail { template class base_atomic { typedef base_atomic this_type; typedef T value_type; typedef T difference_type; public: explicit base_atomic(value_type v) : v_(v) {} base_atomic(void) {} void store(value_type v, memory_order order = memory_order_seq_cst) volatile { if (order != memory_order_seq_cst) { platform_fence_before(order); const_cast(v_) = v; } else { exchange(v, order); } } value_type load(memory_order order = memory_order_seq_cst) const volatile { value_type v = const_cast(v_); platform_fence_after_load(order); return v; } value_type fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile { platform_fence_before(order); __asm__ ( "lock ; xaddb %0, %1" : "+q" (v), "+m" (v_) ); platform_fence_after(order); return v; } value_type fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile { return fetch_add(-v, order); } value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile { platform_fence_before(order); __asm__ ( "xchgb %0, %1" : "+q" (v), "+m" (v_) ); platform_fence_after(order); return v; } bool compare_exchange_strong( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { value_type previous = expected; platform_fence_before(success_order); __asm__ ( "lock ; cmpxchgb %2, %1" : "+a" (previous), "+m" (v_) : "q" (desired) ); bool success = (previous == expected); if (success) platform_fence_after(success_order); else platform_fence_after(failure_order); expected = previous; return success; } bool compare_exchange_weak( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { return compare_exchange_strong(expected, desired, success_order, failure_order); } value_type fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type tmp = load(memory_order_relaxed); do {} while(!compare_exchange_weak(tmp, tmp & v, order, memory_order_relaxed)); return tmp; } value_type fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type tmp = load(memory_order_relaxed); do {} while(!compare_exchange_weak(tmp, tmp | v, order, memory_order_relaxed)); return tmp; } value_type fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type tmp = load(memory_order_relaxed); do {} while(!compare_exchange_weak(tmp, tmp ^ v, order, memory_order_relaxed)); return tmp; } bool is_lock_free(void) const volatile { return true; } BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS private: base_atomic(const base_atomic &) /* = delete */ ; void operator=(const base_atomic &) /* = delete */ ; value_type v_; }; template class base_atomic { typedef base_atomic this_type; typedef T value_type; typedef T difference_type; public: explicit base_atomic(value_type v) : v_(v) {} base_atomic(void) {} void store(value_type v, memory_order order = memory_order_seq_cst) volatile { if (order != memory_order_seq_cst) { platform_fence_before(order); const_cast(v_) = v; } else { exchange(v, order); } } value_type load(memory_order order = memory_order_seq_cst) const volatile { value_type v = const_cast(v_); platform_fence_after_load(order); return v; } value_type fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile { platform_fence_before(order); __asm__ ( "lock ; xaddw %0, %1" : "+q" (v), "+m" (v_) ); platform_fence_after(order); return v; } value_type fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile { return fetch_add(-v, order); } value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile { platform_fence_before(order); __asm__ ( "xchgw %0, %1" : "+q" (v), "+m" (v_) ); platform_fence_after(order); return v; } bool compare_exchange_strong( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { value_type previous = expected; platform_fence_before(success_order); __asm__ ( "lock ; cmpxchgw %2, %1" : "+a" (previous), "+m" (v_) : "q" (desired) ); bool success = (previous == expected); if (success) platform_fence_after(success_order); else platform_fence_after(failure_order); expected = previous; return success; } bool compare_exchange_weak( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { return compare_exchange_strong(expected, desired, success_order, failure_order); } value_type fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type tmp = load(memory_order_relaxed); do {} while(!compare_exchange_weak(tmp, tmp & v, order, memory_order_relaxed)); return tmp; } value_type fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type tmp = load(memory_order_relaxed); do {} while(!compare_exchange_weak(tmp, tmp | v, order, memory_order_relaxed)); return tmp; } value_type fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type tmp = load(memory_order_relaxed); do {} while(!compare_exchange_weak(tmp, tmp ^ v, order, memory_order_relaxed)); return tmp; } bool is_lock_free(void) const volatile { return true; } BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS private: base_atomic(const base_atomic &) /* = delete */ ; void operator=(const base_atomic &) /* = delete */ ; value_type v_; }; template class base_atomic { typedef base_atomic this_type; typedef T value_type; typedef T difference_type; public: explicit base_atomic(value_type v) : v_(v) {} base_atomic(void) {} void store(value_type v, memory_order order = memory_order_seq_cst) volatile { if (order != memory_order_seq_cst) { platform_fence_before(order); const_cast(v_) = v; } else { exchange(v, order); } } value_type load(memory_order order = memory_order_seq_cst) const volatile { value_type v = const_cast(v_); platform_fence_after_load(order); return v; } value_type fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile { platform_fence_before(order); __asm__ ( "lock ; xaddl %0, %1" : "+r" (v), "+m" (v_) ); platform_fence_after(order); return v; } value_type fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile { return fetch_add(-v, order); } value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile { platform_fence_before(order); __asm__ ( "xchgl %0, %1" : "+r" (v), "+m" (v_) ); platform_fence_after(order); return v; } bool compare_exchange_strong( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { value_type previous = expected; platform_fence_before(success_order); __asm__ ( "lock ; cmpxchgl %2, %1" : "+a" (previous), "+m" (v_) : "r" (desired) ); bool success = (previous == expected); if (success) platform_fence_after(success_order); else platform_fence_after(failure_order); expected = previous; return success; } bool compare_exchange_weak( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { return compare_exchange_strong(expected, desired, success_order, failure_order); } value_type fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type tmp = load(memory_order_relaxed); do {} while(!compare_exchange_weak(tmp, tmp & v, order, memory_order_relaxed)); return tmp; } value_type fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type tmp = load(memory_order_relaxed); do {} while(!compare_exchange_weak(tmp, tmp | v, order, memory_order_relaxed)); return tmp; } value_type fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type tmp = load(memory_order_relaxed); do {} while(!compare_exchange_weak(tmp, tmp ^ v, order, memory_order_relaxed)); return tmp; } bool is_lock_free(void) const volatile { return true; } BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS private: base_atomic(const base_atomic &) /* = delete */ ; void operator=(const base_atomic &) /* = delete */ ; value_type v_; }; #if defined(__x86_64__) template class base_atomic { typedef base_atomic this_type; typedef T value_type; typedef T difference_type; public: explicit base_atomic(value_type v) : v_(v) {} base_atomic(void) {} void store(value_type v, memory_order order = memory_order_seq_cst) volatile { if (order != memory_order_seq_cst) { platform_fence_before(order); const_cast(v_) = v; } else { exchange(v, order); } } value_type load(memory_order order = memory_order_seq_cst) const volatile { value_type v = const_cast(v_); platform_fence_after_load(order); return v; } value_type fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile { platform_fence_before(order); __asm__ ( "lock ; xaddq %0, %1" : "+r" (v), "+m" (v_) ); platform_fence_after(order); return v; } value_type fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile { return fetch_add(-v, order); } value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile { platform_fence_before(order); __asm__ ( "xchgq %0, %1" : "+r" (v), "+m" (v_) ); platform_fence_after(order); return v; } bool compare_exchange_strong( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { value_type previous = expected; platform_fence_before(success_order); __asm__ ( "lock ; cmpxchgq %2, %1" : "+a" (previous), "+m" (v_) : "r" (desired) ); bool success = (previous == expected); if (success) platform_fence_after(success_order); else platform_fence_after(failure_order); expected = previous; return success; } bool compare_exchange_weak( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { return compare_exchange_strong(expected, desired, success_order, failure_order); } value_type fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type tmp = load(memory_order_relaxed); do {} while(!compare_exchange_weak(tmp, tmp & v, order, memory_order_relaxed)); return tmp; } value_type fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type tmp = load(memory_order_relaxed); do {} while(!compare_exchange_weak(tmp, tmp | v, order, memory_order_relaxed)); return tmp; } value_type fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type tmp = load(memory_order_relaxed); do {} while(!compare_exchange_weak(tmp, tmp ^ v, order, memory_order_relaxed)); return tmp; } bool is_lock_free(void) const volatile { return true; } BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS private: base_atomic(const base_atomic &) /* = delete */ ; void operator=(const base_atomic &) /* = delete */ ; value_type v_; }; #endif /* pointers */ #if !defined(__x86_64__) template class base_atomic { typedef base_atomic this_type; typedef void * value_type; public: explicit base_atomic(value_type v) : v_(v) {} base_atomic(void) {} void store(value_type v, memory_order order = memory_order_seq_cst) volatile { if (order != memory_order_seq_cst) { platform_fence_before(order); const_cast(v_) = v; } else { exchange(v, order); } } value_type load(memory_order order = memory_order_seq_cst) const volatile { value_type v = const_cast(v_); platform_fence_after_load(order); return v; } value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile { platform_fence_before(order); __asm__ ( "xchgl %0, %1" : "+r" (v), "+m" (v_) ); platform_fence_after(order); return v; } bool compare_exchange_strong(value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { value_type previous = expected; platform_fence_before(success_order); __asm__ ( "lock ; cmpxchgl %2, %1" : "+a" (previous), "+m" (v_) : "r" (desired) ); bool success = (previous == expected); if (success) platform_fence_after(success_order); else platform_fence_after(failure_order); expected = previous; return success; } bool compare_exchange_weak(value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { return compare_exchange_strong(expected, desired, success_order, failure_order); } bool is_lock_free(void) const volatile { return true; } BOOST_ATOMIC_DECLARE_BASE_OPERATORS private: base_atomic(const base_atomic &) /* = delete */ ; void operator=(const base_atomic &) /* = delete */ ; value_type v_; }; template class base_atomic { typedef base_atomic this_type; typedef T * value_type; typedef ptrdiff_t difference_type; public: explicit base_atomic(value_type v) : v_(v) {} base_atomic(void) {} void store(value_type v, memory_order order = memory_order_seq_cst) volatile { if (order != memory_order_seq_cst) { platform_fence_before(order); const_cast(v_) = v; } else { exchange(v, order); } } value_type load(memory_order order = memory_order_seq_cst) const volatile { value_type v = const_cast(v_); platform_fence_after_load(order); return v; } value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile { platform_fence_before(order); __asm__ ( "xchgl %0, %1" : "+r" (v), "+m" (v_) ); platform_fence_after(order); return v; } bool compare_exchange_strong( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { value_type previous = expected; platform_fence_before(success_order); __asm__ ( "lock ; cmpxchgl %2, %1" : "+a" (previous), "+m" (v_) : "r" (desired) ); bool success = (previous == expected); if (success) platform_fence_after(success_order); else platform_fence_after(failure_order); expected = previous; return success; } bool compare_exchange_weak( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { return compare_exchange_strong(expected, desired, success_order, failure_order); } value_type fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile { v = v * sizeof(*v_); platform_fence_before(order); __asm__ ( "lock ; xaddl %0, %1" : "+r" (v), "+m" (v_) ); platform_fence_after(order); return reinterpret_cast(v); } value_type fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile { return fetch_add(-v, order); } bool is_lock_free(void) const volatile { return true; } BOOST_ATOMIC_DECLARE_POINTER_OPERATORS private: base_atomic(const base_atomic &) /* = delete */ ; void operator=(const base_atomic &) /* = delete */ ; value_type v_; }; #else template class base_atomic { typedef base_atomic this_type; typedef void * value_type; public: explicit base_atomic(value_type v) : v_(v) {} base_atomic(void) {} void store(value_type v, memory_order order = memory_order_seq_cst) volatile { if (order != memory_order_seq_cst) { platform_fence_before(order); const_cast(v_) = v; } else { exchange(v, order); } } value_type load(memory_order order = memory_order_seq_cst) const volatile { value_type v = const_cast(v_); platform_fence_after_load(order); return v; } value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile { platform_fence_before(order); __asm__ ( "xchgq %0, %1" : "+r" (v), "+m" (v_) ); platform_fence_after(order); return v; } bool compare_exchange_strong(value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { value_type previous = expected; platform_fence_before(success_order); __asm__ ( "lock ; cmpxchgq %2, %1" : "+a" (previous), "+m" (v_) : "r" (desired) ); bool success = (previous == expected); if (success) platform_fence_after(success_order); else platform_fence_after(failure_order); expected = previous; return success; } bool compare_exchange_weak(value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { return compare_exchange_strong(expected, desired, success_order, failure_order); } bool is_lock_free(void) const volatile { return true; } BOOST_ATOMIC_DECLARE_BASE_OPERATORS private: base_atomic(const base_atomic &) /* = delete */ ; void operator=(const base_atomic &) /* = delete */ ; value_type v_; }; template class base_atomic { typedef base_atomic this_type; typedef T * value_type; typedef ptrdiff_t difference_type; public: explicit base_atomic(value_type v) : v_(v) {} base_atomic(void) {} void store(value_type v, memory_order order = memory_order_seq_cst) volatile { if (order != memory_order_seq_cst) { platform_fence_before(order); const_cast(v_) = v; } else { exchange(v, order); } } value_type load(memory_order order = memory_order_seq_cst) const volatile { value_type v = const_cast(v_); platform_fence_after_load(order); return v; } value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile { platform_fence_before(order); __asm__ ( "xchgq %0, %1" : "+r" (v), "+m" (v_) ); platform_fence_after(order); return v; } bool compare_exchange_strong( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { value_type previous = expected; platform_fence_before(success_order); __asm__ ( "lock ; cmpxchgq %2, %1" : "+a" (previous), "+m" (v_) : "r" (desired) ); bool success = (previous == expected); if (success) platform_fence_after(success_order); else platform_fence_after(failure_order); expected = previous; return success; } bool compare_exchange_weak( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { return compare_exchange_strong(expected, desired, success_order, failure_order); } value_type fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile { v = v * sizeof(*v_); platform_fence_before(order); __asm__ ( "lock ; xaddq %0, %1" : "+r" (v), "+m" (v_) ); platform_fence_after(order); return reinterpret_cast(v); } value_type fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile { return fetch_add(-v, order); } bool is_lock_free(void) const volatile { return true; } BOOST_ATOMIC_DECLARE_POINTER_OPERATORS private: base_atomic(const base_atomic &) /* = delete */ ; void operator=(const base_atomic &) /* = delete */ ; value_type v_; }; #endif template class base_atomic { typedef base_atomic this_type; typedef T value_type; typedef uint8_t storage_type; public: explicit base_atomic(value_type v) { memcpy(&v_, &v, sizeof(value_type)); } base_atomic(void) {} void store(value_type v, memory_order order = memory_order_seq_cst) volatile { if (order != memory_order_seq_cst) { storage_type tmp; memcpy(&tmp, &v, sizeof(value_type)); platform_fence_before(order); const_cast(v_) = tmp; } else { exchange(v, order); } } value_type load(memory_order order = memory_order_seq_cst) const volatile { storage_type tmp = const_cast(v_); platform_fence_after_load(order); value_type v; memcpy(&v, &tmp, sizeof(value_type)); return v; } value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile { storage_type tmp; memcpy(&tmp, &v, sizeof(value_type)); platform_fence_before(order); __asm__ ( "xchgb %0, %1" : "+q" (tmp), "+m" (v_) ); platform_fence_after(order); memcpy(&v, &tmp, sizeof(value_type)); return v; } bool compare_exchange_strong( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { storage_type expected_s, desired_s; memcpy(&expected_s, &expected, sizeof(value_type)); memcpy(&desired_s, &desired, sizeof(value_type)); storage_type previous_s = expected_s; platform_fence_before(success_order); __asm__ ( "lock ; cmpxchgb %2, %1" : "+a" (previous_s), "+m" (v_) : "q" (desired_s) ); bool success = (previous_s == expected_s); if (success) platform_fence_after(success_order); else platform_fence_after(failure_order); memcpy(&expected, &previous_s, sizeof(value_type)); return success; } bool compare_exchange_weak( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { return compare_exchange_strong(expected, desired, success_order, failure_order); } bool is_lock_free(void) const volatile { return true; } BOOST_ATOMIC_DECLARE_BASE_OPERATORS private: base_atomic(const base_atomic &) /* = delete */ ; void operator=(const base_atomic &) /* = delete */ ; storage_type v_; }; template class base_atomic { typedef base_atomic this_type; typedef T value_type; typedef uint16_t storage_type; public: explicit base_atomic(value_type v) { memcpy(&v_, &v, sizeof(value_type)); } base_atomic(void) {} void store(value_type v, memory_order order = memory_order_seq_cst) volatile { if (order != memory_order_seq_cst) { storage_type tmp; memcpy(&tmp, &v, sizeof(value_type)); platform_fence_before(order); const_cast(v_) = tmp; } else { exchange(v, order); } } value_type load(memory_order order = memory_order_seq_cst) const volatile { storage_type tmp = const_cast(v_); platform_fence_after_load(order); value_type v; memcpy(&v, &tmp, sizeof(value_type)); return v; } value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile { storage_type tmp; memcpy(&tmp, &v, sizeof(value_type)); platform_fence_before(order); __asm__ ( "xchgw %0, %1" : "+q" (tmp), "+m" (v_) ); platform_fence_after(order); memcpy(&v, &tmp, sizeof(value_type)); return v; } bool compare_exchange_strong( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { storage_type expected_s, desired_s; memcpy(&expected_s, &expected, sizeof(value_type)); memcpy(&desired_s, &desired, sizeof(value_type)); storage_type previous_s = expected_s; platform_fence_before(success_order); __asm__ ( "lock ; cmpxchgw %2, %1" : "+a" (previous_s), "+m" (v_) : "q" (desired_s) ); bool success = (previous_s == expected_s); if (success) platform_fence_after(success_order); else platform_fence_after(failure_order); memcpy(&expected, &previous_s, sizeof(value_type)); return success; } bool compare_exchange_weak( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { return compare_exchange_strong(expected, desired, success_order, failure_order); } bool is_lock_free(void) const volatile { return true; } BOOST_ATOMIC_DECLARE_BASE_OPERATORS private: base_atomic(const base_atomic &) /* = delete */ ; void operator=(const base_atomic &) /* = delete */ ; storage_type v_; }; template class base_atomic { typedef base_atomic this_type; typedef T value_type; typedef uint32_t storage_type; public: explicit base_atomic(value_type v) { memcpy(&v_, &v, sizeof(value_type)); } base_atomic(void) {} void store(value_type v, memory_order order = memory_order_seq_cst) volatile { if (order != memory_order_seq_cst) { storage_type tmp; memcpy(&tmp, &v, sizeof(value_type)); platform_fence_before(order); const_cast(v_) = tmp; } else { exchange(v, order); } } value_type load(memory_order order = memory_order_seq_cst) const volatile { storage_type tmp = const_cast(v_); platform_fence_after_load(order); value_type v; memcpy(&v, &tmp, sizeof(value_type)); return v; } value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile { storage_type tmp; memcpy(&tmp, &v, sizeof(value_type)); platform_fence_before(order); __asm__ ( "xchgl %0, %1" : "+q" (tmp), "+m" (v_) ); platform_fence_after(order); memcpy(&v, &tmp, sizeof(value_type)); return v; } bool compare_exchange_strong( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { storage_type expected_s, desired_s; memcpy(&expected_s, &expected, sizeof(value_type)); memcpy(&desired_s, &desired, sizeof(value_type)); storage_type previous_s = expected_s; platform_fence_before(success_order); __asm__ ( "lock ; cmpxchgl %2, %1" : "+a" (previous_s), "+m" (v_) : "q" (desired_s) ); bool success = (previous_s == expected_s); if (success) platform_fence_after(success_order); else platform_fence_after(failure_order); memcpy(&expected, &previous_s, sizeof(value_type)); return success; } bool compare_exchange_weak( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { return compare_exchange_strong(expected, desired, success_order, failure_order); } bool is_lock_free(void) const volatile { return true; } BOOST_ATOMIC_DECLARE_BASE_OPERATORS private: base_atomic(const base_atomic &) /* = delete */ ; void operator=(const base_atomic &) /* = delete */ ; storage_type v_; }; #if defined(__x86_64__) template class base_atomic { typedef base_atomic this_type; typedef T value_type; typedef uint64_t storage_type; public: explicit base_atomic(value_type v) { memcpy(&v_, &v, sizeof(value_type)); } base_atomic(void) {} void store(value_type v, memory_order order = memory_order_seq_cst) volatile { if (order != memory_order_seq_cst) { storage_type tmp; memcpy(&tmp, &v, sizeof(value_type)); platform_fence_before(order); const_cast(v_) = tmp; } else { exchange(v, order); } } value_type load(memory_order order = memory_order_seq_cst) const volatile { storage_type tmp = const_cast(v_); platform_fence_after_load(order); value_type v; memcpy(&v, &tmp, sizeof(value_type)); return v; } value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile { storage_type tmp; memcpy(&tmp, &v, sizeof(value_type)); platform_fence_before(order); __asm__ ( "xchgq %0, %1" : "+q" (tmp), "+m" (v_) ); platform_fence_after(order); memcpy(&v, &tmp, sizeof(value_type)); return v; } bool compare_exchange_strong( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { storage_type expected_s, desired_s; memcpy(&expected_s, &expected, sizeof(value_type)); memcpy(&desired_s, &desired, sizeof(value_type)); storage_type previous_s = expected_s; platform_fence_before(success_order); __asm__ ( "lock ; cmpxchgq %2, %1" : "+a" (previous_s), "+m" (v_) : "q" (desired_s) ); bool success = (previous_s == expected_s); if (success) platform_fence_after(success_order); else platform_fence_after(failure_order); memcpy(&expected, &previous_s, sizeof(value_type)); return success; } bool compare_exchange_weak( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { return compare_exchange_strong(expected, desired, success_order, failure_order); } bool is_lock_free(void) const volatile { return true; } BOOST_ATOMIC_DECLARE_BASE_OPERATORS private: base_atomic(const base_atomic &) /* = delete */ ; void operator=(const base_atomic &) /* = delete */ ; storage_type v_; }; #endif #if defined(__i686__) template bool platform_cmpxchg64_strong(T & expected, T desired, const volatile T * ptr) { int scratch; T prev = expected; /* Make sure ebx is saved and restored properly in case this object is compiled as "position independent". Since programmers on x86 tend to forget specifying -DPIC or similar, always assume PIC. To make this work uniformly even in the non-PIC case, setup register constraints such that ebx can not be used by accident e.g. as base address for the variable to be modified. Accessing "scratch" should always be okay, as it can only be placed on the stack (and therefore accessed through ebp or esp only). In theory, could push/pop ebx onto/off the stack, but movs to a prepared stack slot turn out to be faster. */ __asm__ __volatile__ ( "movl %%ebx, %1\n" "movl %2, %%ebx\n" "lock; cmpxchg8b 0(%4)\n" "movl %1, %%ebx\n" : "=A" (prev), "=m" (scratch) : "D" ((int)desired), "c" ((int)(desired >> 32)), "S" (ptr), "0" (prev) : "memory"); bool success = (prev == expected); expected = prev; return success; } template void platform_store64(T value, volatile T * ptr) { T expected = *ptr; do { } while (!platform_cmpxchg64_strong(expected, value, ptr)); } template T platform_load64(const volatile T * ptr) { T expected = *ptr; do { } while (!platform_cmpxchg64_strong(expected, expected, ptr)); return expected; } #endif } } } /* pull in 64-bit atomic type using cmpxchg8b above */ #if defined(__i686__) #include #endif #endif /* !defined(BOOST_ATOMIC_FORCE_FALLBACK) */ #endif././@LongLink0000000000000000000000000000016200000000000011564 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/boost/atomic/detail/type-classifier.hppSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/boost/atomic/detail/type-c0000664000175000017500000000414712110501517032131 0ustar dandan#ifndef BOOST_ATOMIC_DETAIL_TYPE_CLASSIFIER_HPP #define BOOST_ATOMIC_DETAIL_TYPE_CLASSIFIER_HPP // Copyright (c) 2011 Helge Bahmann // // Distributed under the Boost Software License, Version 1.0. // See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) namespace boost { namespace atomics { namespace detail { template struct type_classifier { typedef void test; }; template<> struct type_classifier {typedef int test;}; template<> struct type_classifier {typedef int test;}; template<> struct type_classifier {typedef int test;}; template<> struct type_classifier {typedef int test;}; template<> struct type_classifier {typedef int test;}; template<> struct type_classifier {typedef int test;}; template<> struct type_classifier {typedef int test;}; template<> struct type_classifier {typedef int test;}; template<> struct type_classifier {typedef int test;}; #ifdef BOOST_HAS_LONG_LONG template<> struct type_classifier {typedef int test;}; template<> struct type_classifier {typedef int test;}; #endif template struct type_classifier {typedef void * test;}; template struct sign_trait { typedef void test; }; template<> struct sign_trait {typedef int test;}; template<> struct sign_trait {typedef unsigned int test;}; template<> struct sign_trait {typedef int test;}; template<> struct sign_trait {typedef unsigned int test;}; template<> struct sign_trait {typedef int test;}; template<> struct sign_trait {typedef unsigned int test;}; template<> struct sign_trait {typedef int test;}; template<> struct sign_trait {typedef unsigned int test;}; template<> struct sign_trait {typedef int test;}; #ifdef BOOST_HAS_LONG_LONG template<> struct sign_trait {typedef unsigned int test;}; template<> struct sign_trait {typedef int test;}; #endif }}} #endif ././@LongLink0000000000000000000000000000015400000000000011565 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/boost/atomic/detail/gcc-alpha.hppSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/boost/atomic/detail/gcc-al0000664000175000017500000002223712110501517032056 0ustar dandan#ifndef BOOST_ATOMIC_DETAIL_GCC_ALPHA_HPP #define BOOST_ATOMIC_DETAIL_GCC_ALPHA_HPP // Copyright (c) 2009 Helge Bahmann // // Distributed under the Boost Software License, Version 1.0. // See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #include #include /* Refer to http://h71000.www7.hp.com/doc/82final/5601/5601pro_004.html (HP OpenVMS systems documentation) and the alpha reference manual. */ /* NB: The most natural thing would be to write the increment/decrement operators along the following lines: __asm__ __volatile__( "1: ldl_l %0,%1 \n" "addl %0,1,%0 \n" "stl_c %0,%1 \n" "beq %0,1b\n" : "=&b" (tmp) : "m" (value) : "cc" ); However according to the comments on the HP website and matching comments in the Linux kernel sources this defies branch prediction, as the cpu assumes that backward branches are always taken; so instead copy the trick from the Linux kernel, introduce a forward branch and back again. I have, however, had a hard time measuring the difference between the two versions in microbenchmarks -- I am leaving it in nevertheless as it apparently does not hurt either. */ namespace boost { namespace atomics { namespace detail { static inline void fence_before(memory_order order) { switch(order) { case memory_order_consume: case memory_order_release: case memory_order_acq_rel: case memory_order_seq_cst: __asm__ __volatile__ ("mb" ::: "memory"); default:; } } static inline void fence_after(memory_order order) { switch(order) { case memory_order_acquire: case memory_order_acq_rel: case memory_order_seq_cst: __asm__ __volatile__ ("mb" ::: "memory"); default:; } } template<> inline void platform_atomic_thread_fence(memory_order order) { switch(order) { case memory_order_acquire: case memory_order_consume: case memory_order_release: case memory_order_acq_rel: case memory_order_seq_cst: __asm__ __volatile__ ("mb" ::: "memory"); default:; } } template class atomic_alpha_32 { public: typedef T integral_type; explicit atomic_alpha_32(T v) : i(v) {} atomic_alpha_32() {} T load(memory_order order=memory_order_seq_cst) const volatile { T v=*reinterpret_cast(&i); fence_after(order); return v; } void store(T v, memory_order order=memory_order_seq_cst) volatile { fence_before(order); *reinterpret_cast(&i)=(int)v; } bool compare_exchange_weak( T &expected, T desired, memory_order success_order, memory_order failure_order) volatile { fence_before(success_order); int current, success; __asm__ __volatile__( "1: ldl_l %2, %4\n" "cmpeq %2, %0, %3\n" "mov %2, %0\n" "beq %3, 3f\n" "stl_c %1, %4\n" "2:\n" ".subsection 2\n" "3: mov %3, %1\n" "br 2b\n" ".previous\n" : "+&r" (expected), "+&r" (desired), "=&r"(current), "=&r"(success) : "m" (i) : ); if (desired) fence_after(success_order); else fence_after(failure_order); return desired; } bool is_lock_free(void) const volatile {return true;} protected: inline T fetch_add_var(T c, memory_order order) volatile { fence_before(order); T original, modified; __asm__ __volatile__( "1: ldl_l %0, %2\n" "addl %0, %3, %1\n" "stl_c %1, %2\n" "beq %1, 2f\n" ".subsection 2\n" "2: br 1b\n" ".previous\n" : "=&r" (original), "=&r" (modified) : "m" (i), "r" (c) : ); fence_after(order); return original; } inline T fetch_inc(memory_order order) volatile { fence_before(order); int original, modified; __asm__ __volatile__( "1: ldl_l %0, %2\n" "addl %0, 1, %1\n" "stl_c %1, %2\n" "beq %1, 2f\n" ".subsection 2\n" "2: br 1b\n" ".previous\n" : "=&r" (original), "=&r" (modified) : "m" (i) : ); fence_after(order); return original; } inline T fetch_dec(memory_order order) volatile { fence_before(order); int original, modified; __asm__ __volatile__( "1: ldl_l %0, %2\n" "subl %0, 1, %1\n" "stl_c %1, %2\n" "beq %1, 2f\n" ".subsection 2\n" "2: br 1b\n" ".previous\n" : "=&r" (original), "=&r" (modified) : "m" (i) : ); fence_after(order); return original; } private: T i; }; template class atomic_alpha_64 { public: typedef T integral_type; explicit atomic_alpha_64(T v) : i(v) {} atomic_alpha_64() {} T load(memory_order order=memory_order_seq_cst) const volatile { T v=*reinterpret_cast(&i); fence_after(order); return v; } void store(T v, memory_order order=memory_order_seq_cst) volatile { fence_before(order); *reinterpret_cast(&i)=v; } bool compare_exchange_weak( T &expected, T desired, memory_order success_order, memory_order failure_order) volatile { fence_before(success_order); int current, success; __asm__ __volatile__( "1: ldq_l %2, %4\n" "cmpeq %2, %0, %3\n" "mov %2, %0\n" "beq %3, 3f\n" "stq_c %1, %4\n" "2:\n" ".subsection 2\n" "3: mov %3, %1\n" "br 2b\n" ".previous\n" : "+&r" (expected), "+&r" (desired), "=&r"(current), "=&r"(success) : "m" (i) : ); if (desired) fence_after(success_order); else fence_after(failure_order); return desired; } bool is_lock_free(void) const volatile {return true;} protected: inline T fetch_add_var(T c, memory_order order) volatile { fence_before(order); T original, modified; __asm__ __volatile__( "1: ldq_l %0, %2\n" "addq %0, %3, %1\n" "stq_c %1, %2\n" "beq %1, 2f\n" ".subsection 2\n" "2: br 1b\n" ".previous\n" : "=&r" (original), "=&r" (modified) : "m" (i), "r" (c) : ); fence_after(order); return original; } inline T fetch_inc(memory_order order) volatile { fence_before(order); T original, modified; __asm__ __volatile__( "1: ldq_l %0, %2\n" "addq %0, 1, %1\n" "stq_c %1, %2\n" "beq %1, 2f\n" ".subsection 2\n" "2: br 1b\n" ".previous\n" : "=&r" (original), "=&r" (modified) : "m" (i) : ); fence_after(order); return original; } inline T fetch_dec(memory_order order) volatile { fence_before(order); T original, modified; __asm__ __volatile__( "1: ldq_l %0, %2\n" "subq %0, 1, %1\n" "stq_c %1, %2\n" "beq %1, 2f\n" ".subsection 2\n" "2: br 1b\n" ".previous\n" : "=&r" (original), "=&r" (modified) : "m" (i) : ); fence_after(order); return original; } private: T i; }; template class platform_atomic_integral : public build_atomic_from_typical > > { public: typedef build_atomic_from_typical > > super; explicit platform_atomic_integral(T v) : super(v) {} platform_atomic_integral(void) {} }; template class platform_atomic_integral : public build_atomic_from_typical > > { public: typedef build_atomic_from_typical > > super; explicit platform_atomic_integral(T v) : super(v) {} platform_atomic_integral(void) {} }; template class platform_atomic_integral: public build_atomic_from_larger_type, T> { public: typedef build_atomic_from_larger_type, T> super; explicit platform_atomic_integral(T v) : super(v) {} platform_atomic_integral(void) {} }; template class platform_atomic_integral: public build_atomic_from_larger_type, T> { public: typedef build_atomic_from_larger_type, T> super; explicit platform_atomic_integral(T v) : super(v) {} platform_atomic_integral(void) {} }; } } } #endif ././@LongLink0000000000000000000000000000015400000000000011565 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/boost/atomic/detail/cas32weak.hppSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/boost/atomic/detail/cas32w0000664000175000017500000006222112110501517032027 0ustar dandan#ifndef BOOST_ATOMIC_DETAIL_CAS32WEAK_HPP #define BOOST_ATOMIC_DETAIL_CAS32WEAK_HPP // Distributed under the Boost Software License, Version 1.0. // See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // // Copyright (c) 2011 Helge Bahmann #include #include namespace boost { namespace atomics { namespace detail { /* integral types */ template class base_atomic { typedef base_atomic this_type; typedef T value_type; typedef T difference_type; typedef uint32_t storage_type; public: explicit base_atomic(value_type v) : v_(v) {} base_atomic(void) {} void store(value_type v, memory_order order = memory_order_seq_cst) volatile { platform_fence_before_store(order); const_cast(v_) = v; platform_fence_after_store(order); } value_type load(memory_order order = memory_order_seq_cst) const volatile { value_type v = const_cast(v_); platform_fence_after_load(order); return v; } value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, v, order, memory_order_relaxed)); return original; } bool compare_exchange_weak( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { platform_fence_before(success_order); storage_type expected_s = (storage_type) expected; storage_type desired_s = (storage_type) desired; bool success = platform_cmpxchg32(expected_s, desired_s, &v_); if (success) { platform_fence_after(success_order); } else { platform_fence_after(failure_order); expected = (value_type) expected_s; } return success; } bool compare_exchange_strong( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { for(;;) { value_type tmp = expected; if (compare_exchange_weak(tmp, desired, success_order, failure_order)) return true; if (tmp != expected) { expected = tmp; return false; } } } value_type fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, original + v, order, memory_order_relaxed)); return original; } value_type fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, original - v, order, memory_order_relaxed)); return original; } value_type fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, original & v, order, memory_order_relaxed)); return original; } value_type fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, original | v, order, memory_order_relaxed)); return original; } value_type fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, original ^ v, order, memory_order_relaxed)); return original; } bool is_lock_free(void) const volatile { return true; } BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS private: base_atomic(const base_atomic &) /* = delete */ ; void operator=(const base_atomic &) /* = delete */ ; storage_type v_; }; template class base_atomic { typedef base_atomic this_type; typedef T value_type; typedef T difference_type; typedef uint32_t storage_type; public: explicit base_atomic(value_type v) : v_(v) {} base_atomic(void) {} void store(value_type v, memory_order order = memory_order_seq_cst) volatile { platform_fence_before_store(order); const_cast(v_) = v; platform_fence_after_store(order); } value_type load(memory_order order = memory_order_seq_cst) const volatile { value_type v = const_cast(v_); platform_fence_after_load(order); return v; } value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, v, order, memory_order_relaxed)); return original; } bool compare_exchange_weak( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { platform_fence_before(success_order); storage_type expected_s = (storage_type) expected; storage_type desired_s = (storage_type) desired; bool success = platform_cmpxchg32(expected_s, desired_s, &v_); if (success) { platform_fence_after(success_order); } else { platform_fence_after(failure_order); expected = (value_type) expected_s; } return success; } bool compare_exchange_strong( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { for(;;) { value_type tmp = expected; if (compare_exchange_weak(tmp, desired, success_order, failure_order)) return true; if (tmp != expected) { expected = tmp; return false; } } } value_type fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, original + v, order, memory_order_relaxed)); return original; } value_type fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, original - v, order, memory_order_relaxed)); return original; } value_type fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, original & v, order, memory_order_relaxed)); return original; } value_type fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, original | v, order, memory_order_relaxed)); return original; } value_type fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, original ^ v, order, memory_order_relaxed)); return original; } bool is_lock_free(void) const volatile { return true; } BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS private: base_atomic(const base_atomic &) /* = delete */ ; void operator=(const base_atomic &) /* = delete */ ; storage_type v_; }; template class base_atomic { typedef base_atomic this_type; typedef T value_type; typedef T difference_type; public: explicit base_atomic(value_type v) : v_(v) {} base_atomic(void) {} void store(value_type v, memory_order order = memory_order_seq_cst) volatile { platform_fence_before_store(order); const_cast(v_) = v; platform_fence_after_store(order); } value_type load(memory_order order = memory_order_seq_cst) const volatile { value_type v = const_cast(v_); platform_fence_after_load(order); return v; } value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, v, order, memory_order_relaxed)); return original; } bool compare_exchange_weak( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { platform_fence_before(success_order); bool success = platform_cmpxchg32(expected, desired, &v_); if (success) { platform_fence_after(success_order); } else { platform_fence_after(failure_order); } return success; } bool compare_exchange_strong( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { for(;;) { value_type tmp = expected; if (compare_exchange_weak(tmp, desired, success_order, failure_order)) return true; if (tmp != expected) { expected = tmp; return false; } } } value_type fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, original + v, order, memory_order_relaxed)); return original; } value_type fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, original - v, order, memory_order_relaxed)); return original; } value_type fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, original & v, order, memory_order_relaxed)); return original; } value_type fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, original | v, order, memory_order_relaxed)); return original; } value_type fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, original ^ v, order, memory_order_relaxed)); return original; } bool is_lock_free(void) const volatile { return true; } BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS private: base_atomic(const base_atomic &) /* = delete */ ; void operator=(const base_atomic &) /* = delete */ ; value_type v_; }; /* pointer types */ template class base_atomic { typedef base_atomic this_type; typedef void * value_type; typedef ptrdiff_t difference_type; public: explicit base_atomic(value_type v) : v_(v) {} base_atomic(void) {} void store(value_type v, memory_order order = memory_order_seq_cst) volatile { platform_fence_before_store(order); const_cast(v_) = v; platform_fence_after_store(order); } value_type load(memory_order order = memory_order_seq_cst) const volatile { value_type v = const_cast(v_); platform_fence_after_load(order); return v; } value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, v, order, memory_order_relaxed)); return original; } bool compare_exchange_weak( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { platform_fence_before(success_order); bool success = platform_cmpxchg32(expected, desired, &v_); if (success) { platform_fence_after(success_order); } else { platform_fence_after(failure_order); } return success; } bool compare_exchange_strong( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { for(;;) { value_type tmp = expected; if (compare_exchange_weak(tmp, desired, success_order, failure_order)) return true; if (tmp != expected) { expected = tmp; return false; } } } value_type fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, original + v, order, memory_order_relaxed)); return original; } value_type fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, original - v, order, memory_order_relaxed)); return original; } bool is_lock_free(void) const volatile { return true; } BOOST_ATOMIC_DECLARE_BASE_OPERATORS private: base_atomic(const base_atomic &) /* = delete */ ; void operator=(const base_atomic &) /* = delete */ ; value_type v_; }; template class base_atomic { typedef base_atomic this_type; typedef T * value_type; typedef ptrdiff_t difference_type; public: explicit base_atomic(value_type v) : v_(v) {} base_atomic(void) {} void store(value_type v, memory_order order = memory_order_seq_cst) volatile { platform_fence_before_store(order); const_cast(v_) = v; platform_fence_after_store(order); } value_type load(memory_order order = memory_order_seq_cst) const volatile { value_type v = const_cast(v_); platform_fence_after_load(order); return v; } value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, v, order, memory_order_relaxed)); return original; } bool compare_exchange_weak( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { platform_fence_before(success_order); bool success = platform_cmpxchg32(expected, desired, &v_); if (success) { platform_fence_after(success_order); } else { platform_fence_after(failure_order); } return success; } bool compare_exchange_strong( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { for(;;) { value_type tmp = expected; if (compare_exchange_weak(tmp, desired, success_order, failure_order)) return true; if (tmp != expected) { expected = tmp; return false; } } } value_type fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, original + v, order, memory_order_relaxed)); return original; } value_type fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, original - v, order, memory_order_relaxed)); return original; } bool is_lock_free(void) const volatile { return true; } BOOST_ATOMIC_DECLARE_POINTER_OPERATORS private: base_atomic(const base_atomic &) /* = delete */ ; void operator=(const base_atomic &) /* = delete */ ; value_type v_; }; /* generic types */ template class base_atomic { typedef base_atomic this_type; typedef T value_type; typedef uint32_t storage_type; public: explicit base_atomic(value_type v) : v_(0) { memcpy(&v_, &v, sizeof(value_type)); } base_atomic(void) : v_(0) {} void store(value_type v, memory_order order = memory_order_seq_cst) volatile { storage_type tmp = 0; memcpy(&tmp, &v, sizeof(value_type)); platform_fence_before_store(order); const_cast(v_) = tmp; platform_fence_after_store(order); } value_type load(memory_order order = memory_order_seq_cst) const volatile { storage_type tmp = const_cast(v_); platform_fence_after_load(order); value_type v; memcpy(&v, &tmp, sizeof(value_type)); return v; } value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, v, order, memory_order_relaxed)); return original; } bool compare_exchange_weak( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { storage_type expected_s = 0, desired_s = 0; memcpy(&expected_s, &expected, sizeof(value_type)); memcpy(&desired_s, &desired, sizeof(value_type)); platform_fence_before(success_order); bool success = platform_cmpxchg32(expected_s, desired_s, &v_); if (success) { platform_fence_after(success_order); } else { platform_fence_after(failure_order); memcpy(&expected, &expected_s, sizeof(value_type)); } return success; } bool compare_exchange_strong( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { for(;;) { value_type tmp = expected; if (compare_exchange_weak(tmp, desired, success_order, failure_order)) return true; if (tmp != expected) { expected = tmp; return false; } } } bool is_lock_free(void) const volatile { return true; } BOOST_ATOMIC_DECLARE_BASE_OPERATORS private: base_atomic(const base_atomic &) /* = delete */ ; void operator=(const base_atomic &) /* = delete */ ; storage_type v_; }; template class base_atomic { typedef base_atomic this_type; typedef T value_type; typedef uint32_t storage_type; public: explicit base_atomic(value_type v) : v_(0) { memcpy(&v_, &v, sizeof(value_type)); } base_atomic(void) : v_(0) {} void store(value_type v, memory_order order = memory_order_seq_cst) volatile { storage_type tmp = 0; memcpy(&tmp, &v, sizeof(value_type)); platform_fence_before_store(order); const_cast(v_) = tmp; platform_fence_after_store(order); } value_type load(memory_order order = memory_order_seq_cst) const volatile { storage_type tmp = const_cast(v_); platform_fence_after_load(order); value_type v; memcpy(&v, &tmp, sizeof(value_type)); return v; } value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, v, order, memory_order_relaxed)); return original; } bool compare_exchange_weak( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { storage_type expected_s = 0, desired_s = 0; memcpy(&expected_s, &expected, sizeof(value_type)); memcpy(&desired_s, &desired, sizeof(value_type)); platform_fence_before(success_order); bool success = platform_cmpxchg32(expected_s, desired_s, &v_); if (success) { platform_fence_after(success_order); } else { platform_fence_after(failure_order); memcpy(&expected, &expected_s, sizeof(value_type)); } return success; } bool compare_exchange_strong( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { for(;;) { value_type tmp = expected; if (compare_exchange_weak(tmp, desired, success_order, failure_order)) return true; if (tmp != expected) { expected = tmp; return false; } } } bool is_lock_free(void) const volatile { return true; } BOOST_ATOMIC_DECLARE_BASE_OPERATORS private: base_atomic(const base_atomic &) /* = delete */ ; void operator=(const base_atomic &) /* = delete */ ; storage_type v_; }; template class base_atomic { typedef base_atomic this_type; typedef T value_type; typedef uint32_t storage_type; public: explicit base_atomic(value_type v) : v_(0) { memcpy(&v_, &v, sizeof(value_type)); } base_atomic(void) : v_(0) {} void store(value_type v, memory_order order = memory_order_seq_cst) volatile { storage_type tmp = 0; memcpy(&tmp, &v, sizeof(value_type)); platform_fence_before_store(order); const_cast(v_) = tmp; platform_fence_after_store(order); } value_type load(memory_order order = memory_order_seq_cst) const volatile { storage_type tmp = const_cast(v_); platform_fence_after_load(order); value_type v; memcpy(&v, &tmp, sizeof(value_type)); return v; } value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original = load(memory_order_relaxed); do { } while (!compare_exchange_weak(original, v, order, memory_order_relaxed)); return original; } bool compare_exchange_weak( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { storage_type expected_s = 0, desired_s = 0; memcpy(&expected_s, &expected, sizeof(value_type)); memcpy(&desired_s, &desired, sizeof(value_type)); platform_fence_before(success_order); bool success = platform_cmpxchg32(expected_s, desired_s, &v_); if (success) { platform_fence_after(success_order); } else { platform_fence_after(failure_order); memcpy(&expected, &expected_s, sizeof(value_type)); } return success; } bool compare_exchange_strong( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { for(;;) { value_type tmp = expected; if (compare_exchange_weak(tmp, desired, success_order, failure_order)) return true; if (tmp != expected) { expected = tmp; return false; } } } bool is_lock_free(void) const volatile { return true; } BOOST_ATOMIC_DECLARE_BASE_OPERATORS private: base_atomic(const base_atomic &) /* = delete */ ; void operator=(const base_atomic &) /* = delete */ ; storage_type v_; }; } } } #endif ././@LongLink0000000000000000000000000000015500000000000011566 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/boost/atomic/detail/gcc-armv6+.hppSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/boost/atomic/detail/gcc-ar0000664000175000017500000001676112110501517032071 0ustar dandan#ifndef BOOST_ATOMIC_DETAIL_GCC_ARMV6P_HPP #define BOOST_ATOMIC_DETAIL_GCC_ARMV6P_HPP // Distributed under the Boost Software License, Version 1.0. // See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // // Copyright (c) 2009 Helge Bahmann // Copyright (c) 2009 Phil Endecott // ARM Code by Phil Endecott, based on other architectures. // From the ARM Architecture Reference Manual for architecture v6: // // LDREX{} , [] // Specifies the destination register for the memory word addressed by // Specifies the register containing the address. // // STREX{} , , [] // Specifies the destination register for the returned status value. // 0 if the operation updates memory // 1 if the operation fails to update memory // Specifies the register containing the word to be stored to memory. // Specifies the register containing the address. // Rd must not be the same register as Rm or Rn. // // ARM v7 is like ARM v6 plus: // There are half-word and byte versions of the LDREX and STREX instructions, // LDREXH, LDREXB, STREXH and STREXB. // There are also double-word versions, LDREXD and STREXD. // (Actually it looks like these are available from version 6k onwards.) // FIXME these are not yet used; should be mostly a matter of copy-and-paste. // I think you can supply an immediate offset to the address. // // A memory barrier is effected using a "co-processor 15" instruction, // though a separate assembler mnemonic is available for it in v7. namespace boost { namespace atomics { namespace detail { // "Thumb 1" is a subset of the ARM instruction set that uses a 16-bit encoding. It // doesn't include all instructions and in particular it doesn't include the co-processor // instruction used for the memory barrier or the load-locked/store-conditional // instructions. So, if we're compiling in "Thumb 1" mode, we need to wrap all of our // asm blocks with code to temporarily change to ARM mode. // // You can only change between ARM and Thumb modes when branching using the bx instruction. // bx takes an address specified in a register. The least significant bit of the address // indicates the mode, so 1 is added to indicate that the destination code is Thumb. // A temporary register is needed for the address and is passed as an argument to these // macros. It must be one of the "low" registers accessible to Thumb code, specified // usng the "l" attribute in the asm statement. // // Architecture v7 introduces "Thumb 2", which does include (almost?) all of the ARM // instruction set. So in v7 we don't need to change to ARM mode; we can write "universal // assembler" which will assemble to Thumb 2 or ARM code as appropriate. The only thing // we need to do to make this "universal" assembler mode work is to insert "IT" instructions // to annotate the conditional instructions. These are ignored in other modes (e.g. v6), // so they can always be present. #if defined(__thumb__) && !defined(__ARM_ARCH_7A__) // FIXME also other v7 variants. #define BOOST_ATOMIC_ARM_ASM_START(TMPREG) "adr " #TMPREG ", 1f\n" "bx " #TMPREG "\n" ".arm\n" ".align 4\n" "1: " #define BOOST_ATOMIC_ARM_ASM_END(TMPREG) "adr " #TMPREG ", 1f + 1\n" "bx " #TMPREG "\n" ".thumb\n" ".align 2\n" "1: " #else // The tmpreg is wasted in this case, which is non-optimal. #define BOOST_ATOMIC_ARM_ASM_START(TMPREG) #define BOOST_ATOMIC_ARM_ASM_END(TMPREG) #endif #if defined(__ARM_ARCH_7A__) // FIXME ditto. #define BOOST_ATOMIC_ARM_DMB "dmb\n" #else #define BOOST_ATOMIC_ARM_DMB "mcr\tp15, 0, r0, c7, c10, 5\n" #endif static inline void arm_barrier(void) { int brtmp; __asm__ __volatile__ ( BOOST_ATOMIC_ARM_ASM_START(%0) BOOST_ATOMIC_ARM_DMB BOOST_ATOMIC_ARM_ASM_END(%0) : "=&l" (brtmp) :: "memory" ); } static inline void platform_fence_before(memory_order order) { switch(order) { case memory_order_release: case memory_order_acq_rel: case memory_order_seq_cst: arm_barrier(); case memory_order_consume: default:; } } static inline void platform_fence_after(memory_order order) { switch(order) { case memory_order_acquire: case memory_order_acq_rel: case memory_order_seq_cst: arm_barrier(); default:; } } static inline void platform_fence_before_store(memory_order order) { platform_fence_before(order); } static inline void platform_fence_after_store(memory_order order) { if (order == memory_order_seq_cst) arm_barrier(); } static inline void platform_fence_after_load(memory_order order) { platform_fence_after(order); } template bool platform_cmpxchg32(T & expected, T desired, volatile T * ptr) { int success; int tmp; __asm__ ( BOOST_ATOMIC_ARM_ASM_START(%2) "mov %1, #0\n" // success = 0 "ldrex %0, %3\n" // expected' = *(&i) "teq %0, %4\n" // flags = expected'==expected "ittt eq\n" "strexeq %2, %5, %3\n" // if (flags.equal) *(&i) = desired, tmp = !OK "teqeq %2, #0\n" // if (flags.equal) flags = tmp==0 "moveq %1, #1\n" // if (flags.equal) success = 1 BOOST_ATOMIC_ARM_ASM_END(%2) : "=&r" (expected), // %0 "=&r" (success), // %1 "=&l" (tmp), // %2 "+Q" (*ptr) // %3 : "r" (expected), // %4 "r" (desired) // %5 : "cc" ); return success; } } } #define BOOST_ATOMIC_THREAD_FENCE 2 static inline void atomic_thread_fence(memory_order order) { switch(order) { case memory_order_acquire: case memory_order_release: case memory_order_acq_rel: case memory_order_seq_cst: atomics::detail::arm_barrier(); default:; } } #define BOOST_ATOMIC_SIGNAL_FENCE 2 static inline void atomic_signal_fence(memory_order) { __asm__ __volatile__ ("" ::: "memory"); } class atomic_flag { private: atomic_flag(const atomic_flag &) /* = delete */ ; atomic_flag & operator=(const atomic_flag &) /* = delete */ ; uint32_t v_; public: atomic_flag(void) : v_(false) {} void clear(memory_order order = memory_order_seq_cst) volatile { atomics::detail::platform_fence_before_store(order); const_cast(v_) = 0; atomics::detail::platform_fence_after_store(order); } bool test_and_set(memory_order order = memory_order_seq_cst) volatile { atomics::detail::platform_fence_before(order); uint32_t expected = v_; do { if (expected == 1) break; } while (!atomics::detail::platform_cmpxchg32(expected, (uint32_t)1, &v_)); atomics::detail::platform_fence_after(order); return expected; } }; #define BOOST_ATOMIC_FLAG_LOCK_FREE 2 } #undef BOOST_ATOMIC_ARM_ASM_START #undef BOOST_ATOMIC_ARM_ASM_END #include #if !defined(BOOST_ATOMIC_FORCE_FALLBACK) #define BOOST_ATOMIC_CHAR_LOCK_FREE 2 #define BOOST_ATOMIC_CHAR16_T_LOCK_FREE 2 #define BOOST_ATOMIC_CHAR32_T_LOCK_FREE 2 #define BOOST_ATOMIC_WCHAR_T_LOCK_FREE 2 #define BOOST_ATOMIC_SHORT_LOCK_FREE 2 #define BOOST_ATOMIC_INT_LOCK_FREE 2 #define BOOST_ATOMIC_LONG_LOCK_FREE 2 #define BOOST_ATOMIC_LLONG_LOCK_FREE 0 #define BOOST_ATOMIC_POINTER_LOCK_FREE 2 #define BOOST_ATOMIC_BOOL_LOCK_FREE 2 #include #endif /* !defined(BOOST_ATOMIC_FORCE_FALLBACK) */ #endif ././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/boost/atomic/detail/gcc-ppc.hppSuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/boost/atomic/detail/gcc-pp0000664000175000017500000021116612110501517032102 0ustar dandan#ifndef BOOST_ATOMIC_DETAIL_GCC_PPC_HPP #define BOOST_ATOMIC_DETAIL_GCC_PPC_HPP // Copyright (c) 2009 Helge Bahmann // // Distributed under the Boost Software License, Version 1.0. // See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) /* Refer to: Motorola: "Programming Environments Manual for 32-Bit Implementations of the PowerPC Architecture", Appendix E: "Synchronization Programming Examples" for an explanation of what is going on here (can be found on the web at various places by the name "MPCFPE32B.pdf", Google is your friend...) Most of the atomic operations map to instructions in a relatively straight-forward fashion, but "load"s may at first glance appear a bit strange as they map to: lwz %rX, addr cmpw %rX, %rX bne- 1f 1: That is, the CPU is forced to perform a branch that "formally" depends on the value retrieved from memory. This scheme has an overhead of about 1-2 clock cycles per load, but it allows to map "acquire" to the "isync" instruction instead of "sync" uniformly and for all type of atomic operations. Since "isync" has a cost of about 15 clock cycles, while "sync" hast a cost of about 50 clock cycles, the small penalty to atomic loads more than compensates for this. Byte- and halfword-sized atomic values are realized by encoding the value to be represented into a word, performing sign/zero extension as appropriate. This means that after add/sub operations the value needs fixing up to accurately preserve the wrap-around semantic of the smaller type. (Nothing special needs to be done for the bit-wise and the "exchange type" operators as the compiler already sees to it that values carried in registers are extended appropriately and everything falls into place naturally). The register constrant "b" instructs gcc to use any register except r0; this is sometimes required because the encoding for r0 is used to signify "constant zero" in a number of instructions, making r0 unusable in this place. For simplicity this constraint is used everywhere since I am to lazy to look this up on a per-instruction basis, and ppc has enough registers for this not to pose a problem. */ namespace boost { namespace atomics { namespace detail { static inline void ppc_fence_before(memory_order order) { switch(order) { case memory_order_release: case memory_order_acq_rel: #if defined(__powerpc64__) __asm__ __volatile__ ("lwsync" ::: "memory"); break; #endif case memory_order_seq_cst: __asm__ __volatile__ ("sync" ::: "memory"); default:; } } static inline void ppc_fence_after(memory_order order) { switch(order) { case memory_order_acquire: case memory_order_acq_rel: case memory_order_seq_cst: __asm__ __volatile__ ("isync"); case memory_order_consume: __asm__ __volatile__ ("" ::: "memory"); default:; } } static inline void ppc_fence_after_store(memory_order order) { switch(order) { case memory_order_seq_cst: __asm__ __volatile__ ("sync"); default:; } } } } class atomic_flag { private: atomic_flag(const atomic_flag &) /* = delete */ ; atomic_flag & operator=(const atomic_flag &) /* = delete */ ; uint32_t v_; public: atomic_flag(void) : v_(false) {} void clear(memory_order order = memory_order_seq_cst) volatile { atomics::detail::ppc_fence_before(order); const_cast(v_) = 0; atomics::detail::ppc_fence_after_store(order); } bool test_and_set(memory_order order = memory_order_seq_cst) volatile { uint32_t original; atomics::detail::ppc_fence_before(order); __asm__ ( "1:\n" "lwarx %0,%y1\n" "stwcx. %2,%y1\n" "bne- 1b\n" : "=&b" (original), "+Z"(v_) : "b" (1) : "cr0" ); atomics::detail::ppc_fence_after(order); return original; } }; } /* namespace boost */ #define BOOST_ATOMIC_FLAG_LOCK_FREE 2 #include #if !defined(BOOST_ATOMIC_FORCE_FALLBACK) #define BOOST_ATOMIC_CHAR_LOCK_FREE 2 #define BOOST_ATOMIC_CHAR16_T_LOCK_FREE 2 #define BOOST_ATOMIC_CHAR32_T_LOCK_FREE 2 #define BOOST_ATOMIC_WCHAR_T_LOCK_FREE 2 #define BOOST_ATOMIC_SHORT_LOCK_FREE 2 #define BOOST_ATOMIC_INT_LOCK_FREE 2 #define BOOST_ATOMIC_LONG_LOCK_FREE 2 #define BOOST_ATOMIC_POINTER_LOCK_FREE 2 #if defined(__powerpc64__) #define BOOST_ATOMIC_LLONG_LOCK_FREE 2 #else #define BOOST_ATOMIC_LLONG_LOCK_FREE 0 #endif #define BOOST_ATOMIC_BOOL_LOCK_FREE 2 /* Would like to move the slow-path of failed compare_exchange (that clears the "success" bit) out-of-line. gcc can in principle do that using ".subsection"/".previous", but Apple's binutils seemingly does not understand that. Therefore wrap the "clear" of the flag in a macro and let it remain in-line for Apple */ #if !defined(__APPLE__) #define BOOST_ATOMIC_ASM_SLOWPATH_CLEAR \ "9:\n" \ ".subsection 2\n" \ "2: addi %1,0,0\n" \ "b 9b\n" \ ".previous\n" \ #else #define BOOST_ATOMIC_ASM_SLOWPATH_CLEAR \ "b 9f\n" \ "2: addi %1,0,0\n" \ "9:\n" \ #endif namespace boost { namespace atomics { namespace detail { /* integral types */ template class base_atomic { typedef base_atomic this_type; typedef T value_type; typedef int32_t storage_type; typedef T difference_type; public: explicit base_atomic(value_type v) : v_(v) {} base_atomic(void) {} void store(value_type v, memory_order order = memory_order_seq_cst) volatile { ppc_fence_before(order); __asm__ ( "stw %1, %0\n" : "+m"(v_) : "r" (v) ); ppc_fence_after_store(order); } value_type load(memory_order order = memory_order_seq_cst) const volatile { value_type v; __asm__ __volatile__ ( "lwz %0, %1\n" "cmpw %0, %0\n" "bne- 1f\n" "1:\n" : "=&r" (v) : "m" (v_) ); ppc_fence_after(order); return v; } value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original; ppc_fence_before(order); __asm__ ( "1:\n" "lwarx %0,%y1\n" "stwcx. %2,%y1\n" "bne- 1b\n" : "=&b" (original), "+Z"(v_) : "b" (v) : "cr0" ); ppc_fence_after(order); return original; } bool compare_exchange_weak( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { int success; ppc_fence_before(success_order); __asm__( "lwarx %0,%y2\n" "cmpw %0, %3\n" "bne- 2f\n" "stwcx. %4,%y2\n" "bne- 2f\n" "addi %1,0,1\n" "1:" BOOST_ATOMIC_ASM_SLOWPATH_CLEAR : "=&b" (expected), "=&b" (success), "+Z"(v_) : "b" (expected), "b" (desired) : "cr0" ); if (success) ppc_fence_after(success_order); else ppc_fence_after(failure_order); return success; } bool compare_exchange_strong( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { int success; ppc_fence_before(success_order); __asm__( "0: lwarx %0,%y2\n" "cmpw %0, %3\n" "bne- 2f\n" "stwcx. %4,%y2\n" "bne- 0b\n" "addi %1,0,1\n" "1:" BOOST_ATOMIC_ASM_SLOWPATH_CLEAR : "=&b" (expected), "=&b" (success), "+Z"(v_) : "b" (expected), "b" (desired) : "cr0" ); if (success) ppc_fence_after(success_order); else ppc_fence_after(failure_order); return success; } value_type fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original, tmp; ppc_fence_before(order); __asm__ ( "1:\n" "lwarx %0,%y2\n" "add %1,%0,%3\n" "extsb %1, %1\n" "stwcx. %1,%y2\n" "bne- 1b\n" : "=&b" (original), "=&b" (tmp), "+Z"(v_) : "b" (v) : "cc"); ppc_fence_after(order); return original; } value_type fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original, tmp; ppc_fence_before(order); __asm__ ( "1:\n" "lwarx %0,%y2\n" "sub %1,%0,%3\n" "extsb %1, %1\n" "stwcx. %1,%y2\n" "bne- 1b\n" : "=&b" (original), "=&b" (tmp), "+Z"(v_) : "b" (v) : "cc"); ppc_fence_after(order); return original; } value_type fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original, tmp; ppc_fence_before(order); __asm__ ( "1:\n" "lwarx %0,%y2\n" "and %1,%0,%3\n" "stwcx. %1,%y2\n" "bne- 1b\n" : "=&b" (original), "=&b" (tmp), "+Z"(v_) : "b" (v) : "cc"); ppc_fence_after(order); return original; } value_type fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original, tmp; ppc_fence_before(order); __asm__ ( "1:\n" "lwarx %0,%y2\n" "or %1,%0,%3\n" "stwcx. %1,%y2\n" "bne- 1b\n" : "=&b" (original), "=&b" (tmp), "+Z"(v_) : "b" (v) : "cc"); ppc_fence_after(order); return original; } value_type fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original, tmp; ppc_fence_before(order); __asm__ ( "1:\n" "lwarx %0,%y2\n" "xor %1,%0,%3\n" "stwcx. %1,%y2\n" "bne- 1b\n" : "=&b" (original), "=&b" (tmp), "+Z"(v_) : "b" (v) : "cc"); ppc_fence_after(order); return original; } bool is_lock_free(void) const volatile { return true; } BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS private: base_atomic(const base_atomic &) /* = delete */ ; void operator=(const base_atomic &) /* = delete */ ; storage_type v_; }; template class base_atomic { typedef base_atomic this_type; typedef T value_type; typedef uint32_t storage_type; typedef T difference_type; public: explicit base_atomic(value_type v) : v_(v) {} base_atomic(void) {} void store(value_type v, memory_order order = memory_order_seq_cst) volatile { ppc_fence_before(order); __asm__ ( "stw %1, %0\n" : "+m"(v_) : "r" (v) ); ppc_fence_after_store(order); } value_type load(memory_order order = memory_order_seq_cst) const volatile { value_type v; __asm__ __volatile__ ( "lwz %0, %1\n" "cmpw %0, %0\n" "bne- 1f\n" "1:\n" : "=&r" (v) : "m" (v_) ); ppc_fence_after(order); return v; } value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original; ppc_fence_before(order); __asm__ ( "1:\n" "lwarx %0,%y1\n" "stwcx. %2,%y1\n" "bne- 1b\n" : "=&b" (original), "+Z"(v_) : "b" (v) : "cr0" ); ppc_fence_after(order); return original; } bool compare_exchange_weak( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { int success; ppc_fence_before(success_order); __asm__( "lwarx %0,%y2\n" "cmpw %0, %3\n" "bne- 2f\n" "stwcx. %4,%y2\n" "bne- 2f\n" "addi %1,0,1\n" "1:" BOOST_ATOMIC_ASM_SLOWPATH_CLEAR : "=&b" (expected), "=&b" (success), "+Z"(v_) : "b" (expected), "b" (desired) : "cr0" ); if (success) ppc_fence_after(success_order); else ppc_fence_after(failure_order); return success; } bool compare_exchange_strong( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { int success; ppc_fence_before(success_order); __asm__( "0: lwarx %0,%y2\n" "cmpw %0, %3\n" "bne- 2f\n" "stwcx. %4,%y2\n" "bne- 0b\n" "addi %1,0,1\n" "1:" BOOST_ATOMIC_ASM_SLOWPATH_CLEAR : "=&b" (expected), "=&b" (success), "+Z"(v_) : "b" (expected), "b" (desired) : "cr0" ); if (success) ppc_fence_after(success_order); else ppc_fence_after(failure_order); return success; } value_type fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original, tmp; ppc_fence_before(order); __asm__ ( "1:\n" "lwarx %0,%y2\n" "add %1,%0,%3\n" "rlwinm %1, %1, 0, 0xff\n" "stwcx. %1,%y2\n" "bne- 1b\n" : "=&b" (original), "=&b" (tmp), "+Z"(v_) : "b" (v) : "cc"); ppc_fence_after(order); return original; } value_type fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original, tmp; ppc_fence_before(order); __asm__ ( "1:\n" "lwarx %0,%y2\n" "sub %1,%0,%3\n" "rlwinm %1, %1, 0, 0xff\n" "stwcx. %1,%y2\n" "bne- 1b\n" : "=&b" (original), "=&b" (tmp), "+Z"(v_) : "b" (v) : "cc"); ppc_fence_after(order); return original; } value_type fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original, tmp; ppc_fence_before(order); __asm__ ( "1:\n" "lwarx %0,%y2\n" "and %1,%0,%3\n" "stwcx. %1,%y2\n" "bne- 1b\n" : "=&b" (original), "=&b" (tmp), "+Z"(v_) : "b" (v) : "cc"); ppc_fence_after(order); return original; } value_type fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original, tmp; ppc_fence_before(order); __asm__ ( "1:\n" "lwarx %0,%y2\n" "or %1,%0,%3\n" "stwcx. %1,%y2\n" "bne- 1b\n" : "=&b" (original), "=&b" (tmp), "+Z"(v_) : "b" (v) : "cc"); ppc_fence_after(order); return original; } value_type fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original, tmp; ppc_fence_before(order); __asm__ ( "1:\n" "lwarx %0,%y2\n" "xor %1,%0,%3\n" "stwcx. %1,%y2\n" "bne- 1b\n" : "=&b" (original), "=&b" (tmp), "+Z"(v_) : "b" (v) : "cc"); ppc_fence_after(order); return original; } bool is_lock_free(void) const volatile { return true; } BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS private: base_atomic(const base_atomic &) /* = delete */ ; void operator=(const base_atomic &) /* = delete */ ; storage_type v_; }; template class base_atomic { typedef base_atomic this_type; typedef T value_type; typedef int32_t storage_type; typedef T difference_type; public: explicit base_atomic(value_type v) : v_(v) {} base_atomic(void) {} void store(value_type v, memory_order order = memory_order_seq_cst) volatile { ppc_fence_before(order); __asm__ ( "stw %1, %0\n" : "+m"(v_) : "r" (v) ); ppc_fence_after_store(order); } value_type load(memory_order order = memory_order_seq_cst) const volatile { value_type v; __asm__ __volatile__ ( "lwz %0, %1\n" "cmpw %0, %0\n" "bne- 1f\n" "1:\n" : "=&r" (v) : "m" (v_) ); ppc_fence_after(order); return v; } value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original; ppc_fence_before(order); __asm__ ( "1:\n" "lwarx %0,%y1\n" "stwcx. %2,%y1\n" "bne- 1b\n" : "=&b" (original), "+Z"(v_) : "b" (v) : "cr0" ); ppc_fence_after(order); return original; } bool compare_exchange_weak( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { int success; ppc_fence_before(success_order); __asm__( "lwarx %0,%y2\n" "cmpw %0, %3\n" "bne- 2f\n" "stwcx. %4,%y2\n" "bne- 2f\n" "addi %1,0,1\n" "1:" BOOST_ATOMIC_ASM_SLOWPATH_CLEAR : "=&b" (expected), "=&b" (success), "+Z"(v_) : "b" (expected), "b" (desired) : "cr0" ); if (success) ppc_fence_after(success_order); else ppc_fence_after(failure_order); return success; } bool compare_exchange_strong( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { int success; ppc_fence_before(success_order); __asm__( "0: lwarx %0,%y2\n" "cmpw %0, %3\n" "bne- 2f\n" "stwcx. %4,%y2\n" "bne- 0b\n" "addi %1,0,1\n" "1:" BOOST_ATOMIC_ASM_SLOWPATH_CLEAR : "=&b" (expected), "=&b" (success), "+Z"(v_) : "b" (expected), "b" (desired) : "cr0" ); if (success) ppc_fence_after(success_order); else ppc_fence_after(failure_order); return success; } value_type fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original, tmp; ppc_fence_before(order); __asm__ ( "1:\n" "lwarx %0,%y2\n" "add %1,%0,%3\n" "extsh %1, %1\n" "stwcx. %1,%y2\n" "bne- 1b\n" : "=&b" (original), "=&b" (tmp), "+Z"(v_) : "b" (v) : "cc"); ppc_fence_after(order); return original; } value_type fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original, tmp; ppc_fence_before(order); __asm__ ( "1:\n" "lwarx %0,%y2\n" "sub %1,%0,%3\n" "extsh %1, %1\n" "stwcx. %1,%y2\n" "bne- 1b\n" : "=&b" (original), "=&b" (tmp), "+Z"(v_) : "b" (v) : "cc"); ppc_fence_after(order); return original; } value_type fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original, tmp; ppc_fence_before(order); __asm__ ( "1:\n" "lwarx %0,%y2\n" "and %1,%0,%3\n" "stwcx. %1,%y2\n" "bne- 1b\n" : "=&b" (original), "=&b" (tmp), "+Z"(v_) : "b" (v) : "cc"); ppc_fence_after(order); return original; } value_type fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original, tmp; ppc_fence_before(order); __asm__ ( "1:\n" "lwarx %0,%y2\n" "or %1,%0,%3\n" "stwcx. %1,%y2\n" "bne- 1b\n" : "=&b" (original), "=&b" (tmp), "+Z"(v_) : "b" (v) : "cc"); ppc_fence_after(order); return original; } value_type fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original, tmp; ppc_fence_before(order); __asm__ ( "1:\n" "lwarx %0,%y2\n" "xor %1,%0,%3\n" "stwcx. %1,%y2\n" "bne- 1b\n" : "=&b" (original), "=&b" (tmp), "+Z"(v_) : "b" (v) : "cc"); ppc_fence_after(order); return original; } bool is_lock_free(void) const volatile { return true; } BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS private: base_atomic(const base_atomic &) /* = delete */ ; void operator=(const base_atomic &) /* = delete */ ; storage_type v_; }; template class base_atomic { typedef base_atomic this_type; typedef T value_type; typedef uint32_t storage_type; typedef T difference_type; public: explicit base_atomic(value_type v) : v_(v) {} base_atomic(void) {} void store(value_type v, memory_order order = memory_order_seq_cst) volatile { ppc_fence_before(order); __asm__ ( "stw %1, %0\n" : "+m"(v_) : "r" (v) ); ppc_fence_after_store(order); } value_type load(memory_order order = memory_order_seq_cst) const volatile { value_type v; __asm__ __volatile__ ( "lwz %0, %1\n" "cmpw %0, %0\n" "bne- 1f\n" "1:\n" : "=&r" (v) : "m" (v_) ); ppc_fence_after(order); return v; } value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original; ppc_fence_before(order); __asm__ ( "1:\n" "lwarx %0,%y1\n" "stwcx. %2,%y1\n" "bne- 1b\n" : "=&b" (original), "+Z"(v_) : "b" (v) : "cr0" ); ppc_fence_after(order); return original; } bool compare_exchange_weak( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { int success; ppc_fence_before(success_order); __asm__( "lwarx %0,%y2\n" "cmpw %0, %3\n" "bne- 2f\n" "stwcx. %4,%y2\n" "bne- 2f\n" "addi %1,0,1\n" "1:" BOOST_ATOMIC_ASM_SLOWPATH_CLEAR : "=&b" (expected), "=&b" (success), "+Z"(v_) : "b" (expected), "b" (desired) : "cr0" ); if (success) ppc_fence_after(success_order); else ppc_fence_after(failure_order); return success; } bool compare_exchange_strong( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { int success; ppc_fence_before(success_order); __asm__( "0: lwarx %0,%y2\n" "cmpw %0, %3\n" "bne- 2f\n" "stwcx. %4,%y2\n" "bne- 0b\n" "addi %1,0,1\n" "1:" BOOST_ATOMIC_ASM_SLOWPATH_CLEAR : "=&b" (expected), "=&b" (success), "+Z"(v_) : "b" (expected), "b" (desired) : "cr0" ); if (success) ppc_fence_after(success_order); else ppc_fence_after(failure_order); return success; } value_type fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original, tmp; ppc_fence_before(order); __asm__ ( "1:\n" "lwarx %0,%y2\n" "add %1,%0,%3\n" "rlwinm %1, %1, 0, 0xffff\n" "stwcx. %1,%y2\n" "bne- 1b\n" : "=&b" (original), "=&b" (tmp), "+Z"(v_) : "b" (v) : "cc"); ppc_fence_after(order); return original; } value_type fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original, tmp; ppc_fence_before(order); __asm__ ( "1:\n" "lwarx %0,%y2\n" "sub %1,%0,%3\n" "rlwinm %1, %1, 0, 0xffff\n" "stwcx. %1,%y2\n" "bne- 1b\n" : "=&b" (original), "=&b" (tmp), "+Z"(v_) : "b" (v) : "cc"); ppc_fence_after(order); return original; } value_type fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original, tmp; ppc_fence_before(order); __asm__ ( "1:\n" "lwarx %0,%y2\n" "and %1,%0,%3\n" "stwcx. %1,%y2\n" "bne- 1b\n" : "=&b" (original), "=&b" (tmp), "+Z"(v_) : "b" (v) : "cc"); ppc_fence_after(order); return original; } value_type fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original, tmp; ppc_fence_before(order); __asm__ ( "1:\n" "lwarx %0,%y2\n" "or %1,%0,%3\n" "stwcx. %1,%y2\n" "bne- 1b\n" : "=&b" (original), "=&b" (tmp), "+Z"(v_) : "b" (v) : "cc"); ppc_fence_after(order); return original; } value_type fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original, tmp; ppc_fence_before(order); __asm__ ( "1:\n" "lwarx %0,%y2\n" "xor %1,%0,%3\n" "stwcx. %1,%y2\n" "bne- 1b\n" : "=&b" (original), "=&b" (tmp), "+Z"(v_) : "b" (v) : "cc"); ppc_fence_after(order); return original; } bool is_lock_free(void) const volatile { return true; } BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS private: base_atomic(const base_atomic &) /* = delete */ ; void operator=(const base_atomic &) /* = delete */ ; storage_type v_; }; template class base_atomic { typedef base_atomic this_type; typedef T value_type; typedef T difference_type; public: explicit base_atomic(value_type v) : v_(v) {} base_atomic(void) {} void store(value_type v, memory_order order = memory_order_seq_cst) volatile { ppc_fence_before(order); const_cast(v_) = v; ppc_fence_after_store(order); } value_type load(memory_order order = memory_order_seq_cst) const volatile { value_type v = const_cast(v_); __asm__ __volatile__ ( "cmpw %0, %0\n" "bne- 1f\n" "1:\n" : "+b"(v) : : "cr0" ); ppc_fence_after(order); return v; } value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original; ppc_fence_before(order); __asm__ ( "1:\n" "lwarx %0,%y1\n" "stwcx. %2,%y1\n" "bne- 1b\n" : "=&b" (original), "+Z"(v_) : "b" (v) : "cr0" ); ppc_fence_after(order); return original; } bool compare_exchange_weak( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { int success; ppc_fence_before(success_order); __asm__( "lwarx %0,%y2\n" "cmpw %0, %3\n" "bne- 2f\n" "stwcx. %4,%y2\n" "bne- 2f\n" "addi %1,0,1\n" "1:" BOOST_ATOMIC_ASM_SLOWPATH_CLEAR : "=&b" (expected), "=&b" (success), "+Z"(v_) : "b" (expected), "b" (desired) : "cr0" ); if (success) ppc_fence_after(success_order); else ppc_fence_after(failure_order); return success; } bool compare_exchange_strong( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { int success; ppc_fence_before(success_order); __asm__( "0: lwarx %0,%y2\n" "cmpw %0, %3\n" "bne- 2f\n" "stwcx. %4,%y2\n" "bne- 0b\n" "addi %1,0,1\n" "1:" BOOST_ATOMIC_ASM_SLOWPATH_CLEAR : "=&b" (expected), "=&b" (success), "+Z"(v_) : "b" (expected), "b" (desired) : "cr0" ); if (success) ppc_fence_after(success_order); else ppc_fence_after(failure_order); return success; } value_type fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original, tmp; ppc_fence_before(order); __asm__ ( "1:\n" "lwarx %0,%y2\n" "add %1,%0,%3\n" "stwcx. %1,%y2\n" "bne- 1b\n" : "=&b" (original), "=&b" (tmp), "+Z"(v_) : "b" (v) : "cc"); ppc_fence_after(order); return original; } value_type fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original, tmp; ppc_fence_before(order); __asm__ ( "1:\n" "lwarx %0,%y2\n" "sub %1,%0,%3\n" "stwcx. %1,%y2\n" "bne- 1b\n" : "=&b" (original), "=&b" (tmp), "+Z"(v_) : "b" (v) : "cc"); ppc_fence_after(order); return original; } value_type fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original, tmp; ppc_fence_before(order); __asm__ ( "1:\n" "lwarx %0,%y2\n" "and %1,%0,%3\n" "stwcx. %1,%y2\n" "bne- 1b\n" : "=&b" (original), "=&b" (tmp), "+Z"(v_) : "b" (v) : "cc"); ppc_fence_after(order); return original; } value_type fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original, tmp; ppc_fence_before(order); __asm__ ( "1:\n" "lwarx %0,%y2\n" "or %1,%0,%3\n" "stwcx. %1,%y2\n" "bne- 1b\n" : "=&b" (original), "=&b" (tmp), "+Z"(v_) : "b" (v) : "cc"); ppc_fence_after(order); return original; } value_type fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original, tmp; ppc_fence_before(order); __asm__ ( "1:\n" "lwarx %0,%y2\n" "xor %1,%0,%3\n" "stwcx. %1,%y2\n" "bne- 1b\n" : "=&b" (original), "=&b" (tmp), "+Z"(v_) : "b" (v) : "cc"); ppc_fence_after(order); return original; } bool is_lock_free(void) const volatile { return true; } BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS private: base_atomic(const base_atomic &) /* = delete */ ; void operator=(const base_atomic &) /* = delete */ ; value_type v_; }; #if defined(__powerpc64__) template class base_atomic { typedef base_atomic this_type; typedef T value_type; typedef T difference_type; public: explicit base_atomic(value_type v) : v_(v) {} base_atomic(void) {} void store(value_type v, memory_order order = memory_order_seq_cst) volatile { ppc_fence_before(order); const_cast(v_) = v; ppc_fence_after_store(order); } value_type load(memory_order order = memory_order_seq_cst) const volatile { value_type v = const_cast(v_); __asm__ __volatile__ ( "cmpd %0, %0\n" "bne- 1f\n" "1:\n" : "+b"(v) : : "cr0" ); ppc_fence_after(order); return v; } value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original; ppc_fence_before(order); __asm__ ( "1:\n" "ldarx %0,%y1\n" "stdcx. %2,%y1\n" "bne- 1b\n" : "=&b" (original), "+Z"(v_) : "b" (v) : "cr0" ); ppc_fence_after(order); return original; } bool compare_exchange_weak( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { int success; ppc_fence_before(success_order); __asm__( "ldarx %0,%y2\n" "cmpd %0, %3\n" "bne- 2f\n" "stdcx. %4,%y2\n" "bne- 2f\n" "addi %1,0,1\n" "1:" BOOST_ATOMIC_ASM_SLOWPATH_CLEAR : "=&b" (expected), "=&b" (success), "+Z"(v_) : "b" (expected), "b" (desired) : "cr0" ); if (success) ppc_fence_after(success_order); else ppc_fence_after(failure_order); return success; } bool compare_exchange_strong( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { int success; ppc_fence_before(success_order); __asm__( "0: ldarx %0,%y2\n" "cmpd %0, %3\n" "bne- 2f\n" "stdcx. %4,%y2\n" "bne- 0b\n" "addi %1,0,1\n" "1:" BOOST_ATOMIC_ASM_SLOWPATH_CLEAR : "=&b" (expected), "=&b" (success), "+Z"(v_) : "b" (expected), "b" (desired) : "cr0" ); if (success) ppc_fence_after(success_order); else ppc_fence_after(failure_order); return success; } value_type fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original, tmp; ppc_fence_before(order); __asm__ ( "1:\n" "ldarx %0,%y2\n" "add %1,%0,%3\n" "stdcx. %1,%y2\n" "bne- 1b\n" : "=&b" (original), "=&b" (tmp), "+Z"(v_) : "b" (v) : "cc"); ppc_fence_after(order); return original; } value_type fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original, tmp; ppc_fence_before(order); __asm__ ( "1:\n" "ldarx %0,%y2\n" "sub %1,%0,%3\n" "stdcx. %1,%y2\n" "bne- 1b\n" : "=&b" (original), "=&b" (tmp), "+Z"(v_) : "b" (v) : "cc"); ppc_fence_after(order); return original; } value_type fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original, tmp; ppc_fence_before(order); __asm__ ( "1:\n" "ldarx %0,%y2\n" "and %1,%0,%3\n" "stdcx. %1,%y2\n" "bne- 1b\n" : "=&b" (original), "=&b" (tmp), "+Z"(v_) : "b" (v) : "cc"); ppc_fence_after(order); return original; } value_type fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original, tmp; ppc_fence_before(order); __asm__ ( "1:\n" "ldarx %0,%y2\n" "or %1,%0,%3\n" "stdcx. %1,%y2\n" "bne- 1b\n" : "=&b" (original), "=&b" (tmp), "+Z"(v_) : "b" (v) : "cc"); ppc_fence_after(order); return original; } value_type fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original, tmp; ppc_fence_before(order); __asm__ ( "1:\n" "ldarx %0,%y2\n" "xor %1,%0,%3\n" "stdcx. %1,%y2\n" "bne- 1b\n" : "=&b" (original), "=&b" (tmp), "+Z"(v_) : "b" (v) : "cc"); ppc_fence_after(order); return original; } bool is_lock_free(void) const volatile { return true; } BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS private: base_atomic(const base_atomic &) /* = delete */ ; void operator=(const base_atomic &) /* = delete */ ; value_type v_; }; #endif /* pointer types */ #if !defined(__powerpc64__) template class base_atomic { typedef base_atomic this_type; typedef void * value_type; public: explicit base_atomic(value_type v) : v_(v) {} base_atomic(void) {} void store(value_type v, memory_order order = memory_order_seq_cst) volatile { ppc_fence_before(order); __asm__ ( "stw %1, %0\n" : "+m" (v_) : "r" (v) ); ppc_fence_after_store(order); } value_type load(memory_order order = memory_order_seq_cst) const volatile { value_type v; __asm__ ( "lwz %0, %1\n" "cmpw %0, %0\n" "bne- 1f\n" "1:\n" : "=r"(v) : "m"(v_) : "cr0" ); ppc_fence_after(order); return v; } value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original; ppc_fence_before(order); __asm__ ( "1:\n" "lwarx %0,%y1\n" "stwcx. %2,%y1\n" "bne- 1b\n" : "=&b" (original), "+Z"(v_) : "b" (v) : "cr0" ); ppc_fence_after(order); return original; } bool compare_exchange_weak( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { int success; ppc_fence_before(success_order); __asm__( "lwarx %0,%y2\n" "cmpw %0, %3\n" "bne- 2f\n" "stwcx. %4,%y2\n" "bne- 2f\n" "addi %1,0,1\n" "1:" BOOST_ATOMIC_ASM_SLOWPATH_CLEAR : "=&b" (expected), "=&b" (success), "+Z"(v_) : "b" (expected), "b" (desired) : "cr0" ); if (success) ppc_fence_after(success_order); else ppc_fence_after(failure_order); return success; } bool compare_exchange_strong( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { int success; ppc_fence_before(success_order); __asm__( "0: lwarx %0,%y2\n" "cmpw %0, %3\n" "bne- 2f\n" "stwcx. %4,%y2\n" "bne- 0b\n" "addi %1,0,1\n" "1:" BOOST_ATOMIC_ASM_SLOWPATH_CLEAR : "=&b" (expected), "=&b" (success), "+Z"(v_) : "b" (expected), "b" (desired) : "cr0" ); if (success) ppc_fence_after(success_order); else ppc_fence_after(failure_order); return success; } bool is_lock_free(void) const volatile { return true; } BOOST_ATOMIC_DECLARE_BASE_OPERATORS private: base_atomic(const base_atomic &) /* = delete */ ; void operator=(const base_atomic &) /* = delete */ ; value_type v_; }; template class base_atomic { typedef base_atomic this_type; typedef T * value_type; typedef ptrdiff_t difference_type; public: explicit base_atomic(value_type v) : v_(v) {} base_atomic(void) {} void store(value_type v, memory_order order = memory_order_seq_cst) volatile { ppc_fence_before(order); __asm__ ( "stw %1, %0\n" : "+m" (v_) : "r" (v) ); ppc_fence_after_store(order); } value_type load(memory_order order = memory_order_seq_cst) const volatile { value_type v; __asm__ ( "lwz %0, %1\n" "cmpw %0, %0\n" "bne- 1f\n" "1:\n" : "=r"(v) : "m"(v_) : "cr0" ); ppc_fence_after(order); return v; } value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original; ppc_fence_before(order); __asm__ ( "1:\n" "lwarx %0,%y1\n" "stwcx. %2,%y1\n" "bne- 1b\n" : "=&b" (original), "+Z"(v_) : "b" (v) : "cr0" ); ppc_fence_after(order); return original; } bool compare_exchange_weak( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { int success; ppc_fence_before(success_order); __asm__( "lwarx %0,%y2\n" "cmpw %0, %3\n" "bne- 2f\n" "stwcx. %4,%y2\n" "bne- 2f\n" "addi %1,0,1\n" "1:" BOOST_ATOMIC_ASM_SLOWPATH_CLEAR : "=&b" (expected), "=&b" (success), "+Z"(v_) : "b" (expected), "b" (desired) : "cr0" ); if (success) ppc_fence_after(success_order); else ppc_fence_after(failure_order); return success; } bool compare_exchange_strong( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { int success; ppc_fence_before(success_order); __asm__( "0: lwarx %0,%y2\n" "cmpw %0, %3\n" "bne- 2f\n" "stwcx. %4,%y2\n" "bne- 0b\n" "addi %1,0,1\n" "1:" BOOST_ATOMIC_ASM_SLOWPATH_CLEAR : "=&b" (expected), "=&b" (success), "+Z"(v_) : "b" (expected), "b" (desired) : "cr0" ); if (success) ppc_fence_after(success_order); else ppc_fence_after(failure_order); return success; } value_type fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile { v = v * sizeof(*v_); value_type original, tmp; ppc_fence_before(order); __asm__ ( "1:\n" "lwarx %0,%y2\n" "add %1,%0,%3\n" "stwcx. %1,%y2\n" "bne- 1b\n" : "=&b" (original), "=&b" (tmp), "+Z"(v_) : "b" (v) : "cc"); ppc_fence_after(order); return original; } value_type fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile { v = v * sizeof(*v_); value_type original, tmp; ppc_fence_before(order); __asm__ ( "1:\n" "lwarx %0,%y2\n" "sub %1,%0,%3\n" "stwcx. %1,%y2\n" "bne- 1b\n" : "=&b" (original), "=&b" (tmp), "+Z"(v_) : "b" (v) : "cc"); ppc_fence_after(order); return original; } bool is_lock_free(void) const volatile { return true; } BOOST_ATOMIC_DECLARE_POINTER_OPERATORS private: base_atomic(const base_atomic &) /* = delete */ ; void operator=(const base_atomic &) /* = delete */ ; value_type v_; }; #else template class base_atomic { typedef base_atomic this_type; typedef void * value_type; public: explicit base_atomic(value_type v) : v_(v) {} base_atomic(void) {} void store(value_type v, memory_order order = memory_order_seq_cst) volatile { ppc_fence_before(order); __asm__ ( "std %1, %0\n" : "+m" (v_) : "r" (v) ); ppc_fence_after_store(order); } value_type load(memory_order order = memory_order_seq_cst) const volatile { value_type v; __asm__ ( "ld %0, %1\n" "cmpd %0, %0\n" "bne- 1f\n" "1:\n" : "=r"(v) : "m"(v_) : "cr0" ); ppc_fence_after(order); return v; } value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original; ppc_fence_before(order); __asm__ ( "1:\n" "ldarx %0,%y1\n" "stdcx. %2,%y1\n" "bne- 1b\n" : "=&b" (original), "+Z"(v_) : "b" (v) : "cr0" ); ppc_fence_after(order); return original; } bool compare_exchange_weak( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { int success; ppc_fence_before(success_order); __asm__( "ldarx %0,%y2\n" "cmpd %0, %3\n" "bne- 2f\n" "stdcx. %4,%y2\n" "bne- 2f\n" "addi %1,0,1\n" "1:" BOOST_ATOMIC_ASM_SLOWPATH_CLEAR : "=&b" (expected), "=&b" (success), "+Z"(v_) : "b" (expected), "b" (desired) : "cr0" ); if (success) ppc_fence_after(success_order); else ppc_fence_after(failure_order); return success; } bool compare_exchange_strong( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { int success; ppc_fence_before(success_order); __asm__( "0: ldarx %0,%y2\n" "cmpd %0, %3\n" "bne- 2f\n" "stdcx. %4,%y2\n" "bne- 0b\n" "addi %1,0,1\n" "1:" BOOST_ATOMIC_ASM_SLOWPATH_CLEAR : "=&b" (expected), "=&b" (success), "+Z"(v_) : "b" (expected), "b" (desired) : "cr0" ); if (success) ppc_fence_after(success_order); else ppc_fence_after(failure_order); return success; } bool is_lock_free(void) const volatile { return true; } BOOST_ATOMIC_DECLARE_BASE_OPERATORS private: base_atomic(const base_atomic &) /* = delete */ ; void operator=(const base_atomic &) /* = delete */ ; value_type v_; }; template class base_atomic { typedef base_atomic this_type; typedef T * value_type; typedef ptrdiff_t difference_type; public: explicit base_atomic(value_type v) : v_(v) {} base_atomic(void) {} void store(value_type v, memory_order order = memory_order_seq_cst) volatile { ppc_fence_before(order); __asm__ ( "std %1, %0\n" : "+m" (v_) : "r" (v) ); ppc_fence_after_store(order); } value_type load(memory_order order = memory_order_seq_cst) const volatile { value_type v; __asm__ ( "ld %0, %1\n" "cmpd %0, %0\n" "bne- 1f\n" "1:\n" : "=r"(v) : "m"(v_) : "cr0" ); ppc_fence_after(order); return v; } value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile { value_type original; ppc_fence_before(order); __asm__ ( "1:\n" "ldarx %0,%y1\n" "stdcx. %2,%y1\n" "bne- 1b\n" : "=&b" (original), "+Z"(v_) : "b" (v) : "cr0" ); ppc_fence_after(order); return original; } bool compare_exchange_weak( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { int success; ppc_fence_before(success_order); __asm__( "ldarx %0,%y2\n" "cmpd %0, %3\n" "bne- 2f\n" "stdcx. %4,%y2\n" "bne- 2f\n" "addi %1,0,1\n" "1:" BOOST_ATOMIC_ASM_SLOWPATH_CLEAR : "=&b" (expected), "=&b" (success), "+Z"(v_) : "b" (expected), "b" (desired) : "cr0" ); if (success) ppc_fence_after(success_order); else ppc_fence_after(failure_order); return success; } bool compare_exchange_strong( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { int success; ppc_fence_before(success_order); __asm__( "0: ldarx %0,%y2\n" "cmpd %0, %3\n" "bne- 2f\n" "stdcx. %4,%y2\n" "bne- 0b\n" "addi %1,0,1\n" "1:" BOOST_ATOMIC_ASM_SLOWPATH_CLEAR : "=&b" (expected), "=&b" (success), "+Z"(v_) : "b" (expected), "b" (desired) : "cr0" ); if (success) ppc_fence_after(success_order); else ppc_fence_after(failure_order); return success; } value_type fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile { v = v * sizeof(*v_); value_type original, tmp; ppc_fence_before(order); __asm__ ( "1:\n" "ldarx %0,%y2\n" "add %1,%0,%3\n" "stdcx. %1,%y2\n" "bne- 1b\n" : "=&b" (original), "=&b" (tmp), "+Z"(v_) : "b" (v) : "cc"); ppc_fence_after(order); return original; } value_type fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile { v = v * sizeof(*v_); value_type original, tmp; ppc_fence_before(order); __asm__ ( "1:\n" "ldarx %0,%y2\n" "sub %1,%0,%3\n" "stdcx. %1,%y2\n" "bne- 1b\n" : "=&b" (original), "=&b" (tmp), "+Z"(v_) : "b" (v) : "cc"); ppc_fence_after(order); return original; } bool is_lock_free(void) const volatile { return true; } BOOST_ATOMIC_DECLARE_POINTER_OPERATORS private: base_atomic(const base_atomic &) /* = delete */ ; void operator=(const base_atomic &) /* = delete */ ; value_type v_; }; #endif /* generic */ template class base_atomic { typedef base_atomic this_type; typedef T value_type; typedef uint32_t storage_type; public: explicit base_atomic(value_type v) : v_(0) { memcpy(&v_, &v, sizeof(value_type)); } base_atomic(void) : v_(0) {} void store(value_type v, memory_order order = memory_order_seq_cst) volatile { storage_type tmp = 0; memcpy(&tmp, &v, sizeof(value_type)); ppc_fence_before(order); __asm__ ( "stw %1, %0\n" : "+m" (v_) : "r" (tmp) ); ppc_fence_after_store(order); } value_type load(memory_order order = memory_order_seq_cst) const volatile { storage_type tmp; __asm__ __volatile__ ( "lwz %0, %1\n" "cmpw %0, %0\n" "bne- 1f\n" "1:\n" : "=r"(tmp) : "m"(v_) : "cr0" ); ppc_fence_after(order); value_type v; memcpy(&v, &tmp, sizeof(value_type)); return v; } value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile { storage_type tmp = 0, original; memcpy(&tmp, &v, sizeof(value_type)); ppc_fence_before(order); __asm__ ( "1:\n" "lwarx %0,%y1\n" "stwcx. %2,%y1\n" "bne- 1b\n" : "=&b" (original), "+Z"(v_) : "b" (tmp) : "cr0" ); ppc_fence_after(order); memcpy(&v, &original, sizeof(value_type)); return v; } bool compare_exchange_weak( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { storage_type expected_s = 0, desired_s = 0; memcpy(&expected_s, &expected, sizeof(value_type)); memcpy(&desired_s, &desired, sizeof(value_type)); int success; ppc_fence_before(success_order); __asm__( "lwarx %0,%y2\n" "cmpw %0, %3\n" "bne- 2f\n" "stwcx. %4,%y2\n" "bne- 2f\n" "addi %1,0,1\n" "1:" BOOST_ATOMIC_ASM_SLOWPATH_CLEAR : "=&b" (expected_s), "=&b" (success), "+Z"(v_) : "b" (expected_s), "b" (desired_s) : "cr0" ); if (success) ppc_fence_after(success_order); else ppc_fence_after(failure_order); memcpy(&expected, &expected_s, sizeof(value_type)); return success; } bool compare_exchange_strong( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { storage_type expected_s = 0, desired_s = 0; memcpy(&expected_s, &expected, sizeof(value_type)); memcpy(&desired_s, &desired, sizeof(value_type)); int success; ppc_fence_before(success_order); __asm__( "0: lwarx %0,%y2\n" "cmpw %0, %3\n" "bne- 2f\n" "stwcx. %4,%y2\n" "bne- 0b\n" "addi %1,0,1\n" "1:" BOOST_ATOMIC_ASM_SLOWPATH_CLEAR : "=&b" (expected_s), "=&b" (success), "+Z"(v_) : "b" (expected_s), "b" (desired_s) : "cr0" ); if (success) ppc_fence_after(success_order); else ppc_fence_after(failure_order); memcpy(&expected, &expected_s, sizeof(value_type)); return success; } bool is_lock_free(void) const volatile { return true; } BOOST_ATOMIC_DECLARE_BASE_OPERATORS private: base_atomic(const base_atomic &) /* = delete */ ; void operator=(const base_atomic &) /* = delete */ ; storage_type v_; }; template class base_atomic { typedef base_atomic this_type; typedef T value_type; typedef uint32_t storage_type; public: explicit base_atomic(value_type v) : v_(0) { memcpy(&v_, &v, sizeof(value_type)); } base_atomic(void) : v_(0) {} void store(value_type v, memory_order order = memory_order_seq_cst) volatile { storage_type tmp = 0; memcpy(&tmp, &v, sizeof(value_type)); ppc_fence_before(order); __asm__ ( "stw %1, %0\n" : "+m" (v_) : "r" (tmp) ); ppc_fence_after_store(order); } value_type load(memory_order order = memory_order_seq_cst) const volatile { storage_type tmp; __asm__ __volatile__ ( "lwz %0, %1\n" "cmpw %0, %0\n" "bne- 1f\n" "1:\n" : "=r"(tmp) : "m"(v_) : "cr0" ); ppc_fence_after(order); value_type v; memcpy(&v, &tmp, sizeof(value_type)); return v; } value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile { storage_type tmp = 0, original; memcpy(&tmp, &v, sizeof(value_type)); ppc_fence_before(order); __asm__ ( "1:\n" "lwarx %0,%y1\n" "stwcx. %2,%y1\n" "bne- 1b\n" : "=&b" (original), "+Z"(v_) : "b" (tmp) : "cr0" ); ppc_fence_after(order); memcpy(&v, &original, sizeof(value_type)); return v; } bool compare_exchange_weak( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { storage_type expected_s = 0, desired_s = 0; memcpy(&expected_s, &expected, sizeof(value_type)); memcpy(&desired_s, &desired, sizeof(value_type)); int success; ppc_fence_before(success_order); __asm__( "lwarx %0,%y2\n" "cmpw %0, %3\n" "bne- 2f\n" "stwcx. %4,%y2\n" "bne- 2f\n" "addi %1,0,1\n" "1:" BOOST_ATOMIC_ASM_SLOWPATH_CLEAR : "=&b" (expected_s), "=&b" (success), "+Z"(v_) : "b" (expected_s), "b" (desired_s) : "cr0" ); if (success) ppc_fence_after(success_order); else ppc_fence_after(failure_order); memcpy(&expected, &expected_s, sizeof(value_type)); return success; } bool compare_exchange_strong( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { storage_type expected_s = 0, desired_s = 0; memcpy(&expected_s, &expected, sizeof(value_type)); memcpy(&desired_s, &desired, sizeof(value_type)); int success; ppc_fence_before(success_order); __asm__( "0: lwarx %0,%y2\n" "cmpw %0, %3\n" "bne- 2f\n" "stwcx. %4,%y2\n" "bne- 0b\n" "addi %1,0,1\n" "1:" BOOST_ATOMIC_ASM_SLOWPATH_CLEAR : "=&b" (expected_s), "=&b" (success), "+Z"(v_) : "b" (expected_s), "b" (desired_s) : "cr0" ); if (success) ppc_fence_after(success_order); else ppc_fence_after(failure_order); memcpy(&expected, &expected_s, sizeof(value_type)); return success; } bool is_lock_free(void) const volatile { return true; } BOOST_ATOMIC_DECLARE_BASE_OPERATORS private: base_atomic(const base_atomic &) /* = delete */ ; void operator=(const base_atomic &) /* = delete */ ; storage_type v_; }; template class base_atomic { typedef base_atomic this_type; typedef T value_type; typedef uint32_t storage_type; public: explicit base_atomic(value_type v) : v_(0) { memcpy(&v_, &v, sizeof(value_type)); } base_atomic(void) : v_(0) {} void store(value_type v, memory_order order = memory_order_seq_cst) volatile { storage_type tmp = 0; memcpy(&tmp, &v, sizeof(value_type)); ppc_fence_before(order); __asm__ ( "stw %1, %0\n" : "+m" (v_) : "r" (tmp) ); ppc_fence_after_store(order); } value_type load(memory_order order = memory_order_seq_cst) const volatile { storage_type tmp; __asm__ __volatile__ ( "lwz %0, %1\n" "cmpw %0, %0\n" "bne- 1f\n" "1:\n" : "=r"(tmp) : "m"(v_) : "cr0" ); ppc_fence_after(order); value_type v; memcpy(&v, &tmp, sizeof(value_type)); return v; } value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile { storage_type tmp = 0, original; memcpy(&tmp, &v, sizeof(value_type)); ppc_fence_before(order); __asm__ ( "1:\n" "lwarx %0,%y1\n" "stwcx. %2,%y1\n" "bne- 1b\n" : "=&b" (original), "+Z"(v_) : "b" (tmp) : "cr0" ); ppc_fence_after(order); memcpy(&v, &original, sizeof(value_type)); return v; } bool compare_exchange_weak( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { storage_type expected_s = 0, desired_s = 0; memcpy(&expected_s, &expected, sizeof(value_type)); memcpy(&desired_s, &desired, sizeof(value_type)); int success; ppc_fence_before(success_order); __asm__( "lwarx %0,%y2\n" "cmpw %0, %3\n" "bne- 2f\n" "stwcx. %4,%y2\n" "bne- 2f\n" "addi %1,0,1\n" "1:" BOOST_ATOMIC_ASM_SLOWPATH_CLEAR : "=&b" (expected_s), "=&b" (success), "+Z"(v_) : "b" (expected_s), "b" (desired_s) : "cr0" ); if (success) ppc_fence_after(success_order); else ppc_fence_after(failure_order); memcpy(&expected, &expected_s, sizeof(value_type)); return success; } bool compare_exchange_strong( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { storage_type expected_s = 0, desired_s = 0; memcpy(&expected_s, &expected, sizeof(value_type)); memcpy(&desired_s, &desired, sizeof(value_type)); int success; ppc_fence_before(success_order); __asm__( "0: lwarx %0,%y2\n" "cmpw %0, %3\n" "bne- 2f\n" "stwcx. %4,%y2\n" "bne- 0b\n" "addi %1,0,1\n" "1:" BOOST_ATOMIC_ASM_SLOWPATH_CLEAR : "=&b" (expected_s), "=&b" (success), "+Z"(v_) : "b" (expected_s), "b" (desired_s) : "cr0" ); if (success) ppc_fence_after(success_order); else ppc_fence_after(failure_order); memcpy(&expected, &expected_s, sizeof(value_type)); return success; } bool is_lock_free(void) const volatile { return true; } BOOST_ATOMIC_DECLARE_BASE_OPERATORS private: base_atomic(const base_atomic &) /* = delete */ ; void operator=(const base_atomic &) /* = delete */ ; storage_type v_; }; #if defined(__powerpc64__) template class base_atomic { typedef base_atomic this_type; typedef T value_type; typedef uint64_t storage_type; public: explicit base_atomic(value_type v) { memcpy(&v_, &v, sizeof(value_type)); } base_atomic(void) {} void store(value_type v, memory_order order = memory_order_seq_cst) volatile { storage_type tmp; memcpy(&tmp, &v, sizeof(value_type)); ppc_fence_before(order); __asm__ ( "std %1, %0\n" : "+m" (v_) : "r" (tmp) ); ppc_fence_after_store(order); } value_type load(memory_order order = memory_order_seq_cst) const volatile { storage_type tmp; __asm__ __volatile__ ( "ld %0, %1\n" "cmpd %0, %0\n" "bne- 1f\n" "1:\n" : "=r"(tmp) : "m"(v_) : "cr0" ); ppc_fence_after(order); value_type v; memcpy(&v, &tmp, sizeof(value_type)); return v; } value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile { storage_type tmp = 0, original; memcpy(&tmp, &v, sizeof(value_type)); ppc_fence_before(order); __asm__ ( "1:\n" "ldarx %0,%y1\n" "stdcx. %2,%y1\n" "bne- 1b\n" : "=&b" (original), "+Z"(v_) : "b" (tmp) : "cr0" ); ppc_fence_after(order); memcpy(&v, &original, sizeof(value_type)); return v; } bool compare_exchange_weak( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { storage_type expected_s, desired_s; memcpy(&expected_s, &expected, sizeof(value_type)); memcpy(&desired_s, &desired, sizeof(value_type)); int success; ppc_fence_before(success_order); __asm__( "ldarx %0,%y2\n" "cmpd %0, %3\n" "bne- 2f\n" "stdcx. %4,%y2\n" "bne- 2f\n" "addi %1,0,1\n" "1:" BOOST_ATOMIC_ASM_SLOWPATH_CLEAR : "=&b" (expected_s), "=&b" (success), "+Z"(v_) : "b" (expected_s), "b" (desired_s) : "cr0" ); if (success) ppc_fence_after(success_order); else ppc_fence_after(failure_order); memcpy(&expected, &expected_s, sizeof(value_type)); return success; } bool compare_exchange_strong( value_type & expected, value_type desired, memory_order success_order, memory_order failure_order) volatile { storage_type expected_s, desired_s; memcpy(&expected_s, &expected, sizeof(value_type)); memcpy(&desired_s, &desired, sizeof(value_type)); int success; ppc_fence_before(success_order); __asm__( "0: ldarx %0,%y2\n" "cmpd %0, %3\n" "bne- 2f\n" "stdcx. %4,%y2\n" "bne- 0b\n" "addi %1,0,1\n" "1:" BOOST_ATOMIC_ASM_SLOWPATH_CLEAR : "=&b" (expected_s), "=&b" (success), "+Z"(v_) : "b" (expected_s), "b" (desired_s) : "cr0" ); if (success) ppc_fence_after(success_order); else ppc_fence_after(failure_order); memcpy(&expected, &expected_s, sizeof(value_type)); return success; } bool is_lock_free(void) const volatile { return true; } BOOST_ATOMIC_DECLARE_BASE_OPERATORS private: base_atomic(const base_atomic &) /* = delete */ ; void operator=(const base_atomic &) /* = delete */ ; storage_type v_; }; #endif } } #define BOOST_ATOMIC_THREAD_FENCE 2 inline void atomic_thread_fence(memory_order order) { switch(order) { case memory_order_acquire: __asm__ __volatile__ ("isync" ::: "memory"); break; case memory_order_release: #if defined(__powerpc64__) __asm__ __volatile__ ("lwsync" ::: "memory"); break; #endif case memory_order_acq_rel: case memory_order_seq_cst: __asm__ __volatile__ ("sync" ::: "memory"); default:; } } #define BOOST_ATOMIC_SIGNAL_FENCE 2 inline void atomic_signal_fence(memory_order order) { switch(order) { case memory_order_acquire: case memory_order_release: case memory_order_acq_rel: case memory_order_seq_cst: __asm__ __volatile__ ("" ::: "memory"); break; default:; } } } #endif /* !defined(BOOST_ATOMIC_FORCE_FALLBACK) */ #endif SuperCollider-3.6.3-Source-linux~repack/external_libraries/boost-lockfree/boost/atomic.hpp0000664000175000017500000001106712110501517030253 0ustar dandan#ifndef BOOST_ATOMIC_HPP #define BOOST_ATOMIC_HPP // Copyright (c) 2011 Helge Bahmann // // Distributed under the Boost Software License, Version 1.0. // See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #include #include #include #include #include #include namespace boost { #ifndef BOOST_ATOMIC_CHAR_LOCK_FREE #define BOOST_ATOMIC_CHAR_LOCK_FREE 0 #endif #ifndef BOOST_ATOMIC_CHAR16_T_LOCK_FREE #define BOOST_ATOMIC_CHAR16_T_LOCK_FREE 0 #endif #ifndef BOOST_ATOMIC_CHAR32_T_LOCK_FREE #define BOOST_ATOMIC_CHAR32_T_LOCK_FREE 0 #endif #ifndef BOOST_ATOMIC_WCHAR_T_LOCK_FREE #define BOOST_ATOMIC_WCHAR_T_LOCK_FREE 0 #endif #ifndef BOOST_ATOMIC_SHORT_LOCK_FREE #define BOOST_ATOMIC_SHORT_LOCK_FREE 0 #endif #ifndef BOOST_ATOMIC_INT_LOCK_FREE #define BOOST_ATOMIC_INT_LOCK_FREE 0 #endif #ifndef BOOST_ATOMIC_LONG_LOCK_FREE #define BOOST_ATOMIC_LONG_LOCK_FREE 0 #endif #ifndef BOOST_ATOMIC_LLONG_LOCK_FREE #define BOOST_ATOMIC_LLONG_LOCK_FREE 0 #endif #ifndef BOOST_ATOMIC_POINTER_LOCK_FREE #define BOOST_ATOMIC_POINTER_LOCK_FREE 0 #endif #define BOOST_ATOMIC_ADDRESS_LOCK_FREE BOOST_ATOMIC_POINTER_LOCK_FREE #ifndef BOOST_ATOMIC_BOOL_LOCK_FREE #define BOOST_ATOMIC_BOOL_LOCK_FREE 0 #endif #ifndef BOOST_ATOMIC_THREAD_FENCE #define BOOST_ATOMIC_THREAD_FENCE 0 static inline void atomic_thread_fence(memory_order) { } #endif #ifndef BOOST_ATOMIC_SIGNAL_FENCE #define BOOST_ATOMIC_SIGNAL_FENCE 0 static inline void atomic_signal_fence(memory_order order) { atomic_thread_fence(order); } #endif template class atomic : public atomics::detail::base_atomic::test, sizeof(T), boost::is_signed::value > { private: typedef T value_type; typedef atomics::detail::base_atomic::test, sizeof(T), boost::is_signed::value > super; public: atomic(void) : super() {} explicit atomic(const value_type & v) : super(v) {} atomic & operator=(value_type v) volatile { super::operator=(v); return *const_cast(this); } private: atomic(const atomic &) /* =delete */ ; atomic & operator=(const atomic &) /* =delete */ ; }; typedef atomic atomic_char; typedef atomic atomic_uchar; typedef atomic atomic_schar; typedef atomic atomic_uint8_t; typedef atomic atomic_int8_t; typedef atomic atomic_ushort; typedef atomic atomic_short; typedef atomic atomic_uint16_t; typedef atomic atomic_int16_t; typedef atomic atomic_uint; typedef atomic atomic_int; typedef atomic atomic_uint32_t; typedef atomic atomic_int32_t; typedef atomic atomic_ulong; typedef atomic atomic_long; typedef atomic atomic_uint64_t; typedef atomic atomic_int64_t; #ifdef BOOST_HAS_LONG_LONG typedef atomic atomic_ullong; typedef atomic atomic_llong; #endif typedef atomic atomic_address; typedef atomic atomic_bool; #ifndef BOOST_ATOMIC_FLAG_LOCK_FREE #define BOOST_ATOMIC_FLAG_LOCK_FREE 0 class atomic_flag { public: atomic_flag(void) : v_(false) {} bool test_and_set(memory_order order = memory_order_seq_cst) { return v_.exchange(true, order); } void clear(memory_order order = memory_order_seq_cst) volatile { v_.store(false, order); } private: atomic_flag(const atomic_flag &) /* = delete */ ; atomic_flag & operator=(const atomic_flag &) /* = delete */ ; atomic v_; }; #endif typedef atomic atomic_char; typedef atomic atomic_uchar; typedef atomic atomic_schar; typedef atomic atomic_uint8_t; typedef atomic atomic_int8_t; typedef atomic atomic_ushort; typedef atomic atomic_short; typedef atomic atomic_uint16_t; typedef atomic atomic_int16_t; typedef atomic atomic_uint; typedef atomic atomic_int; typedef atomic atomic_uint32_t; typedef atomic atomic_int32_t; typedef atomic atomic_ulong; typedef atomic atomic_long; typedef atomic atomic_uint64_t; typedef atomic atomic_int64_t; typedef atomic atomic_ullong; typedef atomic atomic_llong; typedef atomic atomic_address; typedef atomic atomic_bool; } #endif SuperCollider-3.6.3-Source-linux~repack/external_libraries/CMakeLists.txt0000664000175000017500000000502312110501517024755 0ustar dandanif (NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/nova-simd/vec.hpp) message(FATAL_ERROR "nova-simd submodule is missing: please run `git submodule init && git submodule update' from the toplevel of your git working tree") endif() if(NOT Boost_FOUND) # we compile boost ourselves # boost thread aux_source_directory(boost/libs/thread/src/ boost_thread_src ) include_directories(boost) if(WIN32) aux_source_directory(boost/libs/thread/src/win32/ boost_thread_platform ) add_definitions(-DBOOST_THREAD_BUILD_LIB) elseif(PTHREADS_FOUND) aux_source_directory(boost/libs/thread/src/pthread/ boost_thread_platform ) else() message(SEND_ERROR "we need to implement boost_thread") endif() include_directories(${PTHREADS_INCLUDE_DIR}) if (SUPERNOVA) aux_source_directory(boost/libs/program_options/src/ boost_program_options ) add_library(boost_program_options STATIC ${boost_program_options}) aux_source_directory(boost/libs/system/src/ boost_system ) add_library(boost_system STATIC ${boost_system}) aux_source_directory(boost/libs/filesystem/src boost_filesystem_src) add_library(boost_filesystem STATIC ${boost_filesystem_src}) if(LTO) set_property(TARGET boost_program_options boost_system boost_filesystem APPEND PROPERTY COMPILE_FLAGS "-flto -flto-report") set_property(TARGET boost_program_options boost_system boost_filesystem APPEND PROPERTY LINK_FLAGS "-flto -flto-report") endif() endif() add_library(boost_thread STATIC ${boost_thread_src} ${boost_thread_platform}) if(LTO) set_property(TARGET boost_thread APPEND PROPERTY COMPILE_FLAGS "-flto -flto-report") set_property(TARGET boost_thread APPEND PROPERTY LINK_FLAGS "-flto -flto-report") endif() endif() if (SUPERNOVA) #oscpack add_library(oscpack STATIC "oscpack_build.cpp") #tlsf add_library(tlsf STATIC "TLSF-2.4.6/src/tlsf.c") set_target_properties(tlsf PROPERTIES COMPILE_DEFINITIONS TLSF_STATISTIC=1) if(LTO) set_property(TARGET oscpack tlsf APPEND PROPERTY COMPILE_FLAGS "-flto -flto-report") set_property(TARGET oscpack tlsf APPEND PROPERTY LINK_FLAGS "-flto -flto-report") endif() endif() if(NOT YAMLCPP_FOUND) message(STATUS "using bundled libyaml-cpp") # yaml-cpp include_directories(${CMAKE_SOURCE_DIR}/external_libraries/yaml-cpp-0.3.0/include) aux_source_directory(${CMAKE_SOURCE_DIR}/external_libraries/yaml-cpp-0.3.0/src yaml_src) CREATE_FINAL_FILE(${CMAKE_CURRENT_BINARY_DIR}/libyamlcpp.cpp ${yaml_src}) add_library(yaml STATIC ${CMAKE_CURRENT_BINARY_DIR}/libyamlcpp.cpp) endif() SuperCollider-3.6.3-Source-linux~repack/external_libraries/oscpack/0000775000175000017500000000000012110505246023643 5ustar dandanSuperCollider-3.6.3-Source-linux~repack/external_libraries/oscpack/LICENSE0000644000175000017500000000253711562456103024664 0ustar dandanoscpack -- Open Sound Control packet manipulation library http://www.audiomulch.com/~rossb/code/oscpack Copyright (c) 2004 Ross Bencina 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. Any person wishing to distribute modifications to the Software is requested to send the modifications to the original developer so that they can be incorporated into the canonical version. 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. SuperCollider-3.6.3-Source-linux~repack/external_libraries/oscpack/README0000644000175000017500000000663711562456103024544 0ustar dandanoscpack -- Open Sound Control packet manipulation library http://www.audiomulch.com/~rossb/code/oscpack Copyright (c) 2004-2005 Ross Bencina A simple C++ library for packing and unpacking OSC packets. Oscpack is simply a set of C++ classes for packing and unpacking OSC packets. Oscpack includes a minimal set of UDP networking classes for windows and posix which are sufficient for writing many OSC applications and servers, but you are encouraged to use another networking framework if it better suits your needs. Oscpack is not an OSC application framework, it doesn't include infrastructure for constructing or routing OSC namespaces, just classes for easily constructing, sending, receiving and parsing OSC packets. The library should also be easy to use for other transport methods (eg serial). The key goals of the oscpack library are: - to be a simple and complete implementation of OSC - to be portable to a wide variety of platforms - to allow easy development of robust OSC applications (for example it should be impossible to crash a server by sending it malformed packets, and difficult to create malformed packets.) Here's a summary of the key files: osc/OscReceivedElements -- classes for parsing a packet osc/OscPrintRecievedElements -- iostream << operators for printing packet elements osc/OscOutboundPacket -- a class for packing messages into a packet osc/OscPacketListener -- base class for listening to OSC packets on a UdpSocket tests/OscUnitTests -- unit test program for the OSC modules tests/OscSendTests -- examples of how to send messages tests/OscReceiveTest -- example of how to receive the messages sent by OSCSendTests examples/OscDump -- a program that prints received OSC packets Building -------- In general the idea is that you will embed this source code in your projects as you see fit. The Makefile has an install rule for building a shared library and installing headers in usr/local. The Makefile works for Linux and MaxOS X except that if you are on a big endian machine such as PowerPC Macintosh you need to edit the line which sets the endianness to OSC_HOST_BIG_ENDIAN (see the makefile comment for details) or it won't work. If you want to build and install liboscpack as a library on OS X you also need to edit the $(LIBFILENAME) rule by commenting out the Linux case and uncommenting the OS X case since OS X uses different gcc flags for shared libraries. On Windows there is a batch file for doing a simple test build with MinGW gcc called make.MinGW32.bat. This will build the test executables and oscdump in ./bin and run the unit tests. -- If you fix anything or write a set of TCP send/recieve classes please consider sending me a patch. Thanks :) For more information about Open Sound Control, see: http://www.cnmat.berkeley.edu/OpenSoundControl/ Thanks to Till Bovermann for helping with POSIX networking code and Mac compatibility, and to Martin Kaltenbrunner and the rest of the reacTable team for giving me a reason to finish this library. Thanks to Merlijn Blaauw for reviewing the interfaces. Thanks to Xavier Oliver for additional help with Linux builds and POSIX implementation details. Portions developed at the Music Technology Group, Audiovisual Institute, University Pompeu Fabra, Barcelona, during my stay as a visiting researcher, November 2004 - September 2005. See the file LICENSE for information about distributing and using this code. SuperCollider-3.6.3-Source-linux~repack/external_libraries/oscpack/Makefile0000644000175000017500000000677511562456103025327 0ustar dandan# should be either OSC_HOST_BIG_ENDIAN or OSC_HOST_LITTLE_ENDIAN # Apple Mac OS X: OSC_HOST_BIG_ENDIAN # Win32: OSC_HOST_LITTLE_ENDIAN # i386 GNU/Linux: OSC_HOST_LITTLE_ENDIAN ENDIANESS=OSC_HOST_LITTLE_ENDIAN CXX = g++ INCLUDES = -I./ COPTS = -Wall -O3 CDEBUG = -Wall -g CXXFLAGS = $(COPTS) $(INCLUDES) -D$(ENDIANESS) PREFIX = /usr/local INSTALL = /usr/bin/install -c #Name definitions UNITTESTS=OscUnitTests SEND=OscSendTests RECEIVE=OscReceiveTest DUMP=OscDump INCLUDEDIR = oscpack LIBNAME = liboscpack LIBSONAME = $(LIBNAME).so LIBFILENAME = $(LIBSONAME).1.0.2 #Test and example source SENDSOURCES = ./tests/OscSendTests.cpp ./osc/OscOutboundPacketStream.cpp ./osc/OscTypes.cpp ./ip/posix/NetworkingUtils.cpp ./ip/posix/UdpSocket.cpp ./ip/IpEndpointName.cpp SENDOBJECTS = $(SENDSOURCES:.cpp=.o) RECEIVESOURCES = ./tests/OscReceiveTest.cpp ./osc/OscTypes.cpp ./osc/OscReceivedElements.cpp ./osc/OscPrintReceivedElements.cpp ./ip/posix/NetworkingUtils.cpp ./ip/posix/UdpSocket.cpp RECEIVEOBJECTS = $(RECEIVESOURCES:.cpp=.o) DUMPSOURCES = ./examples/OscDump.cpp ./osc/OscTypes.cpp ./osc/OscReceivedElements.cpp ./osc/OscPrintReceivedElements.cpp ./ip/posix/NetworkingUtils.cpp ./ip/posix/UdpSocket.cpp DUMPOBJECTS = $(DUMPSOURCES:.cpp=.o) UNITTESTSOURCES = ./tests/OscUnitTests.cpp ./osc/OscOutboundPacketStream.cpp ./osc/OscTypes.cpp ./osc/OscReceivedElements.cpp ./osc/OscPrintReceivedElements.cpp UNITTESTOBJECTS = $(UNITTESTSOURCES:.cpp=.o) #Library sources LIBSOURCES = ./ip/IpEndpointName.cpp \ ./ip/posix/NetworkingUtils.cpp ./ip/posix/UdpSocket.cpp\ ./osc/OscOutboundPacketStream.cpp ./osc/OscPrintReceivedElements.cpp ./osc/OscReceivedElements.cpp ./osc/OscTypes.cpp LIBOBJECTS = $(LIBSOURCES:.cpp=.o) all: unittests send receive dump unittests : $(UNITTESTOBJECTS) @if [ ! -d bin ] ; then mkdir bin ; fi $(CXX) -o bin/$(UNITTESTS) $+ $(LIBS) send : $(SENDOBJECTS) @if [ ! -d bin ] ; then mkdir bin ; fi $(CXX) -o bin/$(SEND) $+ $(LIBS) receive : $(RECEIVEOBJECTS) @if [ ! -d bin ] ; then mkdir bin ; fi $(CXX) -o bin/$(RECEIVE) $+ $(LIBS) dump : $(DUMPOBJECTS) @if [ ! -d bin ] ; then mkdir bin ; fi $(CXX) -o bin/$(DUMP) $+ $(LIBS) clean: rm -rf bin $(UNITTESTOBJECTS) $(SENDOBJECTS) $(RECEIVEOBJECTS) $(DUMPOBJECTS) $(LIBOBJECTS) $(LIBFILENAME) include lib oscpack &> /dev/null $(LIBFILENAME): $(LIBOBJECTS) @#GNU/Linux case $(CXX) -shared -Wl,-soname,$(LIBSONAME) -o $(LIBFILENAME) $(LIBOBJECTS) -lc @#Mac OS X case @#$(CXX) -dynamiclib -Wl,-install_name,$(LIBSONAME) -o $(LIBFILENAME) $(LIBOBJECTS) -lc lib: $(LIBFILENAME) #Installs the library on a system global location install: lib @$(INSTALL) -m 755 $(LIBFILENAME) $(PREFIX)/lib/$(LIBFILENAME) @ln -s -f $(PREFIX)/lib/$(LIBFILENAME) $(PREFIX)/lib/$(LIBSONAME) @mkdir -p $(PREFIX)/include/oscpack/ip $(PREFIX)/include/oscpack/osc @$(INSTALL) -m 644 ip/*.h $(PREFIX)/include/oscpack/ip @$(INSTALL) -m 644 osc/*.h $(PREFIX)/include/oscpack/osc @echo "SUCCESS! oscpack has been installed in $(PREFIX)/lib and $(PREFIX)/include/ospack/" @echo "now doing ldconfig..." @ldconfig #Installs the include/lib structure locally install-local: lib @echo "" @echo " Installing in local directory <$(INCLUDEDIR)>" @echo " > Creating symbolic link" @ln -s $(LIBFILENAME) $(LIBSONAME) @echo " > Creating directories" @mkdir -p oscpack/lib @mkdir -p oscpack/include/ip @mkdir -p oscpack/include/osc @echo " > Copying files" @mv $(LIBFILENAME) $(LIBSONAME) oscpack/lib @cp ip/*.h oscpack/include/ip @cp osc/*.h oscpack/include/osc @echo "" @echo " > Success!" SuperCollider-3.6.3-Source-linux~repack/external_libraries/oscpack/make.MinGW32.bat0000644000175000017500000000237511562456103026411 0ustar dandandel bin\OscUnitTests.exe del bin\OscDump.exe del bin\OscSendTests.exe del bin\OscReceiveTest.exe mkdir bin g++ tests\OscUnitTests.cpp osc\OscTypes.cpp osc\OscReceivedElements.cpp osc\OscPrintReceivedElements.cpp osc\OscOutboundPacketStream.cpp -Wall -I. -lws2_32 -o bin\OscUnitTests.exe g++ examples\OscDump.cpp osc\OscTypes.cpp osc\OscReceivedElements.cpp osc\OscPrintReceivedElements.cpp ip\win32\NetworkingUtils.cpp ip\win32\UdpSocket.cpp -Wall -I. -lws2_32 -lwinmm -o bin\OscDump.exe g++ examples\SimpleSend.cpp osc\OscTypes.cpp osc\OscOutboundPacketStream.cpp ip\win32\NetworkingUtils.cpp ip\win32\UdpSocket.cpp ip\IpEndpointName.cpp -Wall -I. -lws2_32 -lwinmm -o bin\SimpleSend.exe g++ examples\SimpleReceive.cpp osc\OscTypes.cpp osc\OscReceivedElements.cpp ip\win32\NetworkingUtils.cpp ip\win32\UdpSocket.cpp -Wall -I. -lws2_32 -lwinmm -o bin\SimpleReceive.exe g++ tests\OscSendTests.cpp osc\OscTypes.cpp osc\OscOutboundPacketStream.cpp ip\win32\NetworkingUtils.cpp ip\win32\UdpSocket.cpp ip\IpEndpointName.cpp -Wall -I. -lws2_32 -lwinmm -o bin\OscSendTests.exe g++ tests\OscReceiveTest.cpp osc\OscTypes.cpp osc\OscReceivedElements.cpp ip\win32\NetworkingUtils.cpp ip\win32\UdpSocket.cpp -Wall -I. -lws2_32 -lwinmm -o bin\OscReceiveTest.exe .\bin\OscUnitTests.exeSuperCollider-3.6.3-Source-linux~repack/external_libraries/oscpack/TODO0000644000175000017500000000453011562456103024342 0ustar dandanTODO: - consider adding the local endpoint name to PacketListener::PacketReceived() params - consider adding ListenerThread class to support old seperate thread listener functionality, something like: class UdpSocketListenerThread{ public: UdpSocketListenerThread( UdpSocket& socket, Listener *listener ); UdpSocketListenerThread( UdpSocketReceiveMultiplexer *mux ); ~UdpSocketListenerThread(); void Run(); void Stop(); }; - provide some kind of automatic endianness configuration (hopefully there are gcc symbols for this) - work out a way to make the parsing classes totally safe. at a minimum this means adding functions to test for invalid float/doublevalues, making sure the iterators never pass the end of the message, ... (passing end of message can happen if: - too many args in type tags a. typetags overflow message size b. args fulfilling typetags overflow message size - strings too long or not terminated correctly - blobs too long or not terminated correctly if the message was fully checked during construction, the end() iterator could be moved back until only arguments which fit withing size() may be interated (this could be none). A flag could be set to indicate that something was wrong. - other packet badness could include: - time tags too far into the future (the scheduler should deal with that i guess). - message address patterns which aren't correctly terminated - improve the ability to parse messages without tags (SC uses methods which get the data and advance the iterator in one step.) - Check* could be modified to do this - ie if typetags are not present it could check that reading the field won't escape the message size and return the data, or return false if some consistency constraint is violated. (or alternately drop support for messages without type tags) - add a method to discard an inprogress message if it gets half constructed and the buffer is full in OutboundPacket - write a stress testing app which can send garbage packets to try to flush out other bugs in the parsing code. SuperCollider-3.6.3-Source-linux~repack/external_libraries/oscpack/ip/0000775000175000017500000000000012110505246024253 5ustar dandanSuperCollider-3.6.3-Source-linux~repack/external_libraries/oscpack/ip/UdpSocket.h0000644000175000017500000001243211562456103026334 0ustar dandan/* oscpack -- Open Sound Control packet manipulation library http://www.audiomulch.com/~rossb/oscpack Copyright (c) 2004-2005 Ross Bencina 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. Any person wishing to distribute modifications to the Software is requested to send the modifications to the original developer so that they can be incorporated into the canonical version. 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. */ #ifndef INCLUDED_UDPSOCKET_H #define INCLUDED_UDPSOCKET_H #ifndef INCLUDED_NETWORKINGUTILITIES_H #include "NetworkingUtils.h" #endif /* INCLUDED_NETWORKINGUTILITIES_H */ #ifndef INCLUDED_IPENDPOINTNAME_H #include "IpEndpointName.h" #endif /* INCLUDED_IPENDPOINTNAME_H */ class PacketListener; class TimerListener; class UdpSocket; class SocketReceiveMultiplexer{ class Implementation; Implementation *impl_; friend class UdpSocket; public: SocketReceiveMultiplexer(); ~SocketReceiveMultiplexer(); // only call the attach/detach methods _before_ calling Run // only one listener per socket, each socket at most once void AttachSocketListener( UdpSocket *socket, PacketListener *listener ); void DetachSocketListener( UdpSocket *socket, PacketListener *listener ); void AttachPeriodicTimerListener( int periodMilliseconds, TimerListener *listener ); void AttachPeriodicTimerListener( int initialDelayMilliseconds, int periodMilliseconds, TimerListener *listener ); void DetachPeriodicTimerListener( TimerListener *listener ); void Run(); // loop and block processing messages indefinitely void RunUntilSigInt(); void Break(); // call this from a listener to exit once the listener returns void AsynchronousBreak(); // call this from another thread or signal handler to exit the Run() state }; class UdpSocket{ class Implementation; Implementation *impl_; friend class SocketReceiveMultiplexer::Implementation; public: // ctor throws std::runtime_error if there's a problem // initializing the socket. UdpSocket(); virtual ~UdpSocket(); // the socket is created in an unbound, unconnected state // such a socket can only be used to send to an arbitrary // address using SendTo(). To use Send() you need to first // connect to a remote endpoint using Connect(). To use // ReceiveFrom you need to first bind to a local endpoint // using Bind(). // retrieve the local endpoint name when sending to 'to' IpEndpointName LocalEndpointFor( const IpEndpointName& remoteEndpoint ) const; // Connect to a remote endpoint which is used as the target // for calls to Send() void Connect( const IpEndpointName& remoteEndpoint ); void Send( const char *data, int size ); void SendTo( const IpEndpointName& remoteEndpoint, const char *data, int size ); // Bind a local endpoint to receive incoming data. Endpoint // can be 'any' for the system to choose an endpoint void Bind( const IpEndpointName& localEndpoint ); bool IsBound() const; int ReceiveFrom( IpEndpointName& remoteEndpoint, char *data, int size ); }; // convenience classes for transmitting and receiving // they just call Connect and/or Bind in the ctor. // note that you can still use a receive socket // for transmitting etc class UdpTransmitSocket : public UdpSocket{ public: UdpTransmitSocket( const IpEndpointName& remoteEndpoint ) { Connect( remoteEndpoint ); } }; class UdpReceiveSocket : public UdpSocket{ public: UdpReceiveSocket( const IpEndpointName& localEndpoint ) { Bind( localEndpoint ); } }; // UdpListeningReceiveSocket provides a simple way to bind one listener // to a single socket without having to manually set up a SocketReceiveMultiplexer class UdpListeningReceiveSocket : public UdpSocket{ SocketReceiveMultiplexer mux_; PacketListener *listener_; public: UdpListeningReceiveSocket( const IpEndpointName& localEndpoint, PacketListener *listener ) : listener_( listener ) { Bind( localEndpoint ); mux_.AttachSocketListener( this, listener_ ); } ~UdpListeningReceiveSocket() { mux_.DetachSocketListener( this, listener_ ); } // see SocketReceiveMultiplexer above for the behaviour of these methods... void Run() { mux_.Run(); } void RunUntilSigInt() { mux_.RunUntilSigInt(); } void Break() { mux_.Break(); } void AsynchronousBreak() { mux_.AsynchronousBreak(); } }; #endif /* INCLUDED_UDPSOCKET_H */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/oscpack/ip/IpEndpointName.h0000644000175000017500000000536511562456103027314 0ustar dandan/* oscpack -- Open Sound Control packet manipulation library http://www.audiomulch.com/~rossb/oscpack Copyright (c) 2004-2005 Ross Bencina 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. Any person wishing to distribute modifications to the Software is requested to send the modifications to the original developer so that they can be incorporated into the canonical version. 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. */ #ifndef INCLUDED_IPENDPOINTNAME_H #define INCLUDED_IPENDPOINTNAME_H class IpEndpointName{ static unsigned long GetHostByName( const char *s ); public: static const unsigned long ANY_ADDRESS = 0xFFFFFFFF; static const int ANY_PORT = -1; IpEndpointName() : address( ANY_ADDRESS ), port( ANY_PORT ) {} IpEndpointName( int port_ ) : address( ANY_ADDRESS ), port( port_ ) {} IpEndpointName( unsigned long ipAddress_, int port_ ) : address( ipAddress_ ), port( port_ ) {} IpEndpointName( const char *addressName, int port_=ANY_PORT ) : address( GetHostByName( addressName ) ) , port( port_ ) {} IpEndpointName( int addressA, int addressB, int addressC, int addressD, int port_=ANY_PORT ) : address( ( (addressA << 24) | (addressB << 16) | (addressC << 8) | addressD ) ) , port( port_ ) {} // address and port are maintained in host byte order here unsigned long address; int port; enum { ADDRESS_STRING_LENGTH=17 }; void AddressAsString( char *s ) const; enum { ADDRESS_AND_PORT_STRING_LENGTH=23}; void AddressAndPortAsString( char *s ) const; }; inline bool operator==( const IpEndpointName& lhs, const IpEndpointName& rhs ) { return (lhs.address == rhs.address && lhs.port == rhs.port ); } inline bool operator!=( const IpEndpointName& lhs, const IpEndpointName& rhs ) { return !(lhs == rhs); } #endif /* INCLUDED_IPENDPOINTNAME_H */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/oscpack/ip/posix/0000775000175000017500000000000012110505246025415 5ustar dandanSuperCollider-3.6.3-Source-linux~repack/external_libraries/oscpack/ip/posix/NetworkingUtils.cpp0000644000175000017500000000357711562456103031312 0ustar dandan/* oscpack -- Open Sound Control packet manipulation library http://www.audiomulch.com/~rossb/oscpack Copyright (c) 2004-2005 Ross Bencina 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. Any person wishing to distribute modifications to the Software is requested to send the modifications to the original developer so that they can be incorporated into the canonical version. 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. */ #include "ip/NetworkingUtils.h" #include #include #include #include #include NetworkInitializer::NetworkInitializer() {} NetworkInitializer::~NetworkInitializer() {} unsigned long GetHostByName( const char *name ) { unsigned long result = 0; struct hostent *h = gethostbyname( name ); if( h ){ struct in_addr a; memcpy( &a, h->h_addr_list[0], h->h_length ); result = ntohl(a.s_addr); } return result; } SuperCollider-3.6.3-Source-linux~repack/external_libraries/oscpack/ip/posix/UdpSocket.cpp0000644000175000017500000003534011562456103030034 0ustar dandan/* oscpack -- Open Sound Control packet manipulation library http://www.audiomulch.com/~rossb/oscpack Copyright (c) 2004-2005 Ross Bencina 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. Any person wishing to distribute modifications to the Software is requested to send the modifications to the original developer so that they can be incorporated into the canonical version. 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. */ #include "ip/UdpSocket.h" #include #include #include #include #include #include #include #include // for memset #include #include #include #include #include #include #include #include #include // for sockaddr_in #include "ip/PacketListener.h" #include "ip/TimerListener.h" #if defined(__APPLE__) && !defined(_SOCKLEN_T) // pre system 10.3 didn have socklen_t typedef ssize_t socklen_t; #endif static void SockaddrFromIpEndpointName( struct sockaddr_in& sockAddr, const IpEndpointName& endpoint ) { memset( (char *)&sockAddr, 0, sizeof(sockAddr ) ); sockAddr.sin_family = AF_INET; sockAddr.sin_addr.s_addr = (endpoint.address == IpEndpointName::ANY_ADDRESS) ? INADDR_ANY : htonl( endpoint.address ); sockAddr.sin_port = (endpoint.port == IpEndpointName::ANY_PORT) ? 0 : htons( endpoint.port ); } static IpEndpointName IpEndpointNameFromSockaddr( const struct sockaddr_in& sockAddr ) { return IpEndpointName( (sockAddr.sin_addr.s_addr == INADDR_ANY) ? IpEndpointName::ANY_ADDRESS : ntohl( sockAddr.sin_addr.s_addr ), (sockAddr.sin_port == 0) ? IpEndpointName::ANY_PORT : ntohs( sockAddr.sin_port ) ); } class UdpSocket::Implementation{ bool isBound_; bool isConnected_; int socket_; struct sockaddr_in connectedAddr_; struct sockaddr_in sendToAddr_; public: Implementation() : isBound_( false ) , isConnected_( false ) , socket_( -1 ) { if( (socket_ = socket( AF_INET, SOCK_DGRAM, 0 )) == -1 ){ throw std::runtime_error("unable to create udp socket\n"); } memset( &sendToAddr_, 0, sizeof(sendToAddr_) ); sendToAddr_.sin_family = AF_INET; } ~Implementation() { if (socket_ != -1) close(socket_); } IpEndpointName LocalEndpointFor( const IpEndpointName& remoteEndpoint ) const { assert( isBound_ ); // first connect the socket to the remote server struct sockaddr_in connectSockAddr; SockaddrFromIpEndpointName( connectSockAddr, remoteEndpoint ); if (connect(socket_, (struct sockaddr *)&connectSockAddr, sizeof(connectSockAddr)) < 0) { throw std::runtime_error("unable to connect udp socket\n"); } // get the address struct sockaddr_in sockAddr; memset( (char *)&sockAddr, 0, sizeof(sockAddr ) ); socklen_t length = sizeof(sockAddr); if (getsockname(socket_, (struct sockaddr *)&sockAddr, &length) < 0) { throw std::runtime_error("unable to getsockname\n"); } if( isConnected_ ){ // reconnect to the connected address if (connect(socket_, (struct sockaddr *)&connectedAddr_, sizeof(connectedAddr_)) < 0) { throw std::runtime_error("unable to connect udp socket\n"); } }else{ // unconnect from the remote address struct sockaddr_in unconnectSockAddr; memset( (char *)&unconnectSockAddr, 0, sizeof(unconnectSockAddr ) ); unconnectSockAddr.sin_family = AF_UNSPEC; // address fields are zero int connectResult = connect(socket_, (struct sockaddr *)&unconnectSockAddr, sizeof(unconnectSockAddr)); if ( connectResult < 0 && errno != EAFNOSUPPORT ) { throw std::runtime_error("unable to un-connect udp socket\n"); } } return IpEndpointNameFromSockaddr( sockAddr ); } void Connect( const IpEndpointName& remoteEndpoint ) { SockaddrFromIpEndpointName( connectedAddr_, remoteEndpoint ); if (connect(socket_, (struct sockaddr *)&connectedAddr_, sizeof(connectedAddr_)) < 0) { throw std::runtime_error("unable to connect udp socket\n"); } isConnected_ = true; } void Send( const char *data, int size ) { assert( isConnected_ ); send( socket_, data, size, 0 ); } void SendTo( const IpEndpointName& remoteEndpoint, const char *data, int size ) { sendToAddr_.sin_addr.s_addr = htonl( remoteEndpoint.address ); sendToAddr_.sin_port = htons( remoteEndpoint.port ); sendto( socket_, data, size, 0, (sockaddr*)&sendToAddr_, sizeof(sendToAddr_) ); } void Bind( const IpEndpointName& localEndpoint ) { struct sockaddr_in bindSockAddr; SockaddrFromIpEndpointName( bindSockAddr, localEndpoint ); if (bind(socket_, (struct sockaddr *)&bindSockAddr, sizeof(bindSockAddr)) < 0) { throw std::runtime_error("unable to bind udp socket\n"); } isBound_ = true; } bool IsBound() const { return isBound_; } int ReceiveFrom( IpEndpointName& remoteEndpoint, char *data, int size ) { assert( isBound_ ); struct sockaddr_in fromAddr; socklen_t fromAddrLen = sizeof(fromAddr); int result = recvfrom(socket_, data, size, 0, (struct sockaddr *) &fromAddr, (socklen_t*)&fromAddrLen); if( result < 0 ) return 0; remoteEndpoint.address = ntohl(fromAddr.sin_addr.s_addr); remoteEndpoint.port = ntohs(fromAddr.sin_port); return result; } int Socket() { return socket_; } }; UdpSocket::UdpSocket() { impl_ = new Implementation(); } UdpSocket::~UdpSocket() { delete impl_; } IpEndpointName UdpSocket::LocalEndpointFor( const IpEndpointName& remoteEndpoint ) const { return impl_->LocalEndpointFor( remoteEndpoint ); } void UdpSocket::Connect( const IpEndpointName& remoteEndpoint ) { impl_->Connect( remoteEndpoint ); } void UdpSocket::Send( const char *data, int size ) { impl_->Send( data, size ); } void UdpSocket::SendTo( const IpEndpointName& remoteEndpoint, const char *data, int size ) { impl_->SendTo( remoteEndpoint, data, size ); } void UdpSocket::Bind( const IpEndpointName& localEndpoint ) { impl_->Bind( localEndpoint ); } bool UdpSocket::IsBound() const { return impl_->IsBound(); } int UdpSocket::ReceiveFrom( IpEndpointName& remoteEndpoint, char *data, int size ) { return impl_->ReceiveFrom( remoteEndpoint, data, size ); } struct AttachedTimerListener{ AttachedTimerListener( int id, int p, TimerListener *tl ) : initialDelayMs( id ) , periodMs( p ) , listener( tl ) {} int initialDelayMs; int periodMs; TimerListener *listener; }; static bool CompareScheduledTimerCalls( const std::pair< double, AttachedTimerListener > & lhs, const std::pair< double, AttachedTimerListener > & rhs ) { return lhs.first < rhs.first; } SocketReceiveMultiplexer *multiplexerInstanceToAbortWithSigInt_ = 0; extern "C" /*static*/ void InterruptSignalHandler( int ); /*static*/ void InterruptSignalHandler( int ) { multiplexerInstanceToAbortWithSigInt_->AsynchronousBreak(); signal( SIGINT, SIG_DFL ); } class SocketReceiveMultiplexer::Implementation{ std::vector< std::pair< PacketListener*, UdpSocket* > > socketListeners_; std::vector< AttachedTimerListener > timerListeners_; volatile bool break_; int breakPipe_[2]; // [0] is the reader descriptor and [1] the writer double GetCurrentTimeMs() const { struct timeval t; gettimeofday( &t, 0 ); return ((double)t.tv_sec*1000.) + ((double)t.tv_usec / 1000.); } public: Implementation() { if( pipe(breakPipe_) != 0 ) throw std::runtime_error( "creation of asynchronous break pipes failed\n" ); } ~Implementation() { close( breakPipe_[0] ); close( breakPipe_[1] ); } void AttachSocketListener( UdpSocket *socket, PacketListener *listener ) { assert( std::find( socketListeners_.begin(), socketListeners_.end(), std::make_pair(listener, socket) ) == socketListeners_.end() ); // we don't check that the same socket has been added multiple times, even though this is an error socketListeners_.push_back( std::make_pair( listener, socket ) ); } void DetachSocketListener( UdpSocket *socket, PacketListener *listener ) { std::vector< std::pair< PacketListener*, UdpSocket* > >::iterator i = std::find( socketListeners_.begin(), socketListeners_.end(), std::make_pair(listener, socket) ); assert( i != socketListeners_.end() ); socketListeners_.erase( i ); } void AttachPeriodicTimerListener( int periodMilliseconds, TimerListener *listener ) { timerListeners_.push_back( AttachedTimerListener( periodMilliseconds, periodMilliseconds, listener ) ); } void AttachPeriodicTimerListener( int initialDelayMilliseconds, int periodMilliseconds, TimerListener *listener ) { timerListeners_.push_back( AttachedTimerListener( initialDelayMilliseconds, periodMilliseconds, listener ) ); } void DetachPeriodicTimerListener( TimerListener *listener ) { std::vector< AttachedTimerListener >::iterator i = timerListeners_.begin(); while( i != timerListeners_.end() ){ if( i->listener == listener ) break; ++i; } assert( i != timerListeners_.end() ); timerListeners_.erase( i ); } void Run() { break_ = false; // configure the master fd_set for select() fd_set masterfds, tempfds; FD_ZERO( &masterfds ); FD_ZERO( &tempfds ); // in addition to listening to the inbound sockets we // also listen to the asynchronous break pipe, so that AsynchronousBreak() // can break us out of select() from another thread. FD_SET( breakPipe_[0], &masterfds ); int fdmax = breakPipe_[0]; for( std::vector< std::pair< PacketListener*, UdpSocket* > >::iterator i = socketListeners_.begin(); i != socketListeners_.end(); ++i ){ if( fdmax < i->second->impl_->Socket() ) fdmax = i->second->impl_->Socket(); FD_SET( i->second->impl_->Socket(), &masterfds ); } // configure the timer queue double currentTimeMs = GetCurrentTimeMs(); // expiry time ms, listener std::vector< std::pair< double, AttachedTimerListener > > timerQueue_; for( std::vector< AttachedTimerListener >::iterator i = timerListeners_.begin(); i != timerListeners_.end(); ++i ) timerQueue_.push_back( std::make_pair( currentTimeMs + i->initialDelayMs, *i ) ); std::sort( timerQueue_.begin(), timerQueue_.end(), CompareScheduledTimerCalls ); const int MAX_BUFFER_SIZE = 4098; char *data = new char[ MAX_BUFFER_SIZE ]; IpEndpointName remoteEndpoint; struct timeval timeout; while( !break_ ){ tempfds = masterfds; struct timeval *timeoutPtr = 0; if( !timerQueue_.empty() ){ double timeoutMs = timerQueue_.front().first - GetCurrentTimeMs(); if( timeoutMs < 0 ) timeoutMs = 0; // 1000000 microseconds in a second timeout.tv_sec = (long)(timeoutMs * .001); timeout.tv_usec = (long)((timeoutMs - (timeout.tv_sec * 1000)) * 1000); timeoutPtr = &timeout; } if( select( fdmax + 1, &tempfds, 0, 0, timeoutPtr ) < 0 && errno != EINTR ){ throw std::runtime_error("select failed\n"); } if ( FD_ISSET( breakPipe_[0], &tempfds ) ){ // clear pending data from the asynchronous break pipe char c; read( breakPipe_[0], &c, 1 ); } if( break_ ) break; for( std::vector< std::pair< PacketListener*, UdpSocket* > >::iterator i = socketListeners_.begin(); i != socketListeners_.end(); ++i ){ if( FD_ISSET( i->second->impl_->Socket(), &tempfds ) ){ int size = i->second->ReceiveFrom( remoteEndpoint, data, MAX_BUFFER_SIZE ); if( size > 0 ){ i->first->ProcessPacket( data, size, remoteEndpoint ); if( break_ ) break; } } } // execute any expired timers currentTimeMs = GetCurrentTimeMs(); bool resort = false; for( std::vector< std::pair< double, AttachedTimerListener > >::iterator i = timerQueue_.begin(); i != timerQueue_.end() && i->first <= currentTimeMs; ++i ){ i->second.listener->TimerExpired(); if( break_ ) break; i->first += i->second.periodMs; resort = true; } if( resort ) std::sort( timerQueue_.begin(), timerQueue_.end(), CompareScheduledTimerCalls ); } delete [] data; } void Break() { break_ = true; } void AsynchronousBreak() { break_ = true; // Send a termination message to the asynchronous break pipe, so select() will return write( breakPipe_[1], "!", 1 ); } }; SocketReceiveMultiplexer::SocketReceiveMultiplexer() { impl_ = new Implementation(); } SocketReceiveMultiplexer::~SocketReceiveMultiplexer() { delete impl_; } void SocketReceiveMultiplexer::AttachSocketListener( UdpSocket *socket, PacketListener *listener ) { impl_->AttachSocketListener( socket, listener ); } void SocketReceiveMultiplexer::DetachSocketListener( UdpSocket *socket, PacketListener *listener ) { impl_->DetachSocketListener( socket, listener ); } void SocketReceiveMultiplexer::AttachPeriodicTimerListener( int periodMilliseconds, TimerListener *listener ) { impl_->AttachPeriodicTimerListener( periodMilliseconds, listener ); } void SocketReceiveMultiplexer::AttachPeriodicTimerListener( int initialDelayMilliseconds, int periodMilliseconds, TimerListener *listener ) { impl_->AttachPeriodicTimerListener( initialDelayMilliseconds, periodMilliseconds, listener ); } void SocketReceiveMultiplexer::DetachPeriodicTimerListener( TimerListener *listener ) { impl_->DetachPeriodicTimerListener( listener ); } void SocketReceiveMultiplexer::Run() { impl_->Run(); } void SocketReceiveMultiplexer::RunUntilSigInt() { assert( multiplexerInstanceToAbortWithSigInt_ == 0 ); /* at present we support only one multiplexer instance running until sig int */ multiplexerInstanceToAbortWithSigInt_ = this; signal( SIGINT, InterruptSignalHandler ); impl_->Run(); signal( SIGINT, SIG_DFL ); multiplexerInstanceToAbortWithSigInt_ = 0; } void SocketReceiveMultiplexer::Break() { impl_->Break(); } void SocketReceiveMultiplexer::AsynchronousBreak() { impl_->AsynchronousBreak(); } SuperCollider-3.6.3-Source-linux~repack/external_libraries/oscpack/ip/IpEndpointName.cpp0000644000175000017500000000465311562456103027646 0ustar dandan/* oscpack -- Open Sound Control packet manipulation library http://www.audiomulch.com/~rossb/oscpack Copyright (c) 2004-2005 Ross Bencina 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. Any person wishing to distribute modifications to the Software is requested to send the modifications to the original developer so that they can be incorporated into the canonical version. 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. */ #include "IpEndpointName.h" #include #include "NetworkingUtils.h" unsigned long IpEndpointName::GetHostByName( const char *s ) { return ::GetHostByName(s); } void IpEndpointName::AddressAsString( char *s ) const { if( address == ANY_ADDRESS ){ sprintf( s, "" ); }else{ sprintf( s, "%d.%d.%d.%d", (int)((address >> 24) & 0xFF), (int)((address >> 16) & 0xFF), (int)((address >> 8) & 0xFF), (int)(address & 0xFF) ); } } void IpEndpointName::AddressAndPortAsString( char *s ) const { if( port == ANY_PORT ){ if( address == ANY_ADDRESS ){ sprintf( s, ":" ); }else{ sprintf( s, "%d.%d.%d.%d:", (int)((address >> 24) & 0xFF), (int)((address >> 16) & 0xFF), (int)((address >> 8) & 0xFF), (int)(address & 0xFF) ); } }else{ if( address == ANY_ADDRESS ){ sprintf( s, ":%d", port ); }else{ sprintf( s, "%d.%d.%d.%d:%d", (int)((address >> 24) & 0xFF), (int)((address >> 16) & 0xFF), (int)((address >> 8) & 0xFF), (int)(address & 0xFF), (int)port ); } } } SuperCollider-3.6.3-Source-linux~repack/external_libraries/oscpack/ip/PacketListener.h0000644000175000017500000000325511562456103027353 0ustar dandan/* oscpack -- Open Sound Control packet manipulation library http://www.audiomulch.com/~rossb/oscpack Copyright (c) 2004-2005 Ross Bencina 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. Any person wishing to distribute modifications to the Software is requested to send the modifications to the original developer so that they can be incorporated into the canonical version. 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. */ #ifndef INCLUDED_PACKETLISTENER_H #define INCLUDED_PACKETLISTENER_H class IpEndpointName; class PacketListener{ public: virtual ~PacketListener() {} virtual void ProcessPacket( const char *data, int size, const IpEndpointName& remoteEndpoint ) = 0; }; #endif /* INCLUDED_PACKETLISTENER_H */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/oscpack/ip/NetworkingUtils.h0000644000175000017500000000365211562456103027607 0ustar dandan/* oscpack -- Open Sound Control packet manipulation library http://www.audiomulch.com/~rossb/oscpack Copyright (c) 2004-2005 Ross Bencina 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. Any person wishing to distribute modifications to the Software is requested to send the modifications to the original developer so that they can be incorporated into the canonical version. 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. */ #ifndef INCLUDED_NETWORKINGUTILS_H #define INCLUDED_NETWORKINGUTILS_H // in general NetworkInitializer is only used internally, but if you're // application creates multiple sockets from different threads at runtime you // should instantiate one of these in main just to make sure the networking // layer is initialized. class NetworkInitializer{ public: NetworkInitializer(); ~NetworkInitializer(); }; // return ip address of host name in host byte order unsigned long GetHostByName( const char *name ); #endif /* INCLUDED_NETWORKINGUTILS_H */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/oscpack/ip/win32/0000775000175000017500000000000012110505246025215 5ustar dandanSuperCollider-3.6.3-Source-linux~repack/external_libraries/oscpack/ip/win32/NetworkingUtils.cpp0000644000175000017500000000566311562456103031110 0ustar dandan/* oscpack -- Open Sound Control packet manipulation library http://www.audiomulch.com/~rossb/oscpack Copyright (c) 2004-2005 Ross Bencina 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. Any person wishing to distribute modifications to the Software is requested to send the modifications to the original developer so that they can be incorporated into the canonical version. 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. */ #include "ip/NetworkingUtils.h" #include // this must come first to prevent errors with MSVC7 #include #include #include static LONG initCount_ = 0; static bool winsockInitialized_ = false; NetworkInitializer::NetworkInitializer() { if( InterlockedIncrement( &initCount_ ) == 1 ){ // there is a race condition here if one thread tries to access // the library while another is still initializing it. // i can't think of an easy way to fix it so i'm telling you here // incase you need to init the library from two threads at once. // this is why the header file advises to instantiate one of these // in main() so that the initialization happens globally // initialize winsock WSAData wsaData; int nCode = WSAStartup(MAKEWORD(1, 1), &wsaData); if( nCode != 0 ){ //std::cout << "WSAStartup() failed with error code " << nCode << "\n"; }else{ winsockInitialized_ = true; } } } NetworkInitializer::~NetworkInitializer() { if( InterlockedDecrement( &initCount_ ) == 0 ){ if( winsockInitialized_ ){ WSACleanup(); winsockInitialized_ = false; } } } unsigned long GetHostByName( const char *name ) { NetworkInitializer networkInitializer; unsigned long result = 0; struct hostent *h = gethostbyname( name ); if( h ){ struct in_addr a; memcpy( &a, h->h_addr_list[0], h->h_length ); result = ntohl(a.s_addr); } return result; } SuperCollider-3.6.3-Source-linux~repack/external_libraries/oscpack/ip/win32/UdpSocket.cpp0000644000175000017500000003530411562456103027634 0ustar dandan/* oscpack -- Open Sound Control packet manipulation library http://www.audiomulch.com/~rossb/oscpack Copyright (c) 2004-2005 Ross Bencina 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. Any person wishing to distribute modifications to the Software is requested to send the modifications to the original developer so that they can be incorporated into the canonical version. 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. */ #include "ip/UdpSocket.h" #include // this must come first to prevent errors with MSVC7 #include #include // for timeGetTime() #include #include #include #include #ifndef WINCE #include #endif #include "ip/NetworkingUtils.h" #include "ip/PacketListener.h" #include "ip/TimerListener.h" typedef int socklen_t; static void SockaddrFromIpEndpointName( struct sockaddr_in& sockAddr, const IpEndpointName& endpoint ) { memset( (char *)&sockAddr, 0, sizeof(sockAddr ) ); sockAddr.sin_family = AF_INET; sockAddr.sin_addr.s_addr = (endpoint.address == IpEndpointName::ANY_ADDRESS) ? INADDR_ANY : htonl( endpoint.address ); sockAddr.sin_port = (endpoint.port == IpEndpointName::ANY_PORT) ? (short)0 : htons( (short)endpoint.port ); } static IpEndpointName IpEndpointNameFromSockaddr( const struct sockaddr_in& sockAddr ) { return IpEndpointName( (sockAddr.sin_addr.s_addr == INADDR_ANY) ? IpEndpointName::ANY_ADDRESS : ntohl( sockAddr.sin_addr.s_addr ), (sockAddr.sin_port == 0) ? IpEndpointName::ANY_PORT : ntohs( sockAddr.sin_port ) ); } class UdpSocket::Implementation{ NetworkInitializer networkInitializer_; bool isBound_; bool isConnected_; SOCKET socket_; struct sockaddr_in connectedAddr_; struct sockaddr_in sendToAddr_; public: Implementation() : isBound_( false ) , isConnected_( false ) , socket_( INVALID_SOCKET ) { if( (socket_ = socket( AF_INET, SOCK_DGRAM, 0 )) == INVALID_SOCKET ){ throw std::runtime_error("unable to create udp socket\n"); } memset( &sendToAddr_, 0, sizeof(sendToAddr_) ); sendToAddr_.sin_family = AF_INET; } ~Implementation() { if (socket_ != INVALID_SOCKET) closesocket(socket_); } IpEndpointName LocalEndpointFor( const IpEndpointName& remoteEndpoint ) const { assert( isBound_ ); // first connect the socket to the remote server struct sockaddr_in connectSockAddr; SockaddrFromIpEndpointName( connectSockAddr, remoteEndpoint ); if (connect(socket_, (struct sockaddr *)&connectSockAddr, sizeof(connectSockAddr)) < 0) { throw std::runtime_error("unable to connect udp socket\n"); } // get the address struct sockaddr_in sockAddr; memset( (char *)&sockAddr, 0, sizeof(sockAddr ) ); socklen_t length = sizeof(sockAddr); if (getsockname(socket_, (struct sockaddr *)&sockAddr, &length) < 0) { throw std::runtime_error("unable to getsockname\n"); } if( isConnected_ ){ // reconnect to the connected address if (connect(socket_, (struct sockaddr *)&connectedAddr_, sizeof(connectedAddr_)) < 0) { throw std::runtime_error("unable to connect udp socket\n"); } }else{ // unconnect from the remote address struct sockaddr_in unconnectSockAddr; SockaddrFromIpEndpointName( unconnectSockAddr, IpEndpointName() ); if( connect(socket_, (struct sockaddr *)&unconnectSockAddr, sizeof(unconnectSockAddr)) < 0 && WSAGetLastError() != WSAEADDRNOTAVAIL ){ throw std::runtime_error("unable to un-connect udp socket\n"); } } return IpEndpointNameFromSockaddr( sockAddr ); } void Connect( const IpEndpointName& remoteEndpoint ) { SockaddrFromIpEndpointName( connectedAddr_, remoteEndpoint ); if (connect(socket_, (struct sockaddr *)&connectedAddr_, sizeof(connectedAddr_)) < 0) { throw std::runtime_error("unable to connect udp socket\n"); } isConnected_ = true; } void Send( const char *data, int size ) { assert( isConnected_ ); send( socket_, data, size, 0 ); } void SendTo( const IpEndpointName& remoteEndpoint, const char *data, int size ) { sendToAddr_.sin_addr.s_addr = htonl( remoteEndpoint.address ); sendToAddr_.sin_port = htons( (short)remoteEndpoint.port ); sendto( socket_, data, size, 0, (sockaddr*)&sendToAddr_, sizeof(sendToAddr_) ); } void Bind( const IpEndpointName& localEndpoint ) { struct sockaddr_in bindSockAddr; SockaddrFromIpEndpointName( bindSockAddr, localEndpoint ); if (bind(socket_, (struct sockaddr *)&bindSockAddr, sizeof(bindSockAddr)) < 0) { throw std::runtime_error("unable to bind udp socket\n"); } isBound_ = true; } bool IsBound() const { return isBound_; } int ReceiveFrom( IpEndpointName& remoteEndpoint, char *data, int size ) { assert( isBound_ ); struct sockaddr_in fromAddr; socklen_t fromAddrLen = sizeof(fromAddr); int result = recvfrom(socket_, data, size, 0, (struct sockaddr *) &fromAddr, (socklen_t*)&fromAddrLen); if( result < 0 ) return 0; remoteEndpoint.address = ntohl(fromAddr.sin_addr.s_addr); remoteEndpoint.port = ntohs(fromAddr.sin_port); return result; } SOCKET& Socket() { return socket_; } }; UdpSocket::UdpSocket() { impl_ = new Implementation(); } UdpSocket::~UdpSocket() { delete impl_; } IpEndpointName UdpSocket::LocalEndpointFor( const IpEndpointName& remoteEndpoint ) const { return impl_->LocalEndpointFor( remoteEndpoint ); } void UdpSocket::Connect( const IpEndpointName& remoteEndpoint ) { impl_->Connect( remoteEndpoint ); } void UdpSocket::Send( const char *data, int size ) { impl_->Send( data, size ); } void UdpSocket::SendTo( const IpEndpointName& remoteEndpoint, const char *data, int size ) { impl_->SendTo( remoteEndpoint, data, size ); } void UdpSocket::Bind( const IpEndpointName& localEndpoint ) { impl_->Bind( localEndpoint ); } bool UdpSocket::IsBound() const { return impl_->IsBound(); } int UdpSocket::ReceiveFrom( IpEndpointName& remoteEndpoint, char *data, int size ) { return impl_->ReceiveFrom( remoteEndpoint, data, size ); } struct AttachedTimerListener{ AttachedTimerListener( int id, int p, TimerListener *tl ) : initialDelayMs( id ) , periodMs( p ) , listener( tl ) {} int initialDelayMs; int periodMs; TimerListener *listener; }; static bool CompareScheduledTimerCalls( const std::pair< double, AttachedTimerListener > & lhs, const std::pair< double, AttachedTimerListener > & rhs ) { return lhs.first < rhs.first; } SocketReceiveMultiplexer *multiplexerInstanceToAbortWithSigInt_ = 0; extern "C" /*static*/ void InterruptSignalHandler( int ); /*static*/ void InterruptSignalHandler( int ) { multiplexerInstanceToAbortWithSigInt_->AsynchronousBreak(); #ifndef WINCE signal( SIGINT, SIG_DFL ); #endif } class SocketReceiveMultiplexer::Implementation{ NetworkInitializer networkInitializer_; std::vector< std::pair< PacketListener*, UdpSocket* > > socketListeners_; std::vector< AttachedTimerListener > timerListeners_; volatile bool break_; HANDLE breakEvent_; double GetCurrentTimeMs() const { #ifndef WINCE return timeGetTime(); // FIXME: bad choice if you want to run for more than 40 days #else return 0; #endif } public: Implementation() { breakEvent_ = CreateEvent( NULL, FALSE, FALSE, NULL ); } ~Implementation() { CloseHandle( breakEvent_ ); } void AttachSocketListener( UdpSocket *socket, PacketListener *listener ) { assert( std::find( socketListeners_.begin(), socketListeners_.end(), std::make_pair(listener, socket) ) == socketListeners_.end() ); // we don't check that the same socket has been added multiple times, even though this is an error socketListeners_.push_back( std::make_pair( listener, socket ) ); } void DetachSocketListener( UdpSocket *socket, PacketListener *listener ) { std::vector< std::pair< PacketListener*, UdpSocket* > >::iterator i = std::find( socketListeners_.begin(), socketListeners_.end(), std::make_pair(listener, socket) ); assert( i != socketListeners_.end() ); socketListeners_.erase( i ); } void AttachPeriodicTimerListener( int periodMilliseconds, TimerListener *listener ) { timerListeners_.push_back( AttachedTimerListener( periodMilliseconds, periodMilliseconds, listener ) ); } void AttachPeriodicTimerListener( int initialDelayMilliseconds, int periodMilliseconds, TimerListener *listener ) { timerListeners_.push_back( AttachedTimerListener( initialDelayMilliseconds, periodMilliseconds, listener ) ); } void DetachPeriodicTimerListener( TimerListener *listener ) { std::vector< AttachedTimerListener >::iterator i = timerListeners_.begin(); while( i != timerListeners_.end() ){ if( i->listener == listener ) break; ++i; } assert( i != timerListeners_.end() ); timerListeners_.erase( i ); } void Run() { break_ = false; // prepare the window events which we use to wake up on incoming data // we use this instead of select() primarily to support the AsyncBreak() // mechanism. std::vector events( socketListeners_.size() + 1, 0 ); int j=0; for( std::vector< std::pair< PacketListener*, UdpSocket* > >::iterator i = socketListeners_.begin(); i != socketListeners_.end(); ++i, ++j ){ HANDLE event = CreateEvent( NULL, FALSE, FALSE, NULL ); WSAEventSelect( i->second->impl_->Socket(), event, FD_READ ); // note that this makes the socket non-blocking which is why we can safely call RecieveFrom() on all sockets below events[j] = event; } events[ socketListeners_.size() ] = breakEvent_; // last event in the collection is the break event // configure the timer queue double currentTimeMs = GetCurrentTimeMs(); // expiry time ms, listener std::vector< std::pair< double, AttachedTimerListener > > timerQueue_; for( std::vector< AttachedTimerListener >::iterator i = timerListeners_.begin(); i != timerListeners_.end(); ++i ) timerQueue_.push_back( std::make_pair( currentTimeMs + i->initialDelayMs, *i ) ); std::sort( timerQueue_.begin(), timerQueue_.end(), CompareScheduledTimerCalls ); const int MAX_BUFFER_SIZE = 4098; char *data = new char[ MAX_BUFFER_SIZE ]; IpEndpointName remoteEndpoint; while( !break_ ){ double currentTimeMs = GetCurrentTimeMs(); DWORD waitTime = INFINITE; if( !timerQueue_.empty() ){ waitTime = (DWORD)( timerQueue_.front().first >= currentTimeMs ? timerQueue_.front().first - currentTimeMs : 0 ); } DWORD waitResult = WaitForMultipleObjects( (DWORD)socketListeners_.size() + 1, &events[0], FALSE, waitTime ); if( break_ ) break; if( waitResult != WAIT_TIMEOUT ){ for( int i = waitResult - WAIT_OBJECT_0; i < (int)socketListeners_.size(); ++i ){ int size = socketListeners_[i].second->ReceiveFrom( remoteEndpoint, data, MAX_BUFFER_SIZE ); if( size > 0 ){ socketListeners_[i].first->ProcessPacket( data, size, remoteEndpoint ); if( break_ ) break; } } } // execute any expired timers currentTimeMs = GetCurrentTimeMs(); bool resort = false; for( std::vector< std::pair< double, AttachedTimerListener > >::iterator i = timerQueue_.begin(); i != timerQueue_.end() && i->first <= currentTimeMs; ++i ){ i->second.listener->TimerExpired(); if( break_ ) break; i->first += i->second.periodMs; resort = true; } if( resort ) std::sort( timerQueue_.begin(), timerQueue_.end(), CompareScheduledTimerCalls ); } delete [] data; // free events j = 0; for( std::vector< std::pair< PacketListener*, UdpSocket* > >::iterator i = socketListeners_.begin(); i != socketListeners_.end(); ++i, ++j ){ WSAEventSelect( i->second->impl_->Socket(), events[j], 0 ); // remove association between socket and event CloseHandle( events[j] ); unsigned long enableNonblocking = 0; ioctlsocket( i->second->impl_->Socket(), FIONBIO, &enableNonblocking ); // make the socket blocking again } } void Break() { break_ = true; } void AsynchronousBreak() { break_ = true; SetEvent( breakEvent_ ); } }; SocketReceiveMultiplexer::SocketReceiveMultiplexer() { impl_ = new Implementation(); } SocketReceiveMultiplexer::~SocketReceiveMultiplexer() { delete impl_; } void SocketReceiveMultiplexer::AttachSocketListener( UdpSocket *socket, PacketListener *listener ) { impl_->AttachSocketListener( socket, listener ); } void SocketReceiveMultiplexer::DetachSocketListener( UdpSocket *socket, PacketListener *listener ) { impl_->DetachSocketListener( socket, listener ); } void SocketReceiveMultiplexer::AttachPeriodicTimerListener( int periodMilliseconds, TimerListener *listener ) { impl_->AttachPeriodicTimerListener( periodMilliseconds, listener ); } void SocketReceiveMultiplexer::AttachPeriodicTimerListener( int initialDelayMilliseconds, int periodMilliseconds, TimerListener *listener ) { impl_->AttachPeriodicTimerListener( initialDelayMilliseconds, periodMilliseconds, listener ); } void SocketReceiveMultiplexer::DetachPeriodicTimerListener( TimerListener *listener ) { impl_->DetachPeriodicTimerListener( listener ); } void SocketReceiveMultiplexer::Run() { impl_->Run(); } void SocketReceiveMultiplexer::RunUntilSigInt() { assert( multiplexerInstanceToAbortWithSigInt_ == 0 ); /* at present we support only one multiplexer instance running until sig int */ multiplexerInstanceToAbortWithSigInt_ = this; #ifndef WINCE signal( SIGINT, InterruptSignalHandler ); #endif impl_->Run(); #ifndef WINCE signal( SIGINT, SIG_DFL ); #endif multiplexerInstanceToAbortWithSigInt_ = 0; } void SocketReceiveMultiplexer::Break() { impl_->Break(); } void SocketReceiveMultiplexer::AsynchronousBreak() { impl_->AsynchronousBreak(); } SuperCollider-3.6.3-Source-linux~repack/external_libraries/oscpack/ip/TimerListener.h0000644000175000017500000000311211562456103027214 0ustar dandan/* oscpack -- Open Sound Control packet manipulation library http://www.audiomulch.com/~rossb/oscpack Copyright (c) 2004-2005 Ross Bencina 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. Any person wishing to distribute modifications to the Software is requested to send the modifications to the original developer so that they can be incorporated into the canonical version. 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. */ #ifndef INCLUDED_TIMERLISTENER_H #define INCLUDED_TIMERLISTENER_H class TimerListener{ public: virtual ~TimerListener() {} virtual void TimerExpired() = 0; }; #endif /* INCLUDED_TIMERLISTENER_H */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/oscpack/osc/0000775000175000017500000000000012110505246024427 5ustar dandanSuperCollider-3.6.3-Source-linux~repack/external_libraries/oscpack/osc/OscOutboundPacketStream.h0000644000175000017500000001164511562456103031364 0ustar dandan/* oscpack -- Open Sound Control packet manipulation library http://www.audiomulch.com/~rossb/oscpack Copyright (c) 2004-2005 Ross Bencina 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. Any person wishing to distribute modifications to the Software is requested to send the modifications to the original developer so that they can be incorporated into the canonical version. 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. */ #ifndef INCLUDED_OSCOUTBOUNDPACKET_H #define INCLUDED_OSCOUTBOUNDPACKET_H #include "OscTypes.h" #include "OscException.h" namespace osc{ class OutOfBufferMemoryException : public Exception{ public: OutOfBufferMemoryException( const char *w="out of buffer memory" ) : Exception( w ) {} }; class BundleNotInProgressException : public Exception{ public: BundleNotInProgressException( const char *w="call to EndBundle when bundle is not in progress" ) : Exception( w ) {} }; class MessageInProgressException : public Exception{ public: MessageInProgressException( const char *w="opening or closing bundle or message while message is in progress" ) : Exception( w ) {} }; class MessageNotInProgressException : public Exception{ public: MessageNotInProgressException( const char *w="call to EndMessage when message is not in progress" ) : Exception( w ) {} }; class OutboundPacketStream{ public: OutboundPacketStream( char *buffer, unsigned long capacity ); ~OutboundPacketStream(); void Clear(); unsigned int Capacity() const; // invariant: size() is valid even while building a message. unsigned int Size() const; const char *Data() const; // indicates that all messages have been closed with a matching EndMessage // and all bundles have been closed with a matching EndBundle bool IsReady() const; bool IsMessageInProgress() const; bool IsBundleInProgress() const; OutboundPacketStream& operator<<( const BundleInitiator& rhs ); OutboundPacketStream& operator<<( const BundleTerminator& rhs ); OutboundPacketStream& operator<<( const BeginMessage& rhs ); OutboundPacketStream& operator<<( const MessageTerminator& rhs ); OutboundPacketStream& operator<<( bool rhs ); OutboundPacketStream& operator<<( const NilType& rhs ); OutboundPacketStream& operator<<( const InfinitumType& rhs ); OutboundPacketStream& operator<<( int32 rhs ); #ifndef __x86_64__ OutboundPacketStream& operator<<( int rhs ) { *this << (int32)rhs; return *this; } #endif OutboundPacketStream& operator<<( float rhs ); OutboundPacketStream& operator<<( char rhs ); OutboundPacketStream& operator<<( const RgbaColor& rhs ); OutboundPacketStream& operator<<( const MidiMessage& rhs ); OutboundPacketStream& operator<<( int64 rhs ); OutboundPacketStream& operator<<( const TimeTag& rhs ); OutboundPacketStream& operator<<( double rhs ); OutboundPacketStream& operator<<( const char* rhs ); OutboundPacketStream& operator<<( const Symbol& rhs ); OutboundPacketStream& operator<<( const Blob& rhs ); OutboundPacketStream& operator<<( const ArrayStart& rhs ); OutboundPacketStream& operator<<( const ArrayEnd& rhs ); private: char *BeginElement( char *beginPtr ); void EndElement( char *endPtr ); bool ElementSizeSlotRequired() const; void CheckForAvailableBundleSpace(); void CheckForAvailableMessageSpace( const char *addressPattern ); void CheckForAvailableArgumentSpace( long argumentLength ); char *data_; char *end_; char *typeTagsCurrent_; // stored in reverse order char *messageCursor_; char *argumentCurrent_; // elementSizePtr_ has two special values: 0 indicates that a bundle // isn't open, and elementSizePtr_==data_ indicates that a bundle is // open but that it doesn't have a size slot (ie the outermost bundle) uint32 *elementSizePtr_; bool messageIsInProgress_; }; } // namespace osc #endif /* INCLUDED_OSC_OUTBOUND_PACKET_H */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/oscpack/osc/OscPrintReceivedElements.cpp0000644000175000017500000001562311562456103032054 0ustar dandan/* oscpack -- Open Sound Control packet manipulation library http://www.audiomulch.com/~rossb/oscpack Copyright (c) 2004-2005 Ross Bencina 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. Any person wishing to distribute modifications to the Software is requested to send the modifications to the original developer so that they can be incorporated into the canonical version. 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. */ #include "OscPrintReceivedElements.h" #include #include #include #include namespace osc{ std::ostream& operator<<( std::ostream & os, const ReceivedMessageArgument& arg ) { switch( arg.TypeTag() ){ case TRUE_TYPE_TAG: os << "bool:true"; break; case FALSE_TYPE_TAG: os << "bool:false"; break; case NIL_TYPE_TAG: os << "(Nil)"; break; case INFINITUM_TYPE_TAG: os << "(Infinitum)"; break; case INT32_TYPE_TAG: os << "int32:" << arg.AsInt32Unchecked(); break; case FLOAT_TYPE_TAG: os << "float32:" << arg.AsFloatUnchecked(); break; case CHAR_TYPE_TAG: { char s[2] = {0}; s[0] = arg.AsCharUnchecked(); os << "char:'" << s << "'"; } break; case RGBA_COLOR_TYPE_TAG: { uint32 color = arg.AsRgbaColorUnchecked(); os << "RGBA:0x" << std::hex << std::setfill('0') << std::setw(2) << (int)((color>>24) & 0xFF) << std::setw(2) << (int)((color>>16) & 0xFF) << std::setw(2) << (int)((color>>8) & 0xFF) << std::setw(2) << (int)(color & 0xFF) << std::setfill(' '); os.unsetf(std::ios::basefield); } break; case MIDI_MESSAGE_TYPE_TAG: { uint32 m = arg.AsMidiMessageUnchecked(); os << "midi (port, status, data1, data2):<<" << std::hex << std::setfill('0') << "0x" << std::setw(2) << (int)((m>>24) & 0xFF) << " 0x" << std::setw(2) << (int)((m>>16) & 0xFF) << " 0x" << std::setw(2) << (int)((m>>8) & 0xFF) << " 0x" << std::setw(2) << (int)(m & 0xFF) << std::setfill(' ') << ">>"; os.unsetf(std::ios::basefield); } break; case INT64_TYPE_TAG: os << "int64:" << arg.AsInt64Unchecked(); break; case TIME_TAG_TYPE_TAG: { os << "OSC-timetag:" << arg.AsTimeTagUnchecked(); std::time_t t = (unsigned long)( arg.AsTimeTagUnchecked() >> 32 ); // strip trailing newline from string returned by ctime const char *timeString = std::ctime( &t ); size_t len = strlen( timeString ); char *s = new char[ len + 1 ]; strcpy( s, timeString ); if( len ) s[ len - 1 ] = '\0'; os << " " << s; } break; case DOUBLE_TYPE_TAG: os << "double:" << arg.AsDoubleUnchecked(); break; case STRING_TYPE_TAG: os << "OSC-string:`" << arg.AsStringUnchecked() << "'"; break; case SYMBOL_TYPE_TAG: os << "OSC-string (symbol):`" << arg.AsSymbolUnchecked() << "'"; break; case BLOB_TYPE_TAG: { unsigned long size; const void *data; arg.AsBlobUnchecked( data, size ); os << "OSC-blob:<<" << std::hex << std::setfill('0'); unsigned char *p = (unsigned char*)data; for( unsigned long i = 0; i < size; ++i ){ os << "0x" << std::setw(2) << int(p[i]); if( i != size-1 ) os << ' '; } os.unsetf(std::ios::basefield); os << ">>" << std::setfill(' '); } break; default: os << "unknown"; } return os; } std::ostream& operator<<( std::ostream & os, const ReceivedMessage& m ) { os << "["; if( m.AddressPatternIsUInt32() ) os << m.AddressPatternAsUInt32(); else os << m.AddressPattern(); bool first = true; for( ReceivedMessage::const_iterator i = m.ArgumentsBegin(); i != m.ArgumentsEnd(); ++i ){ if( first ){ os << " "; first = false; }else{ os << ", "; } os << *i; } os << "]"; return os; } std::ostream& operator<<( std::ostream & os, const ReceivedBundle& b ) { static int indent = 0; for( int j=0; j < indent; ++j ) os << " "; os << "{ ( "; if( b.TimeTag() == 1 ) os << "immediate"; else os << b.TimeTag(); os << " )\n"; ++indent; for( ReceivedBundle::const_iterator i = b.ElementsBegin(); i != b.ElementsEnd(); ++i ){ if( i->IsBundle() ){ ReceivedBundle b(*i); os << b << "\n"; }else{ ReceivedMessage m(*i); for( int j=0; j < indent; ++j ) os << " "; os << m << "\n"; } } --indent; for( int j=0; j < indent; ++j ) os << " "; os << "}"; return os; } std::ostream& operator<<( std::ostream & os, const ReceivedPacket& p ) { if( p.IsBundle() ){ ReceivedBundle b(p); os << b << "\n"; }else{ ReceivedMessage m(p); os << m << "\n"; } return os; } } // namespace osc SuperCollider-3.6.3-Source-linux~repack/external_libraries/oscpack/osc/OscOutboundPacketStream.cpp0000644000175000017500000003542311562456103031717 0ustar dandan/* oscpack -- Open Sound Control packet manipulation library http://www.audiomulch.com/~rossb/oscpack Copyright (c) 2004-2005 Ross Bencina 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. Any person wishing to distribute modifications to the Software is requested to send the modifications to the original developer so that they can be incorporated into the canonical version. 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. */ #include "OscOutboundPacketStream.h" #include #include #include #if defined(__WIN32__) || defined(WIN32) #include // for alloca #endif #include "OscHostEndianness.h" namespace osc{ static void FromInt32( char *p, int32 x ) { #ifdef OSC_HOST_LITTLE_ENDIAN union{ osc::int32 i; char c[4]; } u; u.i = x; p[3] = u.c[0]; p[2] = u.c[1]; p[1] = u.c[2]; p[0] = u.c[3]; #else *reinterpret_cast(p) = x; #endif } static void FromUInt32( char *p, uint32 x ) { #ifdef OSC_HOST_LITTLE_ENDIAN union{ osc::uint32 i; char c[4]; } u; u.i = x; p[3] = u.c[0]; p[2] = u.c[1]; p[1] = u.c[2]; p[0] = u.c[3]; #else *reinterpret_cast(p) = x; #endif } static void FromInt64( char *p, int64 x ) { #ifdef OSC_HOST_LITTLE_ENDIAN union{ osc::int64 i; char c[8]; } u; u.i = x; p[7] = u.c[0]; p[6] = u.c[1]; p[5] = u.c[2]; p[4] = u.c[3]; p[3] = u.c[4]; p[2] = u.c[5]; p[1] = u.c[6]; p[0] = u.c[7]; #else *reinterpret_cast(p) = x; #endif } static void FromUInt64( char *p, uint64 x ) { #ifdef OSC_HOST_LITTLE_ENDIAN union{ osc::uint64 i; char c[8]; } u; u.i = x; p[7] = u.c[0]; p[6] = u.c[1]; p[5] = u.c[2]; p[4] = u.c[3]; p[3] = u.c[4]; p[2] = u.c[5]; p[1] = u.c[6]; p[0] = u.c[7]; #else *reinterpret_cast(p) = x; #endif } static inline long RoundUp4( long x ) { return ((x-1) & (~0x03L)) + 4; } OutboundPacketStream::OutboundPacketStream( char *buffer, unsigned long capacity ) : data_( buffer ) , end_( data_ + capacity ) , typeTagsCurrent_( end_ ) , messageCursor_( data_ ) , argumentCurrent_( data_ ) , elementSizePtr_( 0 ) , messageIsInProgress_( false ) { } OutboundPacketStream::~OutboundPacketStream() { } char *OutboundPacketStream::BeginElement( char *beginPtr ) { if( elementSizePtr_ == 0 ){ elementSizePtr_ = reinterpret_cast(data_); return beginPtr; }else{ // store an offset to the old element size ptr in the element size slot // we store an offset rather than the actual pointer to be 64 bit clean. *reinterpret_cast(beginPtr) = (uint32)(reinterpret_cast(elementSizePtr_) - data_); elementSizePtr_ = reinterpret_cast(beginPtr); return beginPtr + 4; } } void OutboundPacketStream::EndElement( char *endPtr ) { assert( elementSizePtr_ != 0 ); if( elementSizePtr_ == reinterpret_cast(data_) ){ elementSizePtr_ = 0; }else{ // while building an element, an offset to the containing element's // size slot is stored in the elements size slot (or a ptr to data_ // if there is no containing element). We retrieve that here uint32 *previousElementSizePtr = (uint32*)(data_ + *reinterpret_cast(elementSizePtr_)); // then we store the element size in the slot, note that the element // size does not include the size slot, hence the - 4 below. uint32 elementSize = (endPtr - reinterpret_cast(elementSizePtr_)) - 4; FromUInt32( reinterpret_cast(elementSizePtr_), elementSize ); // finally, we reset the element size ptr to the containing element elementSizePtr_ = previousElementSizePtr; } } bool OutboundPacketStream::ElementSizeSlotRequired() const { return (elementSizePtr_ != 0); } void OutboundPacketStream::CheckForAvailableBundleSpace() { unsigned long required = Size() + ((ElementSizeSlotRequired())?4:0) + 16; if( required > Capacity() ) throw OutOfBufferMemoryException(); } void OutboundPacketStream::CheckForAvailableMessageSpace( const char *addressPattern ) { // plus 4 for at least four bytes of type tag unsigned long required = Size() + ((ElementSizeSlotRequired())?4:0) + RoundUp4(strlen(addressPattern) + 1) + 4; if( required > Capacity() ) throw OutOfBufferMemoryException(); } void OutboundPacketStream::CheckForAvailableArgumentSpace( long argumentLength ) { // plus three for extra type tag, comma and null terminator unsigned long required = (argumentCurrent_ - data_) + argumentLength + RoundUp4( (end_ - typeTagsCurrent_) + 3 ); if( required > Capacity() ) throw OutOfBufferMemoryException(); } void OutboundPacketStream::Clear() { typeTagsCurrent_ = end_; messageCursor_ = data_; argumentCurrent_ = data_; elementSizePtr_ = 0; messageIsInProgress_ = false; } unsigned int OutboundPacketStream::Capacity() const { return end_ - data_; } unsigned int OutboundPacketStream::Size() const { unsigned int result = argumentCurrent_ - data_; if( IsMessageInProgress() ){ // account for the length of the type tag string. the total type tag // includes an initial comma, plus at least one terminating \0 result += RoundUp4( (end_ - typeTagsCurrent_) + 2 ); } return result; } const char *OutboundPacketStream::Data() const { return data_; } bool OutboundPacketStream::IsReady() const { return (!IsMessageInProgress() && !IsBundleInProgress()); } bool OutboundPacketStream::IsMessageInProgress() const { return messageIsInProgress_; } bool OutboundPacketStream::IsBundleInProgress() const { return (elementSizePtr_ != 0); } OutboundPacketStream& OutboundPacketStream::operator<<( const BundleInitiator& rhs ) { if( IsMessageInProgress() ) throw MessageInProgressException(); CheckForAvailableBundleSpace(); messageCursor_ = BeginElement( messageCursor_ ); memcpy( messageCursor_, "#bundle\0", 8 ); FromUInt64( messageCursor_ + 8, rhs.timeTag ); messageCursor_ += 16; argumentCurrent_ = messageCursor_; return *this; } OutboundPacketStream& OutboundPacketStream::operator<<( const BundleTerminator& rhs ) { (void) rhs; if( !IsBundleInProgress() ) throw BundleNotInProgressException(); if( IsMessageInProgress() ) throw MessageInProgressException(); EndElement( messageCursor_ ); return *this; } OutboundPacketStream& OutboundPacketStream::operator<<( const BeginMessage& rhs ) { if( IsMessageInProgress() ) throw MessageInProgressException(); CheckForAvailableMessageSpace( rhs.addressPattern ); messageCursor_ = BeginElement( messageCursor_ ); strcpy( messageCursor_, rhs.addressPattern ); unsigned long rhsLength = strlen(rhs.addressPattern); messageCursor_ += rhsLength + 1; // zero pad to 4-byte boundary unsigned long i = rhsLength + 1; while( i & 0x3 ){ *messageCursor_++ = '\0'; ++i; } argumentCurrent_ = messageCursor_; typeTagsCurrent_ = end_; messageIsInProgress_ = true; return *this; } OutboundPacketStream& OutboundPacketStream::operator<<( const MessageTerminator& rhs ) { (void) rhs; if( !IsMessageInProgress() ) throw MessageNotInProgressException(); int typeTagsCount = end_ - typeTagsCurrent_; if( typeTagsCount ){ char *tempTypeTags = (char*)alloca(typeTagsCount); memcpy( tempTypeTags, typeTagsCurrent_, typeTagsCount ); // slot size includes comma and null terminator int typeTagSlotSize = RoundUp4( typeTagsCount + 2 ); uint32 argumentsSize = argumentCurrent_ - messageCursor_; memmove( messageCursor_ + typeTagSlotSize, messageCursor_, argumentsSize ); messageCursor_[0] = ','; // copy type tags in reverse (really forward) order for( int i=0; i < typeTagsCount; ++i ) messageCursor_[i+1] = tempTypeTags[ (typeTagsCount-1) - i ]; char *p = messageCursor_ + 1 + typeTagsCount; for( int i=0; i < (typeTagSlotSize - (typeTagsCount + 1)); ++i ) *p++ = '\0'; typeTagsCurrent_ = end_; // advance messageCursor_ for next message messageCursor_ += typeTagSlotSize + argumentsSize; }else{ // send an empty type tags string memcpy( messageCursor_, ",\0\0\0", 4 ); // advance messageCursor_ for next message messageCursor_ += 4; } argumentCurrent_ = messageCursor_; EndElement( messageCursor_ ); messageIsInProgress_ = false; return *this; } OutboundPacketStream& OutboundPacketStream::operator<<( bool rhs ) { CheckForAvailableArgumentSpace(0); *(--typeTagsCurrent_) = (char)((rhs) ? TRUE_TYPE_TAG : FALSE_TYPE_TAG); return *this; } OutboundPacketStream& OutboundPacketStream::operator<<( const NilType& rhs ) { (void) rhs; CheckForAvailableArgumentSpace(0); *(--typeTagsCurrent_) = NIL_TYPE_TAG; return *this; } OutboundPacketStream& OutboundPacketStream::operator<<( const InfinitumType& rhs ) { (void) rhs; CheckForAvailableArgumentSpace(0); *(--typeTagsCurrent_) = INFINITUM_TYPE_TAG; return *this; } OutboundPacketStream& OutboundPacketStream::operator<<( int32 rhs ) { CheckForAvailableArgumentSpace(4); *(--typeTagsCurrent_) = INT32_TYPE_TAG; FromInt32( argumentCurrent_, rhs ); argumentCurrent_ += 4; return *this; } OutboundPacketStream& OutboundPacketStream::operator<<( float rhs ) { CheckForAvailableArgumentSpace(4); *(--typeTagsCurrent_) = FLOAT_TYPE_TAG; #ifdef OSC_HOST_LITTLE_ENDIAN union{ float f; char c[4]; } u; u.f = rhs; argumentCurrent_[3] = u.c[0]; argumentCurrent_[2] = u.c[1]; argumentCurrent_[1] = u.c[2]; argumentCurrent_[0] = u.c[3]; #else *reinterpret_cast(argumentCurrent_) = rhs; #endif argumentCurrent_ += 4; return *this; } OutboundPacketStream& OutboundPacketStream::operator<<( char rhs ) { CheckForAvailableArgumentSpace(4); *(--typeTagsCurrent_) = CHAR_TYPE_TAG; FromInt32( argumentCurrent_, rhs ); argumentCurrent_ += 4; return *this; } OutboundPacketStream& OutboundPacketStream::operator<<( const RgbaColor& rhs ) { CheckForAvailableArgumentSpace(4); *(--typeTagsCurrent_) = RGBA_COLOR_TYPE_TAG; FromUInt32( argumentCurrent_, rhs ); argumentCurrent_ += 4; return *this; } OutboundPacketStream& OutboundPacketStream::operator<<( const MidiMessage& rhs ) { CheckForAvailableArgumentSpace(4); *(--typeTagsCurrent_) = MIDI_MESSAGE_TYPE_TAG; FromUInt32( argumentCurrent_, rhs ); argumentCurrent_ += 4; return *this; } OutboundPacketStream& OutboundPacketStream::operator<<( int64 rhs ) { CheckForAvailableArgumentSpace(8); *(--typeTagsCurrent_) = INT64_TYPE_TAG; FromInt64( argumentCurrent_, rhs ); argumentCurrent_ += 8; return *this; } OutboundPacketStream& OutboundPacketStream::operator<<( const TimeTag& rhs ) { CheckForAvailableArgumentSpace(8); *(--typeTagsCurrent_) = TIME_TAG_TYPE_TAG; FromUInt64( argumentCurrent_, rhs ); argumentCurrent_ += 8; return *this; } OutboundPacketStream& OutboundPacketStream::operator<<( double rhs ) { CheckForAvailableArgumentSpace(8); *(--typeTagsCurrent_) = DOUBLE_TYPE_TAG; #ifdef OSC_HOST_LITTLE_ENDIAN union{ double f; char c[8]; } u; u.f = rhs; argumentCurrent_[7] = u.c[0]; argumentCurrent_[6] = u.c[1]; argumentCurrent_[5] = u.c[2]; argumentCurrent_[4] = u.c[3]; argumentCurrent_[3] = u.c[4]; argumentCurrent_[2] = u.c[5]; argumentCurrent_[1] = u.c[6]; argumentCurrent_[0] = u.c[7]; #else *reinterpret_cast(argumentCurrent_) = rhs; #endif argumentCurrent_ += 8; return *this; } OutboundPacketStream& OutboundPacketStream::operator<<( const char *rhs ) { CheckForAvailableArgumentSpace( RoundUp4(strlen(rhs) + 1) ); *(--typeTagsCurrent_) = STRING_TYPE_TAG; strcpy( argumentCurrent_, rhs ); unsigned long rhsLength = strlen(rhs); argumentCurrent_ += rhsLength + 1; // zero pad to 4-byte boundary unsigned long i = rhsLength + 1; while( i & 0x3 ){ *argumentCurrent_++ = '\0'; ++i; } return *this; } OutboundPacketStream& OutboundPacketStream::operator<<( const Symbol& rhs ) { CheckForAvailableArgumentSpace( RoundUp4(strlen(rhs) + 1) ); *(--typeTagsCurrent_) = SYMBOL_TYPE_TAG; strcpy( argumentCurrent_, rhs ); unsigned long rhsLength = strlen(rhs); argumentCurrent_ += rhsLength + 1; // zero pad to 4-byte boundary unsigned long i = rhsLength + 1; while( i & 0x3 ){ *argumentCurrent_++ = '\0'; ++i; } return *this; } OutboundPacketStream& OutboundPacketStream::operator<<( const Blob& rhs ) { CheckForAvailableArgumentSpace( 4 + RoundUp4(rhs.size) ); *(--typeTagsCurrent_) = BLOB_TYPE_TAG; FromUInt32( argumentCurrent_, rhs.size ); argumentCurrent_ += 4; memcpy( argumentCurrent_, rhs.data, rhs.size ); argumentCurrent_ += rhs.size; // zero pad to 4-byte boundary unsigned long i = rhs.size; while( i & 0x3 ){ *argumentCurrent_++ = '\0'; ++i; } return *this; } OutboundPacketStream& OutboundPacketStream::operator<<( const ArrayStart& rhs ) { (void) rhs; CheckForAvailableArgumentSpace(0); *(--typeTagsCurrent_) = ARRAY_START_TYPE_TAG; return *this; } OutboundPacketStream& OutboundPacketStream::operator<<( const ArrayEnd& rhs ) { (void) rhs; CheckForAvailableArgumentSpace(0); *(--typeTagsCurrent_) = ARRAY_END_TYPE_TAG; return *this; } } // namespace osc SuperCollider-3.6.3-Source-linux~repack/external_libraries/oscpack/osc/OscReceivedElements.cpp0000644000175000017500000004340211644345016031034 0ustar dandan/* oscpack -- Open Sound Control packet manipulation library http://www.audiomulch.com/~rossb/oscpack Copyright (c) 2004-2005 Ross Bencina 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. Any person wishing to distribute modifications to the Software is requested to send the modifications to the original developer so that they can be incorporated into the canonical version. 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. */ #include "OscReceivedElements.h" #include #include "OscHostEndianness.h" namespace osc{ // return the first 4 byte boundary after the end of a str4 // be careful about calling this version if you don't know whether // the string is terminated correctly. static inline const char* FindStr4End( const char *p ) { if( p[0] == '\0' ) // special case for SuperCollider integer address pattern return p + 4; p += 3; while( *p ) p += 4; return p + 1; } // return the first 4 byte boundary after the end of a str4 // returns 0 if p == end or if the string is unterminated static inline const char* FindStr4End( const char *p, const char *end ) { if( p >= end ) return 0; if( p[0] == '\0' ) // special case for SuperCollider integer address pattern return p + 4; p += 3; end -= 1; while( p < end && *p ) p += 4; if( *p ) return 0; else return p + 1; } static inline unsigned long RoundUp4( unsigned long x ) { unsigned long remainder = x & 0x3UL; if( remainder ) return x + (4 - remainder); else return x; } static inline int32 ToInt32( const char *p ) { #ifdef OSC_HOST_LITTLE_ENDIAN union{ osc::int32 i; char c[4]; } u; u.c[0] = p[3]; u.c[1] = p[2]; u.c[2] = p[1]; u.c[3] = p[0]; return u.i; #else return *(int32*)p; #endif } static inline uint32 ToUInt32( const char *p ) { #ifdef OSC_HOST_LITTLE_ENDIAN union{ osc::uint32 i; char c[4]; } u; u.c[0] = p[3]; u.c[1] = p[2]; u.c[2] = p[1]; u.c[3] = p[0]; return u.i; #else return *(uint32*)p; #endif } int64 ToInt64( const char *p ) { #ifdef OSC_HOST_LITTLE_ENDIAN union{ osc::int64 i; char c[8]; } u; u.c[0] = p[7]; u.c[1] = p[6]; u.c[2] = p[5]; u.c[3] = p[4]; u.c[4] = p[3]; u.c[5] = p[2]; u.c[6] = p[1]; u.c[7] = p[0]; return u.i; #else return *(int64*)p; #endif } uint64 ToUInt64( const char *p ) { #ifdef OSC_HOST_LITTLE_ENDIAN union{ osc::uint64 i; char c[8]; } u; u.c[0] = p[7]; u.c[1] = p[6]; u.c[2] = p[5]; u.c[3] = p[4]; u.c[4] = p[3]; u.c[5] = p[2]; u.c[6] = p[1]; u.c[7] = p[0]; return u.i; #else return *(uint64*)p; #endif } //------------------------------------------------------------------------------ bool ReceivedPacket::IsBundle() const { return (Size() > 0 && Contents()[0] == '#'); } //------------------------------------------------------------------------------ bool ReceivedBundleElement::IsBundle() const { return (Size() > 0 && Contents()[0] == '#'); } int32 ReceivedBundleElement::Size() const { return ToUInt32( size_ ); } //------------------------------------------------------------------------------ bool ReceivedMessageArgument::AsBool() const { if( !typeTag_ ) throw MissingArgumentException(); else if( *typeTag_ == TRUE_TYPE_TAG ) return true; else if( *typeTag_ == FALSE_TYPE_TAG ) return false; else throw WrongArgumentTypeException(); } bool ReceivedMessageArgument::AsBoolUnchecked() const { if( !typeTag_ ) throw MissingArgumentException(); else if( *typeTag_ == TRUE_TYPE_TAG ) return true; else return false; } int32 ReceivedMessageArgument::AsInt32() const { if( !typeTag_ ) throw MissingArgumentException(); else if( *typeTag_ == INT32_TYPE_TAG ) return AsInt32Unchecked(); else throw WrongArgumentTypeException(); } int32 ReceivedMessageArgument::AsInt32Unchecked() const { #ifdef OSC_HOST_LITTLE_ENDIAN union{ osc::int32 i; char c[4]; } u; u.c[0] = argument_[3]; u.c[1] = argument_[2]; u.c[2] = argument_[1]; u.c[3] = argument_[0]; return u.i; #else return *(int32*)argument_; #endif } float ReceivedMessageArgument::AsFloat() const { if( !typeTag_ ) throw MissingArgumentException(); else if( *typeTag_ == FLOAT_TYPE_TAG ) return AsFloatUnchecked(); else throw WrongArgumentTypeException(); } float ReceivedMessageArgument::AsFloatUnchecked() const { #ifdef OSC_HOST_LITTLE_ENDIAN union{ float f; char c[4]; } u; u.c[0] = argument_[3]; u.c[1] = argument_[2]; u.c[2] = argument_[1]; u.c[3] = argument_[0]; return u.f; #else return *(float*)argument_; #endif } char ReceivedMessageArgument::AsChar() const { if( !typeTag_ ) throw MissingArgumentException(); else if( *typeTag_ == CHAR_TYPE_TAG ) return AsCharUnchecked(); else throw WrongArgumentTypeException(); } char ReceivedMessageArgument::AsCharUnchecked() const { return (char)ToInt32( argument_ ); } uint32 ReceivedMessageArgument::AsRgbaColor() const { if( !typeTag_ ) throw MissingArgumentException(); else if( *typeTag_ == RGBA_COLOR_TYPE_TAG ) return AsRgbaColorUnchecked(); else throw WrongArgumentTypeException(); } uint32 ReceivedMessageArgument::AsRgbaColorUnchecked() const { return ToUInt32( argument_ ); } uint32 ReceivedMessageArgument::AsMidiMessage() const { if( !typeTag_ ) throw MissingArgumentException(); else if( *typeTag_ == MIDI_MESSAGE_TYPE_TAG ) return AsMidiMessageUnchecked(); else throw WrongArgumentTypeException(); } uint32 ReceivedMessageArgument::AsMidiMessageUnchecked() const { return ToUInt32( argument_ ); } int64 ReceivedMessageArgument::AsInt64() const { if( !typeTag_ ) throw MissingArgumentException(); else if( *typeTag_ == INT64_TYPE_TAG ) return AsInt64Unchecked(); else throw WrongArgumentTypeException(); } int64 ReceivedMessageArgument::AsInt64Unchecked() const { return ToInt64( argument_ ); } uint64 ReceivedMessageArgument::AsTimeTag() const { if( !typeTag_ ) throw MissingArgumentException(); else if( *typeTag_ == TIME_TAG_TYPE_TAG ) return AsTimeTagUnchecked(); else throw WrongArgumentTypeException(); } uint64 ReceivedMessageArgument::AsTimeTagUnchecked() const { return ToUInt64( argument_ ); } double ReceivedMessageArgument::AsDouble() const { if( !typeTag_ ) throw MissingArgumentException(); else if( *typeTag_ == DOUBLE_TYPE_TAG ) return AsDoubleUnchecked(); else throw WrongArgumentTypeException(); } double ReceivedMessageArgument::AsDoubleUnchecked() const { #ifdef OSC_HOST_LITTLE_ENDIAN union{ double d; char c[8]; } u; u.c[0] = argument_[7]; u.c[1] = argument_[6]; u.c[2] = argument_[5]; u.c[3] = argument_[4]; u.c[4] = argument_[3]; u.c[5] = argument_[2]; u.c[6] = argument_[1]; u.c[7] = argument_[0]; return u.d; #else return *(double*)argument_; #endif } const char* ReceivedMessageArgument::AsString() const { if( !typeTag_ ) throw MissingArgumentException(); else if( *typeTag_ == STRING_TYPE_TAG ) return argument_; else throw WrongArgumentTypeException(); } const char* ReceivedMessageArgument::AsSymbol() const { if( !typeTag_ ) throw MissingArgumentException(); else if( *typeTag_ == SYMBOL_TYPE_TAG ) return argument_; else throw WrongArgumentTypeException(); } void ReceivedMessageArgument::AsBlob( const void*& data, unsigned long& size ) const { if( !typeTag_ ) throw MissingArgumentException(); else if( *typeTag_ == BLOB_TYPE_TAG ) AsBlobUnchecked( data, size ); else throw WrongArgumentTypeException(); } void ReceivedMessageArgument::AsBlobUnchecked( const void*& data, unsigned long& size ) const { size = ToUInt32( argument_ ); data = (void*)(argument_+4); } std::size_t ReceivedMessageArgument::ArraySize() const { std::size_t ret = 0; unsigned int level = 0; const char * type_tag = typeTag_ + 1; while( *type_tag ) { switch (*type_tag++) { case ARRAY_START_TYPE_TAG: level += 1; break; case ARRAY_END_TYPE_TAG: if (level == 0) return ret; level -= 1; break; default: ret += 1; } } return ret; } //------------------------------------------------------------------------------ void ReceivedMessageArgumentIterator::Advance() { if( !value_.typeTag_ ) return; switch( *value_.typeTag_++ ){ case '\0': // don't advance past end --value_.typeTag_; break; case TRUE_TYPE_TAG: case FALSE_TYPE_TAG: case NIL_TYPE_TAG: case INFINITUM_TYPE_TAG: case ARRAY_START_TYPE_TAG: case ARRAY_END_TYPE_TAG: // zero length break; case INT32_TYPE_TAG: case FLOAT_TYPE_TAG: case CHAR_TYPE_TAG: case RGBA_COLOR_TYPE_TAG: case MIDI_MESSAGE_TYPE_TAG: value_.argument_ += 4; break; case INT64_TYPE_TAG: case TIME_TAG_TYPE_TAG: case DOUBLE_TYPE_TAG: value_.argument_ += 8; break; case STRING_TYPE_TAG: case SYMBOL_TYPE_TAG: // we use the unsafe function FindStr4End(char*) here because all of // the arguments have already been validated in // ReceivedMessage::Init() below. value_.argument_ = FindStr4End( value_.argument_ ); break; case BLOB_TYPE_TAG: { uint32 blobSize = ToUInt32( value_.argument_ ); value_.argument_ = value_.argument_ + 4 + RoundUp4( (unsigned long)blobSize ); } break; default: // unknown type tag // don't advance --value_.typeTag_; break; } } //------------------------------------------------------------------------------ ReceivedMessage::ReceivedMessage( const ReceivedPacket& packet ) : addressPattern_( packet.Contents() ) { Init( packet.Contents(), packet.Size() ); } ReceivedMessage::ReceivedMessage( const ReceivedBundleElement& bundleElement ) : addressPattern_( bundleElement.Contents() ) { Init( bundleElement.Contents(), bundleElement.Size() ); } bool ReceivedMessage::AddressPatternIsUInt32() const { return (addressPattern_[0] == '\0'); } uint32 ReceivedMessage::AddressPatternAsUInt32() const { return ToUInt32( addressPattern_ ); } void ReceivedMessage::Init( const char *message, unsigned long size ) { if( size == 0 ) throw MalformedMessageException( "zero length messages not permitted" ); if( (size & 0x03L) != 0 ) throw MalformedMessageException( "message size must be multiple of four" ); const char *end = message + size; typeTagsBegin_ = FindStr4End( addressPattern_, end ); if( typeTagsBegin_ == 0 ){ // address pattern was not terminated before end throw MalformedMessageException( "unterminated address pattern" ); } if( typeTagsBegin_ == end ){ // message consists of only the address pattern - no arguments or type tags. typeTagsBegin_ = 0; typeTagsEnd_ = 0; arguments_ = 0; }else{ if( *typeTagsBegin_ != ',' ) throw MalformedMessageException( "type tags not present" ); if( *(typeTagsBegin_ + 1) == '\0' ){ // zero length type tags typeTagsBegin_ = 0; typeTagsEnd_ = 0; arguments_ = 0; }else{ // check that all arguments are present and well formed arguments_ = FindStr4End( typeTagsBegin_, end ); if( arguments_ == 0 ){ throw MalformedMessageException( "type tags were not terminated before end of message" ); } ++typeTagsBegin_; // advance past initial ',' const char *typeTag = typeTagsBegin_; const char *argument = arguments_; do{ switch( *typeTag ){ case TRUE_TYPE_TAG: case FALSE_TYPE_TAG: case NIL_TYPE_TAG: case INFINITUM_TYPE_TAG: case ARRAY_START_TYPE_TAG: case ARRAY_END_TYPE_TAG: // zero length break; case INT32_TYPE_TAG: case FLOAT_TYPE_TAG: case CHAR_TYPE_TAG: case RGBA_COLOR_TYPE_TAG: case MIDI_MESSAGE_TYPE_TAG: if( argument == end ) throw MalformedMessageException( "arguments exceed message size" ); argument += 4; if( argument > end ) throw MalformedMessageException( "arguments exceed message size" ); break; case INT64_TYPE_TAG: case TIME_TAG_TYPE_TAG: case DOUBLE_TYPE_TAG: if( argument == end ) throw MalformedMessageException( "arguments exceed message size" ); argument += 8; if( argument > end ) throw MalformedMessageException( "arguments exceed message size" ); break; case STRING_TYPE_TAG: case SYMBOL_TYPE_TAG: if( argument == end ) throw MalformedMessageException( "arguments exceed message size" ); argument = FindStr4End( argument, end ); if( argument == 0 ) throw MalformedMessageException( "unterminated string argument" ); break; case BLOB_TYPE_TAG: { if( argument + 4 > end ) MalformedMessageException( "arguments exceed message size" ); uint32 blobSize = ToUInt32( argument ); argument = argument + 4 + RoundUp4( (unsigned long)blobSize ); if( argument > end ) MalformedMessageException( "arguments exceed message size" ); } break; default: throw MalformedMessageException( "unknown type tag" ); // not handled: // [ Indicates the beginning of an array. The tags following are for // data in the Array until a close brace tag is reached. // ] Indicates the end of an array. } }while( *++typeTag != '\0' ); typeTagsEnd_ = typeTag; } } } //------------------------------------------------------------------------------ ReceivedBundle::ReceivedBundle( const ReceivedPacket& packet ) : elementCount_( 0 ) { Init( packet.Contents(), packet.Size() ); } ReceivedBundle::ReceivedBundle( const ReceivedBundleElement& bundleElement ) : elementCount_( 0 ) { Init( bundleElement.Contents(), bundleElement.Size() ); } void ReceivedBundle::Init( const char *bundle, unsigned long size ) { if( size < 16 ) throw MalformedBundleException( "packet too short for bundle" ); if( (size & 0x03L) != 0 ) throw MalformedBundleException( "bundle size must be multiple of four" ); if( bundle[0] != '#' || bundle[1] != 'b' || bundle[2] != 'u' || bundle[3] != 'n' || bundle[4] != 'd' || bundle[5] != 'l' || bundle[6] != 'e' || bundle[7] != '\0' ) throw MalformedBundleException( "bad bundle address pattern" ); end_ = bundle + size; timeTag_ = bundle + 8; const char *p = timeTag_ + 8; while( p < end_ ){ if( p + 4 > end_ ) throw MalformedBundleException( "packet too short for elementSize" ); uint32 elementSize = ToUInt32( p ); if( (elementSize & 0x03L) != 0 ) throw MalformedBundleException( "bundle element size must be multiple of four" ); p += 4 + elementSize; if( p > end_ ) throw MalformedBundleException( "packet too short for bundle element" ); ++elementCount_; } if( p != end_ ) throw MalformedBundleException( "bundle contents " ); } uint64 ReceivedBundle::TimeTag() const { return ToUInt64( timeTag_ ); } } // namespace osc SuperCollider-3.6.3-Source-linux~repack/external_libraries/oscpack/osc/OscPacketListener.h0000644000175000017500000000505411562456103030173 0ustar dandan/* oscpack -- Open Sound Control packet manipulation library http://www.audiomulch.com/~rossb/oscpack Copyright (c) 2004-2005 Ross Bencina 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. Any person wishing to distribute modifications to the Software is requested to send the modifications to the original developer so that they can be incorporated into the canonical version. 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. */ #ifndef INCLUDED_OSCPACKETLISTENER_H #define INCLUDED_OSCPACKETLISTENER_H #include "OscReceivedElements.h" #include "../ip/PacketListener.h" namespace osc{ class OscPacketListener : public PacketListener{ protected: virtual void ProcessBundle( const osc::ReceivedBundle& b, const IpEndpointName& remoteEndpoint ) { // ignore bundle time tag for now for( ReceivedBundle::const_iterator i = b.ElementsBegin(); i != b.ElementsEnd(); ++i ){ if( i->IsBundle() ) ProcessBundle( ReceivedBundle(*i), remoteEndpoint ); else ProcessMessage( ReceivedMessage(*i), remoteEndpoint ); } } virtual void ProcessMessage( const osc::ReceivedMessage& m, const IpEndpointName& remoteEndpoint ) = 0; public: virtual void ProcessPacket( const char *data, int size, const IpEndpointName& remoteEndpoint ) { osc::ReceivedPacket p( data, size ); if( p.IsBundle() ) ProcessBundle( ReceivedBundle(p), remoteEndpoint ); else ProcessMessage( ReceivedMessage(p), remoteEndpoint ); } }; } // namespace osc #endif /* INCLUDED_OSCPACKETLISTENER_H */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/oscpack/osc/OscException.h0000644000175000017500000000374011562456103027214 0ustar dandan/* oscpack -- Open Sound Control packet manipulation library http://www.audiomulch.com/~rossb/oscpack Copyright (c) 2004-2005 Ross Bencina 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. Any person wishing to distribute modifications to the Software is requested to send the modifications to the original developer so that they can be incorporated into the canonical version. 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. */ #ifndef INCLUDED_OSC_EXCEPTION_H #define INCLUDED_OSC_EXCEPTION_H #include namespace osc{ class Exception : public std::exception { const char *what_; public: Exception() throw() {} Exception( const Exception& src ) throw() : what_( src.what_ ) {} Exception( const char *w ) throw() : what_( w ) {} Exception& operator=( const Exception& src ) throw() { what_ = src.what_; return *this; } virtual ~Exception() throw() {} virtual const char* what() const throw() { return what_; } }; } // namespace osc #endif /* INCLUDED_OSC_EXCEPTION_H */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/oscpack/osc/OscTypes.h0000644000175000017500000001023011562456103026352 0ustar dandan/* oscpack -- Open Sound Control packet manipulation library http://www.audiomulch.com/~rossb/oscpack Copyright (c) 2004-2005 Ross Bencina 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. Any person wishing to distribute modifications to the Software is requested to send the modifications to the original developer so that they can be incorporated into the canonical version. 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. */ #ifndef INCLUDED_OSCTYPES_H #define INCLUDED_OSCTYPES_H namespace osc{ // basic types #if defined(__BORLANDC__) || defined(_MSC_VER) typedef __int64 int64; typedef unsigned __int64 uint64; #elif defined(__x86_64__) || defined(_M_X64) typedef long int64; typedef unsigned long uint64; #else typedef long long int64; typedef unsigned long long uint64; #endif #if defined(__x86_64__) || defined(_M_X64) typedef signed int int32; typedef unsigned int uint32; #else typedef signed long int32; typedef unsigned long uint32; #endif enum TypeTagValues { TRUE_TYPE_TAG = 'T', FALSE_TYPE_TAG = 'F', NIL_TYPE_TAG = 'N', INFINITUM_TYPE_TAG = 'I', INT32_TYPE_TAG = 'i', FLOAT_TYPE_TAG = 'f', CHAR_TYPE_TAG = 'c', RGBA_COLOR_TYPE_TAG = 'r', MIDI_MESSAGE_TYPE_TAG = 'm', INT64_TYPE_TAG = 'h', TIME_TAG_TYPE_TAG = 't', DOUBLE_TYPE_TAG = 'd', STRING_TYPE_TAG = 's', SYMBOL_TYPE_TAG = 'S', BLOB_TYPE_TAG = 'b', ARRAY_START_TYPE_TAG = '[', ARRAY_END_TYPE_TAG = ']', }; // i/o manipulators used for streaming interfaces struct BundleInitiator{ explicit BundleInitiator( uint64 timeTag_ ) : timeTag( timeTag_ ) {} uint64 timeTag; }; extern BundleInitiator BeginBundleImmediate; inline BundleInitiator BeginBundle( uint64 timeTag=1 ) { return BundleInitiator(timeTag); } struct BundleTerminator{ }; extern BundleTerminator EndBundle; struct BeginMessage{ explicit BeginMessage( const char *addressPattern_ ) : addressPattern( addressPattern_ ) {} const char *addressPattern; }; struct MessageTerminator{ }; extern MessageTerminator EndMessage; // osc specific types. they are defined as structs so they can be used // as separately identifiable types with the streaming operators. struct NilType{ }; extern NilType Nil; struct InfinitumType{ }; extern InfinitumType Infinitum; struct RgbaColor{ RgbaColor() {} explicit RgbaColor( uint32 value_ ) : value( value_ ) {} uint32 value; operator uint32() const { return value; } }; struct MidiMessage{ MidiMessage() {} explicit MidiMessage( uint32 value_ ) : value( value_ ) {} uint32 value; operator uint32() const { return value; } }; struct TimeTag{ TimeTag() {} explicit TimeTag( uint64 value_ ) : value( value_ ) {} uint64 value; operator uint64() const { return value; } }; struct Symbol{ Symbol() {} explicit Symbol( const char* value_ ) : value( value_ ) {} const char* value; operator const char *() const { return value; } }; struct Blob{ Blob() {} explicit Blob( const void* data_, unsigned long size_ ) : data( data_ ), size( size_ ) {} const void* data; unsigned long size; }; struct ArrayStart { }; struct ArrayEnd { }; } // namespace osc #endif /* INCLUDED_OSCTYPES_H */ ././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootSuperCollider-3.6.3-Source-linux~repack/external_libraries/oscpack/osc/MessageMappingOscPacketListener.hSuperCollider-3.6.3-Source-linux~repack/external_libraries/oscpack/osc/MessageMappingOscPacketListen0000644000175000017500000000506711562456103032243 0ustar dandan/* oscpack -- Open Sound Control packet manipulation library http://www.audiomulch.com/~rossb/oscpack Copyright (c) 2004-2005 Ross Bencina 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. Any person wishing to distribute modifications to the Software is requested to send the modifications to the original developer so that they can be incorporated into the canonical version. 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. */ #ifndef INCLUDED_MESSAGEMAPPINGOSCPACKETLISTENER_H #define INCLUDED_MESSAGEMAPPINGOSCPACKETLISTENER_H #include #include #include "OscPacketListener.h" namespace osc{ template< class T > class MessageMappingOscPacketListener : public OscPacketListener{ public: typedef void (T::*function_type)(const osc::ReceivedMessage&, const IpEndpointName&); protected: void RegisterMessageFunction( const char *addressPattern, function_type f ) { functions_.insert( std::make_pair( addressPattern, f ) ); } virtual void ProcessMessage( const osc::ReceivedMessage& m, const IpEndpointName& remoteEndpoint ) { typename function_map_type::iterator i = functions_.find( m.AddressPattern() ); if( i != functions_.end() ) (dynamic_cast(this)->*(i->second))( m, remoteEndpoint ); } private: struct cstr_compare{ bool operator()( const char *lhs, const char *rhs ) const { return strcmp( lhs, rhs ) < 0; } }; typedef std::map function_map_type; function_map_type functions_; }; } // namespace osc #endif /* INCLUDED_MESSAGEMAPPINGOSCPACKETLISTENER_H */SuperCollider-3.6.3-Source-linux~repack/external_libraries/oscpack/osc/OscReceivedElements.h0000644000175000017500000003176411562456103030510 0ustar dandan/* oscpack -- Open Sound Control packet manipulation library http://www.audiomulch.com/~rossb/oscpack Copyright (c) 2004-2005 Ross Bencina 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. Any person wishing to distribute modifications to the Software is requested to send the modifications to the original developer so that they can be incorporated into the canonical version. 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. */ #ifndef INCLUDED_OSCRECEIVEDELEMENTS_H #define INCLUDED_OSCRECEIVEDELEMENTS_H #include #include "OscTypes.h" #include "OscException.h" namespace osc{ class MalformedMessageException : public Exception{ public: MalformedMessageException( const char *w="malformed message" ) : Exception( w ) {} }; class MalformedBundleException : public Exception{ public: MalformedBundleException( const char *w="malformed bundle" ) : Exception( w ) {} }; class WrongArgumentTypeException : public Exception{ public: WrongArgumentTypeException( const char *w="wrong argument type" ) : Exception( w ) {} }; class MissingArgumentException : public Exception{ public: MissingArgumentException( const char *w="missing argument" ) : Exception( w ) {} }; class ExcessArgumentException : public Exception{ public: ExcessArgumentException( const char *w="too many arguments" ) : Exception( w ) {} }; class ReceivedPacket{ public: ReceivedPacket( const char *contents, int32 size ) : contents_( contents ) , size_( size ) {} bool IsMessage() const { return !IsBundle(); } bool IsBundle() const; int32 Size() const { return size_; } const char *Contents() const { return contents_; } private: const char *contents_; int32 size_; }; class ReceivedBundleElement{ public: ReceivedBundleElement( const char *size ) : size_( size ) {} friend class ReceivedBundleElementIterator; bool IsMessage() const { return !IsBundle(); } bool IsBundle() const; int32 Size() const; const char *Contents() const { return size_ + 4; } private: const char *size_; }; class ReceivedBundleElementIterator{ public: ReceivedBundleElementIterator( const char *sizePtr ) : value_( sizePtr ) {} ReceivedBundleElementIterator operator++() { Advance(); return *this; } ReceivedBundleElementIterator operator++(int) { ReceivedBundleElementIterator old( *this ); Advance(); return old; } const ReceivedBundleElement& operator*() const { return value_; } const ReceivedBundleElement* operator->() const { return &value_; } friend bool operator==(const ReceivedBundleElementIterator& lhs, const ReceivedBundleElementIterator& rhs ); private: ReceivedBundleElement value_; void Advance() { value_.size_ = value_.Contents() + value_.Size(); } bool IsEqualTo( const ReceivedBundleElementIterator& rhs ) const { return value_.size_ == rhs.value_.size_; } }; inline bool operator==(const ReceivedBundleElementIterator& lhs, const ReceivedBundleElementIterator& rhs ) { return lhs.IsEqualTo( rhs ); } inline bool operator!=(const ReceivedBundleElementIterator& lhs, const ReceivedBundleElementIterator& rhs ) { return !( lhs == rhs ); } class ReceivedMessageArgument{ public: ReceivedMessageArgument( const char *typeTag, const char *argument ) : typeTag_( typeTag ) , argument_( argument ) {} friend class ReceivedMessageArgumentIterator; const char TypeTag() const { return *typeTag_; } // the unchecked methods below don't check whether the argument actually // is of the specified type. they should only be used if you've already // checked the type tag or the associated IsType() method. bool IsBool() const { return *typeTag_ == TRUE_TYPE_TAG || *typeTag_ == FALSE_TYPE_TAG; } bool AsBool() const; bool AsBoolUnchecked() const; bool IsNil() const { return *typeTag_ == NIL_TYPE_TAG; } bool IsInfinitum() const { return *typeTag_ == INFINITUM_TYPE_TAG; } bool IsInt32() const { return *typeTag_ == INT32_TYPE_TAG; } int32 AsInt32() const; int32 AsInt32Unchecked() const; bool IsFloat() const { return *typeTag_ == FLOAT_TYPE_TAG; } float AsFloat() const; float AsFloatUnchecked() const; bool IsChar() const { return *typeTag_ == CHAR_TYPE_TAG; } char AsChar() const; char AsCharUnchecked() const; bool IsRgbaColor() const { return *typeTag_ == RGBA_COLOR_TYPE_TAG; } uint32 AsRgbaColor() const; uint32 AsRgbaColorUnchecked() const; bool IsMidiMessage() const { return *typeTag_ == MIDI_MESSAGE_TYPE_TAG; } uint32 AsMidiMessage() const; uint32 AsMidiMessageUnchecked() const; bool IsInt64() const { return *typeTag_ == INT64_TYPE_TAG; } int64 AsInt64() const; int64 AsInt64Unchecked() const; bool IsTimeTag() const { return *typeTag_ == TIME_TAG_TYPE_TAG; } uint64 AsTimeTag() const; uint64 AsTimeTagUnchecked() const; bool IsDouble() const { return *typeTag_ == DOUBLE_TYPE_TAG; } double AsDouble() const; double AsDoubleUnchecked() const; bool IsString() const { return *typeTag_ == STRING_TYPE_TAG; } const char* AsString() const; const char* AsStringUnchecked() const { return argument_; } bool IsSymbol() const { return *typeTag_ == SYMBOL_TYPE_TAG; } const char* AsSymbol() const; const char* AsSymbolUnchecked() const { return argument_; } bool IsBlob() const { return *typeTag_ == BLOB_TYPE_TAG; } void AsBlob( const void*& data, unsigned long& size ) const; void AsBlobUnchecked( const void*& data, unsigned long& size ) const; bool IsArrayStart() const { return *typeTag_ == ARRAY_START_TYPE_TAG; } bool IsArrayEnd() const { return *typeTag_ == ARRAY_END_TYPE_TAG; } std::size_t ArraySize() const; private: const char *typeTag_; const char *argument_; }; class ReceivedMessageArgumentIterator{ public: ReceivedMessageArgumentIterator( const char *typeTags, const char *arguments ) : value_( typeTags, arguments ) {} ReceivedMessageArgumentIterator operator++() { Advance(); return *this; } ReceivedMessageArgumentIterator operator++(int) { ReceivedMessageArgumentIterator old( *this ); Advance(); return old; } const ReceivedMessageArgument& operator*() const { return value_; } const ReceivedMessageArgument* operator->() const { return &value_; } friend bool operator==(const ReceivedMessageArgumentIterator& lhs, const ReceivedMessageArgumentIterator& rhs ); private: ReceivedMessageArgument value_; void Advance(); bool IsEqualTo( const ReceivedMessageArgumentIterator& rhs ) const { return value_.typeTag_ == rhs.value_.typeTag_; } }; inline bool operator==(const ReceivedMessageArgumentIterator& lhs, const ReceivedMessageArgumentIterator& rhs ) { return lhs.IsEqualTo( rhs ); } inline bool operator!=(const ReceivedMessageArgumentIterator& lhs, const ReceivedMessageArgumentIterator& rhs ) { return !( lhs == rhs ); } class ReceivedMessageArgumentStream{ friend class ReceivedMessage; ReceivedMessageArgumentStream( const ReceivedMessageArgumentIterator& begin, const ReceivedMessageArgumentIterator& end ) : p_( begin ) , end_( end ) {} ReceivedMessageArgumentIterator p_, end_; public: // end of stream bool Eos() const { return p_ == end_; } ReceivedMessageArgumentStream& operator>>( bool& rhs ) { if( Eos() ) throw MissingArgumentException(); rhs = (*p_++).AsBool(); return *this; } // not sure if it would be useful to stream Nil and Infinitum // for now it's not possible // same goes for array boundaries ReceivedMessageArgumentStream& operator>>( int32& rhs ) { if( Eos() ) throw MissingArgumentException(); rhs = (*p_++).AsInt32(); return *this; } ReceivedMessageArgumentStream& operator>>( float& rhs ) { if( Eos() ) throw MissingArgumentException(); rhs = (*p_++).AsFloat(); return *this; } ReceivedMessageArgumentStream& operator>>( char& rhs ) { if( Eos() ) throw MissingArgumentException(); rhs = (*p_++).AsChar(); return *this; } ReceivedMessageArgumentStream& operator>>( RgbaColor& rhs ) { if( Eos() ) throw MissingArgumentException(); rhs.value = (*p_++).AsRgbaColor(); return *this; } ReceivedMessageArgumentStream& operator>>( MidiMessage& rhs ) { if( Eos() ) throw MissingArgumentException(); rhs.value = (*p_++).AsMidiMessage(); return *this; } ReceivedMessageArgumentStream& operator>>( int64& rhs ) { if( Eos() ) throw MissingArgumentException(); rhs = (*p_++).AsInt64(); return *this; } ReceivedMessageArgumentStream& operator>>( TimeTag& rhs ) { if( Eos() ) throw MissingArgumentException(); rhs.value = (*p_++).AsTimeTag(); return *this; } ReceivedMessageArgumentStream& operator>>( double& rhs ) { if( Eos() ) throw MissingArgumentException(); rhs = (*p_++).AsDouble(); return *this; } ReceivedMessageArgumentStream& operator>>( Blob& rhs ) { if( Eos() ) throw MissingArgumentException(); (*p_++).AsBlob( rhs.data, rhs.size ); return *this; } ReceivedMessageArgumentStream& operator>>( const char*& rhs ) { if( Eos() ) throw MissingArgumentException(); rhs = (*p_++).AsString(); return *this; } ReceivedMessageArgumentStream& operator>>( Symbol& rhs ) { if( Eos() ) throw MissingArgumentException(); rhs.value = (*p_++).AsSymbol(); return *this; } ReceivedMessageArgumentStream& operator>>( MessageTerminator& rhs ) { if( !Eos() ) throw ExcessArgumentException(); return *this; } }; class ReceivedMessage{ void Init( const char *bundle, unsigned long size ); public: explicit ReceivedMessage( const ReceivedPacket& packet ); explicit ReceivedMessage( const ReceivedBundleElement& bundleElement ); const char *AddressPattern() const { return addressPattern_; } // Support for non-standad SuperCollider integer address patterns: bool AddressPatternIsUInt32() const; uint32 AddressPatternAsUInt32() const; unsigned long ArgumentCount() const { return static_cast(typeTagsEnd_ - typeTagsBegin_); } const char *TypeTags() const { return typeTagsBegin_; } typedef ReceivedMessageArgumentIterator const_iterator; ReceivedMessageArgumentIterator ArgumentsBegin() const { return ReceivedMessageArgumentIterator( typeTagsBegin_, arguments_ ); } ReceivedMessageArgumentIterator ArgumentsEnd() const { return ReceivedMessageArgumentIterator( typeTagsEnd_, 0 ); } ReceivedMessageArgumentStream ArgumentStream() const { return ReceivedMessageArgumentStream( ArgumentsBegin(), ArgumentsEnd() ); } private: const char *addressPattern_; const char *typeTagsBegin_; const char *typeTagsEnd_; const char *arguments_; }; class ReceivedBundle{ void Init( const char *message, unsigned long size ); public: explicit ReceivedBundle( const ReceivedPacket& packet ); explicit ReceivedBundle( const ReceivedBundleElement& bundleElement ); uint64 TimeTag() const; unsigned long ElementCount() const { return elementCount_; } typedef ReceivedBundleElementIterator const_iterator; ReceivedBundleElementIterator ElementsBegin() const { return ReceivedBundleElementIterator( timeTag_ + 8 ); } ReceivedBundleElementIterator ElementsEnd() const { return ReceivedBundleElementIterator( end_ ); } private: const char *timeTag_; const char *end_; unsigned long elementCount_; }; } // namespace osc #endif /* INCLUDED_OSCRECEIVEDELEMENTS_H */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/oscpack/osc/OscPrintReceivedElements.h0000644000175000017500000000373611562456103031523 0ustar dandan/* oscpack -- Open Sound Control packet manipulation library http://www.audiomulch.com/~rossb/oscpack Copyright (c) 2004-2005 Ross Bencina 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. Any person wishing to distribute modifications to the Software is requested to send the modifications to the original developer so that they can be incorporated into the canonical version. 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. */ #ifndef INCLUDED_OSCPRINTRECEIVEDELEMENTS_H #define INCLUDED_OSCPRINTRECEIVEDELEMENTS_H #include #ifndef INCLUDED_OSCRECEIVEDELEMENTS_H #include "OscReceivedElements.h" #endif /* INCLUDED_OSCRECEIVEDELEMENTS_H */ namespace osc{ std::ostream& operator<<( std::ostream & os, const ReceivedPacket& p ); std::ostream& operator<<( std::ostream & os, const ReceivedMessageArgument& arg ); std::ostream& operator<<( std::ostream & os, const ReceivedMessage& m ); std::ostream& operator<<( std::ostream & os, const ReceivedBundle& b ); } // namespace osc #endif /* INCLUDED_OSCPRINTRECEIVEDELEMENTS_H */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/oscpack/osc/OscTypes.cpp0000644000175000017500000000307611562456103026717 0ustar dandan/* oscpack -- Open Sound Control packet manipulation library http://www.audiomulch.com/~rossb/oscpack Copyright (c) 2004-2005 Ross Bencina 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. Any person wishing to distribute modifications to the Software is requested to send the modifications to the original developer so that they can be incorporated into the canonical version. 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. */ #include "OscTypes.h" namespace osc{ BundleInitiator BeginBundleImmediate(1); BundleTerminator EndBundle; MessageTerminator EndMessage; NilType Nil; InfinitumType Infinitum; } // namespace osc SuperCollider-3.6.3-Source-linux~repack/external_libraries/oscpack/osc/OscHostEndianness.h0000644000175000017500000000463611562456103030210 0ustar dandan/* oscpack -- Open Sound Control packet manipulation library http://www.audiomulch.com/~rossb/oscpack Copyright (c) 2004-2005 Ross Bencina 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. Any person wishing to distribute modifications to the Software is requested to send the modifications to the original developer so that they can be incorporated into the canonical version. 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. */ #ifndef OSC_HOSTENDIANNESS_H #define OSC_HOSTENDIANNESS_H /* Make sure either OSC_HOST_LITTLE_ENDIAN or OSC_HOST_BIG_ENDIAN is defined If you know a way to enhance the detection below for Linux and/or MacOSX please let me know! I've tried a few things which don't work. */ #if defined(OSC_HOST_LITTLE_ENDIAN) || defined(OSC_HOST_BIG_ENDIAN) // you can define one of the above symbols from the command line // then you don't have to edit this file. #elif defined(__WIN32__) || defined(WIN32) || defined(WINCE) // assume that __WIN32__ is only defined on little endian systems #define OSC_HOST_LITTLE_ENDIAN 1 #undef OSC_HOST_BIG_ENDIAN #elif defined(__APPLE__) #if defined(__LITTLE_ENDIAN__) #define OSC_HOST_LITTLE_ENDIAN 1 #undef OSC_HOST_BIG_ENDIAN #elif defined(__BIG_ENDIAN__) #define OSC_HOST_BIG_ENDIAN 1 #undef OSC_HOST_LITTLE_ENDIAN #endif #endif #if !defined(OSC_HOST_LITTLE_ENDIAN) && !defined(OSC_HOST_BIG_ENDIAN) #error please edit OSCHostEndianness.h to configure endianness #endif #endif /* OSC_HOSTENDIANNESS_H */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/oscpack/tests/0000775000175000017500000000000012110505246025005 5ustar dandanSuperCollider-3.6.3-Source-linux~repack/external_libraries/oscpack/tests/OscReceiveTest.cpp0000644000175000017500000002275311562456103030416 0ustar dandan/* oscpack -- Open Sound Control packet manipulation library http://www.audiomulch.com/~rossb/oscpack Copyright (c) 2004-2005 Ross Bencina 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. Any person wishing to distribute modifications to the Software is requested to send the modifications to the original developer so that they can be incorporated into the canonical version. 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. */ #include "OscReceiveTest.h" #include #include #include #include "osc/OscReceivedElements.h" #include "ip/UdpSocket.h" #include "osc/OscPacketListener.h" namespace osc{ class OscReceiveTestPacketListener : public OscPacketListener{ protected: void ProcessMessage( const osc::ReceivedMessage& m, const IpEndpointName& remoteEndpoint ) { // a more complex scheme involving std::map or some other method of // processing address patterns could be used here // (see MessageMappingOscPacketListener.h for example). however, the main // purpose of this example is to illustrate and test different argument // parsing methods try { // argument stream, and argument iterator, used in different // examples below. ReceivedMessageArgumentStream args = m.ArgumentStream(); ReceivedMessage::const_iterator arg = m.ArgumentsBegin(); if( strcmp( m.AddressPattern(), "/test1" ) == 0 ){ // example #1: // parse an expected format using the argument stream interface: bool a1; osc::int32 a2; float a3; const char *a4; args >> a1 >> a2 >> a3 >> a4 >> osc::EndMessage; std::cout << "received '/test1' message with arguments: " << a1 << " " << a2 << " " << a3 << " " << a4 << "\n"; }else if( strcmp( m.AddressPattern(), "/test2" ) == 0 ){ // example #2: // parse an expected format using the argument iterator interface // this is a more complicated example of doing the same thing // as above. bool a1 = (arg++)->AsBool(); int a2 = (arg++)->AsInt32(); float a3 = (arg++)->AsFloat(); const char *a4 = (arg++)->AsString(); if( arg != m.ArgumentsEnd() ) throw ExcessArgumentException(); std::cout << "received '/test2' message with arguments: " << a1 << " " << a2 << " " << a3 << " " << a4 << "\n"; }else if( strcmp( m.AddressPattern(), "/test3" ) == 0 ){ // example #3: // parse a variable argument format using the argument iterator // interface. this is where it is necessary to use // argument iterators instead of streams. // When messages may contain arguments of varying type, you can // use the argument iterator interface to query the types at // runtime. this is more flexible that the argument stream // interface, which requires each argument to have a fixed type if( arg->IsBool() ){ bool a = (arg++)->AsBoolUnchecked(); std::cout << "received '/test3' message with bool argument: " << a << "\n"; }else if( arg->IsInt32() ){ int a = (arg++)->AsInt32Unchecked(); std::cout << "received '/test3' message with int32 argument: " << a << "\n"; }else if( arg->IsFloat() ){ float a = (arg++)->AsFloatUnchecked(); std::cout << "received '/test3' message with float argument: " << a << "\n"; }else if( arg->IsString() ){ const char *a = (arg++)->AsStringUnchecked(); std::cout << "received '/test3' message with string argument: '" << a << "'\n"; }else{ std::cout << "received '/test3' message with unexpected argument type\n"; } if( arg != m.ArgumentsEnd() ) throw ExcessArgumentException(); }else if( strcmp( m.AddressPattern(), "/no_arguments" ) == 0 ){ args >> osc::EndMessage; std::cout << "received '/no_arguments' message\n"; }else if( strcmp( m.AddressPattern(), "/a_bool" ) == 0 ){ bool a; args >> a >> osc::EndMessage; std::cout << "received '/a_bool' message: " << a << "\n"; }else if( strcmp( m.AddressPattern(), "/nil" ) == 0 ){ std::cout << "received '/nil' message\n"; }else if( strcmp( m.AddressPattern(), "/inf" ) == 0 ){ std::cout << "received '/inf' message\n"; }else if( strcmp( m.AddressPattern(), "/an_int" ) == 0 ){ osc::int32 a; args >> a >> osc::EndMessage; std::cout << "received '/an_int' message: " << a << "\n"; }else if( strcmp( m.AddressPattern(), "/a_float" ) == 0 ){ float a; args >> a >> osc::EndMessage; std::cout << "received '/a_float' message: " << a << "\n"; }else if( strcmp( m.AddressPattern(), "/a_char" ) == 0 ){ char a; args >> a >> osc::EndMessage; char s[2] = {0}; s[0] = a; std::cout << "received '/a_char' message: '" << s << "'\n"; }else if( strcmp( m.AddressPattern(), "/an_rgba_color" ) == 0 ){ osc::RgbaColor a; args >> a >> osc::EndMessage; std::cout << "received '/an_rgba_color' message: " << a.value << "\n"; }else if( strcmp( m.AddressPattern(), "/a_midi_message" ) == 0 ){ osc::MidiMessage a; args >> a >> osc::EndMessage; std::cout << "received '/a_midi_message' message: " << a.value << "\n"; }else if( strcmp( m.AddressPattern(), "/an_int64" ) == 0 ){ osc::int64 a; args >> a >> osc::EndMessage; std::cout << "received '/an_int64' message: " << a << "\n"; }else if( strcmp( m.AddressPattern(), "/a_time_tag" ) == 0 ){ osc::TimeTag a; args >> a >> osc::EndMessage; std::cout << "received '/a_time_tag' message: " << a.value << "\n"; }else if( strcmp( m.AddressPattern(), "/a_double" ) == 0 ){ double a; args >> a >> osc::EndMessage; std::cout << "received '/a_double' message: " << a << "\n"; }else if( strcmp( m.AddressPattern(), "/a_string" ) == 0 ){ const char *a; args >> a >> osc::EndMessage; std::cout << "received '/a_string' message: '" << a << "'\n"; }else if( strcmp( m.AddressPattern(), "/a_symbol" ) == 0 ){ osc::Symbol a; args >> a >> osc::EndMessage; std::cout << "received '/a_symbol' message: '" << a.value << "'\n"; }else if( strcmp( m.AddressPattern(), "/a_blob" ) == 0 ){ osc::Blob a; args >> a >> osc::EndMessage; std::cout << "received '/a_blob' message\n"; }else{ std::cout << "unrecognised address pattern: " << m.AddressPattern() << "\n"; } }catch( Exception& e ){ std::cout << "error while parsing message: " << m.AddressPattern() << ": " << e.what() << "\n"; } } }; void RunReceiveTest( int port ) { osc::OscReceiveTestPacketListener listener; UdpListeningReceiveSocket s( IpEndpointName( IpEndpointName::ANY_ADDRESS, port ), &listener ); std::cout << "listening for input on port " << port << "...\n"; std::cout << "press ctrl-c to end\n"; s.RunUntilSigInt(); std::cout << "finishing.\n"; } } // namespace osc #ifndef NO_OSC_TEST_MAIN int main(int argc, char* argv[]) { if( argc >= 2 && strcmp( argv[1], "-h" ) == 0 ){ std::cout << "usage: OscReceiveTest [port]\n"; return 0; } int port = 7000; if( argc >= 2 ) port = atoi( argv[1] ); osc::RunReceiveTest( port ); return 0; } #endif /* NO_OSC_TEST_MAIN */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/oscpack/tests/OscReceiveTest.h0000644000175000017500000000305311562456103030053 0ustar dandan/* oscpack -- Open Sound Control packet manipulation library http://www.audiomulch.com/~rossb/oscpack Copyright (c) 2004-2005 Ross Bencina 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. Any person wishing to distribute modifications to the Software is requested to send the modifications to the original developer so that they can be incorporated into the canonical version. 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. */ #ifndef INCLUDED_OSCRECEIVETEST_H #define INCLUDED_OSCRECEIVETEST_H namespace osc{ void RunReceiveTest( int port ); } // namespace osc #endif /* INCLUDED_OSCSENDTESTS_H */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/oscpack/tests/OscSendTests.h0000644000175000017500000000307311562456103027547 0ustar dandan/* oscpack -- Open Sound Control packet manipulation library http://www.audiomulch.com/~rossb/oscpack Copyright (c) 2004-2005 Ross Bencina 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. Any person wishing to distribute modifications to the Software is requested to send the modifications to the original developer so that they can be incorporated into the canonical version. 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. */ #ifndef INCLUDED_OSCSENDTESTS_H #define INCLUDED_OSCSENDTESTS_H namespace osc{ void RunSendTests( unsigned long address, int port ); } // namespace osc #endif /* INCLUDED_OSCSENDTESTS_H */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/oscpack/tests/OscUnitTests.h0000644000175000017500000000303211562456103027570 0ustar dandan/* oscpack -- Open Sound Control packet manipulation library http://www.audiomulch.com/~rossb/oscpack Copyright (c) 2004-2005 Ross Bencina 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. Any person wishing to distribute modifications to the Software is requested to send the modifications to the original developer so that they can be incorporated into the canonical version. 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. */ #ifndef INCLUDED_OSCUNITTESTS_H #define INCLUDED_OSCUNITTESTS_H namespace osc{ void RunUnitTests(); } // namespace osc #endif /* INCLUDED_OSCUNITTESTS_H */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/oscpack/tests/OscUnitTests.cpp0000644000175000017500000003261711562456103030136 0ustar dandan/* oscpack -- Open Sound Control packet manipulation library http://www.audiomulch.com/~rossb/oscpack Copyright (c) 2004-2005 Ross Bencina 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. Any person wishing to distribute modifications to the Software is requested to send the modifications to the original developer so that they can be incorporated into the canonical version. 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. */ #include "OscUnitTests.h" #include #include #include #include "osc/OscReceivedElements.h" #include "osc/OscPrintReceivedElements.h" #include "osc/OscOutboundPacketStream.h" namespace osc{ static int passCount_=0, failCount_=0; void PrintTestSummary() { std::cout << (passCount_+failCount_) << " tests run, " << passCount_ << " passed, " << failCount_ << " failed.\n"; } void pass_equality( const char *slhs, const char *srhs, const char *file, int line ) { ++passCount_; std::cout << file << "(" << line << "): PASSED : " << slhs << " == " << srhs << "\n"; } void fail_equality( const char *slhs, const char *srhs, const char *file, int line ) { ++failCount_; std::cout << file << "(" << line << "): FAILED : " << slhs << " != " << srhs << "\n"; } template void assertEqual_( const T& lhs, const T& rhs, const char *slhs, const char *srhs, const char *file, int line ) { if( lhs == rhs ) pass_equality( slhs, srhs, file, line ); else fail_equality( slhs, srhs, file, line ); } template void assertEqual_( const T* lhs, const T* rhs, const char *slhs, const char *srhs, const char *file, int line ) { if( lhs == rhs ) pass_equality( slhs, srhs, file, line ); else fail_equality( slhs, srhs, file, line ); } template <> void assertEqual_( const char* lhs, const char* rhs, const char *slhs, const char *srhs, const char *file, int line ) { if( strcmp( lhs, rhs ) == 0 ) pass_equality( slhs, srhs, file, line ); else fail_equality( slhs, srhs, file, line ); } #define assertEqual( a, b ) assertEqual_( (a), (b), #a, #b, __FILE__, __LINE__ ) //--------------------------------------------------------------------------- char * AllocateAligned4( unsigned long size ) { char *s = new char[ size + 4 ]; //allocate on stack to get 4 byte alignment return (char*)((long)(s-1) & (~0x03L)) + 4; } // allocate a 4 byte aligned copy of s char * NewMessageBuffer( const char *s, unsigned long length ) { char *p = AllocateAligned4( length ); memcpy( p, s, length ); return p; } void test1() { const char s[] = "/test\0\0\0,fiT\0\0\0\0\0\0\0\0\0\0\0A"; char *buffer = NewMessageBuffer( s, sizeof(s)-1 ); // test argument iterator interface bool unexpectedExceptionCaught = false; try{ ReceivedMessage m( ReceivedPacket(buffer, sizeof(s)-1) ); assertEqual( strcmp( m.AddressPattern(), "/test" ), 0 ); assertEqual( strcmp( m.TypeTags(), "fiT" ), 0 ); ReceivedMessage::const_iterator i = m.ArgumentsBegin(); ++i; ++i; ++i; assertEqual( i, m.ArgumentsEnd() ); i = m.ArgumentsBegin(); float f = (i++)->AsFloat(); (void)f; int n = (i++)->AsInt32(); (void)n; bool b = (i++)->AsBool(); (void)b; i = m.ArgumentsBegin(); bool exceptionThrown = false; try{ int n = (i++)->AsInt32(); (void)n; }catch( Exception& ){ exceptionThrown = true; } assertEqual( exceptionThrown, true ); }catch( Exception& e ){ std::cout << "unexpected exception: " << e.what() << "\n"; unexpectedExceptionCaught = true; } assertEqual( unexpectedExceptionCaught, false ); // test argument stream interface unexpectedExceptionCaught = false; try{ ReceivedMessage m( ReceivedPacket(buffer, sizeof(s)-1) ); ReceivedMessageArgumentStream args = m.ArgumentStream(); assertEqual( args.Eos(), false ); float f; int32 n; bool b; args >> f >> n >> b; (void) f; (void) n; (void) b; assertEqual( args.Eos(), true ); }catch( Exception& e ){ std::cout << "unexpected exception: " << e.what() << "\n"; unexpectedExceptionCaught = true; } assertEqual( unexpectedExceptionCaught, false ); } //--------------------------------------------------------------------------- #define TEST2_PRINT( ss )\ {\ const char s[] = ss;\ ReceivedPacket p( NewMessageBuffer( s, sizeof(s)-1 ), sizeof(s)-1 ); \ ReceivedMessage m( p );\ std::cout << m << "\n";\ } void test2() { bool unexpectedExceptionCaught = false; try{ // 012301230 1 2 3 TEST2_PRINT( "/no_args\0\0\0\0" ); // 012301230 1 2 3 01 2 3 TEST2_PRINT( "/no_args\0\0\0\0,\0\0\0" ); // 01230123 012 3 0 1 2 3 TEST2_PRINT( "/an_int\0,i\0\0\0\0\0A" ); // 012301230 1 2 3 012 3 0 1 2 3 TEST2_PRINT( "/a_float\0\0\0\0,f\0\0\0\0\0\0" ); // 0123012301 2 3 012 3 012301230123 TEST2_PRINT( "/a_string\0\0\0,s\0\0hello world\0" ); // 01230123 012 3 0 1 2 3 0 1 2 3 TEST2_PRINT( "/a_blob\0,b\0\0\0\0\0\x4\x0\x1\x2\x3" ); // 0123012301 2 3 012 3 0 1 2 3 0 1 2 3 TEST2_PRINT( "/an_int64\0\0\0,h\0\0\0\0\0\0\0\0\0\x1" ); // 01230123012 3 012 3 0 1 2 3 0 1 2 3 TEST2_PRINT( "/a_timetag\0\0,t\0\0\0\0\0\0\0\0\0\x1" ); // 0123012301 2 3 012 3 0 1 2 3 0 1 2 3 TEST2_PRINT( "/a_double\0\0\0,d\0\0\0\0\0\0\0\0\0\0" ); // 0123012301 2 3 012 3 012301230123 TEST2_PRINT( "/a_symbol\0\0\0,S\0\0hello world\0" ); // 01230123 012 3 0 1 2 3 TEST2_PRINT( "/a_char\0,c\0\0\0\0\0A" ); // 012301230 1 2 3 012 3 0 1 2 3 TEST2_PRINT( "/a_color\0\0\0\0,r\0\0\0\0\0\0" ); // 012301230123012 3 012 3 0 1 2 3 TEST2_PRINT( "/a_midimessage\0\0,m\0\0\0\0\0\0" ); // 01230123 012 3 TEST2_PRINT( "/a_bool\0,T\0\0" ); // 01230123 012 3 TEST2_PRINT( "/a_bool\0,F\0\0" ); // 01230 1 2 3 012 3 TEST2_PRINT( "/Nil\0\0\0\0,N\0\0" ); // 01230 1 2 3 012 3 TEST2_PRINT( "/Inf\0\0\0\0,I\0\0" ); TEST2_PRINT( "/test\0\0\0,fiT\0\0\0\0\0\0\0\0\0\0\0A" ); bool exceptionThrown = false; try{ TEST2_PRINT( "/a_char\0,x\0\0\0\0\0A" ); // unknown type tag 'x' }catch( Exception& ){ exceptionThrown = true; } assertEqual( exceptionThrown, true ); }catch( Exception& e ){ std::cout << "unexpected exception: " << e.what() << "\n"; unexpectedExceptionCaught = true; } assertEqual( unexpectedExceptionCaught, false ); } //----------------------------------------------------------------------- // pack a message and then unpack it and check that the result is the same // also print each message // repeat the process inside a bundle #define TEST_PACK_UNPACK0( addressPattern, argument, value, recieveGetter ) \ { \ memset( buffer, 0x74, bufferSize ); \ OutboundPacketStream ps( buffer, bufferSize ); \ ps << BeginMessage( addressPattern ) \ << argument \ << EndMessage;\ assertEqual( ps.IsReady(), true );\ ReceivedMessage m( ReceivedPacket(ps.Data(), ps.Size()) );\ std::cout << m << "\n";\ assertEqual( m.ArgumentsBegin()-> recieveGetter () , value );\ } \ { \ memset( buffer, 0x74, bufferSize ); \ OutboundPacketStream ps( buffer, bufferSize ); \ ps << BeginBundle( 1234 ) \ << BeginMessage( addressPattern ) \ << argument \ << EndMessage \ << EndBundle;\ assertEqual( ps.IsReady(), true );\ ReceivedBundle b( ReceivedPacket(ps.Data(), ps.Size()) );\ ReceivedMessage m( *b.ElementsBegin() );\ std::cout << m << "\n";\ assertEqual( m.ArgumentsBegin()-> recieveGetter () , value );\ } #define TEST_PACK_UNPACK( addressPattern, argument, type, recieveGetter ) \ { \ memset( buffer, 0x74, bufferSize ); \ OutboundPacketStream ps( buffer, bufferSize ); \ ps << BeginMessage( addressPattern ) \ << argument \ << EndMessage;\ assertEqual( ps.IsReady(), true );\ ReceivedMessage m( ReceivedPacket(ps.Data(), ps.Size()) );\ std::cout << m << "\n";\ assertEqual( m.ArgumentsBegin()-> recieveGetter () , ( type ) argument );\ } \ { \ memset( buffer, 0x74, bufferSize ); \ OutboundPacketStream ps( buffer, bufferSize ); \ ps << BeginBundle( 1234 ) \ << BeginMessage( addressPattern ) \ << argument \ << EndMessage \ << EndBundle;\ assertEqual( ps.IsReady(), true );\ ReceivedBundle b( ReceivedPacket(ps.Data(), ps.Size()) );\ ReceivedMessage m( *b.ElementsBegin() );\ std::cout << m << "\n";\ assertEqual( m.ArgumentsBegin()-> recieveGetter () , ( type ) argument );\ } void test3() { int bufferSize = 1000; char *buffer = AllocateAligned4( bufferSize ); // single message tests // empty message { memset( buffer, 0x74, bufferSize ); OutboundPacketStream ps( buffer, bufferSize ); ps << BeginMessage( "/no_arguments" ) << EndMessage; assertEqual( ps.IsReady(), true ); ReceivedMessage m( ReceivedPacket(ps.Data(), ps.Size()) ); std::cout << m << "\n";\ } TEST_PACK_UNPACK( "/a_bool", true, bool, AsBool ); TEST_PACK_UNPACK( "/a_bool", false, bool, AsBool ); TEST_PACK_UNPACK( "/a_bool", (bool)1, bool, AsBool ); TEST_PACK_UNPACK0( "/nil", Nil, true, IsNil ); TEST_PACK_UNPACK0( "/inf", Infinitum, true, IsInfinitum ); TEST_PACK_UNPACK( "/an_int", (int32)1234, int32, AsInt32 ); TEST_PACK_UNPACK( "/a_float", 3.1415926f, float, AsFloat ); TEST_PACK_UNPACK( "/a_char", 'c', char, AsChar ); TEST_PACK_UNPACK( "/an_rgba_color", RgbaColor(0x22334455), uint32, AsRgbaColor ); TEST_PACK_UNPACK( "/a_midi_message", MidiMessage(0x7F), uint32, AsMidiMessage ); TEST_PACK_UNPACK( "/an_int64", (int64)(0xFFFFFFFF), int64, AsInt64 ); TEST_PACK_UNPACK( "/a_time_tag", TimeTag(0xFFFFFFFF), uint64, AsTimeTag ); TEST_PACK_UNPACK( "/a_double", (double)3.1415926, double, AsDouble ); // blob { char blobData[] = "abcd"; memset( buffer, 0x74, bufferSize ); OutboundPacketStream ps( buffer, bufferSize ); ps << BeginMessage( "/a_blob" ) << Blob( blobData, 4 ) << EndMessage; assertEqual( ps.IsReady(), true ); ReceivedMessage m( ReceivedPacket(ps.Data(), ps.Size()) ); std::cout << m << "\n"; const void *value; unsigned long size; m.ArgumentsBegin()->AsBlob( value, size ); assertEqual( size, (unsigned long)4 ); assertEqual( (memcmp( value, blobData, 4 ) == 0), true ); } TEST_PACK_UNPACK( "/a_string", "hello world", const char*, AsString ); TEST_PACK_UNPACK( "/a_symbol", Symbol("foobar"), const char*, AsSymbol ); // nested bundles, and multiple messages in bundles... { memset( buffer, 0x74, bufferSize ); OutboundPacketStream ps( buffer, bufferSize ); ps << BeginBundle() << BeginMessage( "/message_one" ) << 1 << 2 << 3 << 4 << EndMessage << BeginMessage( "/message_two" ) << 1 << 2 << 3 << 4 << EndMessage << BeginMessage( "/message_three" ) << 1 << 2 << 3 << 4 << EndMessage << BeginMessage( "/message_four" ) << 1 << 2 << 3 << 4 << EndMessage << EndBundle; assertEqual( ps.IsReady(), true ); ReceivedBundle b( ReceivedPacket(ps.Data(), ps.Size()) ); std::cout << b << "\n"; } } void RunUnitTests() { test1(); test2(); test3(); PrintTestSummary(); } } // namespace osc #ifndef NO_OSC_TEST_MAIN int main(int argc, char* argv[]) { (void)argc; (void)argv; osc::RunUnitTests(); } #endif SuperCollider-3.6.3-Source-linux~repack/external_libraries/oscpack/tests/OscSendTests.cpp0000644000175000017500000001466411562456103030112 0ustar dandan/* oscpack -- Open Sound Control packet manipulation library http://www.audiomulch.com/~rossb/oscpack Copyright (c) 2004-2005 Ross Bencina 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. Any person wishing to distribute modifications to the Software is requested to send the modifications to the original developer so that they can be incorporated into the canonical version. 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. */ #include "OscSendTests.h" #include #include #include #include "osc/OscOutboundPacketStream.h" #include "ip/UdpSocket.h" #include "ip/IpEndpointName.h" #define IP_MTU_SIZE 1536 namespace osc{ void RunSendTests( const IpEndpointName& host ) { char buffer[IP_MTU_SIZE]; osc::OutboundPacketStream p( buffer, IP_MTU_SIZE ); UdpTransmitSocket socket( host ); p.Clear(); p << osc::BeginMessage( "/test1" ) << true << 23 << (float)3.1415 << "hello" << osc::EndMessage; socket.Send( p.Data(), p.Size() ); // test1 message with too few arguments p.Clear(); p << osc::BeginMessage( "/test1" ) << true << osc::EndMessage; socket.Send( p.Data(), p.Size() ); // test1 message with too many arguments p.Clear(); p << osc::BeginMessage( "/test1" ) << true << 23 << (float)3.1415 << "hello" << 42 << osc::EndMessage; socket.Send( p.Data(), p.Size() ); // test1 message with wrong argument type p.Clear(); p << osc::BeginMessage( "/test1" ) << true << 1.0 << (float)3.1415 << "hello" << osc::EndMessage; socket.Send( p.Data(), p.Size() ); p.Clear(); p << osc::BeginMessage( "/test2" ) << true << 23 << (float)3.1415 << "hello" << osc::EndMessage; socket.Send( p.Data(), p.Size() ); // send four /test3 messages, each with a different type of argument p.Clear(); p << osc::BeginMessage( "/test3" ) << true << osc::EndMessage; socket.Send( p.Data(), p.Size() ); p.Clear(); p << osc::BeginMessage( "/test3" ) << 23 << osc::EndMessage; socket.Send( p.Data(), p.Size() ); p.Clear(); p << osc::BeginMessage( "/test3" ) << (float)3.1415 << osc::EndMessage; socket.Send( p.Data(), p.Size() ); p.Clear(); p << osc::BeginMessage( "/test3" ) << "hello" << osc::EndMessage; socket.Send( p.Data(), p.Size() ); // send a bundle p.Clear(); p << osc::BeginBundle(); p << osc::BeginMessage( "/no_arguments" ) << osc::EndMessage; p << osc::BeginMessage( "/a_bool" ) << true << osc::EndMessage; p << osc::BeginMessage( "/a_bool" ) << false << osc::EndMessage; p << osc::BeginMessage( "/a_bool" ) << (bool)1234 << osc::EndMessage; p << osc::BeginMessage( "/nil" ) << osc::Nil << osc::EndMessage; p << osc::BeginMessage( "/inf" ) << osc::Infinitum << osc::EndMessage; p << osc::BeginMessage( "/an_int" ) << 1234 << osc::EndMessage; p << osc::BeginMessage( "/a_float" ) << 3.1415926f << osc::EndMessage; p << osc::BeginMessage( "/a_char" ) << 'c' << osc::EndMessage; p << osc::BeginMessage( "/an_rgba_color" ) << osc::RgbaColor(0x22334455) << osc::EndMessage; p << osc::BeginMessage( "/a_midi_message" ) << MidiMessage(0x7F) << osc::EndMessage; p << osc::BeginMessage( "/an_int64" ) << (int64)(0xFFFFFFF) << osc::EndMessage; p << osc::BeginMessage( "/a_time_tag" ) << osc::TimeTag(0xFFFFFFFUL) << osc::EndMessage; p << osc::BeginMessage( "/a_double" ) << (double)3.1415926 << osc::EndMessage; p << osc::BeginMessage( "/a_string" ) << "hello world" << osc::EndMessage; p << osc::BeginMessage( "/a_symbol" ) << osc::Symbol("foobar") << osc::EndMessage; // blob { char blobData[] = "abcd"; p << osc::BeginMessage( "/a_blob" ) << osc::Blob( blobData, 4 ) << osc::EndMessage; } p << osc::EndBundle; socket.Send( p.Data(), p.Size() ); // nested bundles, and multiple messages in bundles... p.Clear(); p << osc::BeginBundle( 1234 ) << osc::BeginMessage( "/an_int" ) << 1 << osc::EndMessage << osc::BeginMessage( "/an_int" ) << 2 << osc::EndMessage << osc::BeginMessage( "/an_int" ) << 3 << osc::EndMessage << osc::BeginMessage( "/an_int" ) << 4 << osc::EndMessage << osc::BeginBundle( 12345 ) << osc::BeginMessage( "/an_int" ) << 5 << osc::EndMessage << osc::BeginMessage( "/an_int" ) << 6 << osc::EndMessage << osc::EndBundle << osc::EndBundle; socket.Send( p.Data(), p.Size() ); } } // namespace osc #ifndef NO_OSC_TEST_MAIN int main(int argc, char* argv[]) { if( argc >= 2 && strcmp( argv[1], "-h" ) == 0 ){ std::cout << "usage: OscSendTests [hostname [port]]\n"; return 0; } const char *hostName = "localhost"; int port = 7000; if( argc >= 2 ) hostName = argv[1]; if( argc >= 3 ) port = atoi( argv[2] ); IpEndpointName host( hostName, port ); char hostIpAddress[ IpEndpointName::ADDRESS_STRING_LENGTH ]; host.AddressAsString( hostIpAddress ); std::cout << "sending test messages to " << hostName << " (" << hostIpAddress << ") on port " << port << "...\n"; osc::RunSendTests( host ); } #endif /* NO_OSC_TEST_MAIN */ SuperCollider-3.6.3-Source-linux~repack/external_libraries/oscpack/examples/0000775000175000017500000000000012110505246025461 5ustar dandanSuperCollider-3.6.3-Source-linux~repack/external_libraries/oscpack/examples/OscDump.cpp0000644000175000017500000000500211562456103027541 0ustar dandan/* oscpack -- Open Sound Control packet manipulation library http://www.audiomulch.com/~rossb/oscpack Copyright (c) 2004-2005 Ross Bencina 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. Any person wishing to distribute modifications to the Software is requested to send the modifications to the original developer so that they can be incorporated into the canonical version. 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. */ /* OscDump prints incoming Osc packets. Unlike the Berkeley dumposc program OscDump uses a different printing format which indicates the type of each message argument. */ #include #include #include #include "osc/OscReceivedElements.h" #include "osc/OscPrintReceivedElements.h" #include "ip/UdpSocket.h" #include "ip/PacketListener.h" class OscDumpPacketListener : public PacketListener{ public: virtual void ProcessPacket( const char *data, int size, const IpEndpointName& remoteEndpoint ) { std::cout << osc::ReceivedPacket( data, size ); } }; int main(int argc, char* argv[]) { if( argc >= 2 && strcmp( argv[1], "-h" ) == 0 ){ std::cout << "usage: OscDump [port]\n"; return 0; } int port = 7000; if( argc >= 2 ) port = atoi( argv[1] ); OscDumpPacketListener listener; UdpListeningReceiveSocket s( IpEndpointName( IpEndpointName::ANY_ADDRESS, port ), &listener ); std::cout << "listening for input on port " << port << "...\n"; std::cout << "press ctrl-c to end\n"; s.RunUntilSigInt(); std::cout << "finishing.\n"; return 0; } SuperCollider-3.6.3-Source-linux~repack/external_libraries/oscpack/examples/SimpleReceive.cpp0000644000175000017500000000506611562456103030735 0ustar dandan/* Example of two different ways to process received OSC messages using oscpack. Receives the messages from the SimpleSend.cpp example. */ #include #include "osc/OscReceivedElements.h" #include "osc/OscPacketListener.h" #include "ip/UdpSocket.h" #define PORT 7000 class ExamplePacketListener : public osc::OscPacketListener { protected: virtual void ProcessMessage( const osc::ReceivedMessage& m, const IpEndpointName& remoteEndpoint ) { try{ // example of parsing single messages. osc::OsckPacketListener // handles the bundle traversal. if( strcmp( m.AddressPattern(), "/test1" ) == 0 ){ // example #1 -- argument stream interface osc::ReceivedMessageArgumentStream args = m.ArgumentStream(); bool a1; osc::int32 a2; float a3; const char *a4; args >> a1 >> a2 >> a3 >> a4 >> osc::EndMessage; std::cout << "received '/test1' message with arguments: " << a1 << " " << a2 << " " << a3 << " " << a4 << "\n"; }else if( strcmp( m.AddressPattern(), "/test2" ) == 0 ){ // example #2 -- argument iterator interface, supports // reflection for overloaded messages (eg you can call // (*arg)->IsBool() to check if a bool was passed etc). osc::ReceivedMessage::const_iterator arg = m.ArgumentsBegin(); bool a1 = (arg++)->AsBool(); int a2 = (arg++)->AsInt32(); float a3 = (arg++)->AsFloat(); const char *a4 = (arg++)->AsString(); if( arg != m.ArgumentsEnd() ) throw osc::ExcessArgumentException(); std::cout << "received '/test2' message with arguments: " << a1 << " " << a2 << " " << a3 << " " << a4 << "\n"; } }catch( osc::Exception& e ){ // any parsing errors such as unexpected argument types, or // missing arguments get thrown as exceptions. std::cout << "error while parsing message: " << m.AddressPattern() << ": " << e.what() << "\n"; } } }; int main(int argc, char* argv[]) { ExamplePacketListener listener; UdpListeningReceiveSocket s( IpEndpointName( IpEndpointName::ANY_ADDRESS, PORT ), &listener ); std::cout << "press ctrl-c to end\n"; s.RunUntilSigInt(); return 0; } SuperCollider-3.6.3-Source-linux~repack/external_libraries/oscpack/examples/SimpleSend.cpp0000644000175000017500000000141411562456103030235 0ustar dandan/* Simple example of sending an OSC message using oscpack. */ #include "osc/OscOutboundPacketStream.h" #include "ip/UdpSocket.h" #define ADDRESS "127.0.0.1" #define PORT 7000 #define OUTPUT_BUFFER_SIZE 1024 int main(int argc, char* argv[]) { UdpTransmitSocket transmitSocket( IpEndpointName( ADDRESS, PORT ) ); char buffer[OUTPUT_BUFFER_SIZE]; osc::OutboundPacketStream p( buffer, OUTPUT_BUFFER_SIZE ); p << osc::BeginBundleImmediate << osc::BeginMessage( "/test1" ) << true << 23 << (float)3.1415 << "hello" << osc::EndMessage << osc::BeginMessage( "/test2" ) << true << 24 << (float)10.8 << "world" << osc::EndMessage << osc::EndBundle; transmitSocket.Send( p.Data(), p.Size() ); } SuperCollider-3.6.3-Source-linux~repack/external_libraries/oscpack/CHANGES0000644000175000017500000000643411562456103024652 0ustar dandanSeptember 28, 2005 ------------------ Compared to the previous official snapshot (November 2004) the current version of oscpack includes a re-written set of network classes and some changes to the syntax of the networking code. It no longer uses threads, which means that you don't need to use sleep() if you are writing a simple single-threaded server, or you need to spawn your own threads in a more complex application. The list below summarises the changes if you are porting code from the previous release. - there are no longer any threads in oscpack. if you need to set up an asynchronous listener you can create your own thread and call Run on an instance of SocketReceiveMultiplexer or UdpListeningReceiveSocket (see ip/UdpSocket.h) yourself. - host byte order is now used for network (IP) addresses - functions which used to take two parameters now take an instance of IpEndpointName (see ip/IpEndpointName.h) this class has a number of convenient constructors for converting numbers and strings to internet addresses. For example there is one which takes a string and another that take the dotted address components as separate parameters. - The UdpTransmitPort class, formerly in UdpTransmitPort.h, is now called UdpTransmitSocket, which is simply a convenience class derived from UdpSocket (see ip/UdpSocket.h). Where you used to use the constructor UdpTransmitPort( address, port) now you can use UdpTransmitSocket( IpEndpointName( address, port ) ) or you can any of the other possible ctors to IpEndpointName () (see above). The Send() method is unchanged. - The packet listener base class is now located in ip/PacketListener.h instead of PacketListenerPort.h. The ProcessPacket method now has an additional parameter indicating the remote endpoint - The preferred way to set up listeners is with SocketReceiveMultiplexer (in ip/UdpSocket.h), this also allows attaching periodic timers. For simple applications which only listen to a single socket with no timers you can use UdpListeningReceiveSocket (also in UdpSocket.h) See osc/OscReceiveTest.cpp or osc/OscDump.cpp for examples of this. This is more or less equivalent to the UdpPacketListenerPort object in the old oscpack versions except that you need to explicitly call Run() before it will start receiving packets and it runs in the same thread, not a separate thread so Run() won't usually return. - Explicit calls to InitializeNetworking() and TerminateNetworking() are no longer required for simple applications (more complex windows applications should instantiate NetworkInitializer in main() or WinMain (see ip/NetworkingUtils.h/.cpp) - The OscPacketListener base class (OscPacketListener.h) was added to make traversing OSC packets easier, it handles bundle traversal automatically so you only need to process messages in your derived classes. - On Windows be sure to link with ws2_32.lib or you will see a linker error about WSAEventSelect not being found. Also you will need to link with winmm.lib for timeGetTime() SuperCollider-3.6.3-Source-linux~repack/icons/0000775000175000017500000000000012110505246017455 5ustar dandanSuperCollider-3.6.3-Source-linux~repack/icons/sc_ide_16.png0000664000175000017500000000130712106676016021731 0ustar dandan‰PNG  IHDRóÿatEXtSoftwareAdobe ImageReadyqÉe<iIDATxÚŒSÛJjQÞ2£ËSÌî‘¶…𩱗ÞÏô|~Á_è3ú^;/hÐ&_¢(+S$Ü!ÑÍÚgŽI=8 ÖÞ‹µÖcÎ1ÇráßÔi|®m™þgŒ—GFFºòw¢Ñ¨399錎Ž:Ÿ{åï÷]_‹xŸ/'‰_Åb…Bóóó˜ÅÜÜ133£ì¯¯¯¸¾¾f™Ñ••—¬ÿ¸ `Æïíímd2LLLhFçç縹¹ÁÇÇB¡²Ù¬‚MMMifŒÑvvvL©ÉH&“zØn·aYZ­±¶¶†t:Íê„ÃÃCÍD„5ë•czzZkvwww8::Rv2Çb1Ýe~yyt„ZÔpƒAEzHf‚eaaAY¹æÏxgxxXcË lÖɶ===Á¶mE'k¯×Ó ¶‘FïïïVCDgKmõÁÞÞ^wssÓ`Ðññ1ö÷÷Q¯×(kú··· N¢T*…­­-»T*µ ’Ê.ÅcJruu•­Âóó3...pzzª‚úý~Pì\.§1NæÒdm ¨Õjj ‰Ì¤ØìŠøÄZ__Ï œ’êˆiÒÂd¤iha—Ë¥“†fKL•#Ù_ãþþ¾ìñxh£ßu‹¶¸+­-ÿø˜¾axÎ’ÝÏù¯¨ckÈápIEND®B`‚SuperCollider-3.6.3-Source-linux~repack/icons/sc_ide_48.png0000664000175000017500000000461312106676016021741 0ustar dandan‰PNG  IHDR00Wù‡tEXtSoftwareAdobe ImageReadyqÉe< -IDATxÚìš×nI†‹œ±ÉLyŒÈ ƒÄ-ò5Øâö0O<æiïVû`Y <LÎ9Œ‰&ïùJó÷žééYL–V”TšÕUÿ9ç?¡º'„ßí×¶^ßk¢Þ½{×ÚOÎzþÓ§O5¥cß ½zõê²ß6Ž?~üXüå 8°ÖÀ6Yß–øs öYoíîî.þT†^g wþ»hÑ„°¾óÙ³g×~¸£Fj1àØamÖý!C†„þýû‡Aƒ…>Änt ¯_¿ïÞ½ ïß¿¯6uÑ„Øóøñã–"À„ r|oU&OžÆŒ† lLJûömr¬ó7oÞ£L¬\¹2 Q ÜèÑ£“kô7ndŽ“ ÌÕ·oß´o4_ºt©õ«˜?>!ñ ¿ð9sæT€BXà€*¾C›'OžDA:;;ÃíÛ·+èÅsÐ0%DÃÙ³gÛ¾X€úúúœÑ栧͆ ÂŒ3Ê48qâİ|ùò¸8 ³€g?}ú4œŸ À&>0xðà íûsuøßÞÞ,T&‚¼zõ*œ>}:tuu%ôÄâÎ'Èõ(Kv}Ò˜ƒîêÓ§Ï*ëPcccä% ÚlÞ¼9&rÐ3nܸx-+dú®ëÌgÑ-‚Æ2š °Ð!±®eæH%Ö5<­×^¾|ù滛¦kÍaþ<ˆƒhL¸víÚ˜a=xÎ=H4JÖå>BL¬çº’pÐeĈIdaqXŽÇ±œ_¥#Ѓ¢CJHæÔ}8MÂ#©‰RuñâÅ„JR*€¶ñ–£ö …î2 ˜iÊŠ4Ì o™À ¹D›,XE” .„G%š'² M´8räȨÀpsÍ¬Æ $^c<¹As#$k1–ðÊx×r¥Ñ¿>`òâÚ†>â!1Y€ëâ=\G_»v-;v¬jÉ,Ç$ãѪwnÖÕ:h«>bŒó…|…ØÅWóÇYPYW™öÅ‹ -,qŸd„&Õ‰Aój8(‚Ë‚¬Ý8æžÏ ÝY¡&K€„Bd@=L˜ó“²¸Î‰8r6ÀzÍ“qE æ’h…è9F!̇սãËàÀòN€\–Éâ, ™ÄOªÈA÷NJìVÃpŸ8¯Î\®,H,‡Ðš#µÀÁX§üà¿PÔ@c¾ “¶t, ˜Ømö£ã\¿<¯ÆXÿ³Êåp Ð/€îð{[{í¥ДÞü")›¡#A‚ËŠY,kK‘Ÿµ€ `/š×H¬Dâ'%\ª^³SØÃÜj88‹ãô0aVÔ´mc´Ê€†ÞÚ̯PJ½%l¾B…¬ËsX(ökR´I5É1áUp¾áð4…Ž=¤¼A$ ï}’*8 teY€Ä÷h‡1oZÊf2/çhÍPq(™<Ýȶ‡ŽÖãm¿÷š¤ ÕC¢ë¸ÖV!€ .ø·L¬èÁâ^ËXA±›{ÿþý ßÀŠ\ƒãÐ ­3¿4ÏõS§NÅqÊ#~J @ ðü·û•Ú¾}{qÿþýÅX@‘•Ì|¤`Sw˜sâ¾S´ƒBV„B.ã•yÆó«a}öN€ÂÖ­[‹ÕªÑ}ZXÑ”$& ™°J`*J E]C5‰¦³vaêT–ŒSpÅTÄÑ™ÛÓ‡ÊØµ}UËi{¨Õ̼KçT‹„BedŽW( ¥uªVÆa eeîA …K¯uù‘üŒë¨Ë3\_¸paš>eï‰Ê64¶},ÚàVMzå¡[¯;dj,d;¤ds¢÷ŸŠßÕp\|ŠêÇj^çxÙ²e‰ÕQH.—óE\+« P²ÂN3‚D çÏŸOB×ô¦@‹²åd“­”U=Ȭk48.Ÿø5kÖD j=æ%1L`ëÑk•ööö3mòZi+H‡JçÎK¶z;Ó²)aO@ðT!)N§ÙÅùêÕ«ã}­ãb —Ýw®_¿¾¥ÇoæŽ9ÒaB$Uœ‡ŸZMž9s&:eÖ¸ž\ãš°÷V–†ûì“W­ZåÁì¼þ‹Þ̙ɚM€ƒÖãû!²/”Bƒ8Û¢E‹¢¶B}%™µö×Ð6À½e™—h&Jà‹Ö›¿êå®eÜæ tæ'&4(k|´*Z,˜*Ð’RðF³}ðûâ|u±U?òÉYU˜)Œê Œ65YùÌ"{¬Úý1ùÊV*ëÈÖ¿ËgVÞJœ7«üøÏ¬¾Y™P‹Ö·ùœÑCÐëûoIîç~èÎjÆïøWƒÒ¶´&-PiØe¿ñ¯”¿ÿéñhÿ0Rò웿ãºIEND®B`‚SuperCollider-3.6.3-Source-linux~repack/icons/sc_cube_16x16.png0000664000175000017500000000132511721141255022437 0ustar dandan‰PNG  IHDRóÿaœIDAT8SIK›Q5Uª¶‚¥ÐÁ¸p㦸¨³H Q„ ‰Š8E â@Ô ¦5!Rqa‹T‰à€SCRÄ )u¡H7¥-’´éB²è8½÷ÅEkûàð>x÷œ{îðedÜr<"<'<¹-îúx<ž§{{{Æh4úêäääýÁÁÁ÷P(„ÃÃËóós' =þS–;»»»ŽÙÙÙ§§§—GGGX^^ÆÚÚ666°¹¹‰••¹I,Nâ/ÙÙMÌd2ù%ãøøÛÛÛ×¾—––äÞßß—·ééi„Ãáï¸ÈÚÙÙ‰uuuannŽí"‰ˆ &¬¯¯# ÊÛüü<È)ÆÆÆàõz/S©T¾8 «±ºº:X­VÔÖÖbhhH˜À§¦¦àr¹`±XPVV†‚‚TWW'ˆ›Ï&2)8æt:Åj Ààà ŒF#׌ÖÖV!1ˆ„žžI¢Óégggi²ã¬>ŸRwGGfffPQQ“É„îîn477‹`CC4Mbuu5-°¸¸(“““bbbBããã’µ±±õõõ¨¬¬DMM ZZZ V«~¿?-°°°ck´₉ýýýR ÷Æl6‹gfÁÎÎN”””$¨ñiªû3w›'ÁA‡Ü“ööv455¡ªª mmmrkµZôöö¢¸¸8A.D £´´ôíÈȶ¶¶d¸n·[ºn³Ù87M¦Ä šÄO¢>¸Ú'%áuaaá7âñ  ittv»]Hl]¯×ƒâ››û8÷nnu¡œð&//ïB©TB¥R¡¯¯ƒEEE¿rrr¾Ò{„àgãû§î´ …"ý‰¾ß¼„á!Añ??ç}³~Þ%¶þRúaµIEND®B`‚SuperCollider-3.6.3-Source-linux~repack/icons/sc_ide.svg0000664000175000017500000000507712106676016021446 0ustar dandan SuperCollider Icon SVG - Batuhan Bozkurt 2012 SuperCollider-3.6.3-Source-linux~repack/icons/sc_ide.ico0000664000175000017500000012444512106676016021422 0ustar dandan cV00 h&uc  (݉ ¸ › h½¤‰PNG  IHDR\r¨fîiCCPICC Profilex…TÏkAþ6n©Ð"Zk²x"IY«hEÔ6ýbk Û¶Ed3IÖn6ëî&µ¥ˆäâÑ*ÞEí¡ÿ€zðd/J…ZE(Þ«(b¡-ñÍnL¶¥êÀÎ~óÞ7ï}ovß rÒ4õ€ä ÇR¢il|BjüˆŽ¢ A4%UÛìN$Aƒsù{çØz[VÃ{ûw²w­šÒ¶š„ý@àGšÙ*°ïq Yˆ<ß¡)ÇtßãØòì9NyxÁµ+=ÄY"|@5-ÎM¸SÍ%Ó@ƒH8”õqR>œ×‹”×infÆÈ½O¦»Ìî«b¡œNö½ô~N³Þ>Â! ­?F¸žõŒÕ?âaá¤æÄ†=5ôø`·©ø5Â_M'¢TqÙ. ñ˜®ýVòJ‚p8Êda€sZHO×Lnøº‡}&ׯâwVQáygÞÔÝïEÚ¯0  š HPEa˜°P@†<14²r?#«“{2u$j»tbD±A{6Ü=·Q¤Ý<þ("q”Cµ’üAþ*¯ÉOåyùË\°ØV÷”­›šºòà;Å噹×ÓÈãsM^|•Ôv“WG–¬yz¼šì?ìW—1æ‚5Äs°ûñ-_•Ì—)ŒÅãUóêK„uZ17ߟl;=â.Ï.µÖs­‰‹7V›—gýjHû“æUùO^õñügÍÄcâ)1&vŠç!‰—Å.ñ’ØK« â`mÇ•†)Òm‘ú$Õ``š¼õ/]?[x½F õQ”ÌÒT‰÷Â*d4¹oúÛÇüä÷ŠçŸ(/làÈ™ºmSqï¡e¥ns®¿Ñ}ð¶nk£~8üX<«­R5Ÿ ¼v‡zè)˜Ó––Í9R‡,Ÿ“ºéÊbRÌPÛCRR×%×eK³™UbévØ™Ón¡9B÷ħJe“ú¯ñ°ý°Rùù¬RÙ~NÖ—úoÀ¼ýEÀx‹‰ IDATxí½I°fIY€}ÁynPDå634C1ƒ }›YQ¨Ö0¬Ú¸ÐÝK#Œ–ÿŠfë¦Ëå¿¢Ô…ö-Q‘¹°A º”IµDEœÿ|NÝçþo½y¦ï|w¨:q¾÷ÍwÊÌ7Ç“'Ïùöÿ÷;kX=°zàæôÀÃoÎb¯¥^=°z¬ÀÚVÜÄX€›¸ò×¢¯X€µ ¬¸‰=°7qå¯E_=°kX=p{`nâÊ_‹¾z`Ö6°zà&öÀ:ÜÄ•¿}õÀ:¬m`õÀMìu¸‰+-úêo_]pã{àa{ØÞœR–÷Döçè­:§Ç[_:=••sZ:ö™B»¥\{¼Ûànáíà‹€ÒN®C\„K×ÀÎ~W ïòA|§Ìëp *ì £ï>üá?S:|ñ¾© J^/ýïÿþ/•u`ØÔ«Û×_€íûxR ¥u3:½à·—N„vêBÉûÕ’÷Ë:(ìC;u¹3¼' r¿ýÛ¿ý,½de¯\gN@–¶™…ËÅ8Á¥ÿþïÿ¾¸Í„VÛÃX€a-.Q:ûîw|Çwœ-àö‚Ÿ]÷ù÷–k7Wôñ@®”ë|Y ìß EÚ¸ëP\ÈrÿÛ¾íÛÞU:þ¹=zL¾÷{¿w§¼U¸,e鮲±S|w}ÿ÷ÿ!.­~ó›ß<”/÷Ò;ÿó?ÿ³SÞÞÛ)/ítøi ¥ÜJþ×Û‚R7ýð#?ò#¼ŠË¬*–ûeCr‡Îü}ß÷}Ýõßù]§§3öuè¯Üæþq{\×é¿û»¿»w+âvxÒô9¸tŽnÔ©å‰ÁI JÞïùÛ¿ýÛ»§ÔÝi—½i€ýÑ=S6ÉXòŸ9 •öƒ?øƒ]§/ùÚ¡ÓbçÂí\5¹)¶–²C>¦Úb0` ý.—üœÿÚ×¾vù„äg«Ù¸)€ÿñ?Wž¿«xò–­zsÀxù ØÎOüÄOìÜzë­]§ÏõLêX5yhKÙjÙ™“¯–-.„²gpµäçî¯~õ«Èónø ,­éøÇºä/Ov~ò'²›ñ[V:­o&Un \ÊÖRvÈó[ÊwJÇósÏ—¾ô¥ú–à†ýg vùË®ù{ÊýþÞñ´Ç?þñ;O|âwXîÛas^j¼ä9‹ŠoÓÖÜ<‘ñœ¯![eµ¶ƒŒá¨ÂoGè®2œù·û·;oÔ§7ä €J+è=¥Mìn§]ô[ÝÝÝÝyÚÓžÖ=Ÿ·ã mÔÆkë5z¦-ek);äo[¶†þÙ˜{¥”ëβ¸áön¸@¹ÇÞ+›}tþ#¿ßgÆÆ3žñŽ›ß˜†LGÊrÐrÈ2™O|Œ­¹v´ÓÝ–-ÊaY8 qį>ÝWÚÖ_üâ÷8í­&wC esíÜÁNÿV–3ãÓñ9zKˆuL‡Èö² âsí,i+– »„¹ùšk =#zÜùZ.Žä÷–Ò¶î+mìüƒ>xáHR<‚Dn˜ TÌ]¥1²áwdGx/zÑ‹ºŽOÃôšÓ)ævˆ\ØšdŽ3O¤_Ë×&yòñ!OVŽxEpoik·”AàÊuÚà 1”¶{ËíÜQUGrŸ÷¼çí<æ19ìô1m{_ãÛ†ìf¶ÕJw)[sìÏZ¾æØŠvÐçÈ1›†¼<ŠPòð®ÒæžóùÏþüQ¤·Í4Ný@ç/rn›NжŸõ¬gí<å)OÙaæ¡¶BlÜY.6â–¾ôhÚR¶²lÍ×¶ò4·|l<–/ÿtuÂ@0¶¤·A8ÇžÓ>œêàIOzÒ‘Íüåý—¾ô¥×mðÕÏ&+ÛÛ¦­M:IÎ×\[ÙåßÄ«n 8YYî׳;—¼ž+mpçsŸûÜ©] lßK‹»ýšÁ2 IçgFyö³ŸÝ=Ö£ÁæF›ã±Ëñ!W´lmj‡tÍÇR¶¦Ú!K•¯Ï«¾e@½1Xnt¶Šýs¬xàS9œÊ€Îã·Q¡Ñæ#ùȽ½½î½{¯P¹¡Öê(Ùöúlµì —mqðˆop›BàGœ8…$. XÞ‘ï^é/ŸÑÚ)ÿÏ·S¾»ß]ÒÁü¡ýéOŸšAàÔ å ÍÖŸó3{¾þõ¯?Üá§Qi¹áÙ˜3œc‹CFœ0ä‘#ËYlšžÐtŒ [tøå2ÜTÏ¡œšÛ)Çg¯DMË4jpŒŸÐ›j »|]‰ým†’·»ÿò/ÿòTœ8À3ŸùÌs¥ÂîÝf¥±›ûò—¿üºÆjã$]ñ± /ÊG<Új5`6•ìøYƸPÛÆ#$­¯å=óûìÉ‹vÔ—g\ÈçÁÊ»õ;_øÂ2¨SƒÑO1½šì-Ûâ, ¦[ç?ùÉO^Ør›?ñ@yî¾WJy߯%í1ðŠW¼b‡ ÖhÈ„o*­ÏËû2Ðu³½g ìD¦cµ,S!û|zmËáŽûï¿ËildþD¥CðV+/ö°ü™Ÿù™ÃrQî<6,¼,>Ù¢£3ÓsªYIùÁ ‘VËgæ›ÇLŸko®^+l$–eòÎW¾ò•æ&"åV,´¼Y¾f‹}¾½¸Å„|X䎲¸Lú'1œØàÖrÞº<ÎúxqÚî6G‡{Ík^Ó͹±´âä£Åk5¼š<»õ,ó™ñí•ÓN„¤K<Ò”f:quj|u³^‹®\‹ß¢Éëþê¯þjç¯ÿú¯wÊ{÷ñ/åÐ~ æ¼Õd¤Õl1°÷³Å}+ßøÆ7ž[Þ¸Jú'-œØseÇö=ÅY»ÛpËí7¾ñ‡ol4$Ÿ?ƒÇ =Ò2Πóüç?çÉO~rרm¼Êi³•¶d†èÚ’Ëü¹zÙŽqíÑùv"ƒ@yŒÖ ò‘¾Íú‘§N F[ÚáÍBö(8é¹¥A`÷ -ßÑÊ×qÒOä à9ÏyÊy×6CçÿÙŸýÙÃÎOCsÅÎ:F>Ê0ËsŒ˜F®)gŒ£k\;Æ#T/Ò”6"__Ý(¯Ü½¹öx”è@€ ‚¶æBËÔ²Å@ÂãÕ- Ôç=ŸøÄ'NÜçÅNÜðÜç>÷\©Œ{»Z_ø‡Îÿs?÷sƒßÆÒjl­F”åéø·Ýv[·Ô§ai7Cõ28¡FWùstZ¶¢mebZÒ¢\äOÍ{´Ç­AyÑf§,»=lE~nZ2-[ ªÚÖ PòsþãÿøÒ?)áD ¥óŸ)•p_¹ßôã9úë^÷º®rsÃj0Yž8!Ó£žÝ¿ä%/9|v¯¬2Â}ˆß§GÞÐ׆pŒ2Ê —Ö›b€ÍBžÔ0ç3òZx˃meƒ@É GvGN̦à‰Ú(÷ƒÌü‹w~f~øP©4ˆ¨ô©¡e‡ûüW¾ò•ÝrÒ†©muÆÂ¹zÚW(í¨ ioš{¼‚M§,Ôº×~µiKÕö¨³/ùËÝœùÆ…m›6þÜ…íÎ6wbV/|á ·ò=yÙ§h@s.;´ºÙVYÁtK~–þÊ 1޾qmpŽÞ{1 åcžÆòÕÍòėλi•Wo»[ãS ùT‡<ŠgȠ¿5ù§-]ú)iÝóáøD윈à/xÁÙòY'vý tþ7½éM¹ç'‘\á9žKæÇ§Êâ#Eu…ʶèCü>=ò£~†5=d¦ê`g®^-Sí•Çj;ŸúÔ§º·µWƒ–¿Æ“FÙÅ3dà\¶1”?@¹ó#ùÈÅÎùÇøsì@™5ù—Þ‹³]úÓùßüæ7?¤ó[ɹâÇ4u#äá‹_üâÃt´#TÖx„ä!Æ‘5¾´Þ{¦áœ<ŽI+–Õô¦èñøŽãżomic ìk *gRºúEn©PòwµìoÜZö®.esŽcß(÷Y¼á·hçç^ÿÕ¯~õ÷p4„j4Fû)4ø h>BŒ í54ÿsÓUL”›VÖ›jâ{Þð+oßu_ ÖÆTh^Ô‹mÁ‰ H6u—üø(mž¶_Ò¼Ótë  Ìœ[Yú¿å-oÙa@ÅråF: ±ÅÉ1^â,9q‚id¨Ý±tåæèµòA~µ—ý‚Ž<`ùœÃðŠ/4óa+­h+Ê÷Ñ‘›cO=Þ>üÌg>3xKËóNÈ´g2á€Kn>øÁÛ­À± ,ýËG,]tögæçÀM¬¼>œ mñmÀ‘Ïü½ìe/ë–„™o\¨žñI7Æ‘5>GÙ‰'¼îÊ=+—Ÿ´ØF<ÓŒ 8»ÏUþ>»{ïŸ{bž7É»å­ÙÃ.AûªË-ƒ,‘íEZ ·¼->« 6WË'ÌŽíVàØnJçg×ÑÎ_N~»ol%QÙ.ùÀc.?ÿ(O+¾t ºGéðtpþxÔ/ÕÒŽ´n9Z|^˜!ï/ Ç—€¸8µÇ—‰vÆÄ‘!l¢‡?Êcº}ãrJ¯AÒWÞ¼D9Þ`Ä× ¿EÈDø®’Îù˜ÖQáDz(¯ßî•Þ·d!ûØÇîœ={¶kDTÞ˜ËÙ„| É3ë?á OèäÔb;Ƶi\Ø¢ñY†Ò鹘éµCÀ â™éC²ð•7¡8ƒè8Ïϒܲ‘ã2!öc<ÊÍÑãl?/©;š~,kKw9ü(ä w¼ÿýïß_ÈÖh3Dz(;«÷ŽÎáA6äx¹ÇÑ»¦Beæ <<ñ,C°ÚàÒ‚>që‚öF™:òÀí·ßþŽâà·ÊÝH¡;ï¼³;)FåyÙAŒ$å¨`Ž;ÛjS¨¬ñ±ã飂 Ãj,7Ð!ÅGñN)èÁ‹|ñ('-ˆGYpx‘/Îm·å}øÃ{s} T×x†-~‹Ž>ÈëÅ Dì(?b£&kþ¸`%°d(é½óÒ¥KïXÒæ­#î¸ãŽ[J!}æÏ=9ãj•µ Ó|}‡{bC#†Ð´ [tù4,f{6ô”•ià„Mº°& õ£¬üN°"+?ëH²OPžyw±¬@BŒcǸù2áX=ò‡!Ú[ òö G”— %_WËäxë}÷Ýwu)›Cv]à %Vø¼æ»ØÆ÷ý¡B‡–m­¼¡vtƒx„5<ÊG>tâ™&]ùâðQŸOýùŸÿywk0ÖWÊiÇx„¤ãÈçß‚X d]ã-ó]“a¥ÈÓ¡%÷J~Y\!ím‡#[”ûØ{—, 3?ÿ€C¥Àã¨yÈDž:òáïùåigSíqÄ”¿o•ÑJ;ðj|iÊd(?ê#Cˆ´ŒËï+²òµß’“ÏþGµÙøØÇ>ÖmjCÝWo.d%Ài>6& cÚr¤—eÍ|^WfUÃù¥ÂA_¹c){}vŽdðÚ×¾v¯dâ¾¾ŒLá±ôÿùŸÿùÃK…p1ÒŒO… *»»»×ÙªÍ&ÑnæËËtóô>ŸAÀü ÑÏxG(?ÚÎ|u¤g(?ê#Cˆ´ŒËï+²òµox vÄ~KÏàÅ=£éMGݘ†´,e²~MG™ £lä‰×øÒ”ÉP>PB¤³|æß˜®”Ù™€ÿ"Ì¡fC[S ÷ìü•øßÿýßç$ºxNgl›âËEüÜR¡äãíÅÖþRöZv¶¾`ö/ ±ÙŸYzÌ®?¦2k—3Š<:%Ïú‰gžñ±ãcôèô,{œÐ!˜‡.r—.Œ²5¹ÌŸjSýh[Z´%Í|e(?ꌵ©n\ @Ë~®Ñ”1]ãÂK¼Vœe”­AË[ãa‡cÂK.6·¾ Øú  ÜÏ,6ûóhŒÏlQCGï,k'„Î=8ƒ A»sag¤b‡pò¦¢i´Ò•/ÌrÒoå!Ë©å¥eÙ(c>¢l¦ϰ¦ƒ Á4ÙTc5ÀûþøÀyÊt„ð£MIƇ ƒ>÷ï¬ÆlÚv´¯.tž ð´c©ï›[_luðÓ?ýÓ{¥‹ÍþÜ÷Sq8¿uÅÊiÉAgé¹Wþþ›Î©žP=ãÂ>A9 ÂÏM«× •â„#Þ1{øSdMGh[0âQ&ëG9qe2”¶¥E¾46×Ê}p·A¨_•3.ŒtiÂÈ—Nçç¶£¼‘×åM¹TÇòÕd q‹Á)Á¥B±yÇïÿþïï/e/ÛÙê €ŒN°D ãóuœlˆ¸´˜üWFÈÌÏ €Ê%d{Æç@f2ŽðrŠ/ÛÇ^ËfÌG–Ë:}²òÔ1ž¡|á¹–¬ºò³l?ê GðIƒ›w†,›ãÊE˜eˆ3S“M ÊFšížxä‹ó:5·L* …­®¶¶(³ÿniü.ä„óçÏ_÷ÌŸŠ{‘‡,ËÇ$žýìgÎŽðvÖG׸vŒ #ƒD¼°Ã¦ô˜¾x„âQ¶E“.ìÓQ&ìÓÇŸ"«uˆˆK˸üN°" }÷½ï}]GÕßj·Þâ1Lý¯BòešBís¦ƒïC.Ê åÖ² ¸²”½hgk+€%ïýYRågþ±C8³>‡7¤…Úè“g³ÏÑß^Ö‘–éÄ3MYaäG>!Ò".ÏÇy&‹gæ•¢ˆË“fœ Rf^ì0¨!Ë ŽÂ=.ƒBL?â¤c>À ‘–ñ(^ãCãq-eñ}ek½>Ë÷ðQ¶‹üè7iØÍ4yø‡/)qÚs‰@Ÿ*vîYÂV´±• 4š·ÅD6Á¢“­Ìh3ò#=ãåv"Ú‚ÚªÉÑx¸ï³“!‹\”¸üh³ÆÏ´¨—[X¶Òù‰ÇN,~á’Gþˆ#7ÇF”c@`ÃSîãêÀ<£+aÄ‘!DZÄåI3Î÷Ƀ€A™M 3a Û¦H/ËšÎðžÇ¡¤AŸ:ù@y7ÿlÉìî…æ>Ù'†ììÈëéþ™×ÊÖtät :M6ÒÄM¸´#eÁÕaæ²s⓾N®²}rQ†A¥5 `4Øìd¶ûú׿Þ}",çß<£#/♯Œ°%ËJ€ˆgïÊŽ…Ø$dyÊÄ“lŽ Úˆò¶Ñ…W»ô­÷¼ç=cZ›âÛX¼Ylš9ý` 'Oµ™+†AâqÉ›2˜_i}G|qæG6Ê‹k·ÅWNhÞŒéœl.±YEˆ³¯SéÈú¨¿ûlÆœU'àx7ž#¶,}I—`"MzÆ;¥ WãK+{M;ï}ï{?6Ó¨Ù‰ü˜~¤s+ÇF®~ÖŽP=ãúKJrÎ`©U@IûÍÅî¢À¢›€e„º¥tŠk7Qz`&d©^Žw Å Ç”x†4ÄL3Îý,_ JS>BìÇ8²Æ#@ç·×6¸!Ò2Ž 4C‹Ï²”‹@z\y¨ÑÇʵlÍÑGÿ°¡Æª U&Ë-¤lâC:Q¿üîïþîu‡…¬ë.CígºzÜV± ðÖJù!h¾²my©A äéep•´–×^G[ÂR±QËÿÃFº þ¼ç=ï!vÈ&6k¡/->æÉRŠ!L…1=u™)4¯XñÒ2DZKV>2ÌBü)ܤ1j+Êôá}¼![òÇÀ˜7äPvww»ÿIôéM¶CÞâ•ù9že-³5/‡' ÁNh@މ‚|÷µ©ÛÒMÈ`(}SH‹¶7Ž(³ÿ"›,'9S+ÓÂâı?¿æ‹N¶i\{Æ[9ò@#%Ôd#M¼>—Œ82Ø¥Ósëì 4‰OÁmpØÂɇéMIËžé‘QVÈ£0^•e¶–VƒØŽW–1íš ¯sÇ£âÈæBÚ•?s‹m <òs\ƒ ø†ð }t–‹ åQØ"Ë–Ö·Ýv[¯³(x͉Ù!Œâ¾ž9·!hS}:n˜9ެWæ—/„ÎywÞ+ç”øqtdó7’WÊ¢^ÆÙ(ä‘.…Ê-¿0òä k21¾æD:ÐæºÌü§-²Ñ›C­íEò1ÎÀ (ÓçÄék9Osã‹ %¿2§0Yg¨ó+_+°<¡ŸmΛãÚÊô§1@³AÆÆ ݫƗ¦Œv´Á½>OÆ•‹ñ)¸²càÜFÛSòÊÿëqKìmÇÈ(,·få³ó]u'Œ…pEÞ^ÛÔX¨½—Z›¿ín‚/2üâ/þânY/²üo µBöUËM_ŽºcD–Ó† ®Ö@щü,Sã3+p …%¿º59y}pnG6= ¸y7½>zNWä <îÙP³ ébz5hÈx)ùþMW}1®úÚš<ÛˆPº}ñM }>g:›ÀE€R˜E–ÿlüqáœjC¦F‡;¬PtÆÆ‘%(ßjt6>!òñ’ž!'Îø÷žïG^îPؒ߇Ë3í1:Q&§+¯¢cºÈÅ™YyÒãª*ç9§©]åŒ+ã¼æÍj Ö] u‰|ä·âÈ0ävÖ)§ŸšL¤±¿Ã†`¤m€/r°Ôpû9t³¿a¬=ä£,q*Ÿƒ?„VÅJï„FÈ!ÏeƒJ“o\~ "ãÌOç:ÚQ/óÆÐ²#ÏÉŸe`µ_ƒ: IDATàt¦ƒ€ô õIL+ËG†úgp' ÁN¨GŽ€Íßb›ëÃщ|þ!Æ7Àoù™‹_¿=>ÓJ©ÀEF#ÞÑÇ!S‚•«ú¬"ܬ“Tv D–ÆÕÒÑnŸiÊÒùxàî8/ ûä;ãêÛHÐÂÑÉvZö#Û1>g !­¡<Å|›?uøB2ÿ)È#<_GFÞ€¼~È82òÄïîîv ÆãTys!yePÁ'SƒùQׄãD'}\¤Ï]?¬ÍÈÅ/ÿò//¶üçe F Ö²‡!ÊyîoÅ´ iQéñBÞ+Òk¸rBeøû¼ì—'œ»´&-mŒÅ{ÅÀ À²üb¾-‹PÐKP>8«€àÆBu‘¯ÝÄ6'®Ž0·On8½¨ü&¾g:sáÆ+€2û/²áٿβ0V”ñÌ—D>‰Ê"®~ ªßâÓˆè†l³¥‡|–•Æ?ËzØ7S#Oú”©O.Êl2#G;cð9ùÓ.e².Å©7¾Ðtùò凸N?“&¡å[å„lr1ëJËðšÅáA|r«’ÛƒúBËe\Hºò¸ `²Û4ô½‹›ØÙx(‰ïY°M2Âò?‡©vq²ÿÐbEkÓøÈRù¨ql7¡8hŒ”«¯S/Ý‘™q˜yXbó†iûõn•xvÎý8tžžðz3ƒ('ùúò Ï:Âñö•«•Ÿ3œ˜ûüç?_k¾Õ§fY–Û¼œ$}ˆŸ|õ;–|L ¯èŸ%nн½1éöÉl4”/õÜR*òL_cxœ¸ò#c䳌:¯sŸ ±ÃlEGÄF´#Ž !ó[4–üò± WñWëÈöѱç äÞ—G‹¬6Ì^\txq r’?x ÊpßË€ÀÅ`@úæÏ¼÷åÉü CˆñÎJ7 ÿùŸÿù!¾Õ÷bZ¦§=° ˜:`“mâ/Ê=5hC=Žyoº (y9C¼÷Þ{¯j{*Üh(‰íÍqHΤ³ÿ[Ù™ØRϯð"£\ š‡ßÓxÑVÔ‰zGƸ8+ þ§¾Õè#Ÿ‚3»ó Û‘siÓXY90@0°R àó±?–Aß o½eœMÁýýýn0R>Cò-Ó#M€, Ÿé­8²ø’úì ê+c9‰Ã#ÎÍ÷6 ÅÞ^±1û6`^Ë8ÈuiÝáŸM ÁÁ œ¢s¢½>gF9p?¿”uŒ…̈4úÐúGθ¸q gûéH”qL§AŽ‹0„cŸÁŠ4¸½È³{gdÒa€Á7Üp›@Ê_”ÁƘò3ÐðÇ_üÅ_\çWlaƒ«†wÄù@&f[ÆÈ‹¶ÆÐñ/>0¨ohÝEZÄÑa@âTä¦>XlÏP Ú=ÿß´¼Ä¡Ó²C¥IƒUý¹tèP5ýÍ|Á«ñ¹§å˜/å°,5]:‡¼16±OpIož¶}\Ç=13âØ¼’Ÿ¸èÃy’ÃfYí›ÙÏØ´ˆËc•ù¡}ˆèu²µx'ÔË>¶NÕ yïc®nJc£MøV¥¯¸?c6±Ò(ÜÇði**;ÚjAXãCs2âQ_Z–Eš_°¥L}ù¾‘õ¹·ç¶‚•åž»Ì'ݹÁ™´sþrY‘…†aç1_ü©ùý!ßËG–r°§Á*&e¦@ümÙ£­>\ûQ†A€ÕÉ&¡øpoýÙç~õWõLq›€]ÅÎ…Îþ6†Ü8"]¼V`™m|,¤óS¹tÆxEýH82Ä\ìú³/MYå2]þä¥!f3lŸ„`y[ùÆŸ­2÷ѹ`% ŸL'ê´Ò̲ R~•a*Ô×q ³Mf¨¬0ó‰3Ìí7Q¾h:Sáì@)À.…Ø4xÿŸíP9Ú·¢”‘nÈ“åæBì0£Ò¨ 5[5Z”‡ïi?l™_`Æ‘ \þ•¯|eçÓŸþôá½¾é7$¯òžó-²g^_Y‘çsZìoÄUöð[®éÂÌçž›'1òk°c–Ÿ¬›ãÖc–7žùÒ#äIÀ¹¨SËÝB¿\ã Ñf¥"7^þ“9W1£:[Ú“¸…ð6BÝÔfÏLå³ä¢L ¶2ŸÝx-yïkôذӈ·tXQð¯¹Ç±Ü·¬}|áC®\â\„!_â3äXnÓq)7ôègói‡u˜$x¤É ys`§œ~,["÷F—Ú /–„fmÎJ7Þ¤Bì¸ÑS:“ÊüŒsÿO°òå ¹?¤3j+ê‰GÛÒ€G†ÀŽ=4ËÑØé46zË gæçžŸq’ƒ |¤±Làc|Aù¢Àý÷ßècøÑß—'͸'Eñ ‘rC}‚rÖË5êø_õÑ`3•'ƒÒ†aöFà&Àî\'XX6‡là°–ŒÎäÙ´ø\Hžâò;Ú2¿‘–ñ(Cguö‡Nþ-C ÇV_çàžŸpÒ;¿> AóASØ‘§àÑO¬,x»3.ß­›¾z ?™ÏÀ+Øò"ìˆå'ÚŽüL‡g½‚ç |¤gy¹lÙHçž{}:vlÄxÄY®ò<ü´Îösëíùº†ã;|&/úÇxÌÜä¢Ï;â½ÅWžÿ†ˆO¤O…¤C>Ñšn‡üH´Œ3ðíŠMBIgw®þ¬§¿þë¿ÞÝÿSÀM.W5¹@5hÌ,;­@õŒ…v~ä¹è„Bp/ùBéB*Ôc¬Ò¢ŒÓA”«Á~ô£ÝLj¹N ¤nâ%Z¶\þH—‡ÎA®,Ÿe#_Ý,“oáZPŸG¾¸<`«öÑÝì“ãOƼŒÅg­ÊÈ| ™Ú4P¡Øi93ÚG¦–æÒËó’!y‰´ΡÁŠkáØˆ³\Æ9CÀ£¾“ºéײ燙–•À˜·ñþ­ýÝÝÝîmË÷ÒÍqigà6 ?êDºü´~áÕÚ¦63Ôtn•¦èf[Æé“âSàÜ`o‰L³˜â¼š,³ A§¶ Niñó`”¯édšy`€t G§ÅcéÏ­ÄiÔœNM°Ó´p|—B}ÄÛ‚ùÈG®«kë¡3^~ˆKË82Ц®¢=mÉ«x­O¨Û üD9V‹1å¦à%{E~¿\“ÂÜ`R"5aîÛ§¼æL‹dºñ±Oˆ¡WÓÍ4Êi,çÜü£l­†éÈ釈³QÅ&ÚiÙø«Õ14ÊÊJG^väXþŒ£Ó’£®±åW~%äúŠu"¿Êå–¯_ÐÍ8«Bô} ï„ä":yâ=ƒ²ÌØx´a]GÚÎ@/6 %¯³Î6Í,­­t¸Žh99yÌ 4(‚új/Óó± lÏPÛ™N<ÒhP­Æ騋ñŒ»Ûm¾—„<êd¥B£g&ä/«ØKa‡|GRÕìb›Ç™„Ü©‰ãÇ< d¿ çmcö½õ`â-¾r”ÙБ>¢cþÀ èÛ6¥Õ éÀcÀ§Ò7 cÒ¬ÙŸ5C»s4¬r˜b.±û–‚T&!V ¸ñ#n ñæeÓ‘³¼gäµÞ¥UrlÎÑñ…Ü£gÃý1dz}·b©|°ì¦œvšì#Òiñ"€8þ¶Ìc¤e™(ïgã"]¾0Ú퓳£|¤e{ÈE>ƒqŒkg"<ÒMÀ݉™{ˆ80·Ð:t‰å?óõVplk?ˆ#Gˆ´x ²Y>qäiøÆs' aÓùitÈ%¶8AhÇÇgvüävˆSŒ¬xg©ÛÊÊ ÀlW+·>É>«ù’A öüë]ãâÆi1HŸ)O Úf™ŒgHû’É:•øÑ=\ ³ÝRnŒìL ®S~ ê¨:3`äG}ã‡&Èg¬èÀ­Æm#Q[à”%ê,9ûS.6YUØñk>®ä³*âŸløÆâRƒ·}ì(7¾£üÆ£/Z8«GÞ‹ äz°N:fÊN…Ѷx„– 8&,õ$`LZYfÖ43¶`9±·Â# ÜÊÞ—÷ÿ1¨;Ò[:؇WãKC†;âµNrßf·KÒðÌ»¿ÖÑíðÀˆ#‹ïØxak‰•€g6¢(kŒÁé¼ÈbÝt„D‹üX_â-m·äðsË7èôµ_mb¿Oþ¶Âõk—©üÆoüÆ™Ýôj%5Å.6tâThúÌ’4&ô…àÆ¡I7å"¿…Ó`¢íˆ3;²d_"°ŒÇ6ß‹¯À[P¹iÜK JØâ=ý§¢¤õAmhý>ò…Úf#}.j¯ØU¦K$üH_ Ò7ƒùQè±­6=ÿL¥1³Z¨Z|è^Ú‰²ï³…„†Eeæ?Ò±ã_êÜﳄ§£Íúòóìãä™ûÔÖLl`Õf9møø¯ÏgÑGà­åûP}E>¸y¼¾¸åŒò”#ù‘^“ƒÏ*«Å‹úCx-Í!c(0SðZÁЋ9ÊL…ÌÈ4*ºY_º0óÕaóŒ<õ5dÒ‚œåŽ8#—là1‹ÇNq;ýŒ:úhÓü‘/|;56c|'_ú=×¶"­…g¹'DÝVÜ|e;ÅòcýªãÊD8IJ-<ç¡%é“ÍÁ“iqíæ‚d¾r-¨~ ª?¿yàÈÔìHSÆFKœüšgqäûô™¹7 4Hš¥f‰%fÊæò¿à¡AQÿ¡+Ž/ñW®d IÏ8|‚|Vž*”6^³x}‡—!vɦ‡/6 slÌê͵‚LÍ|´¡´yÒú úÂ(+­Öx}4ìG¾€ú:8:-9d6 ,Õóìo'Æ™]Z†5™9 ¬Vý€[¾è£c“£³tÞXЉgštaæ£OÈòcÛ«z׬\ûUWySñšý!Ç6äŒÍu€…Î0Û'žeˆçK¹,+]ùÎF6ìV㥌–³†³‘¸Dp¨uâÜÑ‘ÕW›ä‘'øÉÁdÈg-_’ot 1_Ö‹t¡ô,éÈ2½GÞ:UW¨Žq`K¶EºCx-½!crÉ|¦ÅÌ÷NÞ¬ÙC‡†ÌúÈGZÄåAC߆l€\ðiÄÆ[ :ËáM—Ú¤Ó·üÓÑ„êP–øÒTôçX›Ø™»ô×—úÜz0}lKkáY6Ç£ž¶ú >ü.R~¤W¦F¯Ñ¢Þ¶ðɸD¨ÇK·LKºq¡rc¡zBô" ^Í®´(ã;82-^¦#»i ~Dì´s`K‡N»é@ùìü¹üÔqö_”A×8Ðzª'åЯéÀÏAyéÆ3„ßj£ê Ѳ9®ÜT8§oÎêÍ1óS3©|¶¡C[|é5¨®Pã}žz}xË.‘«Õx)«åíõ¿ ¤Ð[xˆ§¾0ÚYâÅc×vä–ÏZtýG=aƒ.ŒxGìáçºÖF„Úˆ´œ†ueûpõ•±LÆçÂlwŒcræt"…Ï2µ¸…ÞÒ¢~ÄM3Ò"Ÿׯhe"C#6ÞjБÎýñ¦±×w `ÇÎ0vôÌ3¾ÄS ÎØù­g}„/kx˗нÐ7ˆg~‹®0ÊÄxMšåˆ|qm"=êE<ÊNÁki éÛÐWàìœXˆXHñ±P;Q<-9èYgܵC¹è„ìF\ž v~å:Å ~È›€vÚ Çtô–Φƒ“Åj•¿EG/û2¾  ]Êëzé5yù}:mY{׸úBõŽ N˜í–ÈììH’õ”*g|º+]Ó‹º¯É¶¯÷»äÛ¼·p6mÚÉÈ'ö§¬Æ ä‹å;ƒÃ&CJvæ–ÏZôèËX'oÄ3Mº¾·4Y6ÇÑ!dºñkÜk¿Öq¤õáØˆí¡Ovˆ7gyVm.1[Õ•Z“‰Nð™·zKÀh#â¦iÇùžã·BáçY¾Õ¸¡oÚ¹Ì#u<'oÍäc:¼ºÊúMÓ˜ }÷}ý4¾ÄÏø‹ë ⳇ,vÔ©ÉC“ß‚øg¨j;BíI[¢O1@N ³€9Îc ÇŸ4Äíâ¤L‹ò49Õ«ÉÅÆ”ùèEZÄ#OLq0[äÙ ñ!œY{‰ÀéF«;r ÚÁû –wæÌ0¹<¼úЇ|‘N쨣Ÿ¡åúÈ´ÈG†`|.Äùìk£ÈLãZìú[¾4ƆºKÂÉçó7sŸÌÕEasZÙÙ¹ÆÇ@:. Ë xIÂÏ2,ߣ ÐøXÈàÀ‘Ë85Î3ìÔ.ÒªÑ# òþ™Ï|fjòUyf\OMbW_áÙ—ÜF¨›ë¡åëš’Ð -hAúøCíY&ƇøQ¶§obkJ8¶€ʬŽrèâN¹©;5HG–@\š¸ yƒ–g0&¼>:¶y[nÓ}ìÐi¾üå/ï<ùÉOî:zß ïê Ëà_¾&„­%f;¬û!¼æKžFèw !BñL7._`| dÀÌ2M ÑSô–=¶€eœÿ× ¢ó¥áh5§*;µÕ’£óº4E9e£®´È—æà >¦Ã×d–È7·ÌÞ·Ýv[w;;x_œY–¿$# Knûje³…V«òiD˜qiFzK·F‡F ïµ¶yÛÿkÚ|0u®þ†¹sköJÉðî°ù¶ï«Sh dËÈe3SÖ7>2ŠÛ ÌGM¿FSži·±’Wó;„£gCâVÂADÛ›@|Ä,Îÿ0Þzë­Ý§Øj_!Ÿc¶fÖ_bæ'ÿlز‘ˆú:¼þ‹2Ù~]ØúÀ¾80âò¤g£TZ "Khñ¡ã7‚uÝE?Ú‘­·Zâò¦ÂbûòTäg %³Wʵ‹¹A˜Rp¨<8… c§ÂN¹ü0 [Ó4qõ²_˜aeC¹b#îñ>ƒä’–²‘LJ9 X±0ó0»ó8ŒôàÓ1 -Õñ-³?¶­?}¿†ã[|&Oÿå•ú¹2Íx„ä%ëv*d0}ËÓ‰iD~¤ûÅäH›Ïú–ÜÜà°"gd´S±£ŒÑ·R¢¬Îä>•Æ¡L†êdzŒs'&‘'íHFÜoÍ“7ì\[4ü³Àþ{tð/|á ‡ø6:¾e`‚Çú½8(Šû5àì{ä#Íx†ú˜AO|*Ä&‰Ãv¨kœiƒ±vÔ?*8w¸T2¼·I&Y´ ÝçLxQ%.Š ÞTèG*´¡~gôÀ®4`ÄÕò8ç8ä“Oó:„c3vV®’°}šß'äž;–o ^óƒƒA­ðQ¬›ˆË“Æþˆ´ì˜åGùtù,yEÆúV¢³Ðpi(­Ö€¡©͉Ç€ÎUfÈvt4€Ë0ôµ5M 9f>¾¡hO<Ú€FEr?Ç,ëŒ5¦¡#Cˆ: ¬nN{àÖÂÙŸ²P·Öo ÇøC^ôuíÊ(Ö80â¤iÆ©lj:ÊöÁÚ½;¶,Ÿö#4-iÈÒn6 ÙîX{³€R)ûåzûØDZrT&Ëæ>‡µt-pߣ@u•탚ÉÏ…£¼x´) (Îýõ•ò¯¾”)6Þ>ÜU :úH;í«ÿ⼯üqàÿđ×—Ìþú9ˆ£C\šñ™ýåO…Ø! Ç¤a}]£^û…']ûò¥góزJ› ÷çèÍJBWsAæ$Î}˜ÕIšSÃÜ…»RÛš`”§R) Á /Ýx ¢çlL¶c|R™|%Ö¿®Šò7‘–ñÇ?þñ;÷ßW¶ÖìéV2¶k8{¦aú'~èCêfÚXα8e£Ãâ uØ\…Fˆ¾F¼&ŸÇ®ªZò-z—øAú­å¿2¦_kÇÚGÆ êÍÀ¯ÌÐéTfEûJ)Üngeæ õš£Æ˜Å™:v.äq™eÐÏ6ÈK¤µpä¸ `éë&e³|âèÓ¸ÛЉg\lŸ†@ççQ#ùιV¾(c]Æ2ãG–ÿ†–ï¥G9iBN8Œguûä8±I‡‚ö£\Ô[b(i\‰ö§à³€RˆKåÚ›’X–e€¥b|œ’er<;gÒh˜% ò[P{5>GgåiÏx„¯ÙäO5ùo¾Ø¸#ŽNŒÁMÓôN"üð‡?ÜýÍ8y‹qꊫ…S¾<øáþàÔ²kxg´ü´øêÐæ Òæ@ÎŽXíµi59øÜÞ-ñ ˜ºÓ›‚o2tûS«É² àùy-Œu&r^ÑŽúc!›:µ§ØŒöµ'](Èðàƒ®Nj|¨C`WlÒ9â`ÿ$:?LjÉs­#Ñ)Köåe€NÀú¹#$Zä+'䑤OU¤…1-:.OhÐU_>eÌ™wajô¬?">ëþ»³€R¨+Tò¦“]~`Œ3[éÙp´1j—Âýä'?ÙE±‘íÀˆ´ΞŸøÄÃWi©h.äñ›ñ±…tí4d«“èT,û9îk›°>Æ–OyýBÙÀy!‰ûvý ]<ˆGqø#6^ƒ³ü´lIg’0Ç1Ý(K|© øîʘ<Ôdf¿ök¿vù·~ë·j6'Ñ|o¥è )Fp&3…»²VT†ÚÌôÔ£ÕÙ¡QKGOØÂ³}î]9xBÙb爸<;A_§¡œ¤¬ü0Ýã€<ê£óól=æ›2YŸC8åAW9íð¸Ž!úÜx¤‰wÂòÒ€øËÓêÏ…<1²l¦7Í‹rè/4\¥/jw*œ=P©¨ýöÊ5;ðϨ„)­93ÓŒO…ì%0°‰…nM?ÓȤEüéOúÎG?úÑë: œŽ½>ÐÀŒc×ÎNÁNœ‘°sUƒÛg?ûÙÃŽkþÌ»y%Þ‡“ßÚà÷©O}ê!u}+ny‰KË8þð!ÊŒ‰wJzL2 Úa‡ [§ÜF°ç´@˜ÝùI{£ è_*ÚÃÐ&ák_ûZ÷†šÎɶ²C[r6"åÇBÓSžû÷/~ñ‹‡• ]žñÌ—Ž '÷¸Çí|éK_zHG1¿}#Ê`/ÆÁÙÔb‰Ì¦ÔBJ$Ó˜•y,çʆú  „œ?yCtä¬W i89èÏègÒŠtã5¼¾cÞð -}éµ7÷äiÃrYø Íþø`ö ùÚh(•zÙÝ÷XÈ©8ƒÀìHíô9T¡62âGy:£<¯ÐäEšôˆw :òo-ïá3ÈÑQçv”¾ÉØL¥‘“oòïíùÙrKÄIIŽöÒñ)õÂ0i¤7„㟚ìûRUö­>°†[^xqóz”Ÿ¯ÍÚ”sJ ý¥€Ò.ŽoP–UûžÙ48Òcgª3M§r¡¿Icý'=éIÝG1Œ×lJS&Cù4òg>ó™;ùÈG6^úS¾Øá"N'åC  ›® X°ÇÅÆ DúÖ‘8å¬uä¾¼"O`eqt>ö±uƒe'P~ôc„5<ÊG~~ǹÈï‹G› ª¬èÔ•7F½ÝÝÝC?ŽÕ¯ÉÑkô±´VåøáÕ .0›`MŽ$îÑ8]…“l`5YiÑ™ÐÔ‘>f{êQÑ\¬¤ÅѰ†#ËÒñ OxBïÙ€Ö2ý¯FGžo½àÒfŸ€'àt8W tt_×e£Œ“[ ê}®¾nþrG&^Ë_¦ÇÕ + ?ú‰]ü}šiÄ YNÊÂ¥L vÌò£N Ò¶µ.Òó£EÔ£º]»LÔþ¸Ñpà~)ØFvØt{ÊSžÒ™Äq:ë ÃÊ1žùÒ4:B®ãc!«V'ÊG›Ò€5¼ËÀAäsBÙˆ'¹ uÊk™‡pÒþrtn:4ñHoá5¹¡üa+vdlÌC 7¯ØçS_|;š>‹P[âÖp&–¢LËN‹Îãjʃ ˧mífy» Íþ%Í}mÎ…K —JAïš›õØQ~êSŸÚE§8Sý µ± ä˜&o ²&`«fOšyÈrò r 4Lˆ¤†#Ÿ;阎H>ÆÈµdÌo-OØ®ÑÍkËf‹n^ Øõ'˜>P<ÓËϲð¹%Šs£¬ú}=þ°ŠÊ6®I´;»üiÖ{¤OÅK^.MÕÉò×nÄ2uBüܹsm›@–›4‚Ιc}: !WVŽwBrÏxÆ3ºÎDæÂ†¸(æ'·ÔIDATqh™eÄ•{Ö³žÕ}þ[ýÈx´¹ ®Í1Y|NZstH‹<1 rߟó‡M¯ÌËqä1 ²‘.?BpÂOrr˜Ó>Yú{þŽ~Ô¡ïåñ‰ÃezÔ­Ùƒ†Œ—qe#ä‘«u0vÊ凴ó˜Çtõ_kgÈIW'ByB—ÿÆçBú\Lg.¾Äx±Ü#½kn&Ôc÷7> .ÄYc¶ïþO;T0¡bë9ÏyÎÎ?øÁ‡Èª×²!?Cä8)È«Ãì¾S>h4dqäb| N§ÄŽ C8ùËiIkNþ°K=ûÊ4iGÿDû„LË:פ®Éùî@M'ÚŠ:‘žõøÌþËA9é5y@ö“jç¢ÌX¼”ñä¬Ê½È•âŒE¾Ä›_¬Nñ!\})YQca—òåÙ¦i¼^ð½ ËËP¹,CYXa`;òÀzF6Ï9Ctùc eâL3?çj:¤¯š ´š Ë~.x1Ÿ éü­wÿm‡¤#Þ—šýK.Óçbùæâ‹Üx)øo÷~,Ç@5Ùƒ4«\ý9_ îk /zÑ‹¿ =®ÝÝÝîC"6öM–ÖÚÀî\Ù10NcÓ¢~}½7¦£„‘®}ùÆ•3ΠN˜ mSèS/ÛU "S£C3,5›¿­ÍMá"·d¢dŠÀo½9Îyü¬ÐHŽtp–´¬òAå´72 <÷¹ÏÝùÀ>Йˆzâ0Ä#Œx-}ø¼„Ä£&¾#Àí ›òM]š££_†pÒ· cÓ¢ SòGyøX*K‚þˆ84é*—éQ'Îü59m }r¬ú8<¥Œ:-ˆþÎòÐø“V%.нE–ÿäe±À[ßúÖ+%c‹ÜÄU@vΜrQÈ[)CÐôZr4 Nô9ó‘õ2ùÒ”f¾q …]gicàÜ9æe*>&_ÈpðéÓŸþt÷˜7ú ¦—mE¹ÌËqí ¡ºT®™8vËì?ÔÖL#šuZ£Ï ]¦¯Åô6Á[dâÝ¥@÷n’!t9~ËQÖÚg—¨,œ6¬Tdyõ’M6i›BžãsËÙB´qói-<Ê2 3Ðpd”ÓqljQ޾Ù}:Æ\M.ÂNþÇ®xÇ OÏw´Ê.½Ë@ù!.-ãÈÈW&Òᤅ״vºG¿Üû«'=Çõ[ägû;¾:¾Í¨l„àe3¼Æ½ö+>f¹iQ¶†·dñ#íW¿Öt§ÐJ:¿3E~ŒìÃZ™£Ü’¹xñ⃥л-þúk^óšÃXòš/lešq:ƒ8Æžÿ]z–3.Ô†ñIŸ]{¾ˆ‹AqmHSF(](=ÃÈg0ãþÚ3ï±#Ái˜cäj2ø€{|ÒöÑ[+¯1ÏâBuˆˆK˸| Ÿ|!ëÃ825º6•‹üe/{Yo{ËòÄ[OtÞò–·•CIãÊÙ³goÝØP2°I°¸ñ#A qÉ)¼VÀùްà1H—F£ac‡åi+hc äV…ÆÆ @@·¦ŸiÊ 3ßx‹Ï½*¥\$kÔ‰òÒ€\œé \ÒÕݲ’âÑ.ÁvDâcà'æ Ñ…ïý/Ч²0‹½•€œ”õβT;7+WI‰gÉ·–ÇaŒÒ­Ðª°\1è»tfÇZ~ ÆôZ2‘Î ÀjåOÿôOï±eĵM\ZÆ£®x”mѤ £NÄá2x¦e¹Èxg0ÙÌ|âÒ²]ã‘Ï#Ñ¡™_ù¬å 3?·QêE¹Ö e£³?«Ö¥BYɽs)[ÙÎõÇ3wƒx±®õ}³ÄÅI²!;µì¶tØ ¡QÅ`¥¶`”¯Ér¤÷öÛo?¼ŸdÆõBÞKZ *Œ29/ÊÖøY?ÊG^ÄÇÈ(ekégZ”ÇFæK£þèPÌüäú`Ç!§^öariµìÁË¡%ý•¯|eÓ^Ÿ^WÒÝ?èK9 ‹Ä·¶ wÅÉï,£öø¦ÙšÓwT˜ÁJ4ĉc·lh¹‹ž6‡`L£&Ë#Bž`üÉŸüÉuߌ²5\»ðjüHkÉBÏúQ¶Å×v_¡²BéÀˆÃ'dZŸÞ™9Ê]³T·ÕJ£FgEÉsn3æÑt€Y&ò"Ρ->ù½T(áÖfò¸•Ç€±ðï}ï{ï+ñ½H›‹³´þ©Ÿú©Ãû@E†ØÏ´w†¡ósÜ–{`iBuŒGH1ެñˆCã‹7ìch/æÜÐâC'ÅGñN)èÁ‹|ñ('-ˆGYpx‘ñ!Yõ£œúÔ5«4}!ò1ŽŽqðoÑ\^üâwL–ÑF„æ5Òjø/üÂ/t+Ë´!ÜÃÞpdž6zÕ·º8HùeôÜëÍÅH&»÷œ¼ãqM_ bâˆM<ùì*s¢Ïÿ(Tv.ŒéhƒY†AðAŸ> '?ˆGñ?Ó”F¾8<qi—ß VdåGý(Ûâ+_ãS/ÌúÜ¢c*3vÂåGû}°œZíNû!c[P¿krÚW›}ûTÊ…ÅþVgò±õ‰üÁüÁ}KÝ `sø¾¦I%ä+6œÌkÅy±‡¯ÿÂÏ3‚q¡6ŒGHþb<Ú£ó3ø¿ƒÈj+ãÄ ->tùr +-òÅ£œ4`ÄÕoÉÊÏ:Ò…™o¼Ozy®ìË9B–7õøÛ­å¾_ÚÕÊ›Þô¦îų.#þ”|ï¿þõ¯ßêìOb€£ßYFÙ½ }r¨Î§¤žÿüçÆ©ÀÑ¡ÙÕs?À¿–®íM!ö8ÀÂ- gxTèÞƒ¶cšÒ€GƸ¸ñÅ•ÉP~†Êe:ñLSVùâðY_>zâ9fý,§î&]¶yɇ¿m7ýkœ‡þ¶ø­6Åyò¿T(éo}ö'¯G² ¡÷½ï}÷çí/xÌÂ×z©¨¾‹´Zü<; Ç~€ƒ€ü µ7–Ž!ʳùøÉO~òpo>v…—Ö1ËéGz¤eºñhS!êg\~'x +M;Q'ÊÕø‘Æ?ƒ¯öj¾B^ß™Žqa‹íÑùY¦+a¶y7¯ÒŸö´§í𵨥B±»_6·>û“ß#YPy–y¾Üo?¾Dàü=Û†F]*ÉQ<鑯..{ \u„ÊŸ Y ÐùòÑåË—»'Ñ–xLO0âQ<òjx”¯ñ#­%k:ÊÏP~†,÷™õñCì|Y?ÆÁ ÙÖ˜8·Î1¨c¼Öäeˆ®ò,ý—<ôCZåçùœæ¶âG¶ ôGtoqܹ¥ Ãìñ¾°kTJ¼j*òûpŽÐ²ÙèGD´$Ä8vŒkÓ¸°E|6!ùguÔ#žñ(ÓâG(½O§%›uŒgX³¯M;¾Ë}} 4ÏÆ#ÄFŒ#k¼¥MEn½8FPv4=í¼îu¯ë¾×Ð^à§äé«^õª#Žl€oÊ+£w—åÞÙ‚^[ómè0Þ„»råÊÎîînW©Ñœ#44*:Æ£\Æ‘å33¶Ðû`Ç!—í¨çá!ÿ“°&i7ÒŒg((n>"M^¤e[Æ[²òy¬ÇÓ–¼y+ˆ.!æÁ83?oøÑù-ÇØ¶   A]l±‚[ò™Iãj¹ý¼Û´Ž.úA¡ —{¥o•Nõ=ʼn{8r‰‹ûuî!iXCÁÊ‹r6šHG–ÆÃ›ƒ¼Xƒ:Û€œNdð¡aq6A.ŸÓ']/ò%Þ—Ÿ(#n™Œ· i[rÐ àÝeö¥,,÷µ3F»cõ¨?6ç¸ÍÈaJ[ȺÄýèGwO£–hÃÚ(fÿŸòÜÿ½µô¶E;Ò[ Q> ±Ø÷°IÃb†™»¯qÎå}ñ‹_ì¾#@Z.3ÔöXºrCzlò؃D<ªTž¼€ÄküH‹ò}:Èõñ³Í(Ë`̹ž‰Ó¸-+ãèצñ§ê1ˆò¤H›KB”;ï¼s±G~”­äïJ9>~+øQ†#½°`¥°çËìpŸñM!3äý÷ßÝ&6©ôj#–Éqv±ÅÇDÚ*o|,£Gc£1“V# |5™•OL'âæQšñ å ‡øÈµdÙaÆ¥Ós¸*w^õ–†ä™íòBÖ ^ð‚CZäwÂ?sÚªwÜqÇàæsLg ^üud÷ý1?Dz ïÿûÝÄ&Ë2Þì¢1ô]ÈöñáÙ€£÷å<Ã|äÊg¨~¦ÏÕÓ+òê²2p@€o0â5¹Èx–åV…NïÅrß2¢Çe\Ø¢ñûôÈ—ú@N]ú^¿z}ý>><íƒ3°ðØoÉPì^(·*Ç2Ë ç•Yûî²t?[Î"‚ؤC0 ±¡Ö¨È8úÏ!òåa—™ÍA<õ3T/Ó‡âcôÈ,ôÈ ‡ŠðŸébï€Ï«“VN/ç9ò#n><šËÌÎ _ÍÕÀ²¡¸ºCr->þ s²ß€L­þL#Â,«ý(£-qŠpÉPüv•¾°¤Í)¶Žm@&Ë*àlÞ3%Ãcdùx”ʬ]6Öo ͧ@åcG€f5º:ÊeH§êi³¦ç@à ¡,ã  ÆéøàÙ¦üL'N¨ÑÕ©Ù›«§MòLçy—7M{HŽæ7¾ñ]ù–ü)œï,³ÿÅ%mN±u¬-³õž2Âòhp±Àf #5ƒ€±VÁ$X£·hÑg8ŒÄkÊÒ3ÔN¦'Ôèê3_^¦Ï±§–Í}NZÚšn†ÊŒ¥›î÷yÇF°6ú ö³ õ‘iÆéü¼ÚÍ hÉPì_|éK_zç’6§Ú:¶[3ZîeÏ—gÄ{%¾Ø­•Ì®9ßdãÞ´¨`—w5ø1DY÷šf_ÀG…YÇøXhzcå‡äZö¤‡lŒåks¬¼rsôèŒtü݃3 ÙV,—ö±#ý[  8¶FâWËiÓc¹ïùk÷Ž(µE|ooïjqüyœ¿äÅr÷3ŸùL7ãôÙ¥hðk¡OO÷áOúÓo9°cclAÓjñ§ÒçÚS/¡´•’Û&Ÿ¹¼)×½ÑG~¬ ó&”>jK}™×¾öµÝ†±6&ȧí›ÖqÁc¿°àå“Ú|Eø.ãKAnxq(ŸˆKAÒ¢Áν´ÅyŽG;ò"$½GÞ¸ºÆ…-:ü9öÆè™v„sÒêË»<`L§FgÕÅŸl²²S9B”ŸŠ×l1ó—#¹Ý…t ,ûsO9Â~l±('f SeøxAÏÄ .3Ðp¸h5Òiñ"=6–Hç%"í(›¡²céȲ¼ñ9öÔjG(Ï8P¼Æ“V³…Þœ¼g=žÀpØ«µ¹K1}x.K–eæ§ó³ÒX:”´.—ÎÿÜ¥íεwì{)ãçËp_¡-êyÎóîsŸëîÙ[{4–o9@¡&ùœ‚c†âL?i.µ7`>24íLŠOÕS8d{I¾oÛ=ö±=ìà1/â¤Y«ó¢°&'Ÿ™ÿÕ¯~õV:IãjÉϱß÷[Và‰Z¡}ìcç ¸|éÀ )lÜõ­h0K]<)à¶€‹ ÏjÎDBÓ5.lÑá”Ëpi½š=Ó¬ñ¤•ËP™L§#rëÆ®Ü6!·ÛšùÚòùç=ïyðNÜ€WÊ ð®ÒIßÀ634:lt±Q!ãcñ>[¬@xdÈ©=í)/lÑá”˰¥×¢«ßâ·èSòaStHW½[ËçºJGìøÊ›g !ÆÇât~Žøòç Û%¯÷”2ˆûþX¾9Áò‘ŒE¿  Í @#k­ík8µ†×’¶¾ð…/~P;@BŒcϸ¶ [tøsìÍÕëËG/瑽rûIJ_½s¹#/âØñm±Â(;ò[ëü%ýýòÈòòuÒÂIÛˆþ¹³8î㥓îFâ8çè9ÎË}eíù. &Þ'!ò"½†G[Ü‚ðÈpww÷ð¥WL#CmfúQÇçæC=`-Ïl¸±Ì§óÇŽåµ1Öï¤eMW;@ùlôñ½ÒÞF(Í•b÷ÎmØ^Âæ‰]P¸² 8SV‹n ê8VtF¿NCCár&4>:Ë^Íûnr~_ùÑqóíe¾¼L7Þâ·èè-:³=ßud6 ó° k‹£ÃüƒƒÐ6B)ÃÕ’—;Êìyö—°y¢ X½rvß…mÙàϽdž‡|Œá4¼–Ì-^äaUÂÉBVÙ–q¡é´bYãKëM±Ç}6þ©O}j·Ë®n„C~вâ¹lÒûlñŠ5Ÿ“Ûf(›Àtþým¦±©í?PÀò®ÿ¹2[oåÉ€dó‡gÍ6!|ñ [ /ËoÙÊvxrÀK´¥lq{ÀÞŸçµd i˜I7Æ£œyÍüL§£Óáñ™U9àRåk‡4Íẇ8_ðYú+>]!ús¡¤sj:?Ù?u™f(ËôsàÛ œàSÖ¾HDZ6*a_ÃS¦³­¹v°m±2àb€ð{7?µ4¡Ñ¹íÔàÌštz.u‡`Îòµô¶i‡[:fým/ù)k)Û©ëüäûTdüØúí@ç ‡]û<8ŸÂj¬+¹cÔ›ú’ Gfým/ùi#%¯ÊY†S5ó“oÂI>t-‡_^6ìÎ5D#³Ìæ-?n X Ì 4è<Œ’é}ñšä—²5Çé×òµ”­)v˜õùP÷üG˜ùOkçÇ?§v ó8þóŸÿ<è9~¶XBs¯ÍWpY ô…±¹¡Æmµä—²5Ǿ¨åk)[cìpˬ_ÚD_Õ,Í;Õgœê€”{ºA 4ÀsÄ·¸·æL?÷•ž £ÆPë ‘ñܸ—²•íæØ|m+Oä!çknž¢­øU&èGJ9.ÐöŽ"­m¦qêœCE”—l>QÓVÏ Xlf±¹ÆÀj€ssBî ØÛ!rzÙÖ\;Ø]ÊV¶ƒí¹ùªÙbæ>ŸÚ£ %/w—6w*žóùå†(dy™äžr;pµÜ£ß;Tè¥øœåçß‚xZÀ½çÐ@±ºøØ¼-e+Û!}òrœy"9_1OøºtÀî ²GÊ7üÏ—´/ešÛLëÔ>h9¥œ§ß+<>5¾•ˆZéBg àÁR¼èÇi‹r‘‡Ú55_-[cíà_:þcóLi(å¿Z¼³¼<¶¤ o9±nÀ_e8S]âG¸5` pÖªuž¼Ží-Ò—²µ”ò5Ǿäuáãèøä·äûJ¹èü—»Ü@?7Ì-@¬*ª Ï-3ñ{ }/òŽçÖ€‹gÐ  ­`§ˆü>ù(—ñmÚš›'ò˜ó5ÖO\øSTÞÏ8ư_d:?+€.Ü+€XKå­º­}^,¦Ó‡sKÀc*ÎŒ™Ý±E§º–²µ”ò»„-޳³¿­ÏsõÕU䕲ÜS ÷¯˜ÇMñ~ÀAe8Wf‚#ßÈÄ À€@èëà™?¦cµì-e+ÛÛákùʶX)ñö ŸÁò8Cñ5_ï½»tþ Ç™£Hû¦pä—¿üeö8>|æ(;”Ë`.C­“Üè4îíùÈGvo²Ü? ¡øür¹Î—Á膻߯ù÷¦,|y·þ]¥ãÝeü$ÁÜáÉ[¦ Å[+…¥lͱCžÍž¥=¯oë;|äqN(ù¼§ì7ÜÐKþì—›nÀe8[–áœ8ö[‚\!Äí0tã­ŽoÇjñ#})[SípXŠNgË pbWæSh‡c0p@àˆrÍqW ØÉ¼©qW&ÌáQ'‹NÏfÞ) Ýßt•[‘›nÖõsÓ8ƒÕ@Yš²7p.:ç4átJ.:5gìÜü‚8åoA:´<îÛ™Ù¹  O“b^K¹.”¯'Ý}³ÎúÑë¼Q¾µ·w°Ø ä½q>>ÿ777ÿ000ÿ...ÿcccÿmmmÿgggÿbbbÿ¥¥¥ÿ½½½ÿ½½½ÿ¼¼¼ï»»» ···Ÿ···ÿ···ÿ»»»ÿõõõÿøøøÿóóóÿìììÿÌÌÌÿÃÃÃÿ¼¼¼ÿ´´´ÿˆˆˆÿTTTÿQQQÿNNNÿKKKÿHHHÿFFFÿCCCÿ@@@ÿ===ÿ:::ÿ888ÿ555ÿ222ÿ///ÿ888ÿ999ÿ222ÿ+++ÿ)))ÿdddÿcccÿ^^^ÿeeeÿ±±±ÿ···ÿ···ÿ···Ÿ¯¯¯±±±ÿ±±±ÿ±±±ÿØØØÿúúúÿõõõÿðððÿÙÙÙÿÌÌÌÿÅÅÅÿ¾¾¾ÿƒƒƒÿ___ÿ\\\ÿZZZÿWWWÿPPPÿFFFÿCCCÿGGGÿKKKÿOOOÿMMMÿDDDÿ===ÿ;;;ÿ888ÿ555ÿ666ÿ555ÿ---ÿ&&&ÿ000ÿ```ÿZZZÿUUUÿÿ±±±ÿ±±±ÿ±±±ÿ¯¯¯«««p«««ÿ«««ÿ«««ÿöööÿöööÿñññÿçççÿÖÖÖÿÏÏÏÿÈÈÈÿÿkkkÿhhhÿeeeÿ___ÿGGGÿ999ÿ@@@ÿGGGÿNNNÿUUUÿ\\\ÿcccÿjjjÿ^^^ÿFFFÿAAAÿ>>>ÿ;;;ÿ777ÿ000ÿ(((ÿ!!!ÿHHHÿVVVÿQQQÿRRRÿ«««ÿ«««ÿ«««ÿ«««p¥¥¥Ï¥¥¥ÿ¥¥¥ÿÅÅÅÿ÷÷÷ÿóóóÿíííÿáááÿØØØÿÑÑÑÿ»»»ÿvvvÿtttÿqqqÿjjjÿ@@@ÿ<<<ÿCCCÿJJJÿQQQÿXXXÿ___ÿfffÿmmmÿsssÿ{{{ÿwwwÿMMMÿFFFÿDDDÿAAAÿ444ÿ+++ÿ$$$ÿ$$$ÿRRRÿMMMÿHHHÿÿ¥¥¥ÿ¥¥¥ÿ¥¥¥ÏŸŸŸÿŸŸŸÿŸŸŸÿÜÜÜÿôôôÿïïïÿéééÿâââÿÛÛÛÿÔÔÔÿ•••ÿÿ|||ÿuuuÿDDDÿ???ÿFFFÿLLLÿUUUÿiiiÿzzzÿ†††ÿ‰‰‰ÿ{{{ÿ}}}ÿ„„„ÿ‹‹‹ÿ………ÿSSSÿLLLÿIIIÿBBBÿ---ÿ&&&ÿÿAAAÿIIIÿDDDÿ]]]ÿŸŸŸÿŸŸŸÿŸŸŸÿ™™™@™™™ÿ™™™ÿ™™™ÿïïïÿðððÿëëëÿéééÿäääÿÝÝÝÿÍÍÍÿ‹‹‹ÿˆˆˆÿ………ÿ[[[ÿAAAÿHHHÿOOOÿYYYÿpppÿƒƒƒÿ•••ÿ¦¦¦ÿ¸¸¸ÿÄÄÄÿ   ÿŽŽŽÿ”””ÿ›››ÿÿUUUÿRRRÿOOOÿ333ÿ(((ÿ!!!ÿ---ÿEEEÿ@@@ÿAAAÿ™™™ÿ™™™ÿ™™™ÿ™™™@”””€”””ÿ”””ÿ¦¦¦ÿòòòÿìììÿæææÿìììÿçççÿßßßÿ¸¸¸ÿ“““ÿÿ„„„ÿDDDÿKKKÿRRRÿVVVÿ```ÿqqqÿƒƒƒÿ•••ÿ¦¦¦ÿ¸¸¸ÿÊÊÊÿÛÛÛÿ±±±ÿžžžÿ¥¥¥ÿ¬¬¬ÿhhhÿ[[[ÿXXXÿCCCÿ***ÿ###ÿ"""ÿAAAÿ<<<ÿ777ÿ‚‚‚ÿ”””ÿ”””ÿ”””€ŽŽŽÿŽŽŽÿ­­­ÿîîîÿèèèÿãããÿðððÿéééÿâââÿ®®®ÿœœœÿ™™™ÿuuuÿMMMÿTTTÿYYYÿOOOÿ```ÿqqqÿƒƒƒÿ¦¦¦ÿ¹¹¹ÿ¸¸¸ÿÊÊÊÿÛÛÛÿèèèÿ¬¬¬ÿ¯¯¯ÿµµµÿ‹‹‹ÿdddÿ```ÿSSSÿ---ÿ&&&ÿÿ===ÿ999ÿ333ÿpppÿŽŽŽÿŽŽŽÿˆˆˆ¿ˆˆˆÿˆˆˆÿ»»»ÿêêêÿäääÿæææÿóóóÿëëëÿäääÿ§§§ÿ¥¥¥ÿ¢¢¢ÿjjjÿWWWÿ^^^ÿWWWÿNNNÿ```ÿqqqÿ£££ÿÅÅÅÿÝÝÝÿçççÿÊÊÊÿÛÛÛÿíííÿÍÍÍÿ¸¸¸ÿ¿¿¿ÿªªªÿlllÿiiiÿfffÿ///ÿ(((ÿ!!!ÿ222ÿ555ÿ///ÿYYYÿˆˆˆÿˆˆˆÿˆˆˆ¿‚‚‚¿‚‚‚ÿ‚‚‚ÿ¶¶¶ÿåååÿáááÿãããÿõõõÿîîîÿæææÿ°°°ÿ­­­ÿªªªÿnnnÿ```ÿgggÿWWWÿNNNÿ```ÿrrrÿ‹‹‹ÿ£££ÿ¼¼¼ÿÔÔÔÿÒÒÒÿÛÛÛÿíííÿÛÛÛÿÂÂÂÿÉÉÉÿ¹¹¹ÿuuuÿrrrÿoooÿ222ÿ***ÿ###ÿ000ÿ000ÿ+++ÿTTTÿ‚‚‚ÿ‚‚‚ÿ‚‚‚¿|||¿|||ÿ|||ÿ±±±ÿâââÿÝÝÝÿáááÿ÷÷÷ÿðððÿéééÿ¹¹¹ÿ¶¶¶ÿ³³³ÿwwwÿjjjÿqqqÿ\\\ÿNNNÿ```ÿjjjÿjjjÿ‚‚‚ÿšššÿ²²²ÿÉÉÉÿÛÛÛÿíííÿàààÿËËËÿÒÒÒÿÂÂÂÿ}}}ÿ{{{ÿxxxÿ444ÿ---ÿ&&&ÿ---ÿ,,,ÿ'''ÿPPPÿ|||ÿ|||ÿ|||¿vvv¿vvvÿvvvÿ¬¬¬ÿÞÞÞÿÙÙÙÿÞÞÞÿúúúÿòòòÿëëëÿÁÁÁÿ¿¿¿ÿ¼¼¼ÿ†††ÿsssÿ{{{ÿiiiÿNNNÿ```ÿqqqÿYYYÿaaaÿyyyÿšššÿÊÊÊÿÛÛÛÿíííÿßßßÿÕÕÕÿÜÜÜÿÆÆÆÿ†††ÿƒƒƒÿÿ666ÿ///ÿ(((ÿ+++ÿ)))ÿ$$$ÿKKKÿvvvÿvvvÿvvv¿ppppppÿpppÿ’’’ÿÚÚÚÿÕÕÕÿÏÏÏÿüüüÿõõõÿîîîÿÒÒÒÿÇÇÇÿÅÅÅÿ¢¢¢ÿ}}}ÿ„„„ÿ‡‡‡ÿRRRÿ```ÿqqqÿƒƒƒÿƒƒƒÿ–––ÿ¸¸¸ÿÊÊÊÿÛÛÛÿëëëÿÚÚÚÿÞÞÞÿåååÿ¸¸¸ÿÿŒŒŒÿvvvÿ999ÿ111ÿ***ÿ***ÿ%%%ÿ ÿVVVÿpppÿpppÿpppjjj€jjjÿjjjÿÿÖÖÖÿÑÑÑÿÌÌÌÿ÷÷÷ÿ÷÷÷ÿðððÿÞÞÞÿÐÐÐÿÍÍÍÿÂÂÂÿ‡‡‡ÿŽŽŽÿ•••ÿ………ÿ```ÿqqqÿƒƒƒÿ•••ÿ¦¦¦ÿ¸¸¸ÿÊÊÊÿÛÛÛÿßßßÿáááÿèèèÿïïïÿ¥¥¥ÿ———ÿ•••ÿjjjÿ;;;ÿ444ÿ---ÿ&&&ÿ!!!ÿÿ[[[ÿjjjÿjjjÿjjj€ddd@dddÿdddÿdddÿËËËÿÍÍÍÿÈÈÈÿèèèÿùùùÿòòòÿéééÿÙÙÙÿÖÖÖÿÓÓÓÿ­­­ÿ———ÿžžžÿ¥¥¥ÿ–––ÿuuuÿƒƒƒÿ•••ÿ¦¦¦ÿ¸¸¸ÿÊÊÊÿÜÜÜÿãããÿëëëÿñññÿÓÓÓÿ£££ÿ   ÿÿOOOÿ===ÿ666ÿ,,,ÿ###ÿÿÿdddÿdddÿdddÿddd@```^^^ÿ^^^ÿ^^^ÿ«««ÿÉÉÉÿÄÄÄÿÏÏÏÿüüüÿôôôÿíííÿãããÿÞÞÞÿÜÜÜÿÕÕÕÿ«««ÿ¨¨¨ÿ¯¯¯ÿ¶¶¶ÿ¸¸¸ÿ¬¬¬ÿ±±±ÿ½½½ÿÍÍÍÿÞÞÞÿæææÿíííÿôôôÿíííÿ´´´ÿ¬¬¬ÿ©©©ÿÿGGGÿ@@@ÿ999ÿ'''ÿÿÿ,,,ÿ^^^ÿ^^^ÿ^^^ÿ```YYYÏYYYÿYYYÿƒƒƒÿÅÅÅÿÀÀÀÿ»»»ÿôôôÿ÷÷÷ÿðððÿéééÿçççÿäääÿâââÿÜÜÜÿºººÿ¸¸¸ÿ¿¿¿ÿÆÆÆÿÍÍÍÿÔÔÔÿÛÛÛÿâââÿéééÿðððÿ÷÷÷ÿñññÿ¿¿¿ÿ···ÿ´´´ÿ²²²ÿbbbÿJJJÿBBBÿ888ÿ ÿÿÿ>>>ÿYYYÿYYYÿYYYÏSSSpSSSÿSSSÿSSSÿºººÿ¼¼¼ÿ···ÿÉÉÉÿùùùÿòòòÿëëëÿéééÿíííÿêêêÿçççÿâââÿÐÐÐÿÉÉÉÿÏÏÏÿ×××ÿÝÝÝÿäääÿëëëÿòòòÿùùùÿçççÿÉÉÉÿÃÃÃÿÀÀÀÿ½½½ÿƒƒƒÿSSSÿLLLÿDDDÿ***ÿÿÿÿSSSÿSSSÿSSSÿSSSpOOOMMMÿMMMÿMMMÿ„„„ÿ¸¸¸ÿ³³³ÿ­­­ÿæææÿôôôÿíííÿæææÿíííÿóóóÿðððÿíííÿêêêÿåååÿàààÿáááÿåååÿéééÿìììÿçççÿÙÙÙÿÑÑÑÿÎÎÎÿËËËÿÉÉÉÿ   ÿ\\\ÿUUUÿNNNÿ>>>ÿÿÿÿ...ÿMMMÿMMMÿMMMÿOOOGGGŸGGGÿGGGÿNNNÿ¦¦¦ÿ¯¯¯ÿªªªÿªªªÿñññÿïïïÿèèèÿáááÿèèèÿùùùÿöööÿóóóÿðððÿîîîÿëëëÿèèèÿåååÿâââÿßßßÿÝÝÝÿÚÚÚÿ×××ÿÔÔÔÿ˜˜˜ÿfffÿ___ÿWWWÿMMMÿ"""ÿÿÿÿCCCÿGGGÿGGGÿGGGŸBBB AAAïAAAÿAAAÿ\\\ÿ«««ÿ¦¦¦ÿ   ÿ¬¬¬ÿìììÿêêêÿãããÿÜÜÜÿÝÝÝÿòòòÿüüüÿùùùÿöööÿóóóÿñññÿîîîÿëëëÿèèèÿåååÿâââÿÇÇÇÿ‰‰‰ÿpppÿhhhÿaaaÿWWWÿ***ÿÿÿÿ444ÿAAAÿAAAÿAAAïBBB <<<€;;;ÿ;;;ÿ;;;ÿwwwÿ¢¢¢ÿœœœÿ———ÿ¤¤¤ÿçççÿæææÿßßßÿ×××ÿÐÐÐÿÐÐÐÿàààÿíííÿüüüÿùùùÿöööÿôôôÿÚÚÚÿ¾¾¾ÿ”””ÿÿyyyÿrrrÿkkkÿ```ÿ---ÿÿÿÿ!!!ÿ;;;ÿ;;;ÿ;;;ÿ<<<€555Ï555ÿ555ÿ555ÿvvvÿ™™™ÿ”””ÿŽŽŽÿÿÎÎÎÿáááÿÚÚÚÿÓÓÓÿËËËÿÄÄÄÿ¼¼¼ÿµµµÿ®®®ÿ§§§ÿ   ÿ˜˜˜ÿ‘‘‘ÿŠŠŠÿƒƒƒÿ|||ÿtttÿ\\\ÿ(((ÿÿÿÿÿ555ÿ555ÿ555ÿ555Ï1110///ï///ÿ///ÿ///ÿnnnÿÿŠŠŠÿ………ÿ€€€ÿšššÿÏÏÏÿÕÕÕÿÍÍÍÿÆÆÆÿ¿¿¿ÿ¸¸¸ÿ±±±ÿ©©©ÿ¢¢¢ÿ›››ÿ”””ÿŒŒŒÿ………ÿtttÿBBBÿ%%%ÿ ÿÿÿÿ///ÿ///ÿ///ÿ///ï1110***@)))ÿ)))ÿ)))ÿ)))ÿ```ÿ†††ÿÿ|||ÿvvvÿqqqÿ†††ÿ§§§ÿ»»»ÿÁÁÁÿºººÿ³³³ÿ¬¬¬ÿ¥¥¥ÿÿ‹‹‹ÿmmmÿFFFÿ+++ÿ&&&ÿ!!!ÿÿÿÿ)))ÿ)))ÿ)))ÿ)))ÿ***@$$$`###ÿ###ÿ###ÿ###ÿ;;;ÿrrrÿxxxÿrrrÿmmmÿhhhÿbbbÿ]]]ÿXXXÿlllÿgggÿaaaÿ[[[ÿ===ÿ888ÿ333ÿ---ÿ(((ÿ###ÿÿÿÿ###ÿ###ÿ###ÿ###ÿ$$$`@ïÿÿÿ###ÿHHHÿiiiÿiiiÿdddÿ___ÿYYYÿTTTÿNNNÿJJJÿDDDÿ>>>ÿ999ÿ444ÿ...ÿ)))ÿ$$$ÿÿÿÿÿÿÿï@0Ïÿÿÿÿÿ444ÿIIIÿVVVÿUUUÿPPPÿKKKÿEEEÿ@@@ÿ;;;ÿ666ÿ000ÿ)))ÿ!!!ÿÿÿÿÿÿÿÏ0€ïÿÿÿÿÿÿÿ###ÿ,,,ÿ)))ÿ&&&ÿ$$$ÿÿÿÿÿÿÿÿÿï€ Ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ Ÿ pÏÿÿÿÿÿÿÿÿÿÿÿÿÏp@€¿¿¿¿€@( @ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷÷÷ üüüPûûû€ûûû€ûûû€ûûû€üüüP÷÷÷ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïïïóóó€ööößöööÿöööÿöööÿöööÿöööÿöööÿöööÿöööÿööößóóó€ïïïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿééé€íííïíííÿíííÿíííÿìììÿéééÿçççÿåååÿãããÿçççÿíííÿíííÿíííÿíííïééé€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßßß ãããÏäääÿäääÿæææÿéééÿåååÿÞÞÞÿÕÕÕÿÍÍÍÿÅÅÅÿ½½½ÿµµµÿ´´´ÿÁÁÁÿÜÜÜÿäääÿäääÿãããÏßßß ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÕÕÕ0ÛÛÛïÛÛÛÿÝÝÝÿëëëÿðððÿçççÿàààÿ×××ÿÅÅÅÿ²²²ÿ©©©ÿ¬¬¬ÿ¯¯¯ÿ¨¨¨ÿŸŸŸÿ˜˜˜ÿ±±±ÿÖÖÖÿÛÛÛÿÛÛÛïÕÕÕ0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÏÏÏ ÑÑÑïÓÓÓÿÛÛÛÿòòòÿòòòÿêêêÿÑÑÑÿ®®®ÿŒŒŒÿ|||ÿqqqÿgggÿ\\\ÿWWWÿjjjÿƒƒƒÿ’’’ÿŠŠŠÿ’’’ÿÂÂÂÿÓÓÓÿÑÑÑïÏÏÏ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÉÉÉÏÊÊÊÿÔÔÔÿøøøÿôôôÿéééÿ¾¾¾ÿ   ÿ•••ÿ‹‹‹ÿ€€€ÿuuuÿjjjÿ___ÿUUUÿJJJÿ???ÿPPPÿÿ|||ÿzzzÿ¹¹¹ÿÊÊÊÿÉÉÉÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿€ÁÁÁÿÅÅÅÿòòòÿöööÿçççÿÂÂÂÿ¯¯¯ÿ¤¤¤ÿ„„„ÿXXXÿ>>>ÿ555ÿ111ÿ000ÿ888ÿDDDÿBBBÿ888ÿ===ÿgggÿnnnÿxxxÿ»»»ÿÁÁÁÿ¿¿¿€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¯¯¯¸¸¸ï¸¸¸ÿàààÿøøøÿïïïÿÎÎÎÿ½½½ÿ­­­ÿiiiÿOOOÿKKKÿFFFÿBBBÿ>>>ÿ:::ÿ555ÿ111ÿ444ÿ:::ÿ000ÿ444ÿdddÿ```ÿƒƒƒÿ¸¸¸ÿ¸¸¸ï¯¯¯ÿÿÿÿÿÿÿÿÿÿÿÿ­­­€¯¯¯ÿ¹¹¹ÿúúúÿóóóÿÝÝÝÿÌÌÌÿ¼¼¼ÿuuuÿ```ÿ\\\ÿJJJÿCCCÿGGGÿOOOÿTTTÿOOOÿ>>>ÿ:::ÿ888ÿ444ÿ)))ÿ444ÿ[[[ÿRRRÿ£££ÿ¯¯¯ÿ­­­€ÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ß¦¦¦ÿÖÖÖÿõõõÿëëëÿÚÚÚÿÏÏÏÿŠŠŠÿqqqÿiiiÿ@@@ÿ???ÿIIIÿTTTÿ^^^ÿiiiÿsssÿsssÿKKKÿCCCÿ===ÿ---ÿ"""ÿFFFÿMMMÿpppÿ¦¦¦ÿ¦¦¦ßÿÿÿÿÿÿÿÿÿ——— ÿÿëëëÿïïïÿèèèÿÞÞÞÿÁÁÁÿƒƒƒÿ~~~ÿFFFÿCCCÿMMMÿcccÿƒƒƒÿ™™™ÿ———ÿÿŒŒŒÿ‰‰‰ÿPPPÿLLLÿ666ÿ&&&ÿ///ÿGGGÿKKKÿÿÿ——— ÿÿÿÿÿÿ“““P•••ÿ¡¡¡ÿñññÿéééÿìììÿáááÿªªªÿÿoooÿGGGÿQQQÿZZZÿtttÿÿ©©©ÿÄÄÄÿÎÎÎÿšššÿ¥¥¥ÿzzzÿYYYÿJJJÿ)))ÿ!!!ÿAAAÿ999ÿ‰‰‰ÿ•••ÿ“““Pÿÿÿÿÿÿ‹‹‹€ŒŒŒÿ¥¥¥ÿëëëÿæææÿðððÿåååÿ¥¥¥ÿÿeeeÿUUUÿSSSÿZZZÿwwwÿ¨¨¨ÿÆÆÆÿÈÈÈÿßßßÿÉÉÉÿ³³³ÿ¢¢¢ÿfffÿ___ÿ,,,ÿ!!!ÿ777ÿ333ÿtttÿŒŒŒÿ‹‹‹€ÿÿÿÿÿÿ€ƒƒƒÿÿåååÿåååÿóóóÿèèèÿ®®®ÿªªªÿcccÿcccÿMMMÿZZZÿxxxÿ¢¢¢ÿÆÆÆÿÓÓÓÿßßßÿçççÿÁÁÁÿÀÀÀÿsssÿnnnÿ000ÿ%%%ÿ///ÿ---ÿlllÿƒƒƒÿ€ÿÿÿÿÿÿzzz€zzzÿ•••ÿàààÿâââÿ÷÷÷ÿìììÿ»»»ÿ···ÿqqqÿrrrÿQQQÿZZZÿfffÿpppÿ”””ÿ¿¿¿ÿßßßÿëëëÿÏÏÏÿÎÎÎÿ€€€ÿ|||ÿ333ÿ(((ÿ+++ÿ(((ÿdddÿzzzÿzzz€ÿÿÿÿÿÿppp€qqqÿÿÚÚÚÿØØØÿúúúÿðððÿÊÊÊÿÄÄÄÿŽŽŽÿ€€€ÿlllÿZZZÿqqqÿsssÿÿÁÁÁÿßßßÿâââÿÞÞÞÿËËËÿÿ„„„ÿ777ÿ,,,ÿ)))ÿ"""ÿ\\\ÿqqqÿppp€ÿÿÿÿÿÿfffPhhhÿvvvÿÔÔÔÿÌÌÌÿùùùÿóóóÿÛÛÛÿÑÑÑÿ³³³ÿŽŽŽÿ™™™ÿiiiÿtttÿÿ©©©ÿÄÄÄÿÝÝÝÿâââÿìììÿ¾¾¾ÿšššÿ|||ÿ:::ÿ///ÿ$$$ÿÿ^^^ÿhhhÿfffPÿÿÿÿÿÿ``` ___ÿ___ÿÀÀÀÿÆÆÆÿçççÿöööÿéééÿÞÞÞÿÚÚÚÿ¨¨¨ÿ§§§ÿ²²²ÿŸŸŸÿžžžÿµµµÿÓÓÓÿæææÿðððÿëëëÿ«««ÿ§§§ÿ^^^ÿ>>>ÿ...ÿÿ ÿ___ÿ___ÿ``` ÿÿÿÿÿÿÿÿÿWWWßWWWÿ–––ÿÀÀÀÿÊÊÊÿúúúÿïïïÿéééÿçççÿßßßÿ¾¾¾ÿÀÀÀÿÊÊÊÿÕÕÕÿßßßÿêêêÿôôôÿñññÿÁÁÁÿ¸¸¸ÿœœœÿLLLÿBBBÿ&&&ÿÿ000ÿWWWÿWWWßÿÿÿÿÿÿÿÿÿÿÿÿNNN€NNNÿ\\\ÿ»»»ÿ²²²ÿâââÿòòòÿéééÿïïïÿïïïÿëëëÿÞÞÞÿÜÜÜÿãããÿëëëÿíííÿãããÿÎÎÎÿÉÉÉÿ²²²ÿaaaÿPPPÿ:::ÿÿÿFFFÿNNNÿNNN€ÿÿÿÿÿÿÿÿÿÿÿÿ@@@DDDïEEEÿƒƒƒÿ­­­ÿªªªÿåååÿëëëÿâââÿòòòÿøøøÿôôôÿðððÿìììÿçççÿãããÿßßßÿÛÛÛÿ½½½ÿoooÿ^^^ÿKKKÿÿÿ&&&ÿEEEÿDDDï@@@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ<<<€<<<ÿCCCÿ’’’ÿŸŸŸÿ©©©ÿÜÜÜÿäääÿÙÙÙÿÛÛÛÿìììÿøøøÿøøøÿôôôÿêêêÿÍÍÍÿ›››ÿxxxÿmmmÿWWWÿ)))ÿÿÿ999ÿ<<<ÿ<<<€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ444Ï333ÿGGGÿ“““ÿ‘‘‘ÿÿÇÇÇÿÝÝÝÿÒÒÒÿÇÇÇÿ¼¼¼ÿ±±±ÿ§§§ÿœœœÿ‘‘‘ÿ†††ÿ{{{ÿZZZÿ%%%ÿÿÿ,,,ÿ333ÿ444Ïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ((( ***ï***ÿ===ÿxxxÿƒƒƒÿ{{{ÿŽŽŽÿ­­­ÿÄÄÄÿÀÀÀÿµµµÿªªªÿŸŸŸÿÿhhhÿ@@@ÿ$$$ÿÿÿ%%%ÿ***ÿ***ï((( ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 0 ï!!!ÿ'''ÿTTTÿuuuÿnnnÿeeeÿ^^^ÿcccÿhhhÿ___ÿJJJÿ666ÿ---ÿ&&&ÿÿÿ ÿ!!!ÿ ï 0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ Ïÿÿ###ÿDDDÿVVVÿXXXÿPPPÿHHHÿ@@@ÿ888ÿ000ÿ&&&ÿÿÿÿÿÏ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ïÿÿÿÿÿÿÿÿÿÿÿÿï€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ßÿÿÿÿÿÿÿÿ߀ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ P€€€€P ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ(0 õõõööö`øøø¯øøøÏúúúÿúúúÿøøøÏøøø¯ööö`õõõììì€îîîïïïïÿïïïÿëëëÿéééÿæææÿãããÿïïïÿïïïÿîîîïììì€ÞÞÞ âââÏãããÿèèèÿêêêÿãããÿÙÙÙÿÎÎÎÿÃÃÃÿ¹¹¹ÿ®®®ÿ¼¼¼ÿÑÑÑÿãããÿâââÏÞÞÞ ÔÔÔ ÖÖÖï×××ÿëëëÿñññÿæææÿÅÅÅÿªªªÿ‰‰‰ÿ{{{ÿ………ÿŠŠŠÿ›››ÿ‘‘‘ÿªªªÿ×××ÿÖÖÖïÔÔÔ ÊÊÊÏËËËÿêêêÿôôôÿØØØÿªªªÿ”””ÿ†††ÿwwwÿiiiÿZZZÿLLLÿIIIÿnnnÿÿ•••ÿËËËÿÊÊÊϽ½½€¿¿¿ÿãããÿ÷÷÷ÿÞÞÞÿ¶¶¶ÿ¢¢¢ÿkkkÿIIIÿ999ÿ333ÿ444ÿ;;;ÿ@@@ÿ333ÿYYYÿlllÿ‹‹‹ÿ¿¿¿ÿ½½½€¯¯¯³³³ïÇÇÇÿùùùÿèèèÿÉÉÉÿ«««ÿaaaÿUUUÿJJJÿDDDÿHHHÿCCCÿ999ÿ555ÿ666ÿ***ÿNNNÿZZZÿ›››ÿ³³³ï¯¯¯§§§`¨¨¨ÿÜÜÜÿòòòÿÞÞÞÿÉÉÉÿwwwÿiiiÿBBBÿBBBÿPPPÿ^^^ÿlllÿmmmÿIIIÿ???ÿ///ÿ(((ÿRRRÿmmmÿ¨¨¨ÿ§§§`›››¯œœœÿõõõÿëëëÿáááÿ¦¦¦ÿƒƒƒÿLLLÿGGGÿ\\\ÿ~~~ÿœœœÿŸŸŸÿÿˆˆˆÿQQQÿ@@@ÿ%%%ÿ;;;ÿ???ÿœœœÿ›››¯Ï©©©ÿíííÿëëëÿæææÿ£££ÿ†††ÿLLLÿQQQÿfffÿ’’’ÿ¶¶¶ÿÐÐÐÿÁÁÁÿ®®®ÿqqqÿXXXÿ)))ÿ///ÿ888ÿxxxÿÏ„„„ÿžžžÿåååÿñññÿêêêÿ¬¬¬ÿ~~~ÿ```ÿPPPÿfffÿ¡¡¡ÿÑÑÑÿÓÓÓÿáááÿÁÁÁÿžžžÿnnnÿ...ÿ'''ÿ000ÿmmmÿ„„„ÿxxxÿ“““ÿÝÝÝÿòòòÿïïïÿ½½½ÿ‘‘‘ÿsssÿUUUÿbbbÿaaaÿŽŽŽÿÏÏÏÿæææÿÔÔÔÿ±±±ÿÿ333ÿ(((ÿ(((ÿcccÿxxxÿmmmψˆˆÿÖÖÖÿæææÿôôôÿÑÑÑÿ»»»ÿ†††ÿtttÿfffÿÿ£££ÿÐÐÐÿãããÿçççÿ¦¦¦ÿ†††ÿ777ÿ***ÿ!!!ÿXXXÿmmmÏaaa¯aaaÿÎÎÎÿ×××ÿøøøÿåååÿÚÚÚÿ©©©ÿ§§§ÿ•••ÿšššÿ···ÿÙÙÙÿìììÿåååÿ§§§ÿzzzÿ<<<ÿ'''ÿÿaaaÿaaa¯VVV`UUUÿšššÿ¼¼¼ÿóóóÿïïïÿëëëÿãããÿÄÄÄÿÈÈÈÿÖÖÖÿãããÿñññÿïïïÿÃÃÃÿ³³³ÿUUUÿ===ÿÿ+++ÿUUUÿVVV`MMMIIIïeeeÿ´´´ÿÄÄÄÿóóóÿéééÿõõõÿòòòÿéééÿçççÿëëëÿâââÿÕÕÕÿÉÉÉÿuuuÿTTTÿ***ÿÿ999ÿIIIïMMM>>>€===ÿzzzÿ¡¡¡ÿºººÿéééÿÞÞÞÿíííÿôôôÿøøøÿòòòÿàààÿºººÿ|||ÿgggÿ555ÿÿ###ÿ===ÿ>>>€222Ï222ÿrrrÿÿ¤¤¤ÿÒÒÒÿÑÑÑÿÃÃÃÿ´´´ÿ¦¦¦ÿ———ÿ‰‰‰ÿqqqÿ:::ÿÿÿ222ÿ222Ï))) &&&ï&&&ÿ[[[ÿ}}}ÿrrrÿˆˆˆÿÿžžžÿ‘‘‘ÿkkkÿMMMÿ'''ÿÿÿ&&&ÿ&&&ï)))  Ïÿ///ÿKKKÿ___ÿUUUÿJJJÿ???ÿ555ÿ***ÿÿÿÿÏ €ïÿÿÿÿÿÿÿÿï€`¯Ïÿÿϯ`(  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúúú0÷÷÷@÷÷÷@úúú0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëëë€ïïïïðððÿìììÿèèèÿîîîÿïïïïëëë€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÏÏÏÝÝÝÏæææÿêêêÿßßßÿ¿¿¿ÿ®®®ÿ¯¯¯ÿ°°°ÿÌÌÌÿÝÝÝÏÏÏÏÿÿÿÿÿÿÿÿÿÿÿÿËËËÏàààÿðððÿÂÂÂÿ•••ÿzzzÿeeeÿUUUÿcccÿ~~~ÿ­­­ÿËËËÏÿÿÿÿÿÿÿÿÿ¹¹¹€ÍÍÍÿöööÿÊÊÊÿ“““ÿTTTÿ@@@ÿ888ÿ444ÿ999ÿ;;;ÿcccÿ¤¤¤ÿ¹¹¹€ÿÿÿÿÿÿ©©©ïæææÿåååÿ±±±ÿgggÿFFFÿHHHÿ]]]ÿbbbÿDDDÿ444ÿ:::ÿeeeÿ©©©ïÿÿÿ•••0žžžÿðððÿçççÿ———ÿZZZÿNNNÿ{{{ÿªªªÿ¡¡¡ÿ………ÿOOOÿ'''ÿ@@@ÿ’’’ÿ•••0ƒƒƒ@   ÿêêêÿîîîÿ§§§ÿXXXÿOOOÿˆˆˆÿÄÄÄÿÞÞÞÿÀÀÀÿlllÿ***ÿ///ÿoooÿƒƒƒ@ttt@ÿáááÿõõõÿÁÁÁÿtttÿUUUÿhhhÿ¢¢¢ÿäääÿÜÜÜÿ†††ÿ111ÿ'''ÿ___ÿttt@eee0jjjÿÍÍÍÿöööÿÝÝÝÿ­­­ÿ“““ÿˆˆˆÿ···ÿåååÿ×××ÿ•••ÿ888ÿÿ]]]ÿeee0ÿÿÿPPP襤¤ÿÝÝÝÿðððÿêêêÿÐÐÐÿ×××ÿìììÿëëëÿÇÇÇÿsssÿ222ÿ###ÿPPPïÿÿÿÿÿÿ@@@€[[[ÿ¬¬¬ÿáááÿêêêÿöööÿöööÿîîîÿØØØÿ‘‘‘ÿRRRÿÿ222ÿ@@@€ÿÿÿÿÿÿÿÿÿ///ÏUUUÿ‘‘‘ÿµµµÿÉÉÉÿºººÿ¥¥¥ÿŠŠŠÿUUUÿÿ!!!ÿ///Ïÿÿÿÿÿÿÿÿÿÿÿÿ Ï333ÿYYYÿ___ÿcccÿRRRÿ///ÿÿÿÏ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ ïÿÿÿ ÿ ï€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ0@@0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿSuperCollider-3.6.3-Source-linux~repack/icons/sc_ide.icns0000664000175000017500000035445512106676016021612 0ustar dandanicnsÙ-is32“‘  ƒ "3Y_cR/" /U‘µÉº¥ŠU!/€}A[¬áêööîØ‘R2AQ¤ÝðêÐ×ìëÇs2#QejÍöÝ­“ˆ·åו8]euáõÁtUh¢ä܆1'_u† êî§XOˆÄÞÀl*/o†–žðç—ZN{ª¡…O'@’–©æå±gFH]bD4:e©ºÍöÊ“T@849;c¤º€ Ìàð•zeUc~­Ì ØÝæêß¿®¯°ÌÝØƒíððìèîðí‡ûƒ‘  ƒ "3Y_cR/" /U‘µÉº¥ŠU!/€}A[¬áêööîØ‘R2AQ¤ÝðêÐ×ìëÇs2#QejÍöÝ­“ˆ·åו8]euáõÁtUh¢ä܆1'_u† êî§XOˆÄÞÀl*/o†–žðç—ZN{ª¡…O'@’–©æå±gFH]bD4:e©ºÍöÊ“T@849;c¤º€ Ìàð•zeUc~­Ì ØÝæêß¿®¯°ÌÝØƒíððìèîðí‡ûƒ‘  ƒ "3Y_cR/" /U‘µÉº¥ŠU!/€}A[¬áêööîØ‘R2AQ¤ÝðêÐ×ìëÇs2#QejÍöÝ­“ˆ·åו8]euáõÁtUh¢ä܆1'_u† êî§XOˆÄÞÀl*/o†–žðç—ZN{ª¡…O'@’–©æå±gFH]bD4:e©ºÍöÊ“T@849;c¤º€ Ìàð•zeUc~­Ì ØÝæêß¿®¯°ÌÝØƒíððìèîðí‡ûƒs8mk0@@0€ïÿÿÿÿï€ÏÿÿÿÿÿÿÿÿÏÏÿÿÿÿÿÿÿÿÿÿÏ€ÿÿÿÿÿÿÿÿÿÿÿÿ€ïÿÿÿÿÿÿÿÿÿÿÿÿï0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ0@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ@@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ@0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ0ïÿÿÿÿÿÿÿÿÿÿÿÿï€ÿÿÿÿÿÿÿÿÿÿÿÿ€ÏÿÿÿÿÿÿÿÿÿÿÏÏÿÿÿÿÿÿÿÿÏ€ïÿÿÿÿï€0@@0il32 ©…’ ‡ Ž‹€ #DVXPH@80&ˆ$!!'Tune^ch_J6-& !!$†-**=xƒ{Ž­ÄÀµªŸh@$%**-…43G“‘ÇÝÒǼ±§œ‘†{Z%,34„=. __bihvÔÌùóÛÑ³Ž™it©ÄÝâ쾚|:/$^hiqqÚØúðÊÄŽ€lZqsÁßâÞË„7,)"\qqzz•àâ÷ì»·qrQZfp”¿ßëÏ΀|3(+(dzz}ƒƒååó讪ccMZx¢ÆÓßçÁÀsn0%/-lƒƒŒŒ¥ëæðå¥eUSZw¨ÆÈßɳ¢f_,!73tŒŒ”•¡ñéìáªoGQZt©ÄΚ¥zYJ)!A9‰•”›ëïèÞÁƒ~FCMcƒ™—Œ‰PL6&/GK›€¦¦ÖõëÚÏŠqi@?IT^issKC=-"FMp¦¦®¯¹úóÝ̼u`\JCGOTO>:84)4[R£¯®µ¸¸àøïν­iOKFB>:514:04d`ƒ¸¸µ‚ÀÁÅòö篤„X>5108DB8=gnx»ÁÀ„ÉÊÔøôé¾ •‹€uj_UJ?P|z¹ÊÉ…ÐÒÓÛòòêÑ®Œ|qg\Wjƒ’Š’ÂÓÒІÙÛÛÝëðçà×Ų©¬¯¨Ÿ˜±ÖÛÛÙˆáãääæéåÞÕÍŽµ´ÁÜääãá‹ëíìéçåãçíëŽóô‡öôó’ûüýüû©©…’ ‡ Ž‹€ #DVXPH@80&ˆ$!!'Tune^ch_J6-& !!$†-**=xƒ{Ž­ÄÀµªŸh@$%**-…43G“‘ÇÝÒǼ±§œ‘†{Z%,34„=. __bihvÔÌùóÛÑ³Ž™it©ÄÝâ쾚|:/$^hiqqÚØúðÊÄŽ€lZqsÁßâÞË„7,)"\qqzz•àâ÷ì»·qrQZfp”¿ßëÏ΀|3(+(dzz}ƒƒååó讪ccMZx¢ÆÓßçÁÀsn0%/-lƒƒŒŒ¥ëæðå¥eUSZw¨ÆÈßɳ¢f_,!73tŒŒ”•¡ñéìáªoGQZt©ÄΚ¥zYJ)!A9‰•”›ëïèÞÁƒ~FCMcƒ™—Œ‰PL6&/GK›€¦¦ÖõëÚÏŠqi@?IT^issKC=-"FMp¦¦®¯¹úóÝ̼u`\JCGOTO>:84)4[R£¯®µ¸¸àøïν­iOKFB>:514:04d`ƒ¸¸µ‚ÀÁÅòö篤„X>5108DB8=gnx»ÁÀ„ÉÊÔøôé¾ •‹€uj_UJ?P|z¹ÊÉ…ÐÒÓÛòòêÑ®Œ|qg\Wjƒ’Š’ÂÓÒІÙÛÛÝëðçà×Ų©¬¯¨Ÿ˜±ÖÛÛÙˆáãääæéåÞÕÍŽµ´ÁÜääãá‹ëíìéçåãçíëŽóô‡öôó’ûüýüû©©…’ ‡ Ž‹€ #DVXPH@80&ˆ$!!'Tune^ch_J6-& !!$†-**=xƒ{Ž­ÄÀµªŸh@$%**-…43G“‘ÇÝÒǼ±§œ‘†{Z%,34„=. __bihvÔÌùóÛÑ³Ž™it©ÄÝâ쾚|:/$^hiqqÚØúðÊÄŽ€lZqsÁßâÞË„7,)"\qqzz•àâ÷ì»·qrQZfp”¿ßëÏ΀|3(+(dzz}ƒƒååó讪ccMZx¢ÆÓßçÁÀsn0%/-lƒƒŒŒ¥ëæðå¥eUSZw¨ÆÈßɳ¢f_,!73tŒŒ”•¡ñéìáªoGQZt©ÄΚ¥zYJ)!A9‰•”›ëïèÞÁƒ~FCMcƒ™—Œ‰PL6&/GK›€¦¦ÖõëÚÏŠqi@?IT^issKC=-"FMp¦¦®¯¹úóÝ̼u`\JCGOTO>:84)4[R£¯®µ¸¸àøïν­iOKFB>:514:04d`ƒ¸¸µ‚ÀÁÅòö篤„X>5108DB8=gnx»ÁÀ„ÉÊÔøôé¾ •‹€uj_UJ?P|z¹ÊÉ…ÐÒÓÛòòêÑ®Œ|qg\Wjƒ’Š’ÂÓÒІÙÛÛÝëðçà×Ų©¬¯¨Ÿ˜±ÖÛÛÙˆáãääæéåÞÕÍŽµ´ÁÜääãá‹ëíìéçåãçíëŽóô‡öôó’ûüýüû©l8mk P€€€€P €ßÿÿÿÿÿÿÿÿ߀€ïÿÿÿÿÿÿÿÿÿÿÿÿï€ ÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÏ 0ïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿï0 ïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿï ÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÏ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿï€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿß ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ PÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€PÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ߀ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿï€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÏ ïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿï 0ïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿï0 ÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÏ €ïÿÿÿÿÿÿÿÿÿÿÿÿßÿÿÿÿÿÿÿÿ߀ P€€€€P it32fTÿÿÿÿÿÿ¨‚…‚æ•Ý€›€Ö§Ñ © Í ­ ɱ Å·Á»¾’ +1?=FGECA?=;95-)"’»(8HVTRPNMKHFDB@><;97420.,%¸Ž!/F\^\ZXVTQONLJHFDB?=<:86420.+*(%޶&%B]eca`^[YWUSQONLIGECA?=<:7531/-+)(&#!޳+'Pmkifdba_][YWURPNMKIGEC@><;97531.,*)'%#!° ‹/*Trpnljhfdb`^\ZXVTRPNMJHFDB@><;86420.,*)&$" ‹ ®"Š!3'Swusrpnljgeca`^\ZXUSQONLJHFDA?=<:8642/-+)(&$"  Š!"¬$Š#5Fw{ywusqomkigeca_][YWUSQOMKIGECA?=;97531/-+)'%#!Š#$ªŠ&9+k|zxvtsqomjhfdba_][Y]nl}}zq][F><;97530.,*)'%#!#Š&¨)‰(;E€„‚€~|zxvtrpnljhfdo‡˜©Á¾»¹¶³±®«¨¦£ ž„pW>6420.,*(&$" !‰()¦+‰*=Z‰‡†„‚€}{ywusrpnkv›¹ËÈÅÃÀ½º¸µ²°­ª¨¥¢Ÿš—•’a>1/-+)(&$!‰*+¤-ˆ,A2p‹ˆ‡…ƒ}{ywtsx–ÂÒÏÌÊÇÄ¿¼º·´±¯¬©§¤¡žœ™–”‘ŽŒ‰vO4-*)'%#!*ˆ,-£ˆ/C5€ŽŒŠˆ†…ƒ€~|zx|¨Ó×ÔÑÎÌÉÆÃÁ¾»¹¶³±®«¨¦£ ž›˜•“‹ˆ…ƒ{U1*)'%" -ˆ/¢ˆ1E7ƒ”’ŽŒ‰‡†„‚€~‚­ØÛØÖÓÐÍËÈÅÃÀ½º¸µ²°­ª¨¥¢Ÿš—•’ŒŠ‡„‚|uQ.(&$" .ˆ1 ˆ3G9Œ˜•“‘‹‰‡†„ŸÖàÝÚ×ÕÒÏÍÊÇÄ¿¼º·´±¯¬©§¤¡žœ™–”‘ŽŒ‰†ƒ~{yvj?(&#!0ˆ3ž6‡5I<‰š™—•“‘ŒŠˆ†‹ÈäáßÜÙ×ÔÑÎÌÉÆÄÁ¾»¹¶³±®«¨¦£ ž›˜•“‹ˆ…ƒ€}zxurpX+%#!3‡56‡7K>Œžœš˜–”’ŽŒŠ âæãàÞÛØÖÓÐÍËÈÅÃÀ½»¸µ²°­ª¨¥¢Ÿš—•’ŒŠ‡„‚|zwtqole6$" 4‡7œˆ:K‚¢Ÿ›™˜–”’¶êèåâàÝÚ×ÕÒÏÍÊÇÄ¿¼ÇÎÙáéèæäãáÕȵ§”‘ŽŒ‰†ƒ~{yvspnkhf@$" ˆ:šˆO`©§¥¢ žœš™—›ÓïìéçäàÞÛØÖÓÐÍËÚíþýüûúùø÷öõôòòñðîíìëêéèÉ£‚|zwtqoligda^K&!/‡>˜A†@QN¥ª¨¦¤¢ žœšžáðîëèæãàÞÛ×ÕÒÏß÷ýüûúùø÷öõôòññðîíìëêéèçæåäãÕ£{yvspnkhfc`^[N% =†@A—‡BQ”­«ª¨¦£¡Ÿ›ØòðíêçåâßÝÚ×ÕÜôüûúù÷÷öõôòñððîíìëêéèçæåäãáààßÝÊ‘urpmjgeb_]ZWE!‡B–‡ESu±®¬«©§¥£¡ŸÕôñïìéçäáÞÜÙÙíûúù÷ööõóòñðïîíìëêéèææåäãáàßßÝÜÛÚÙØ«xoligda^\YVT@!0‡E•†GUN­²°®¬«©¦¤¢ÇöóðîëèæãàÞÛÞõù÷ööõóòñðïîíìëêéèæååäâáàßÞÝÜÛÚÙØ×ÕÕÔÆkhfc`^[XUSP5 C†G”‡IU޶´²¯­«ª¨¦¹øõòðíêçåâßÝå÷öõôóòñðïîíìëêéèæååäâáàßÞÝÜÛÚÙØ×ÕÔÔÓÑÐÏÎheb_]ZWUROL, (‡I“†KWY¹·µ³±¯­«ª­ô÷ôñïìéçäáÞëõôóòñðïîíìëêéçæåäãââããáÝÜÛÚÙØ×ÕÔÔÓÑÐÏÎÍÌËÊžda_\YVTQNLG$C†K’‡NW𻹷µ³°®¬«áùöóðîëèæãàìóòñðïîíìëêéçæåäáßßáãæéëîðñîçáÔÓÒÑÐÏÎÍÌËÊÉÈÇÆ `^[XVSPMKH:!'‡N‘†PY]¾¼º¸¶´²°®Åúøõòðíêçåâêñðïîììëêèçæåäá×ÔÕØÚÝàâåçêíïòõ÷÷ìÕÎÍÌËÊÉÈÇÅÄÃÂÁ–]ZWUROMJGD, G†PS†RY—¿¾¼º¸¶³±´òú÷ôñïìéçäæïîìëëêèçæåäãÝÎÊÍÏÒÔ×ÙÜßáäæéìîñóöùûñÐÉÈÇÅÄÃÂÁÀ¿¾½€YVTQNLIFC># )†RS†T[bÃÁ¿½»¹·µ³×ûùöóñîëèæåìëêêèçæåäãâßÍÁÄÆÉËÎÑÓÖÙÛÞàãåèëíðòõøúýæÈÃÂÁÀ¿¾½¼»º¹jVSPMKHEC@0!K†T†V[ŽÄÂÀ¾½»¹·¹øúøõòðíêèåééèçæåäãâáà×À»½ÀÃÅÈÊÍÐÒÕ×ÚÝßâåçêìïñô÷ùüóÌ¿¾½¼»¹¹¸·µ©[ROMJGDB?;$!4†VއY[ºÆÄ¿¾¼º¸Úüú÷ôñïìéçæçæåäãâáàßÞεµ·º½¿ÂÄÇÉÌÏÑÔÖÙÜÞáäæéëîñóöøûùÑ»¹¸¸·µ´³²±ŽQNLIFCA>;." ‡Y†[]~ÉÇÅÃÁ¿¾¼¾ùûùöóñîëèæåäãâáàßÞÜÛȬ®±´¶¹¼¾ÁÃÆÉËÎÐÓÕØÛÝàâåèêíðòõ÷úýÒ·µ´³²±°¯®­gMKHEC@=:7%!D†[†]]£ËÉÇÅÃÀ¿½ÕýúøõòðíêèãááàßÝÜÛÚÙȦ¨«­°³µ¸º½ÀÂÅÈÊÍÏÒÕ×ÚÜßáäçéìïñôöùüʲ±°¯®­¬«ª—MJGDB?<:7+#!/†]†_]ÈÌÊÈÆÄÂÀ¾òüú÷ôñïìéåàßÝÜÛÚÙØ×Ë£¢¥§ª­¯²´·¹¼¿Á½µ¯´¹½ÉÒÙÛÞáãæèëíðóõøö½­¬¬«©¨§¦¥mIFCA>;961%" †_Œb…a_vÐÎÌÊÈÆÃÁÇþûùöóñîëèÞÜÛÚÙØ×ÖÕФœž¡¤¦©¬®±³¶´›‰‡Ž•œ¢©¯¶ÀÎÙÝàâåçêíïòõ÷ë°©¨§¦¥¤£¢–HEC@=:852'$" N…ab‹†d_›ÑÏÍËÉÇÅÃàýúøõòðíêäÚÙØ×ÕÕÔÓÑ®–˜› £¥¨«­°xz‡Ž•œ¢©¯¶½ÃËÕÜßáäæéìîñóöÕ¦¥¤£¢¡ ŸžbDB?<:741+%#!=†d‹†f_¸ÒÐÏÍËÉÇÄóüú÷ôñïìéÝ×ÕÔÔÓÑÐÏÆ’•—šŸ¢¤§ tmtz‡Ž•œ¢©¯¶½ÃÊÑ×ÛÞàãåèëíðòõ²¢¡ Ÿœ›šDA?;9631-'%#!*†f‹†h_ÖÔÒÐÎÌÊÈÊþûùöóñîëçÔÔÓÑÐÏÎÍÌšŒ‘”–™œž¡–dfmtz‡Ž•œ¢©¯¶½ÃÊÑ×ÝÜÝßâåçêìïñߟœ›š™˜—–HA>;8620-)&$" †h‹…ja×ÕÓÑÐÎÌÊÙýúøõòðíêàÑÐÏÎÍÌËÊÀ†‰‹Ž“•˜›”]`fmtz‡Ž•œ¢©¯¶½ÃÊÑ×ÞãÛÜÞáãæéëîñ¦š™˜—–•”“`@=:852/-)(&$" […jŠm…la–Ù×ÕÓÑÏÍËçüú÷ôñïìé×ÎÍÌËÊÉÈÇš‚…‡Š’•—`Y`fmtz‡Ž•œ¢©¯¶½ÃÊÑ×ÞäçØÛÝàâåèêíΗ–•”“‘‘v?<9741/,*)'%#!M…lm‰†oa¥ÚØÖÔÒÐÏÍñûùöóñîëèÍËÊÉÈÇÅÄÀ„†‰ŒŽ‘pRY`fmtz‡Ž•œ¢©¯¶½ÃÊÑ×Þäëã×ÚÜßáäçéæ”“‘Œ†>;8630.+)*)'%# E†o‰†qa¼ÜÚØÖÔÑÐÎýúøõòðíêâÉÈÆÅÄÃÂÁ©y{~€ƒ…ˆ‹‰PRY`fmtz‡Ž•œ¢©¯¶½ÃÊÑ×ÞäëïÖÖÙÛÞáãæè§Œ‹Š‰ˆJ:852/-*',*(&$" 1†q‰†saÄÝÛÙ×ÕÓÑÒüú÷ôñïìéÝÅÄÃÂÁÀ¿¾˜uwz}‚…‡hLRY`fmtz‡vgck€›¶½ÃÊÑ×ÞäëòäÓÕØÚÝàâ庌‹Š‰ˆ‡†…R9741/,)&,+)(&$!3†s‰†uaÚßÝÛÙ×ÔÒÜûùöóñîëèÕÂÁÀ¿¾½¼»‚qtvy|~„MLRY`fmtz}YT]fpy‚”ºÃÊÑ×ÞäëòóÏÑÔ×ÙÜßá͉ˆ‡…„„ƒ]8630.+(&,-*)'%#!$†u‰†xaãáÞÜÚØÖÔÝúøõòðíêèξ¾½¼»¹¸·pnpsux{}xELRY`fmtzYXajs|…Ž—¦ÃÊÑ×ÞäëòùÒÎÑÓÖÙÛÝÛ…„„ƒ€~d852/-*'%-.,*)'%" †x‰†zaãâàÞÜÚØÕåú÷ôñïìéçǼº¹¸·¶µ´hjmoruwzjELRY`fmtl[dmv€‰’›¤­¾ÊÑ×ÞäëòùÙÊÍÐÒÕ×ÚÝ‚€~}|{j741/,)&$*0-+)(&$"†z‰†|aåãâßÝÛÙ×èùöóñîëèæÄ¸·¶µ´³²§dgilnqtv\ELRY`fmthhqzƒŒ•ž§°¹ÃÊÑ×ÞäëòùáÇÉÌÏÑÔÖÙ‹~}|{zyxg630.+(&#*1/-+)(%#†|‰†~aæäãáßÝÛØèøõòðíêèåÁµ´³²±°¯š`cehkmps[ELRY`fmtmt}†˜¢«´½ÆÎÊÑ×ÞäëòùßÃÆÉËÎÐÓÕ“{zyxwutd52/-*'%"*31.,*)'%†~‰†€aèæäâàÞÜÚé÷ôòïìéç俲±°®­¬«—]_begjloYELRY`fmtwŠ“œ¥®·ÀÉÒØÊÑ×ÞäëòùÝÀÂÅÇÊÍÏÒxwutsrqb41/,)&$!*420.,*(&†€‰†ƒaéçåãâàÞÜéöóñîëéæã¼®­¬«ª©¨Y\^adfikWELRY`fmt–Ÿ¨±ºÄÍÖßÜÊÑ×Þäëòùܼ¿ÁÄÆÉÌÎtsrqpon_30.+(&# +641/-+)(†ƒ‰†…aëéçåãáßÝèõòðíêèå⹫ª©¨§¦¥¤VX[]`ceh]ELRY`fmt‚𣬵¾ÇÐÙâëÕÊÑ×Þäëòù̹»¾ÀÃÅÈËrqponmlk\20-*'%"-7531/-+)†…‰†‡aìêèæäãáßãôòïìéçäὨ§¦¥¤¢¢¡WUWZ]_bdbELRY`fmtzŸ¯¸ÁÊÓÝæïìÃÊÑ×Þäëòù¼µ¸º½¿ÂÅÂonmlkihhS1/,)'$!397520.,*†‡‰†‰aèìêèåäâàäóñîëéæãàÂ¥¤¢¡¡ žbQTVY[^acILRY`fmtz„±ÅÎ×àéòíÁÃÊÑ×Þäëòﯱ´·¹¼¾Á®ljihgfedK0.+(&# 4:86420.2†‰‰†‹aÖíëéçåãâáòðíêèåâàË¡¡ žœ›šsMPSUXZ]`TLRY`fmtz‡¦ÃÚãÜ̶½ÃÊÑ×ÞäëòЫ®°³µ¸»½”hgfedcba@0-*'%";<:8531/E†‹‰…ŽaØïíëéæäãáòïìéçäáßÑžœ›š™˜—‚JMORTWY\]MRY`fmtz‡Ž•œ¢©¯¶½ÃÊÑ×Þäë쪨ª­¯²µ·ºedcba`_]9/,)'$!>=;97531M…މ†aÁðîìêèæäãíîëéæãàÞÛŸš™˜–••”’KILNQSVY[URY`fmtz‡Ž•œ¢©¯¶½ÃÊÑ×ÞäëÈ¡¤§©¬®±´±cba`^]\[X0.+(&# %@><;9642`†‰†’a·òðîìéçåãêíêèåâàÝÚ¬–••”’‘_EHJMPRUXZTY`fmtz‡Ž•œ¢©¯¶½ÃÊÑ×ÞäÛ›ž¡£¦¨«­°”`^]\[ZYXK0-*'%",B?=<:864n†’Š…”a¦óñïíëéçåèíêçäáßÜÙ¾“’‘ŽŒ‚BDGILOQTWXY`fmtz‡Ž•œ¢©¯¶½ÃÊÑ×Þß ˜šŸ¢¥§ª­g\[ZYXWVU>/,)'$!8CA?=<:75‚…”‹†—_õóñïíêèææìéçäáÞÛØÒŽŒ‹Š‰ˆPACFIKNPSUX_fmtz‡Ž•œ¢©¯¶½ÃÊÑ×Ùž‘”—™œž¡¤¦•ZYXWVUTSR2.+(&# DEB@><;97†—‹˜…™_ßôòðîìêèæéèæãàÞÛØÕ£Œ‹Š‰ˆ†…„v=@BEHJMORUXdmtz‡Ž•œ¢©¯¶½ÃÊÑÇ“‹Ž‘“–˜› £aWVUTRQQPE0-*'%"#HFDB@><:Q…™˜‹†›Éöôòðîëé€çTåâßÝÚ×Õ»‰ˆ†…„ƒ‚€XACFHKMPSUZj|‡Ž•œ¢©¯¶³~|„‡‰ŒŽ‘”–ŒWQPPNMLKJF0.+(&# GKIGECA?=‹†Œ†Ÿ]òöõóñîìêèæãàÞÛØÕÓб€~}|zyyk<:=?BEGJMORTWYam{„ˆ€wqtvy{~ƒ†ˆ‹]ONMLKJIHF90-*'%"$NMKIFDB@D†Ÿ¡…¢]Ø÷öôòðîìêæâßÝÚ×ÕÒÏÌŒ}|zyyxvut`79<>ADFIKNQSVY[^`cehkmpruxz}€‚…‡ŠbMLKJIHFEEA1/,)'$!=ONLJHFDBe…¢¡£…¤]¿ù÷öôòïíëéáÞÜÙÖÔÑÎ˵yxwvutsrqpY68;=@CEHJMPRUXZ]_begjloqtwy|„†cKJIHFEDDBA60.+(&# PQONLJGEC……¤£¥†¦[ðøöõóñïíëäÞÛØÕÓÐÍËÈ”utsrqpnmmlY87:=?BDGILOQTVY\^adfiknqsvx{}}\IGFEDCBA@?:20-*'%"9USPNMKIGQ†¦¥Ž†¨[ÒúøöõòðîìéÝÚ×ÕÒÏÌÊÇ¿|qpnmmljihg]=69<>ACFIKNPSUX[]`cehjmpruwqQFEDCBA@?>=;51/,)'$! TVTRPNMKHw†¨†ª[µûù÷öôòðîìãÙÖÔÑÎËÉÆÃ±mlljihgfedc_G58;=@BEHJMORUWZ\_adgiloq`HDCBA@?>=<;:730.+(&# 79=;;:978520-*'%"%Y[YWUSQOMp†­¬†¯Y¹üúøöõóñïíäÕÒÏÌÊÇÄ¿¼‹edcba`^]\[ZYXSB;;>ACFHKMPSUXZ]^WGBA@?>=;::97657741/,)'$!L_][YWTRPN£†¯‘‡±WáüúøöôòðîìÛÑÎËÉÆÃÁ¾»¹a`^]\[ZYXWVUTSRIEA@BEGJMOQQNIBA@?><;:997654369631.+(&# 4b`^\ZXVTRt‡±’†³W¼ýûù÷öôòðíêÒÍËÈÅÂÀ½º¸µƒ\[ZYXWVUTSRQPOMLKJIGFFEDCBA@?><;:9876543216:8520-*(%"$aca`^\ZWUS§†³“µ†¶Ußýûù÷õóñïíäÌÊÇÄ¿¼¹·´±XWVUTRQQPNMLKJIHGFEDCBA@?><;:9876543210/9<:741/,)'$!Vgeca_][YWy†¶µ”·…¸U¼úüúøöõóñîìÝÉÆÃÁ¾»¹¶³°®›^RQQPNMLKJIHGFEDCA@@?=<;:9876543210/.0=>;9631.+(&#Kjhfdba_][^²…¸·•‡ºSÔþüú÷öôòðîìÕÅÃÀ½º¸µ²°­ª¢uNMLKJIHGFEDCA@@?=<;:987654320//.,+5A@=:8520-*(%@nljhfcb`^\‡º–‡¼Qîýûù÷öôòïíëп¼º·´±¯¬©§¤ŒZIHFFEDBA@?>=<;:987654320//.,+*/@EB?<:741/,)'=rpmkigeca`u‡¼—‡¾QÂûýúøöõóñïíèȾ»¹¶³±®«¨¦£ ž{ODBA@?>=<;:987554310/.-,+*)-?JGDA?<9631.+(5osqomkigdbg³‡¾˜À†ÁOÔþüúøöõòðîìçʺ¸µ²°­ª¨¥¢Ÿš—zY>=<;:987544310/.-,+*)(5DNKIFCA>;8630-*Bsvtsqnljhfd£†ÁÀ™†ÃMáþûù÷öôòðîìéË·´±¯¬©§¤¡žœ™–”‘‰mR=6543310/.-,+*)+7ERSPMKHEB@=:852/-I|ywusrpnljhކÚˆÅKíýûù÷õóñïíëéÒ³±®«¨¦£ ž›˜•“‹ˆ…thWLA@?=<:@GPT]ZWTROLJGDA?<9741/\}{ywusqomk†ˆÅœ‡ÇKËôüúøöõóñïíêèÙ³­ª¨¥¢Ÿš—•’ŒŠ‡„‚|zwtqolifda^\YVTQNKIFCA>;8636oƒ}zxvtsqo~Á‡ÇˆÉIÍôüúøöôòðîìêè⽩§¤¡žœ™–”‘ŽŒ‰†ƒ~{yvspnkhfc`][XUSPMKHEB@=:85M‚†„‚€~|zxvtrĈɞˇÌGÏôûù÷öôòðíëéçåÑ­£ ž›˜•“‹ˆ…ƒ€}zxurpmjgeb_]ZWTROLJGDA?<9Br‹‰‡†„‚€}{ywu„ƇÌˠ͇ÎEÑôûù÷õóñïíëéçäßÂ£š—•’ŒŠ‡„‚|zwtqoligda^\YVTQNKIFCA>@f‹‹‰‡…ƒ}{y‡È‡ÎÍ¢ˆÐCÓôúøöõóñîìêèæäãݽ–”‘ŽŒ‰†ƒ~{yvspnkhfc`^[XUSPMKHEBEk‘•“ŽŒŠˆ†…ƒ~|ŠËˆÐ£ÑˆÒAÕïù÷öôòðîìêèåäâàÚ ‹ˆ…ƒ€}zxurpmjgeb_]ZWUROLJGU{–š˜–”’ŽŒŠ‡†„‚€˜ÍˆÒѤÔÔˆÕ=êù÷öôñïíëéçåãâàÝÛв˜‡„‚|zwtqoligda^\YVTQN]w˜¡Ÿ›™˜–“‘‹‰‡†„«ˆÕÔÔ¦ÖÖˆ×;âööõóñïíëèæäãáßÝÛÙ×к¤’{yvspnkhfc`^[Xl{Š¥©§¥£¡Ÿœš™—•“‘ŠˆŒ½ˆ×Ö֨؉Ù9ÝðöõòðîìêèæäâàÞÜÚØÖÔÒÐÏǵ³¡™–”’•¤¢±´²°®¬«¨¦¤¢ žœš™—”’ŽŒžÔ‰ÙتڊÛ5çôôòðîìéçåãâàÞÜÚ×ÕÓÑÐÎÌÊÈÆÃÁ¿¾¼º¸¶´±¯­«ª¨¦¤¢Ÿ›™˜–”’”¾ŠÛڬ܊Ý3ßìóñïíëéçåãáßÝÛÙ×ÕÓÑÏÍËÉÇÅÃÁ¿½»¹·µ³±¯­«©§¥£¡Ÿ›™—•´ØŠÝÜ®ßߊà/âíñïìêèæäãáßÝÛØÖÔÒÐÏÍËÉÆÄÂÀ¾½»¹·µ²°®¬«©§¥£ žœš³×Šàßß°áá‹â+äëîìêèæäâàÞÜÚØÖÔÒÐÎÌÊÈÆÄÂÀ¾¼º¸¶´²°®¬ª¨¦¤¢ ·Ù‹âáá³ä'åéêéçåãâàÞÛÙ×ÕÓÑÐÎÌÊÇÅÃÁ¿¾¼º¸µ³±¯­«ª¨®ÄÜä¶åŽæ!èèçäãáßÝÛÙ×ÕÒÑÏÍËÉÇÅÃÁ¿½»¹·µ³±¯°ÁÓŽæå¸ç‘èæäáßÜÚØÖÔÒÐÏÍÊÈÆÄÂÀ¾½»¹¶ÁÍÚèç»êê‘ëéæãßÜ×ÓÑÐÎÌÊÈÆÆÌÊÔÙá‘ëêê¾ìì·íììÁîµïîÅð±ñðÉóó«ôóóÍõõ¦ö€õÑ÷÷£ø÷÷ÖùùúùùÝûû•üûûæþÿÿÿÿÿÿ¨ÿÿÿÿÿÿ¨‚…‚æ•Ý€›€Ö§Ñ © Í ­ ɱ Å·Á»¾’ +1?=FGECA?=;95-)"’»(8HVTRPNMKHFDB@><;97420.,%¸Ž!/F\^\ZXVTQONLJHFDB?=<:86420.+*(%޶&%B]eca`^[YWUSQONLIGECA?=<:7531/-+)(&#!޳+'Pmkifdba_][YWURPNMKIGEC@><;97531.,*)'%#!° ‹/*Trpnljhfdb`^\ZXVTRPNMJHFDB@><;86420.,*)&$" ‹ ®"Š!3'Swusrpnljgeca`^\ZXUSQONLJHFDA?=<:8642/-+)(&$"  Š!"¬$Š#5Fw{ywusqomkigeca_][YWUSQOMKIGECA?=;97531/-+)'%#!Š#$ªŠ&9+k|zxvtsqomjhfdba_][Y]nl}}zq][F><;97530.,*)'%#!#Š&¨)‰(;E€„‚€~|zxvtrpnljhfdo‡˜©Á¾»¹¶³±®«¨¦£ ž„pW>6420.,*(&$" !‰()¦+‰*=Z‰‡†„‚€}{ywusrpnkv›¹ËÈÅÃÀ½º¸µ²°­ª¨¥¢Ÿš—•’a>1/-+)(&$!‰*+¤-ˆ,A2p‹ˆ‡…ƒ}{ywtsx–ÂÒÏÌÊÇÄ¿¼º·´±¯¬©§¤¡žœ™–”‘ŽŒ‰vO4-*)'%#!*ˆ,-£ˆ/C5€ŽŒŠˆ†…ƒ€~|zx|¨Ó×ÔÑÎÌÉÆÃÁ¾»¹¶³±®«¨¦£ ž›˜•“‹ˆ…ƒ{U1*)'%" -ˆ/¢ˆ1E7ƒ”’ŽŒ‰‡†„‚€~‚­ØÛØÖÓÐÍËÈÅÃÀ½º¸µ²°­ª¨¥¢Ÿš—•’ŒŠ‡„‚|uQ.(&$" .ˆ1 ˆ3G9Œ˜•“‘‹‰‡†„ŸÖàÝÚ×ÕÒÏÍÊÇÄ¿¼º·´±¯¬©§¤¡žœ™–”‘ŽŒ‰†ƒ~{yvj?(&#!0ˆ3ž6‡5I<‰š™—•“‘ŒŠˆ†‹ÈäáßÜÙ×ÔÑÎÌÉÆÄÁ¾»¹¶³±®«¨¦£ ž›˜•“‹ˆ…ƒ€}zxurpX+%#!3‡56‡7K>Œžœš˜–”’ŽŒŠ âæãàÞÛØÖÓÐÍËÈÅÃÀ½»¸µ²°­ª¨¥¢Ÿš—•’ŒŠ‡„‚|zwtqole6$" 4‡7œˆ:K‚¢Ÿ›™˜–”’¶êèåâàÝÚ×ÕÒÏÍÊÇÄ¿¼ÇÎÙáéèæäãáÕȵ§”‘ŽŒ‰†ƒ~{yvspnkhf@$" ˆ:šˆO`©§¥¢ žœš™—›ÓïìéçäàÞÛØÖÓÐÍËÚíþýüûúùø÷öõôòòñðîíìëêéèÉ£‚|zwtqoligda^K&!/‡>˜A†@QN¥ª¨¦¤¢ žœšžáðîëèæãàÞÛ×ÕÒÏß÷ýüûúùø÷öõôòññðîíìëêéèçæåäãÕ£{yvspnkhfc`^[N% =†@A—‡BQ”­«ª¨¦£¡Ÿ›ØòðíêçåâßÝÚ×ÕÜôüûúù÷÷öõôòñððîíìëêéèçæåäãáààßÝÊ‘urpmjgeb_]ZWE!‡B–‡ESu±®¬«©§¥£¡ŸÕôñïìéçäáÞÜÙÙíûúù÷ööõóòñðïîíìëêéèææåäãáàßßÝÜÛÚÙØ«xoligda^\YVT@!0‡E•†GUN­²°®¬«©¦¤¢ÇöóðîëèæãàÞÛÞõù÷ööõóòñðïîíìëêéèæååäâáàßÞÝÜÛÚÙØ×ÕÕÔÆkhfc`^[XUSP5 C†G”‡IU޶´²¯­«ª¨¦¹øõòðíêçåâßÝå÷öõôóòñðïîíìëêéèæååäâáàßÞÝÜÛÚÙØ×ÕÔÔÓÑÐÏÎheb_]ZWUROL, (‡I“†KWY¹·µ³±¯­«ª­ô÷ôñïìéçäáÞëõôóòñðïîíìëêéçæåäãââããáÝÜÛÚÙØ×ÕÔÔÓÑÐÏÎÍÌËÊžda_\YVTQNLG$C†K’‡NW𻹷µ³°®¬«áùöóðîëèæãàìóòñðïîíìëêéçæåäáßßáãæéëîðñîçáÔÓÒÑÐÏÎÍÌËÊÉÈÇÆ `^[XVSPMKH:!'‡N‘†PY]¾¼º¸¶´²°®Åúøõòðíêçåâêñðïîììëêèçæåäá×ÔÕØÚÝàâåçêíïòõ÷÷ìÕÎÍÌËÊÉÈÇÅÄÃÂÁ–]ZWUROMJGD, G†PS†RY—¿¾¼º¸¶³±´òú÷ôñïìéçäæïîìëëêèçæåäãÝÎÊÍÏÒÔ×ÙÜßáäæéìîñóöùûñÐÉÈÇÅÄÃÂÁÀ¿¾½€YVTQNLIFC># )†RS†T[bÃÁ¿½»¹·µ³×ûùöóñîëèæåìëêêèçæåäãâßÍÁÄÆÉËÎÑÓÖÙÛÞàãåèëíðòõøúýæÈÃÂÁÀ¿¾½¼»º¹jVSPMKHEC@0!K†T†V[ŽÄÂÀ¾½»¹·¹øúøõòðíêèåééèçæåäãâáà×À»½ÀÃÅÈÊÍÐÒÕ×ÚÝßâåçêìïñô÷ùüóÌ¿¾½¼»¹¹¸·µ©[ROMJGDB?;$!4†VއY[ºÆÄ¿¾¼º¸Úüú÷ôñïìéçæçæåäãâáàßÞεµ·º½¿ÂÄÇÉÌÏÑÔÖÙÜÞáäæéëîñóöøûùÑ»¹¸¸·µ´³²±ŽQNLIFCA>;." ‡Y†[]~ÉÇÅÃÁ¿¾¼¾ùûùöóñîëèæåäãâáàßÞÜÛȬ®±´¶¹¼¾ÁÃÆÉËÎÐÓÕØÛÝàâåèêíðòõ÷úýÒ·µ´³²±°¯®­gMKHEC@=:7%!D†[†]]£ËÉÇÅÃÀ¿½ÕýúøõòðíêèãááàßÝÜÛÚÙȦ¨«­°³µ¸º½ÀÂÅÈÊÍÏÒÕ×ÚÜßáäçéìïñôöùüʲ±°¯®­¬«ª—MJGDB?<:7+#!/†]†_]ÈÌÊÈÆÄÂÀ¾òüú÷ôñïìéåàßÝÜÛÚÙØ×Ë£¢¥§ª­¯²´·¹¼¿Á½µ¯´¹½ÉÒÙÛÞáãæèëíðóõøö½­¬¬«©¨§¦¥mIFCA>;961%" †_Œb…a_vÐÎÌÊÈÆÃÁÇþûùöóñîëèÞÜÛÚÙØ×ÖÕФœž¡¤¦©¬®±³¶´›‰‡Ž•œ¢©¯¶ÀÎÙÝàâåçêíïòõ÷ë°©¨§¦¥¤£¢–HEC@=:852'$" N…ab‹†d_›ÑÏÍËÉÇÅÃàýúøõòðíêäÚÙØ×ÕÕÔÓÑ®–˜› £¥¨«­°xz‡Ž•œ¢©¯¶½ÃËÕÜßáäæéìîñóöÕ¦¥¤£¢¡ ŸžbDB?<:741+%#!=†d‹†f_¸ÒÐÏÍËÉÇÄóüú÷ôñïìéÝ×ÕÔÔÓÑÐÏÆ’•—šŸ¢¤§ tmtz‡Ž•œ¢©¯¶½ÃÊÑ×ÛÞàãåèëíðòõ²¢¡ Ÿœ›šDA?;9631-'%#!*†f‹†h_ÖÔÒÐÎÌÊÈÊþûùöóñîëçÔÔÓÑÐÏÎÍÌšŒ‘”–™œž¡–dfmtz‡Ž•œ¢©¯¶½ÃÊÑ×ÝÜÝßâåçêìïñߟœ›š™˜—–HA>;8620-)&$" †h‹…ja×ÕÓÑÐÎÌÊÙýúøõòðíêàÑÐÏÎÍÌËÊÀ†‰‹Ž“•˜›”]`fmtz‡Ž•œ¢©¯¶½ÃÊÑ×ÞãÛÜÞáãæéëîñ¦š™˜—–•”“`@=:852/-)(&$" […jŠm…la–Ù×ÕÓÑÏÍËçüú÷ôñïìé×ÎÍÌËÊÉÈÇš‚…‡Š’•—`Y`fmtz‡Ž•œ¢©¯¶½ÃÊÑ×ÞäçØÛÝàâåèêíΗ–•”“‘‘v?<9741/,*)'%#!M…lm‰†oa¥ÚØÖÔÒÐÏÍñûùöóñîëèÍËÊÉÈÇÅÄÀ„†‰ŒŽ‘pRY`fmtz‡Ž•œ¢©¯¶½ÃÊÑ×Þäëã×ÚÜßáäçéæ”“‘Œ†>;8630.+)*)'%# E†o‰†qa¼ÜÚØÖÔÑÐÎýúøõòðíêâÉÈÆÅÄÃÂÁ©y{~€ƒ…ˆ‹‰PRY`fmtz‡Ž•œ¢©¯¶½ÃÊÑ×ÞäëïÖÖÙÛÞáãæè§Œ‹Š‰ˆJ:852/-*',*(&$" 1†q‰†saÄÝÛÙ×ÕÓÑÒüú÷ôñïìéÝÅÄÃÂÁÀ¿¾˜uwz}‚…‡hLRY`fmtz‡vgck€›¶½ÃÊÑ×ÞäëòäÓÕØÚÝàâ庌‹Š‰ˆ‡†…R9741/,)&,+)(&$!3†s‰†uaÚßÝÛÙ×ÔÒÜûùöóñîëèÕÂÁÀ¿¾½¼»‚qtvy|~„MLRY`fmtz}YT]fpy‚”ºÃÊÑ×ÞäëòóÏÑÔ×ÙÜßá͉ˆ‡…„„ƒ]8630.+(&,-*)'%#!$†u‰†xaãáÞÜÚØÖÔÝúøõòðíêèξ¾½¼»¹¸·pnpsux{}xELRY`fmtzYXajs|…Ž—¦ÃÊÑ×ÞäëòùÒÎÑÓÖÙÛÝÛ…„„ƒ€~d852/-*'%-.,*)'%" †x‰†zaãâàÞÜÚØÕåú÷ôñïìéçǼº¹¸·¶µ´hjmoruwzjELRY`fmtl[dmv€‰’›¤­¾ÊÑ×ÞäëòùÙÊÍÐÒÕ×ÚÝ‚€~}|{j741/,)&$*0-+)(&$"†z‰†|aåãâßÝÛÙ×èùöóñîëèæÄ¸·¶µ´³²§dgilnqtv\ELRY`fmthhqzƒŒ•ž§°¹ÃÊÑ×ÞäëòùáÇÉÌÏÑÔÖÙ‹~}|{zyxg630.+(&#*1/-+)(%#†|‰†~aæäãáßÝÛØèøõòðíêèåÁµ´³²±°¯š`cehkmps[ELRY`fmtmt}†˜¢«´½ÆÎÊÑ×ÞäëòùßÃÆÉËÎÐÓÕ“{zyxwutd52/-*'%"*31.,*)'%†~‰†€aèæäâàÞÜÚé÷ôòïìéç俲±°®­¬«—]_begjloYELRY`fmtwŠ“œ¥®·ÀÉÒØÊÑ×ÞäëòùÝÀÂÅÇÊÍÏÒxwutsrqb41/,)&$!*420.,*(&†€‰†ƒaéçåãâàÞÜéöóñîëéæã¼®­¬«ª©¨Y\^adfikWELRY`fmt–Ÿ¨±ºÄÍÖßÜÊÑ×Þäëòùܼ¿ÁÄÆÉÌÎtsrqpon_30.+(&# +641/-+)(†ƒ‰†…aëéçåãáßÝèõòðíêèå⹫ª©¨§¦¥¤VX[]`ceh]ELRY`fmt‚𣬵¾ÇÐÙâëÕÊÑ×Þäëòù̹»¾ÀÃÅÈËrqponmlk\20-*'%"-7531/-+)†…‰†‡aìêèæäãáßãôòïìéçäὨ§¦¥¤¢¢¡WUWZ]_bdbELRY`fmtzŸ¯¸ÁÊÓÝæïìÃÊÑ×Þäëòù¼µ¸º½¿ÂÅÂonmlkihhS1/,)'$!397520.,*†‡‰†‰aèìêèåäâàäóñîëéæãàÂ¥¤¢¡¡ žbQTVY[^acILRY`fmtz„±ÅÎ×àéòíÁÃÊÑ×Þäëòﯱ´·¹¼¾Á®ljihgfedK0.+(&# 4:86420.2†‰‰†‹aÖíëéçåãâáòðíêèåâàË¡¡ žœ›šsMPSUXZ]`TLRY`fmtz‡¦ÃÚãÜ̶½ÃÊÑ×ÞäëòЫ®°³µ¸»½”hgfedcba@0-*'%";<:8531/E†‹‰…ŽaØïíëéæäãáòïìéçäáßÑžœ›š™˜—‚JMORTWY\]MRY`fmtz‡Ž•œ¢©¯¶½ÃÊÑ×Þäë쪨ª­¯²µ·ºedcba`_]9/,)'$!>=;97531M…މ†aÁðîìêèæäãíîëéæãàÞÛŸš™˜–••”’KILNQSVY[URY`fmtz‡Ž•œ¢©¯¶½ÃÊÑ×ÞäëÈ¡¤§©¬®±´±cba`^]\[X0.+(&# %@><;9642`†‰†’a·òðîìéçåãêíêèåâàÝÚ¬–••”’‘_EHJMPRUXZTY`fmtz‡Ž•œ¢©¯¶½ÃÊÑ×ÞäÛ›ž¡£¦¨«­°”`^]\[ZYXK0-*'%",B?=<:864n†’Š…”a¦óñïíëéçåèíêçäáßÜÙ¾“’‘ŽŒ‚BDGILOQTWXY`fmtz‡Ž•œ¢©¯¶½ÃÊÑ×Þß ˜šŸ¢¥§ª­g\[ZYXWVU>/,)'$!8CA?=<:75‚…”‹†—_õóñïíêèææìéçäáÞÛØÒŽŒ‹Š‰ˆPACFIKNPSUX_fmtz‡Ž•œ¢©¯¶½ÃÊÑ×Ùž‘”—™œž¡¤¦•ZYXWVUTSR2.+(&# DEB@><;97†—‹˜…™_ßôòðîìêèæéèæãàÞÛØÕ£Œ‹Š‰ˆ†…„v=@BEHJMORUXdmtz‡Ž•œ¢©¯¶½ÃÊÑÇ“‹Ž‘“–˜› £aWVUTRQQPE0-*'%"#HFDB@><:Q…™˜‹†›Éöôòðîëé€çTåâßÝÚ×Õ»‰ˆ†…„ƒ‚€XACFHKMPSUZj|‡Ž•œ¢©¯¶³~|„‡‰ŒŽ‘”–ŒWQPPNMLKJF0.+(&# GKIGECA?=‹†Œ†Ÿ]òöõóñîìêèæãàÞÛØÕÓб€~}|zyyk<:=?BEGJMORTWYam{„ˆ€wqtvy{~ƒ†ˆ‹]ONMLKJIHF90-*'%"$NMKIFDB@D†Ÿ¡…¢]Ø÷öôòðîìêæâßÝÚ×ÕÒÏÌŒ}|zyyxvut`79<>ADFIKNQSVY[^`cehkmpruxz}€‚…‡ŠbMLKJIHFEEA1/,)'$!=ONLJHFDBe…¢¡£…¤]¿ù÷öôòïíëéáÞÜÙÖÔÑÎ˵yxwvutsrqpY68;=@CEHJMPRUXZ]_begjloqtwy|„†cKJIHFEDDBA60.+(&# PQONLJGEC……¤£¥†¦[ðøöõóñïíëäÞÛØÕÓÐÍËÈ”utsrqpnmmlY87:=?BDGILOQTVY\^adfiknqsvx{}}\IGFEDCBA@?:20-*'%"9USPNMKIGQ†¦¥Ž†¨[ÒúøöõòðîìéÝÚ×ÕÒÏÌÊÇ¿|qpnmmljihg]=69<>ACFIKNPSUX[]`cehjmpruwqQFEDCBA@?>=;51/,)'$! TVTRPNMKHw†¨†ª[µûù÷öôòðîìãÙÖÔÑÎËÉÆÃ±mlljihgfedc_G58;=@BEHJMORUWZ\_adgiloq`HDCBA@?>=<;:730.+(&# 79=;;:978520-*'%"%Y[YWUSQOMp†­¬†¯Y¹üúøöõóñïíäÕÒÏÌÊÇÄ¿¼‹edcba`^]\[ZYXSB;;>ACFHKMPSUXZ]^WGBA@?>=;::97657741/,)'$!L_][YWTRPN£†¯‘‡±WáüúøöôòðîìÛÑÎËÉÆÃÁ¾»¹a`^]\[ZYXWVUTSRIEA@BEGJMOQQNIBA@?><;:997654369631.+(&# 4b`^\ZXVTRt‡±’†³W¼ýûù÷öôòðíêÒÍËÈÅÂÀ½º¸µƒ\[ZYXWVUTSRQPOMLKJIGFFEDCBA@?><;:9876543216:8520-*(%"$aca`^\ZWUS§†³“µ†¶Ußýûù÷õóñïíäÌÊÇÄ¿¼¹·´±XWVUTRQQPNMLKJIHGFEDCBA@?><;:9876543210/9<:741/,)'$!Vgeca_][YWy†¶µ”·…¸U¼úüúøöõóñîìÝÉÆÃÁ¾»¹¶³°®›^RQQPNMLKJIHGFEDCA@@?=<;:9876543210/.0=>;9631.+(&#Kjhfdba_][^²…¸·•‡ºSÔþüú÷öôòðîìÕÅÃÀ½º¸µ²°­ª¢uNMLKJIHGFEDCA@@?=<;:987654320//.,+5A@=:8520-*(%@nljhfcb`^\‡º–‡¼Qîýûù÷öôòïíëп¼º·´±¯¬©§¤ŒZIHFFEDBA@?>=<;:987654320//.,+*/@EB?<:741/,)'=rpmkigeca`u‡¼—‡¾QÂûýúøöõóñïíèȾ»¹¶³±®«¨¦£ ž{ODBA@?>=<;:987554310/.-,+*)-?JGDA?<9631.+(5osqomkigdbg³‡¾˜À†ÁOÔþüúøöõòðîìçʺ¸µ²°­ª¨¥¢Ÿš—zY>=<;:987544310/.-,+*)(5DNKIFCA>;8630-*Bsvtsqnljhfd£†ÁÀ™†ÃMáþûù÷öôòðîìéË·´±¯¬©§¤¡žœ™–”‘‰mR=6543310/.-,+*)+7ERSPMKHEB@=:852/-I|ywusrpnljhކÚˆÅKíýûù÷õóñïíëéÒ³±®«¨¦£ ž›˜•“‹ˆ…thWLA@?=<:@GPT]ZWTROLJGDA?<9741/\}{ywusqomk†ˆÅœ‡ÇKËôüúøöõóñïíêèÙ³­ª¨¥¢Ÿš—•’ŒŠ‡„‚|zwtqolifda^\YVTQNKIFCA>;8636oƒ}zxvtsqo~Á‡ÇˆÉIÍôüúøöôòðîìêè⽩§¤¡žœ™–”‘ŽŒ‰†ƒ~{yvspnkhfc`][XUSPMKHEB@=:85M‚†„‚€~|zxvtrĈɞˇÌGÏôûù÷öôòðíëéçåÑ­£ ž›˜•“‹ˆ…ƒ€}zxurpmjgeb_]ZWTROLJGDA?<9Br‹‰‡†„‚€}{ywu„ƇÌˠ͇ÎEÑôûù÷õóñïíëéçäßÂ£š—•’ŒŠ‡„‚|zwtqoligda^\YVTQNKIFCA>@f‹‹‰‡…ƒ}{y‡È‡ÎÍ¢ˆÐCÓôúøöõóñîìêèæäãݽ–”‘ŽŒ‰†ƒ~{yvspnkhfc`^[XUSPMKHEBEk‘•“ŽŒŠˆ†…ƒ~|ŠËˆÐ£ÑˆÒAÕïù÷öôòðîìêèåäâàÚ ‹ˆ…ƒ€}zxurpmjgeb_]ZWUROLJGU{–š˜–”’ŽŒŠ‡†„‚€˜ÍˆÒѤÔÔˆÕ=êù÷öôñïíëéçåãâàÝÛв˜‡„‚|zwtqoligda^\YVTQN]w˜¡Ÿ›™˜–“‘‹‰‡†„«ˆÕÔÔ¦ÖÖˆ×;âööõóñïíëèæäãáßÝÛÙ×к¤’{yvspnkhfc`^[Xl{Š¥©§¥£¡Ÿœš™—•“‘ŠˆŒ½ˆ×Ö֨؉Ù9ÝðöõòðîìêèæäâàÞÜÚØÖÔÒÐÏǵ³¡™–”’•¤¢±´²°®¬«¨¦¤¢ žœš™—”’ŽŒžÔ‰ÙتڊÛ5çôôòðîìéçåãâàÞÜÚ×ÕÓÑÐÎÌÊÈÆÃÁ¿¾¼º¸¶´±¯­«ª¨¦¤¢Ÿ›™˜–”’”¾ŠÛڬ܊Ý3ßìóñïíëéçåãáßÝÛÙ×ÕÓÑÏÍËÉÇÅÃÁ¿½»¹·µ³±¯­«©§¥£¡Ÿ›™—•´ØŠÝÜ®ßߊà/âíñïìêèæäãáßÝÛØÖÔÒÐÏÍËÉÆÄÂÀ¾½»¹·µ²°®¬«©§¥£ žœš³×Šàßß°áá‹â+äëîìêèæäâàÞÜÚØÖÔÒÐÎÌÊÈÆÄÂÀ¾¼º¸¶´²°®¬ª¨¦¤¢ ·Ù‹âáá³ä'åéêéçåãâàÞÛÙ×ÕÓÑÐÎÌÊÇÅÃÁ¿¾¼º¸µ³±¯­«ª¨®ÄÜä¶åŽæ!èèçäãáßÝÛÙ×ÕÒÑÏÍËÉÇÅÃÁ¿½»¹·µ³±¯°ÁÓŽæå¸ç‘èæäáßÜÚØÖÔÒÐÏÍÊÈÆÄÂÀ¾½»¹¶ÁÍÚèç»êê‘ëéæãßÜ×ÓÑÐÎÌÊÈÆÆÌÊÔÙá‘ëêê¾ìì·íììÁîµïîÅð±ñðÉóó«ôóóÍõõ¦ö€õÑ÷÷£ø÷÷ÖùùúùùÝûû•üûûæþÿÿÿÿÿÿ¨ÿÿÿÿÿÿ¨‚…‚æ•Ý€›€Ö§Ñ © Í ­ ɱ Å·Á»¾’ +1?=FGECA?=;95-)"’»(8HVTRPNMKHFDB@><;97420.,%¸Ž!/F\^\ZXVTQONLJHFDB?=<:86420.+*(%޶&%B]eca`^[YWUSQONLIGECA?=<:7531/-+)(&#!޳+'Pmkifdba_][YWURPNMKIGEC@><;97531.,*)'%#!° ‹/*Trpnljhfdb`^\ZXVTRPNMJHFDB@><;86420.,*)&$" ‹ ®"Š!3'Swusrpnljgeca`^\ZXUSQONLJHFDA?=<:8642/-+)(&$"  Š!"¬$Š#5Fw{ywusqomkigeca_][YWUSQOMKIGECA?=;97531/-+)'%#!Š#$ªŠ&9+k|zxvtsqomjhfdba_][Y]nl}}zq][F><;97530.,*)'%#!#Š&¨)‰(;E€„‚€~|zxvtrpnljhfdo‡˜©Á¾»¹¶³±®«¨¦£ ž„pW>6420.,*(&$" !‰()¦+‰*=Z‰‡†„‚€}{ywusrpnkv›¹ËÈÅÃÀ½º¸µ²°­ª¨¥¢Ÿš—•’a>1/-+)(&$!‰*+¤-ˆ,A2p‹ˆ‡…ƒ}{ywtsx–ÂÒÏÌÊÇÄ¿¼º·´±¯¬©§¤¡žœ™–”‘ŽŒ‰vO4-*)'%#!*ˆ,-£ˆ/C5€ŽŒŠˆ†…ƒ€~|zx|¨Ó×ÔÑÎÌÉÆÃÁ¾»¹¶³±®«¨¦£ ž›˜•“‹ˆ…ƒ{U1*)'%" -ˆ/¢ˆ1E7ƒ”’ŽŒ‰‡†„‚€~‚­ØÛØÖÓÐÍËÈÅÃÀ½º¸µ²°­ª¨¥¢Ÿš—•’ŒŠ‡„‚|uQ.(&$" .ˆ1 ˆ3G9Œ˜•“‘‹‰‡†„ŸÖàÝÚ×ÕÒÏÍÊÇÄ¿¼º·´±¯¬©§¤¡žœ™–”‘ŽŒ‰†ƒ~{yvj?(&#!0ˆ3ž6‡5I<‰š™—•“‘ŒŠˆ†‹ÈäáßÜÙ×ÔÑÎÌÉÆÄÁ¾»¹¶³±®«¨¦£ ž›˜•“‹ˆ…ƒ€}zxurpX+%#!3‡56‡7K>Œžœš˜–”’ŽŒŠ âæãàÞÛØÖÓÐÍËÈÅÃÀ½»¸µ²°­ª¨¥¢Ÿš—•’ŒŠ‡„‚|zwtqole6$" 4‡7œˆ:K‚¢Ÿ›™˜–”’¶êèåâàÝÚ×ÕÒÏÍÊÇÄ¿¼ÇÎÙáéèæäãáÕȵ§”‘ŽŒ‰†ƒ~{yvspnkhf@$" ˆ:šˆO`©§¥¢ žœš™—›ÓïìéçäàÞÛØÖÓÐÍËÚíþýüûúùø÷öõôòòñðîíìëêéèÉ£‚|zwtqoligda^K&!/‡>˜A†@QN¥ª¨¦¤¢ žœšžáðîëèæãàÞÛ×ÕÒÏß÷ýüûúùø÷öõôòññðîíìëêéèçæåäãÕ£{yvspnkhfc`^[N% =†@A—‡BQ”­«ª¨¦£¡Ÿ›ØòðíêçåâßÝÚ×ÕÜôüûúù÷÷öõôòñððîíìëêéèçæåäãáààßÝÊ‘urpmjgeb_]ZWE!‡B–‡ESu±®¬«©§¥£¡ŸÕôñïìéçäáÞÜÙÙíûúù÷ööõóòñðïîíìëêéèææåäãáàßßÝÜÛÚÙØ«xoligda^\YVT@!0‡E•†GUN­²°®¬«©¦¤¢ÇöóðîëèæãàÞÛÞõù÷ööõóòñðïîíìëêéèæååäâáàßÞÝÜÛÚÙØ×ÕÕÔÆkhfc`^[XUSP5 C†G”‡IU޶´²¯­«ª¨¦¹øõòðíêçåâßÝå÷öõôóòñðïîíìëêéèæååäâáàßÞÝÜÛÚÙØ×ÕÔÔÓÑÐÏÎheb_]ZWUROL, (‡I“†KWY¹·µ³±¯­«ª­ô÷ôñïìéçäáÞëõôóòñðïîíìëêéçæåäãââããáÝÜÛÚÙØ×ÕÔÔÓÑÐÏÎÍÌËÊžda_\YVTQNLG$C†K’‡NW𻹷µ³°®¬«áùöóðîëèæãàìóòñðïîíìëêéçæåäáßßáãæéëîðñîçáÔÓÒÑÐÏÎÍÌËÊÉÈÇÆ `^[XVSPMKH:!'‡N‘†PY]¾¼º¸¶´²°®Åúøõòðíêçåâêñðïîììëêèçæåäá×ÔÕØÚÝàâåçêíïòõ÷÷ìÕÎÍÌËÊÉÈÇÅÄÃÂÁ–]ZWUROMJGD, G†PS†RY—¿¾¼º¸¶³±´òú÷ôñïìéçäæïîìëëêèçæåäãÝÎÊÍÏÒÔ×ÙÜßáäæéìîñóöùûñÐÉÈÇÅÄÃÂÁÀ¿¾½€YVTQNLIFC># )†RS†T[bÃÁ¿½»¹·µ³×ûùöóñîëèæåìëêêèçæåäãâßÍÁÄÆÉËÎÑÓÖÙÛÞàãåèëíðòõøúýæÈÃÂÁÀ¿¾½¼»º¹jVSPMKHEC@0!K†T†V[ŽÄÂÀ¾½»¹·¹øúøõòðíêèåééèçæåäãâáà×À»½ÀÃÅÈÊÍÐÒÕ×ÚÝßâåçêìïñô÷ùüóÌ¿¾½¼»¹¹¸·µ©[ROMJGDB?;$!4†VއY[ºÆÄ¿¾¼º¸Úüú÷ôñïìéçæçæåäãâáàßÞεµ·º½¿ÂÄÇÉÌÏÑÔÖÙÜÞáäæéëîñóöøûùÑ»¹¸¸·µ´³²±ŽQNLIFCA>;." ‡Y†[]~ÉÇÅÃÁ¿¾¼¾ùûùöóñîëèæåäãâáàßÞÜÛȬ®±´¶¹¼¾ÁÃÆÉËÎÐÓÕØÛÝàâåèêíðòõ÷úýÒ·µ´³²±°¯®­gMKHEC@=:7%!D†[†]]£ËÉÇÅÃÀ¿½ÕýúøõòðíêèãááàßÝÜÛÚÙȦ¨«­°³µ¸º½ÀÂÅÈÊÍÏÒÕ×ÚÜßáäçéìïñôöùüʲ±°¯®­¬«ª—MJGDB?<:7+#!/†]†_]ÈÌÊÈÆÄÂÀ¾òüú÷ôñïìéåàßÝÜÛÚÙØ×Ë£¢¥§ª­¯²´·¹¼¿Á½µ¯´¹½ÉÒÙÛÞáãæèëíðóõøö½­¬¬«©¨§¦¥mIFCA>;961%" †_Œb…a_vÐÎÌÊÈÆÃÁÇþûùöóñîëèÞÜÛÚÙØ×ÖÕФœž¡¤¦©¬®±³¶´›‰‡Ž•œ¢©¯¶ÀÎÙÝàâåçêíïòõ÷ë°©¨§¦¥¤£¢–HEC@=:852'$" N…ab‹†d_›ÑÏÍËÉÇÅÃàýúøõòðíêäÚÙØ×ÕÕÔÓÑ®–˜› £¥¨«­°xz‡Ž•œ¢©¯¶½ÃËÕÜßáäæéìîñóöÕ¦¥¤£¢¡ ŸžbDB?<:741+%#!=†d‹†f_¸ÒÐÏÍËÉÇÄóüú÷ôñïìéÝ×ÕÔÔÓÑÐÏÆ’•—šŸ¢¤§ tmtz‡Ž•œ¢©¯¶½ÃÊÑ×ÛÞàãåèëíðòõ²¢¡ Ÿœ›šDA?;9631-'%#!*†f‹†h_ÖÔÒÐÎÌÊÈÊþûùöóñîëçÔÔÓÑÐÏÎÍÌšŒ‘”–™œž¡–dfmtz‡Ž•œ¢©¯¶½ÃÊÑ×ÝÜÝßâåçêìïñߟœ›š™˜—–HA>;8620-)&$" †h‹…ja×ÕÓÑÐÎÌÊÙýúøõòðíêàÑÐÏÎÍÌËÊÀ†‰‹Ž“•˜›”]`fmtz‡Ž•œ¢©¯¶½ÃÊÑ×ÞãÛÜÞáãæéëîñ¦š™˜—–•”“`@=:852/-)(&$" […jŠm…la–Ù×ÕÓÑÏÍËçüú÷ôñïìé×ÎÍÌËÊÉÈÇš‚…‡Š’•—`Y`fmtz‡Ž•œ¢©¯¶½ÃÊÑ×ÞäçØÛÝàâåèêíΗ–•”“‘‘v?<9741/,*)'%#!M…lm‰†oa¥ÚØÖÔÒÐÏÍñûùöóñîëèÍËÊÉÈÇÅÄÀ„†‰ŒŽ‘pRY`fmtz‡Ž•œ¢©¯¶½ÃÊÑ×Þäëã×ÚÜßáäçéæ”“‘Œ†>;8630.+)*)'%# E†o‰†qa¼ÜÚØÖÔÑÐÎýúøõòðíêâÉÈÆÅÄÃÂÁ©y{~€ƒ…ˆ‹‰PRY`fmtz‡Ž•œ¢©¯¶½ÃÊÑ×ÞäëïÖÖÙÛÞáãæè§Œ‹Š‰ˆJ:852/-*',*(&$" 1†q‰†saÄÝÛÙ×ÕÓÑÒüú÷ôñïìéÝÅÄÃÂÁÀ¿¾˜uwz}‚…‡hLRY`fmtz‡vgck€›¶½ÃÊÑ×ÞäëòäÓÕØÚÝàâ庌‹Š‰ˆ‡†…R9741/,)&,+)(&$!3†s‰†uaÚßÝÛÙ×ÔÒÜûùöóñîëèÕÂÁÀ¿¾½¼»‚qtvy|~„MLRY`fmtz}YT]fpy‚”ºÃÊÑ×ÞäëòóÏÑÔ×ÙÜßá͉ˆ‡…„„ƒ]8630.+(&,-*)'%#!$†u‰†xaãáÞÜÚØÖÔÝúøõòðíêèξ¾½¼»¹¸·pnpsux{}xELRY`fmtzYXajs|…Ž—¦ÃÊÑ×ÞäëòùÒÎÑÓÖÙÛÝÛ…„„ƒ€~d852/-*'%-.,*)'%" †x‰†zaãâàÞÜÚØÕåú÷ôñïìéçǼº¹¸·¶µ´hjmoruwzjELRY`fmtl[dmv€‰’›¤­¾ÊÑ×ÞäëòùÙÊÍÐÒÕ×ÚÝ‚€~}|{j741/,)&$*0-+)(&$"†z‰†|aåãâßÝÛÙ×èùöóñîëèæÄ¸·¶µ´³²§dgilnqtv\ELRY`fmthhqzƒŒ•ž§°¹ÃÊÑ×ÞäëòùáÇÉÌÏÑÔÖÙ‹~}|{zyxg630.+(&#*1/-+)(%#†|‰†~aæäãáßÝÛØèøõòðíêèåÁµ´³²±°¯š`cehkmps[ELRY`fmtmt}†˜¢«´½ÆÎÊÑ×ÞäëòùßÃÆÉËÎÐÓÕ“{zyxwutd52/-*'%"*31.,*)'%†~‰†€aèæäâàÞÜÚé÷ôòïìéç俲±°®­¬«—]_begjloYELRY`fmtwŠ“œ¥®·ÀÉÒØÊÑ×ÞäëòùÝÀÂÅÇÊÍÏÒxwutsrqb41/,)&$!*420.,*(&†€‰†ƒaéçåãâàÞÜéöóñîëéæã¼®­¬«ª©¨Y\^adfikWELRY`fmt–Ÿ¨±ºÄÍÖßÜÊÑ×Þäëòùܼ¿ÁÄÆÉÌÎtsrqpon_30.+(&# +641/-+)(†ƒ‰†…aëéçåãáßÝèõòðíêèå⹫ª©¨§¦¥¤VX[]`ceh]ELRY`fmt‚𣬵¾ÇÐÙâëÕÊÑ×Þäëòù̹»¾ÀÃÅÈËrqponmlk\20-*'%"-7531/-+)†…‰†‡aìêèæäãáßãôòïìéçäὨ§¦¥¤¢¢¡WUWZ]_bdbELRY`fmtzŸ¯¸ÁÊÓÝæïìÃÊÑ×Þäëòù¼µ¸º½¿ÂÅÂonmlkihhS1/,)'$!397520.,*†‡‰†‰aèìêèåäâàäóñîëéæãàÂ¥¤¢¡¡ žbQTVY[^acILRY`fmtz„±ÅÎ×àéòíÁÃÊÑ×Þäëòﯱ´·¹¼¾Á®ljihgfedK0.+(&# 4:86420.2†‰‰†‹aÖíëéçåãâáòðíêèåâàË¡¡ žœ›šsMPSUXZ]`TLRY`fmtz‡¦ÃÚãÜ̶½ÃÊÑ×ÞäëòЫ®°³µ¸»½”hgfedcba@0-*'%";<:8531/E†‹‰…ŽaØïíëéæäãáòïìéçäáßÑžœ›š™˜—‚JMORTWY\]MRY`fmtz‡Ž•œ¢©¯¶½ÃÊÑ×Þäë쪨ª­¯²µ·ºedcba`_]9/,)'$!>=;97531M…މ†aÁðîìêèæäãíîëéæãàÞÛŸš™˜–••”’KILNQSVY[URY`fmtz‡Ž•œ¢©¯¶½ÃÊÑ×ÞäëÈ¡¤§©¬®±´±cba`^]\[X0.+(&# %@><;9642`†‰†’a·òðîìéçåãêíêèåâàÝÚ¬–••”’‘_EHJMPRUXZTY`fmtz‡Ž•œ¢©¯¶½ÃÊÑ×ÞäÛ›ž¡£¦¨«­°”`^]\[ZYXK0-*'%",B?=<:864n†’Š…”a¦óñïíëéçåèíêçäáßÜÙ¾“’‘ŽŒ‚BDGILOQTWXY`fmtz‡Ž•œ¢©¯¶½ÃÊÑ×Þß ˜šŸ¢¥§ª­g\[ZYXWVU>/,)'$!8CA?=<:75‚…”‹†—_õóñïíêèææìéçäáÞÛØÒŽŒ‹Š‰ˆPACFIKNPSUX_fmtz‡Ž•œ¢©¯¶½ÃÊÑ×Ùž‘”—™œž¡¤¦•ZYXWVUTSR2.+(&# DEB@><;97†—‹˜…™_ßôòðîìêèæéèæãàÞÛØÕ£Œ‹Š‰ˆ†…„v=@BEHJMORUXdmtz‡Ž•œ¢©¯¶½ÃÊÑÇ“‹Ž‘“–˜› £aWVUTRQQPE0-*'%"#HFDB@><:Q…™˜‹†›Éöôòðîëé€çTåâßÝÚ×Õ»‰ˆ†…„ƒ‚€XACFHKMPSUZj|‡Ž•œ¢©¯¶³~|„‡‰ŒŽ‘”–ŒWQPPNMLKJF0.+(&# GKIGECA?=‹†Œ†Ÿ]òöõóñîìêèæãàÞÛØÕÓб€~}|zyyk<:=?BEGJMORTWYam{„ˆ€wqtvy{~ƒ†ˆ‹]ONMLKJIHF90-*'%"$NMKIFDB@D†Ÿ¡…¢]Ø÷öôòðîìêæâßÝÚ×ÕÒÏÌŒ}|zyyxvut`79<>ADFIKNQSVY[^`cehkmpruxz}€‚…‡ŠbMLKJIHFEEA1/,)'$!=ONLJHFDBe…¢¡£…¤]¿ù÷öôòïíëéáÞÜÙÖÔÑÎ˵yxwvutsrqpY68;=@CEHJMPRUXZ]_begjloqtwy|„†cKJIHFEDDBA60.+(&# PQONLJGEC……¤£¥†¦[ðøöõóñïíëäÞÛØÕÓÐÍËÈ”utsrqpnmmlY87:=?BDGILOQTVY\^adfiknqsvx{}}\IGFEDCBA@?:20-*'%"9USPNMKIGQ†¦¥Ž†¨[ÒúøöõòðîìéÝÚ×ÕÒÏÌÊÇ¿|qpnmmljihg]=69<>ACFIKNPSUX[]`cehjmpruwqQFEDCBA@?>=;51/,)'$! TVTRPNMKHw†¨†ª[µûù÷öôòðîìãÙÖÔÑÎËÉÆÃ±mlljihgfedc_G58;=@BEHJMORUWZ\_adgiloq`HDCBA@?>=<;:730.+(&# 79=;;:978520-*'%"%Y[YWUSQOMp†­¬†¯Y¹üúøöõóñïíäÕÒÏÌÊÇÄ¿¼‹edcba`^]\[ZYXSB;;>ACFHKMPSUXZ]^WGBA@?>=;::97657741/,)'$!L_][YWTRPN£†¯‘‡±WáüúøöôòðîìÛÑÎËÉÆÃÁ¾»¹a`^]\[ZYXWVUTSRIEA@BEGJMOQQNIBA@?><;:997654369631.+(&# 4b`^\ZXVTRt‡±’†³W¼ýûù÷öôòðíêÒÍËÈÅÂÀ½º¸µƒ\[ZYXWVUTSRQPOMLKJIGFFEDCBA@?><;:9876543216:8520-*(%"$aca`^\ZWUS§†³“µ†¶Ußýûù÷õóñïíäÌÊÇÄ¿¼¹·´±XWVUTRQQPNMLKJIHGFEDCBA@?><;:9876543210/9<:741/,)'$!Vgeca_][YWy†¶µ”·…¸U¼úüúøöõóñîìÝÉÆÃÁ¾»¹¶³°®›^RQQPNMLKJIHGFEDCA@@?=<;:9876543210/.0=>;9631.+(&#Kjhfdba_][^²…¸·•‡ºSÔþüú÷öôòðîìÕÅÃÀ½º¸µ²°­ª¢uNMLKJIHGFEDCA@@?=<;:987654320//.,+5A@=:8520-*(%@nljhfcb`^\‡º–‡¼Qîýûù÷öôòïíëп¼º·´±¯¬©§¤ŒZIHFFEDBA@?>=<;:987654320//.,+*/@EB?<:741/,)'=rpmkigeca`u‡¼—‡¾QÂûýúøöõóñïíèȾ»¹¶³±®«¨¦£ ž{ODBA@?>=<;:987554310/.-,+*)-?JGDA?<9631.+(5osqomkigdbg³‡¾˜À†ÁOÔþüúøöõòðîìçʺ¸µ²°­ª¨¥¢Ÿš—zY>=<;:987544310/.-,+*)(5DNKIFCA>;8630-*Bsvtsqnljhfd£†ÁÀ™†ÃMáþûù÷öôòðîìéË·´±¯¬©§¤¡žœ™–”‘‰mR=6543310/.-,+*)+7ERSPMKHEB@=:852/-I|ywusrpnljhކÚˆÅKíýûù÷õóñïíëéÒ³±®«¨¦£ ž›˜•“‹ˆ…thWLA@?=<:@GPT]ZWTROLJGDA?<9741/\}{ywusqomk†ˆÅœ‡ÇKËôüúøöõóñïíêèÙ³­ª¨¥¢Ÿš—•’ŒŠ‡„‚|zwtqolifda^\YVTQNKIFCA>;8636oƒ}zxvtsqo~Á‡ÇˆÉIÍôüúøöôòðîìêè⽩§¤¡žœ™–”‘ŽŒ‰†ƒ~{yvspnkhfc`][XUSPMKHEB@=:85M‚†„‚€~|zxvtrĈɞˇÌGÏôûù÷öôòðíëéçåÑ­£ ž›˜•“‹ˆ…ƒ€}zxurpmjgeb_]ZWTROLJGDA?<9Br‹‰‡†„‚€}{ywu„ƇÌˠ͇ÎEÑôûù÷õóñïíëéçäßÂ£š—•’ŒŠ‡„‚|zwtqoligda^\YVTQNKIFCA>@f‹‹‰‡…ƒ}{y‡È‡ÎÍ¢ˆÐCÓôúøöõóñîìêèæäãݽ–”‘ŽŒ‰†ƒ~{yvspnkhfc`^[XUSPMKHEBEk‘•“ŽŒŠˆ†…ƒ~|ŠËˆÐ£ÑˆÒAÕïù÷öôòðîìêèåäâàÚ ‹ˆ…ƒ€}zxurpmjgeb_]ZWUROLJGU{–š˜–”’ŽŒŠ‡†„‚€˜ÍˆÒѤÔÔˆÕ=êù÷öôñïíëéçåãâàÝÛв˜‡„‚|zwtqoligda^\YVTQN]w˜¡Ÿ›™˜–“‘‹‰‡†„«ˆÕÔÔ¦ÖÖˆ×;âööõóñïíëèæäãáßÝÛÙ×к¤’{yvspnkhfc`^[Xl{Š¥©§¥£¡Ÿœš™—•“‘ŠˆŒ½ˆ×Ö֨؉Ù9ÝðöõòðîìêèæäâàÞÜÚØÖÔÒÐÏǵ³¡™–”’•¤¢±´²°®¬«¨¦¤¢ žœš™—”’ŽŒžÔ‰ÙتڊÛ5çôôòðîìéçåãâàÞÜÚ×ÕÓÑÐÎÌÊÈÆÃÁ¿¾¼º¸¶´±¯­«ª¨¦¤¢Ÿ›™˜–”’”¾ŠÛڬ܊Ý3ßìóñïíëéçåãáßÝÛÙ×ÕÓÑÏÍËÉÇÅÃÁ¿½»¹·µ³±¯­«©§¥£¡Ÿ›™—•´ØŠÝÜ®ßߊà/âíñïìêèæäãáßÝÛØÖÔÒÐÏÍËÉÆÄÂÀ¾½»¹·µ²°®¬«©§¥£ žœš³×Šàßß°áá‹â+äëîìêèæäâàÞÜÚØÖÔÒÐÎÌÊÈÆÄÂÀ¾¼º¸¶´²°®¬ª¨¦¤¢ ·Ù‹âáá³ä'åéêéçåãâàÞÛÙ×ÕÓÑÐÎÌÊÇÅÃÁ¿¾¼º¸µ³±¯­«ª¨®ÄÜä¶åŽæ!èèçäãáßÝÛÙ×ÕÒÑÏÍËÉÇÅÃÁ¿½»¹·µ³±¯°ÁÓŽæå¸ç‘èæäáßÜÚØÖÔÒÐÏÍÊÈÆÄÂÀ¾½»¹¶ÁÍÚèç»êê‘ëéæãßÜ×ÓÑÐÎÌÊÈÆÆÌÊÔÙá‘ëêê¾ìì·íììÁîµïîÅð±ñðÉóó«ôóóÍõõ¦ö€õÑ÷÷£ø÷÷ÖùùúùùÝûû•üûûæþÿÿÿÿÿÿ¨t8mk@ @`€€Ÿ¿¿¿¿¿¿Ÿ€€`@ 0`Ÿ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿Ÿ`0`ŸïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïŸ``¯ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¯`0ŸïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŸ@`¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿``ßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿß`@ÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÏ@ ¯ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¯ pïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïp ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿ `ïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïPŸÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŸÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÏ0ßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿß00ïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿï00ïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿï00ïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿï00ïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿï00ïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿï0ßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÏŸÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿPÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿï ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿp ïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿï ¯ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¯@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ@ÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÏ`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ`ßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿß`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ`¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ0ŸÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŸÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿï`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ`¯ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¯ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ`ŸÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŸïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿï0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ0`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ`ŸÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŸ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ @ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ@`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ`€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ŸÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŸ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿ŸÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŸ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ`@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ@ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿ŸÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŸ`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ`0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ0ïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïŸÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŸ`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¯ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¯`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ`ïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŸÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŸ0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ@¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ`ßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿß`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ`ÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÏ@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ@¯ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¯ ïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿï pÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿp¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿ ïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿï PÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿPŸÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŸÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÏßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿß0ïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿï00ïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿï00ïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿï00ïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿï00ïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿï00ßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿß0ÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÏŸÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿPïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïP ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿ pïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïp ¯ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¯ @ÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÏ@`ßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿß``¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿`@ŸÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïŸ0`¯ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¯``ŸïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïŸ`0`Ÿ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿Ÿ`0 @`€€Ÿ¿¿¿¿¿¿Ÿ€€`@ ic08U jP ‡ ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2cÿOÿQ2ÿR ÿ\ PXX`XX`XX`XXXPPXÿdKakadu-v5.2.1ÿ T ÿ“ÏÁ$|îAÞt®mD'¦÷=øªh‹ûlÊú§õ¾aŽ?¯©&kjáˆN¼‰ÚG³Ás`/A@á(GròäkûAU”4lc̆Ìï†d€€ÏÁ °ðWá¬Ù\ÏG U›@Ù|Y>mgIq1W¶ï,MÀê·m¥$L°ß>1¤a¥4åc"ìà+¨7@e– ÖשDÇàwô?ð]¾ƒ½TŒj 4“Œœ@[^£kî_š1z×"ˆÉ«Ï6üä½Ì†?Þ,[’ªÒ÷PLHîBîT©¤¨¥“4m*çJd®úžtþ+›Ãs%_D,yȼiå0ñ7ÌeàŸ²Y¬]~ÓVj:©B!»'”ôþé ov÷Zþ#´Ò¬0—4îXI1KèkO¾‘ êѲ¡s9yõÏw4™Yóô RžœöbžU §V€€ÇàsÌ?7$y3ãÙ<¢”AÝnqù†NzÛÁyÜ}·^ŒÈ{£ÙyÅ­ÂÊ a˜óé}Iíÿxïù§Û›ã‹–S'`P½Õ‹Âئؙ¨jTb²ly¡h· F++ª`¥o«ýÄSPœ(ð²K ›)QüeÕ“9v‡—ܧFM.Œã/”ùõg±]ôW­×½e1/$<ä#/¯uµ^‘â5¦•ñ‚<‹Ë,<ݶÀºö ¤Çá`O·áe€œ6.ÌŒ@F½R§f ÌÑeøÓ“@6'F­ºqDulrsZ%}ÌÇC Bô–¬åBl”›ê]?I1u¬Ÿ/ûo¦} šIÙÿ[ô‚Õþ4µ£@ÁŠA :`²Îrzø´pýÄ}ÑŒáenÏ_ªˆÍ.×äRÜm!-DFvéÝ·‡r®K.¡Û!Š–)=ÄhÄTev¸g˜òß äC®—/¦Ýeèz¾ð¿:­õ1Æ¡¬ƒá‡1ä!`CÍÝ?hƒ ¥ m;éó¥ÚõŸ¥×mK”J’Z*ð3O;²áÙFh Cü,*sê1v\0ñ¸HÙNÓ”ø6@Õ˜¦uÌé ¾vè6ô\Àéd\7±úmqŒû  I’Žâ(ý’«ò³¨U꩜ñ%“8šƒ“^ãR/ò@tL‹ VJ$F,• œTáX2óç…ï0ÅÏ\?e»Òþ$⟋ýœÆY2åáRêÕËLÜñß2ö0t!>}G$»ÿ&ïëdÔY®S=!  øïEÌ_`Ê*VW]SxV9€€Ï·ŸÁü‹ŒNü+žlµyvŠcë…¨ 1Å•-„ÃVú÷Ï]9Mò€o`ƒÇò2£³“שPAt½ A‹U#xd‡U¤Ãê+¤ð¼c¾É¥liìúY¥¥uxêÆ/„'¯Ð SWwöö"îŽÝ%¬µ™h²†ÿ(œTAC(Òs{On®"ÏÓu¥ m;¿¹ù5ýûiÒdP¨x¿¸³h^j›kÙ8 1¼ïÑÍ㟎;"«OZ`Ÿ¶d1毹+Ÿbá’£>] ³ÁŒ_ niü¤¬E9sO<-xÔÁY,ÚãM•ÔA <ðWwÄ „ YŸtÏY–örëGoKû<[«~EÜgC <ì‘r:YÍz®îÁV\@-H3UBaPwÛózˆYûH£ÔÚ› :ÿSóÎ4S†ykÒab ¯Ó¼ž÷kúeQþKÖ’ŽÙ'°x€ìuè…_º¤*ל³ÍÔWœ ,_Lzâ`Î’ãH‘‹|úΞôØ­+dåív_ÇáÑä~Ãðé8ÕÖ„ÄâµJHò»;¹ü°é˜Ñ@Jh)¶˜¸Fºüzñ'¦x÷zÙÞ„ñ`8 Tl!Àð°LËù—^—†]ÇI‚¦vuµŒ)d>ªµ\|GíÝ@þ[ æ¢b–» BEÚî>êðô a¼}æ¨AéÄ_Y¸A%þÕL R¬^ éæ=ïÞƒªö”,¼îÇ¹Ä ï"î„T¿7‘‘äž'êìkïb¯j¯´ë?`© Ô랥ˆ7 ‚ZÅ`ƒ|vÁŸd‘1?Ê;Mô\®3úeÜ=®-ù¡ã?©ú~ÜåjðòŒÓ÷¬öÖ&Á«5N]…þ’Ëà] ä% 털P'º5¯×Ô©SÅK †qÔýAa3É2f:ÅM‘¨j!SW&,Bì—Ú½¯2+òåtî!2c€Þ¡fr ™£2h­vî-ž`ïEo¹Äý4<wm#WxË%yÈœðªÕ·¯#'=~%¥Ú¬n<¿^€Ï-oã2— &ívLNj˜KXj×oÃ*Ñ0i~p Ög—Çê¬%øÛE,cÁI•ãF]Îpn&Ï¥]‹Û¢††ëËuè/wyÊÐù"Yq\ˆgw¬»k½/à'óÒzQYPâׄ6+9á7t‚ˆ=Fœ3›'I°néá±,ƒ8‘”±{?ƒdˆLnÔæáµÊ€LfùA¾Å\E,#w’*Õéo¹¼H?Ú=¬ïblîSðCçd#0›ÝÒþ9$Åòím÷ҘĊ«#%]C”aˤY‘À¼£Ž)Y·íÐé½ÿ:ñ´êuæ(i(fB™Àì¯gM³#°‡½ý^ôØåÍy%‰ ‰ÊÎßÂFPRw¸^"(‰(«F–<ܸ´>¬¯‚W¾øv!Ôuøj Upâ Γ/µÛ4\PU?CíJ+\vࡱâZ$­!¯ÓÌ­ü¼4’Ð`ö•rëÉWla¹šŠ¹„$LWm¤ %Y~èùʺ˜­br={qˆ\ºt!‘¡M÷*¨1ýŠ*)wù•ÛqAüÖ½6Q5y2ãωïósð»»`‡¥rqV‘Óñ‘ßËW9C6D„´ÎfCÎÕ§UˆME}Çc™JÓ“¤ØFcë¹Ç·=4óÁµÚ úæó驎ÇÞ’¤1{4üu* ‰!;ÙcYU°å¥:ÈÝÙì0G¢[faP'`¡gùÁ­F iBcËÙ¿{kkZ-¿Bélk,—²q¡ iÖ¿áa꣆V?C]»ÿLó &Âwg˜M©¿ŒŠºöS}<ú oêD¾kÉ#÷SªG=½ ̤²xþìÑú°´ôì3º̛ñõü˜ŠªÿQÉçë¿w¬MûtRõ…@)v¨öRBnèÖÚù+}Z:§ú(Ô|)OÓ ûBr¡/½uذPA™}5(Äš³®Ðœ+z]´B#j$ï(ì”p/I g2¦×a7Tf˜ÃÕɤÆÜ ¿Å«}$ÝÍcûä䔤§Î á5w4?.¬}€€Çá¢qøh”? è°îçµZY¨’Šwñ£g>NÄ¡'­!ËO©Y">Ÿ¬&B¤ÈÕÒ\\Yiè{*bИñûAm÷¸®fJÈ´,ð$NhWÕw É„ ójBŽRÂG¤ÝÇ*9;'à^j ›÷àËjcbÍd«Yå,bóXžy´¦¥@¥x°“|pGð´ñˆT5#YŒYË‹°BÉôìÎG/,~ÔIœ¿ësR5èÈhr6¸ÒÚÎî~Õê;Nº÷,®æ}Æ Äÿ[.f¥V3XÁZƒL†â©ünþg™?ÑìâŒ8€û¯§mtÍW*C£{y*CbÔ€r†ø¦ÒFøQ64N½˜Ïsê`$ô%‘Bp|]£ÛuÀ¯9 ]*Ùí/‚ûÈeÊãî¦NN} d£D·9¾LÛÊêþ$m[ð]b‘ò¤ÀÝ ¦˜ÕqÍ΂µCéhyi·»÷&ŸÖ¾ˆS‹<çYº·e…í9.£þÏJF˜:4kÒ ʤx+¤*˜Ë¯­†çhÈ›52uU¯¸…kÃÁ%%ÛÕ&Mykú $¦ê÷öY M€f> „¬$PÛL2ëÓ8!ß´Îÿ-Ø`µæÕß".6´S:Ûk2ç«Ðcå{UŒmµ¸³ hGÑKu;“" ÍX~²Mª"mó¢Wv‚´Æ¢¤Ї2Y›_(˜iì6e9F¹cÇáë!‡¬ô~´ ôÀÀ_.޹ìsG‘B5m)˜×KöEà;Jó¯õö@Ü Îš¯‘ÛJF¾N–ˆ¯©¯=ùÂüf•À „dWb­Ôʾ@7ÑT"WAn:yBƳ=Hñ‘o•P7â¸Ö¹µ‹kMP4S—~-™!1–ì*sFd¿· GS»Wˆ!LGzh­éåh³Ì"9O~’H%¶Ülý÷ˆ__9„ÔV „‰…8ÇΤ=ž<úp>þÂRÛ”-Ì1/sR³Ÿñ^‘GâŽ&æÞ˜T’"¶Æiþc'“²aàˆsŒiYÔ^¤ Dî½ T–Ñ“’_S2¸ûVDñŸû¢¢˜Í~Cðý>œÌ3Å?(FC«oª8¿$ F˜ñV`¾9®JAøô¶¸z«Ñø A p¾^—´â‘ëñBôC¨í'ÝNO(üÔ±på»9åÉ3E.಑Q2”o=ºjÒ‚ÙR·ÓŠþ/Åï$ê«.‡|ZP3c+155½éù¸:49ìÿÄT2+%cR—«³"šG2Œ%•rùß—…oãªç¤„(AYË`DI<'ÝC]Êü™¥ÈîÔfÍáŽ7nÉûú>c ¶Ð«ÙJ-®ˆo Ó223Ã\™ëíAá<Ðv‚Z}‰‡-,ûœð|q”/¯ pSr“Fí,Ý"DË …’j™Á/©ÿ/±ð7Z¸ßœ]d˜Õ1d’‚Ì{.ê:$uÏ×p¸Ïº„×=.ÜcÒäb^' sóÔû•Éçr[åÛG/ŽåDyf®â¡ð_sòÞƒPºjåÁúôUÁÑÂ|#zy­³ˆo¤´4',¾“š"!¡ÐP¸ÎyyxVï%d]V¡9ŽÆGz̼gmŽz8_FgÊ5•Îò Cïïõ‚þ Vœ'^Äú²h°N-D*Ï Rü‘«™oÈV×Ü ð1¦È]Nd–C4HÁ{ã0ä¦'Ù^ð6™ÉÙ„¢4dymú̆[@…àb‰›w'H¥Q =q€£rú«U-èÿ¦”¦dSA˃IƒÁØ^8ÐܹiÄã¶õú «¤£<<Ñ,k™-¨O¯ÜAN‚›ÞÚs’õ˜Å“îÛ ªª*UUà—ÒóÏéˆ5„?¼±WZÔEï5NfÎkÓ\ªWu42µïXU€áÊŸÀ¥_AÃúÚnø#®È Þûã^Ï©D±1‘â=ÛòE‚‡R~–ULP4äÚ«NàªW-çîgb\j$Îò?QÄÞpÌÙ&ê0 á81’y~‚ C.(¤tÉ›°òûV9Šä¡G´”²œ]^‚Ž£qw¨É¼ÆñÀ­»ð%3Å”§;ZN7J¿” j×1ëÊœ¹ +¥½ª% Á÷ OÑøZ™ªpÝ¿Üýdñ;”ÄœØ%«SàÚåÊp°#ÝÕî] “,P‰æn$wÒïØ+Z¼µ×é-];Á.8–ˆ‡7LÑ-Qµît F¼wV†!.«qùf7˜iòGjzÜ7aÑPÓú¦ò:!–¥º?ZS¸š†…hÝÞHxä›’yr"ŸÄ”º¤‘`”zȪ‘;î@hTÙ¼Àê¹]EUî/gïz$ÌŒV³é Ø-|ø¡:JùrΣ[2ñb‰Bý• Å­Ÿy#š&¼¬53å™Ö6äÉ™%¯œÌ©qÈdÖpFôÓwѧqÍi£ í ˜ö;'ò@Ãm%ÎãÕ‰[5dÚô}Id¥tG>õ}iqL³oB±U_#­G£ƒŽ2ìõÌ6.‘ìøýÝ]$°Î#uà!÷¯)sÔl«nÜl¢â“V­:Ã.•ä)-4Œ%•€#(ÚÙa„¥ \’ß«çmƒ%:Ô•„Ô/÷«i¦ÃPòÖõëT œS/ªO÷Ãð,ßP©°g1[Í‹ÀÃ.憃‘w© *K¥Šc&ý:_\q~olÓ£«ãöÕГ룜zWŠ]k{Î^ì‡Äßá=uÿKüXs.ŒËÓrgc›ÿnå[Ö³»•Mþýù¼Õ<~1 :^ïÝ‘89ÌwH"JHöwv}}¶ùÉiÑ’s«‹_u¡f€Ù8ðìa”Í}%Ú]ÚlâúYlsÿ F–ËDŸ  Vµ ˆ¶€V÷æE¢¦'';!u1®q¥tn÷öOœan, ìÀW :*¥óI^üÁ2o¸ $ çĘ*órEÿM ºâˆ±šK±†W¡hŒö¦UBï«`ÄÉgû_¡ ÇØ8 ÿqn&×2¨«ˆt/‰ƒ¯~ÿ[Ù|Ú¿p8F ›¤÷}Z%EuÇRðû®ŒÖåù…×k•ñ MXýh¶˜)VTÒrÍuʤ)k6ÎõSFWž™¨£,¶s ï`Il›§]èü¨|±u˜SàÛ“‡Q¦Eøµð`Ѝ;²H, éÓ짘 ½àzÆT ¿a?}\’ÒyñÓJ%úYã‚TÀ¾Uó.Škéº|Ç%q"ß›h8öß=î3°/f:êŠ2&Š9D ŸPÝÊ$ùü#cº ƒ8Òûh)^*ÚyuC’AŒË+!ôEžõƒE’ª}WnÞPfcæ **+‡»²xäH´þûoú ¡äÒå¿Fá7ÚºfQ€•`•f†‰ŒiXø—Oý;Ÿƒ"E¹ ížmáôãH \¸!½E"⨜@¥$~/¿ ã˜9ƒغ“·*Ôò¨WÞ2Xl€´‡ù¥iËd[ËûË*¿¤þ¡•›ª ¨n¶¨ùŠÞlÃv4Zm.f´Šçÿ·}Ï’G÷WËð#ŽÙd>è„(˜Û“§5%KH²u¾‘Þ´!Uòè_0Ab‡øïö}Î3¹´ì, ÀëѦÑy˜ÉßtÔ")õ55"¦)2Ðõ|ŠÊÅœƒJÙ)Ÿý8È9Dvô…©ÑWWåžZMÉ:À eKJ¬¼®éúk“ŠJlÂg Õ»8ÞÐÁç¼xœyÖiá7Òžßcn¤iAgÏoê«íÅÐ@IÓÓƒŸ=M;'!ŸCGN"ÖÞJ×÷±, Ÿ™®tAû0½mSͬ ðYÕüRkwÀ}ÜúœÀãžjçŠ|ƒYracõpÐÜØƒè¼‘iÚ²íjëªD0U’{]¬ z,³ áÅÍÄ^>¼úÇuÜcÚÚso™¸nLWÌøwfOæ(…‰"sšsÀ'È>ö#(ùÜòš]©±ªß&·}šéõŸ,“ôȶ¿iø„%ÚOÐÄK:í˜yÔƒbaìÃÃJ[ šqðëeÒ¥@ùAî@O²±|—PW´\Å›pNªéELfTh¢ØÍ{†Nï~Ü÷7dœÎÈ©°øþ‡YÉŒµŒÅ†€×Á†RY¥.wÓ-¡tÚ>5K$µN©^JIºj+©á¬Ðnï(ƒó•´¥5§võkê &â+cztƒ¾C£7´¦>OªÕHSUqð|­6ÃÈ–f1ŽÒ=4$mÕ'#kŒ!°Üºžú Åx‘Õ E\jÚäÓ豨%i|d€ù3uªá•¾‘?yƒAøÇ°ôƒ€[ ¹iwžµXT_|nú ß‚1ôVQnæjÏ>[ºÓè8Y08±}ê,âexe„Œ£îm%ùÝM÷–jOj‹v¯™ˆïxXµj½Qõ,o>Qr5>ʤIrù:K£ì·DâàˆK¨p+­ ³!ÎzWE°nr+ 99õX’JS-rÕÇ‚pj2®vSZáÿ{ çô×6š]Õe¦§ Ë6}8/ø…/ÓI¾´¥Å%¨®÷Q ¹t³k)ÿ5-E&6Þ¨bßë¬gI«e'åÆz)*iµì!D·2ÛL™Tض¸I¢R² šåU…2…eÜÕ¤S…ÔÖJت TBFÎKò³BzewµÑ`Öç ñ—¼C}<ÕÇ0…þŒÙ]˜f¨yãþg?[Ã’ßUÅ*·ßöÒœ½B-`­û2ßõêeÕÓ°]䃋-TÜe𑬲Ro…¶à½æ;Á"³ÒëŽÊ¸E,½þæZîµgõçdÛö"ÈÇÎ×  ¼÷¥lCO†œ&¥.úH¬Ì<9ø(ž©Œ´¸Òa$âŽJUìêpÀÖw@<û¤ã™³-é¿è0tY Tväñü’Qœ‰9pZàJ­Ò‹¼@nÑÁèJ1 ´”.ÖûªÈ ÜÁ–/œ ìùä‡brVD„¯y˜’.¨#Ü3|Zµ7nÃ,ø'®–³ tW´—N®ŸDbÏ ‡õ5 ÏsGåF~®õ ?]â[›‘tç¤%ѹŠóDý¿vÌÅUÆ{&¹øôóé*šÀN0í €’“ ïV3ÒZ‡U!ÀUƒ#=,¤"ô‹üUÂÈ£ˆ¹øÞV0±º–±‡–”UJÛ2,6RŒ¸ ý$âÇOYÜ,?¦o}Û¨‚c¨`ßUP³ ¢ÎP ”oDìhø ¨ç¾<Åó{…·K!û‘ƒR_Ây¬98:n{ŽVT…Œüz¨eâü½6œô®M[3 ¿|œ7E8f#Ä|?âÉÊ×Áª.*‡êR]4b$ÇPzê\ÍçÁ‰t™ u@ÿEçFKúl´Û/Ö{³" ôe‹"‘óyþ@·!-þ4ÕËèò¼&uå(¾%Ä“@øØl0%ÓrøFJ†c8cÝß­7{«—c6Ñ(YS·ÙðX.?Ïþ­6ý‰I§¨¶<²xËî2‡yçОԟ”€€Çá¾1øo”~¾ä¸Å²àÍ?KŸ‘êH„JýˆÕÛ–\G6ŽÇÍ›`À8R¡“é¹Ìh#Qƒ¾‹µÃ¯Ð{)îmfªXÜûï¿¢ìfF4‡<Ðè×<¬Ñ#åNòCVŠ»P¹ëà%WÖƒò I`Ia£UáÓ°³€+{b‘\V”ß;P¬ú_WÁ%¬¿|µv~AG¢yœüò ½Ö7䇻¢îÈAL²zÃñ*‚N/ El{\¢¯Šl&2ò;wú6:Þm¾KD܉ÓTTØ=Ý {Êlv–›4ê2 ‚ìs˜ïÒJŠšò‡ô$Ô‰±,';ÒÔHãô`ªA)’¶OAš¦ïF8áÇr¡‘zûDÃÞ‹G¬™èþi÷ßD_yª¦«3JeèƒþyWª-ÆJ·‘HûkihØck!Ž£H³.3®C6Ó ç°T¯H1ùvñðƒ/¬'LÖkeBŠa™nmʪ÷@ÉezNé6Ìöϳ]X8Yy!&Ù¡Aܵêå“ÅΗ°U$O1; ïÍ:ST±DwÑ õd³àÁJ§·Û`ù.¤¢×H¹D²­‹)^þŠG©´$fhyãS$Âÿ@²öbßþD“Æû+¹ ¡`HX÷eóOéãmnÊVúÒZjq¿vaã%º…ž@Š‹ŠnoЉêà»ücñ'i¶Ý†ßévŒƒÌ [öZBú¶ô¼ñE°vT2ŒhoIñcQÇl¯Ÿgû}N~*CÎfMmÒˆîë•9ß>O@ê+3€à__½@F –ãQMz$; RßE(½ôíü­êx=IA¢Š”žUõ3Õå'yó ]Ô œ¾„ÔfaÒ3ùºVm¡÷E;ù$Ìú©û4TRæmDÅÇÛÕªËõ‡›!ñ…ú¢RÚDŒ.hžCübœóE´ ža&²õø¹þ1—Ñ0¿A‹à\È5l²ë=}è½\ Z#å]J+¥­&Ô¯P!åx3þR -„9 Nº±[€ÝjEpãL´ªIü¶b6Z hÈtýIéªpâåîß+ÜEBDð¾l·¸Ï8êX½ùè,L Àëeæ¼—Ë&»l.fr›¹Ù±Z²”­-‚¬c|°"ã\B6xCŒ‘u²…|Üê|½QÛä ë–˜Æu‹TZ‘½ãíóúñôãêÐzQwù®K†ý¹L5ú”Z Ð =Ôpþ Øpô{ŠTëÇÄ'7¤ ‹VË38F• ¥>Xu"«[«úb*ÑÄÄLõó›@&é$ ‹û Üü‡‡(޼ñgp^\Žƒµ&úü??†Qše÷JeÅdjŸÛm°IQ²‡ò1ù>‚¶ïëexÀnl' TÕˆ›¿ÓÁZi¶ù̩٠°Ç/̓ P×ネ±"Z=P5±&Îó•Z®_?„iGnf÷ò§Qzò›ñà$_^÷´³?ðC‡3¹Ò1Ú_¯ÌÆÇFÆûU6ÅXÍ…]£Ó­98j˜]AõˆÞ&¦¬û3W$² Ãé´ ”íä¦4˨Yå®[áU³ÏBÔ]Ï­)OA’ù¿Ëó"¯¡Ä¤mkaÆÓ ‹ æHyìSrãæ?:ïóA ïÆÄ­ûPn+S4¶£ß ý J¦`»«á„tm.¹5‰ÆQðüL ÜoRf³ì.¾ê‘q¦nm-£sÛ¨Ð>¿eH;ěɷüTˆ,Œ “ Š bòdݤ±ªÔܬµÿV!Jب˜|‡ìW‡',M°HÀÔFÎ*•ü‚,¶š¹6\~³Ÿ€)\±Šš®eQ¢ P̺öÓ& îÇ$בI ÖF´P6’µ‘—ñãöõùûzÂý½‰~Þв}]‡O«¯¯áÙŸðíwêëf}]Tÿ\ð€õáL¥ªìBþ‡d¹Wñ ̤¾áÀŸÐ¢î&†¦˜%€öC(“¬èývŽ"-K´´T…Âw[ª„¨.í4}éaZÕ×é• /§‰+¶„¸XãöBroF!´l®íÙ‡Á︹óÒûð»ÇùaB•å¸ÿ9·–%é°¶M]K¹œÛª.z˜§¼>ãErÏüÉäÂdíŒwù&Ðçƒþãï+/ßžZ>ψX‚]ãǾ­[µá:œ¤8¯ŸÞüÕgVŽYéI,”·‰Cݺì5/©À†„"‰_ãÕÞoDóÑ®Uó[°«Âį|½”™ˆ¸–,þ»Iý«A@Ý“µÝ뛚ßÚ}ŵàA:Yé'düâÒã•jr_ KïîÉÉ.â_tøf4Êáž5ôM ±²ÿ:H¾ô =i`ºlÞš‚ñ íóë’ ùÉœp’sm·ÿRF6ÝzšDßwÄj„êÊæ¼Ç|ð0³?K÷„ã¶Ý"ÔÓ-¾-¾ù©O¸ ùÌÛç¾'¦Œ½Û±ð´­àaè|ÎU ßÁQ¿%_xNz(³ß#!ó¯“è!±n÷°ŠÇF)á’Ó\^0çFCÞ¸“×ö {cT“Ь«·§ŠÜh@jåWjQ×ÓCÒÿ?É7ó„†h8MS—Xy|6`^I‰”š›V¶7ª…žÒR¹¤»¸4 ¾Á!°7*þÜH ÃpGHƒ5·Ð8X.€”,±4]óðaym’£dyÒñ¦‹ -b×.*8ÍÂ¥”I)<À›[AÀCÜ*KÒ ‰‚xG=€âqÓ2sç쟱BÏ·®/ý¯l i¬¹ ;­²3È¥9Õxkæ?k:šö l öx D$)KmPÀžÅ»U¶l¢‡$2 Þp’ÏøSÎ`Ïpq€!/òm-Emµ±Yã@>»ßfåµÕ±ù•W(¥´o<3¾v`4žGsÍ~3\öPzÎÀ>K=·Rcò$@ŒêqËWÆx¤ H³ôƒ¶¿l’ îGšM°¢æHI Øüïbþ'Ä`â´ûÜ>X¤h ÷‚6` žÄÒ!…é8KN«êE®¿Ú·EKQ“?ëŸU–¦nˉžè Tö•S´{ãÆÚµ`»PÒú¯¢cŸ}Ç­`ÃH†Â[n‹aÕÍhÂáÌH$²è¯þm6 àáÿZÂ~³ …¼XhïAD„c†3 ¯Œ­”ûNÐÔ™õQÌâÉÕUøxÂߊ4ç囦Tç©}ºE]öU/k@û²…X×?‹™oÝ S+Ÿ}¯.…xpïÚ¾ÊÌ—¼¥®Ð@®~,‹£…®ð4+{[¸ÕàÖWëf~Åøjiz|ç)иAÏçµrWó¯‰ëïò¥Ë*ûqv4Çí{«D¬©…äG!¸Z1•s’ˆÛ ÂC ¢½åÃ×–ÿ =‡ùÔiÁß·ÝœN„U§D„R¯¯|Q`jS·ÂýµÐ+¨Œ,±|úZU„€½Ýs èQf^UŠÀ5‚"Î1žx´lCX’õï¡î&E õ8ȇ í?¡úDA§šÝec;¢"Þ8õ ^ê¤ÑÜ?À"š,ŸŸÑJñ£ýÂ Ì ÷2¢8FN+¢1ÚÇ5:èW_®ÄÊÁâàØoi“\ó?ýâ“ÝKƸñ¯FäÖy¾¹Kóº]Û¡="~=UcûÞ•™U ²yjA­t(ÜÎTó-[ª“» ÈÙX}{ŠžÌÕàÖA Êšù¸îÂUê{±¨Ã¢ôØ›;q=ìeùRÊÙô÷Æ'äbŸ®Øs|Ñÿp-'ÞÏȵ Ê~äL´Gõ[Qp/ “lµqˆÔtˆ1"0jÐãH¢~¢Ä帕 ¯…ÇœÜƒŽ¼ª% Ù©ƒQKÏ?ã¬r3‰y·¶Ñ%çÌ‘~ƒx*i5/{$^MM#‰›ÛèŠ}Q=Œ}à„¡F4»Þ#1ŽŒ#ñqã/É&¹"H›¥Ïîöxòæ1 ’Ž•÷Qm"Cúðþão^çSÄüØåÅñf Õ…“Nc2–À Ë ;ؘV¹KJÓøÝù÷‘žC³Ê\¿eJ•Ó:žþIýŸ¾EUŒÒ‚KSÒæ¹ÒIà R°õTf¤LtèüiÜSe¼aÏÝÞï¡øC¥“%­|b¶áÐdQ™sºú¹ö‡ Q®0ŽÐ”ýþ±$«i¢×ûY­4r‹1­p%Û6UAëÅÏB›-9kG¯û­(ýbQ–zi ŒÿKèBBSÛ‡§±Ö%<çÉçd>ûÛŒ¢¯NÑ)V|´z Ú€Ýy$²æƒGnCÓ¶B#¥}£ÃãäñŽ"È’œóôaÈa ¿¿=8ÛšUÈSU:fí^¯¥rLÿdá@LËçP(²²‡J« Â3´eG/¡.n 7sÁÀhÖ“íÜxêt‰0¯ëJRN¬l¯æ>#Óhž!ž§üÊ~9À€3Ò|ÏDÌYPèïXÈÉG “Í6¨í]Át3ÀMÈh`+— ’жèBÓ“ðe93cL1.è-µÛŠ6®9O·DF€µ éJ…2O 4 ž› è C ¢ô ®ÙÚè˜(rù‡“¾¯§ ¡AÁÓxæoÂѳ=ÓArvõWv.Ž1G¥ FÎÀÑî« E·~r©û=y’©kIÑ“»Lí÷àÄí½-­k™Ðu±‡AÊ óË54eÍ5D\DztUωm§I‹Ó" µ `oõ1z›W0¾s¬™4d+»²h ƒÅV6s÷¥‹ m3 ?b–çAŽyŸ:WÚáA_' 9=&Ð\y}D°™Š‰åÂç6ÐÁ6¿3AW¦déC.AõœÏ¹fæ;æ)YhÁwòi Ãw1û"‘˜ì°±.Ñ7LiÀ‰|ðÜvb˜LA0¤L£ÝÅEÇD²°:Wò­[ü•`ãÁÏ)"šsȆ¨S§sú¿ `£V‰dîJêœðò½µHÕoT~À‡A®íÙwö®”ú±E4¾Ÿe…fI³ù`Á¬*À¶® Fm¤ƒÌêé´Çîº 5(¢p‚I›ã¼+wìA±±¿B<µ]IæZK"™«ØÅa«£™ ÇÔ´ô[ \HÕwéç~ß‚JqãOzøÕ6³ ÿNf(&I°ÿ FP\é“&ËéQù'€X­¶½êžJçþP‹ÎÚ½ˆT"µ˜ÚdU\¾€}„M¢ðôõÑl“³¹ó+1•ÄçLjflæpQW³ ¤½#G ‰[%éwä~ÈÄ.\F&¦bgR²¹ëNoÖJØ[²húÃ19¶`m½G¢5»S/±XwóOîÊ'÷)ÿM ânï™ ¦’ÐÒ@ë Å ¥±øns5iAE¼qóäry{øQ žfÈn¾–@çÂE³Hû«† 4¥Ôõ;ð%©àCf ’–I¼R¦±ÍʱJ*ØÎV¬ŸYY(™ F&ü ú²‘•Í ؤæJe^No¨7žL Q׎Âù¶àÐNT£KGéËm=<&ü7)G]XçÁóò«Rïì¡GW÷?üY?_õ̘ÿ`!»o–á¿_⦩8³íð?°—ýÒÚwýqÌA9šaóÎýñ‘G‰r¥9ÖÈ‚îÄn 1.¾ƒú¦Ž S®½ú õú{ÌDÖàwÒ\Î^ïû¢ì›ú9êWD… röÙI—Û-³©Õ(|ÓΧ4šKXO@:ÍG6µÔüG›ËpG)Ô7=fìèN¢M­!’BÿZ;šÁH#nx Vsâý^Ob¼Kxݾv#üE „ØTE¸Âæ¶e×â%™OCHL´ªñ³*½¬Ö*—¦WØcˆRQ\"×Ñ¥v¸“íÌÔ;V°sôŸ»ÅQªõlñ]g<ÓR]å5Wyt)KúM­&ãïd~óqKtµ$fl³šyŽ·ÞtÃm¨z]/¦4´Døl[sVunŠäÚ,Èì+NwOUFŸX¢c(b'Ðjá3Kš^.Èæßèg£ü߆]Æ‚?Žd¶ Ã+Šfú;>p½N>">÷b¬5V+«”-¸?/Q÷i§Ìªè¾ö¡G½ÞZ•…áÍ_7û5% ?Í~vlMNoIq(E-C:‚訂…•­~ÁÖ­€ ƒ.Îà¥5P$ͱ£Ó÷Ö3dÅ2å6‹2OÅSn1Ê¡©_GÒ f‘›‰7ªBÚ~ …ýûs±R ;,ýéñ{…Ñõ€ÚÑË!Û&è˜/9—ßÜxQËad‚Z¸|vÎéfpê›ÃMš˜+6¨ÝñÑ”ÖWÄi-€Qü´›¢¥ŸÇ"$ÊÇ9ñîrËRçczpgåµ ŸÊlœ/’ïêwÐo¡#Ô›Î$òFó&ÿA´bJÝb¸ovq”…¾’†RA%£)ç¥#=Ò`ÓLÿ öÕHª‚©¿õ×ÖW3½˜ò´ÈÕG{« ao] Ï1RâÇ  DÇK?¢M´j/@…•`Å[i¯’)öøš3È0תIâ-•̯ƂL*È— 0%}”âà+Üæ1#ñdVÃÉY!£ƒB²{Û—²æÓnÜæé&ì<‘(»9ÄRóÀò… œëÅÉwfFŸ°;ãÙµ–+3@V) ¬ñÙ_kÓ¸“ •»bHtߊœ¾ÊgÈÁUÑ3 {«}sµƒv‰˜ÒÔ¶@æn¿ƒT ~x—Çï¿Á Ø“E$þ‡âòЊîZ]ާµ j¢½vŇ{¤mæ`jpvòmÖ;qðh8Ø9iÞaspÌk‚s©¤]±ïQ¾ºì8&¡UY—9SÃÀG‘a6ÎÞ})íàYÒß½ék)®6‘kr¥‘°Öœv>#‹Åvbå²ù!,WÉ`&u?Ðh¸£0Ö:ÎðbÇ„dKØ(“Ñá”®!Êl O”5OU`²sE†e^ÂIkm6û§á—[Û§xɤ¶¸í.6‰+¯«¥h³ŠØftzÄ; ßuÒ2××N>ˆ#¾Ë/UWS£Ä¯è1ÚÜ~So¬8š ‚L4ý¢ ‰'˶ ‹Lô ±m¯>ý²,As‘ õ%[ há¹Ôr‹ƒ&‘F6wgïÀ€ËåõÇ®>PîÇaæk¿„‹PJ|cÍè '«µC pÂÊá\Ÿ¢ä|1v²ãazåa­“¢UP³$`Fï$š&~È€ÀÚÃaµò«A ¬€\YQŒ•(wxŽ2ÊhÆHt'1*V;¯i¼àVr%S$æo!RËqT0&©T1ÛX 2Éœ!ÞªK®y«ÚQ°#dŒüOO)µ˜$U'ù;£ŠÂì†ïJpØL;ƒF¨¡Fgœ4vľtÎÙÒ T g£ñ·ß›q»(ËOòV o1ˆpî NQåm3à)à #bU3™°Eq¦žáþuåŠ”ÄÆà“ÿFÐhaAc§€x*ß>ÌúïóEà4{Á=ÕlËévÿ¨5Á‘i¤…£iåŠ1|Á!eàl±øL¢àè_³ãûcX´ç±Ô+˜ö«×à;¥8ÿ_R²`æÂ™}l%áùWnP ø²-ÚŸM#­òL>%«ñXHo³aUc¦¼–æ\ƒ¿kÓuPjð#¨²ÔBy¿ OJXI.Ô }1ë+|Q6cΖß{ §wæÝËi« *Ó£X݇ێ7q¦‡gŠÞ?ØõñšµIIZÚÀ€v*Îù--+Ì ¢Š>)ènèAˆ–}O¼Iïl'Îf†GÁ®’íºÍÏu_8Šᥴ%˜!’‘a#Rç 6-íD5.ò*!•nÙ?¼R½'Z ë Od–áߥ.nk´`«v2(q]`•¯¿È´åÔ–ç9À¿ $e Llä¬0©öq¦³ÔÜh±Þ£ð.©%k0_Oîoá DëªÔðzÛ½ë"îM¡}._ð$ŸWϺ©§Œ 4ã–ë0ï5v¹é ïTó‡0»S¢D6 Ò~Dz YŒ”[?àÄWÖ7äúrhC£zˆ/ÑmnÌ÷Ó§]€w¸+_™ä3e@¢V9gÃðšdRkŒ™üÃYÈ ¾—Ùõû€1X‹ÀG);ø…!ƒ™âýÇù§;mÉ®Wëâ*Û¹Ñ?ïã+Á ïÀ×cPòàazql¯2ÐLG­ê5t ¶Ö³Ð/•`þqé­Žú`DÜ6ÌâS²=ÿ.EßuêGÒábµèÔª™@¤{f`LtÚS{d׫ÀBZe?Ƴõóξ1Ç?ÈUï2e”-Piè)¨2ØÃÄwr¹nSïÉ!JìmõÞ^âåmsM²-\ô×èš  Hb³IDýžTÐÝ,Håa¨<Ä~g56ËÔšª1æW„H029P¿~üª%Àjn£k‘5ëoáØ24Ë'’f¯K4+Õʵ‘?kI*ð……ý6Ë‘kà’0u! t òYoiš»>†J”ðÅ+Ø Ös£œ3k”´;ô X1aÇ GÒ×îÈëEzÇ[SIẃ¹øèƒ£ŠÇ»ÄÖŸ[·2|ÿ¾?«Ø>ÍÅl&€ò¿íãé@mãRñåÝÀœŒÄñ®’u½l$vÃJÆþQA[HôÍOå¨ÄhTpL¿Báòz_ìƒvNišLCÝ-kà$˜Ömï(Q³a¥úš*ÁIÛ&óÇ×RBL4’ªÀ~V¡_é#6Ï€¾b¡¯Û/f§¦{ ù¹Ó@ùÅ´rûZDæTÁ_8Ы[¨‹,?ÔßùJU¬˜3ÿBèÛqUêòî;táþ˾ÛxY\ÛYÛË:ðöŠ>~2=QRœÏȵˆ!ˆÊ*0G°Á`'t-§¤¯ê ëiº¹ÁvšÅ+½ßWÏUcåï˜ò¯¹Hq& mcM°´×ÌéR1#c½×‰>JA“nÁÏ2³"â@Ž!õ5{©% Î6ßš-c«x(ƒ5Õ›å„;ó~gîÐGA… m”z#Õ¼ÂÉÀ­3¨Ò} ½æ¤ P¥@ì~±´Œ=œlëÂ1Æ7_'-{)@äñ1œ;t\ßÈYfìSߊÿ.„™ƒ¸½º™¢A áaJaü÷ZAs2>ÈÄõ‰’RVç¤&7ìð#;Æç]^J£ãŒ’Ò/ʽ™„”<¨s¿Ê ‡³£)¥$”Æt¡/Då¸ z,B¹f¶©þã5}½8Z=ߣ ª®c·ùéë’ÝÌ`½«±Ëã ûXàÙKƒ; ÿ„?ëŠ|uÑy99ÑoN¢étϺâUú+$„±ìœÌÁ õ!µ’¯(©Ó8¬Ñ’¹¨—° µG?û!1iê¤ ÷xuŸÓKûÌ-É´ñdù$g9óýƒÏR6Â1ù"Â襬!4lg¶7¸cœ›U7k¹Îð’b‰n…]\•9쪘ø‘ˆÓöô#éÔ›yW*ÓÎCý¸]ì¤#Z¢RCÛ¤Ö9f÷êñ>LÄK"ÖH¶ô ]ý ÓXÇ·eV †ƒf|ú ”‚2FSš×Ì4Y`RÅÉÁÌTF©œõ$ub¯ÊrkP‰œïa©ê­8QóчPv©±™Þ‹.!¤Öã{þ ¤ òß -Œ«ê«ÐRlgç¾9b 9ÙqhÆBÓF¶éöw¡8§ýý`(ø (lTP»ÀYÁ# ¸ÉãNžšìÕî(Á‹0`¨æËš~뜊"^>0Ö(#e©LO¯­]Âü¹ñõ­É”ÅJÑsp“¦lùΟBÆ{Þ ÂÎTæFê‚„5Ê ÿhî±i)?¼â\çJVû ?•ØÆö9Sìgäúžj÷_ÜžÀ÷µ~ò6k·Š}+ß‘-ò̢½ÂQ‡b{#ÔÞû-Ö¹ÃóÄ6Ä}ÛÀš¹ùþ6]AÞu0à©Mˆ м#=²ù*3jZœÀÅÑOÏî`kzeÝ[|b¸‘?œ#bq^œŠôÌôˆeŽ@òÌY³‰84yIR"Òº62î„fÿQ}á\VUÑ'íM“Õä5%c¡cTwùÀš$5}Ýåž_ñD»±Éˆh¬• ~)ÚÒIøn•Æ•Îë5ÜCܸ•¥‘q‡²! I× «þ²/"ª Ê–->ºÒ?à‹ïì eY“z“bò<¹ @ss]Ú=Ÿ%­3Fp,p|%Ú^@–r3´zà©0øc¼ák¿¡åˆ Þe˜,‚xÊõÿ{1$Ä<­O˜Ò×ß÷÷ñÛÇRœo - ~&‰¢âE­òð¶tÙ¸jeîòÈ¥¹®ÒÄtª9ªBS…?S.¶€7RÄÑÑGÉNDòèls´]k‘¨ê|€—éÿ\;È®3Ì+ñá(u…ö ‚ï LÀ¸¢Hž–oG&!ú¡âÒÈâ§”¥låÇ;NUŽx¼ÊéÔþ"ÌÊ+oŠñ\>*lƒ| x­Ç›GáQW$Ž–x#iHso¤kLQ+…‹­øæ}x…È] Íü+Ú8ùLúÚYW¥²ª;aííô—„¡ƒÐoÐJÔ6QIìZtV¥"ºWå_å¨Áӿ髆ÿEGL9k˜´öÛ&«œ¸ò´4Üý׫:b{—Å»Iƒ˜Fg.²:g=)§YÒ`»eˆ–ª«ÕPƒ%̹4͘€0R<¾ö}hÅØ.#Å®ƒ± ðT€z»– wÓïž“èÁËYì  ŠìМÙlDððG,g‘qž¹\Ò/Î踖E,ï›z6ÿ ¬P ‹F&1¦¢H´9¹¥PÏöÁ}ñÏWÈúN—ÿ3”GÜ^ ÿ|ˆø‹k̤bþ‚w¡“ËcDs9ÃÔT€.×îû¯ë  "\þlÿw:*ÿM†tÿuœ ïó£‘ÄVB‚¨ÌžÃ1E:È P„<5cÿPÜ-ôÊ*5)õŽ¢8Û¹&|1C QÚaˆjW±´¼DŽyqI4~BU­u·»ÆÂ‹ôÒ3=¼$VN0»³ˆÝùZMz·†•Œ9ô¹)À¦ûC`k²ãÐyX4S'Nε€½Oy äX¥ä˜ðŸk=E:…'^=I5ܘ²ÝËrcS‡„€ÆÚµÎºáIs;§Ó¨·ÔÃ÷Q«(Ÿ&=–›0Z 6Í–Ê5óüzùJgŠûJá¸KíÍ(JOõo«é<\@µ²6Ú!‚ÃOË÷g½m5 ËzI^(¥ÿD[Ñ –JMîé±ÝxS*›dUòæ½× rGòµÊ¦:ÆÌ7 Ä€_?5zçê ;P;ÏP’êÿg©Ÿˆ¦q}t' çðµo¶Úþ§ð¹³ø[ÂÕ¾Ûcø\Ø~Ú‹öÕß¶²ýµ°ø 3÷)WõW84íòò`Q«ÎNè)Nø&“„&vüBIÇq ¸EÕ¢ÁÂYPÎWÔOÈŒw’À„ŽzÓª÷[”ó^ã˜_´±6;ðL·ŒÑÊþôÄ>Õg”Lñ½‹äýwj§^”ÏA²‰@ºÁïpª¦WêЯRå9Qîâ‘aÎn†dyáŠ3Ê›,i&º³-‚ )Ѻ°Éf$ wÄ™ïâÕsÔ5ppiGfc«ðênîë£b¦dåÚ×ÅX³Àbœ&æD¶èøý‚¿ÏYJK íîËÙ‹# Ûb»ã3iÇåÆkœtê…«R`²æù¢É’•zð» 3° ¶Lðý÷)A…e *§~ÕÜÇmÛ6Þ÷ÔQšöo³\ £—hÖÇáÒ:ìÍ"ÊëX¿fåøÔœÊT»kè/N­¡¨ÀG%Ë»Ó1Íw“É8\(ÌÒ‡â |½"å9W¨|wFåz=kÅVóÁ#ðE9ï~ÝGbþãÎq,hË™Óï!$£™²<`œx€V}•}ò`󢚚o–â§Ç&|ª-ã®n±ê@´ñ„׋}MìÕs”imµ¤¿“u£a‘‘™¶¶4"ö`aüœoqžP•|g®_Ë aõF „bf—àJïíˆRºé¢x{»ˆˆŸÞWqtQ­#v3FîÓt‹ÈnÉÂï”?2N¤lþ®½T’v'gÎòÕŒ¶ÛNmÒQ“m=£ªH÷Ùk2˜á?ïÅFØq7/RC6o-ø9t•¹?²ÆÖ½åÚ䌆Á.ÐÞ?öáAÒ'®F¼«Óe`ÃËÝŒIêW«` ¶5ÚÊ dÊÌZ¶Ë±EY1kq—¤#]rÞjó´ÖbãL肙ܾçk‹ÉqøäŠ^S6}‹ùC¥;¶‹¯‚á”&ãÐl£ÓôÑxÓ\û9Œ}͹$» ÃS«¯EÅ Œÿccðòlô±|“CnØnÏ﮲pp¸vÖv,ãï¶\Éc£ehJ¶Í¥èÐ|d`'ù¤V+b© ”ŽF­½ù¤å΄Å7`GÒµå-+hÈMÉö›;}`Ôñ1¿Éª4·Ô áï÷ôVŒ&”(æÜÍXEcwÛ¥uÌé­bÚ‡Âóc€²”¬.9\V¢ì¥Óëä}¤gÆê#¯Wâ$Ö¡Že·£IÈôb ÛXy³V±Äµ àN–nò³nºÕHû:*I¬ Rãñ²iëõácâщ£ÿ9ôûKÇ0à%Üdäø4“ 9YD7ÞÈd/¸Š% ÁZø®2­R=£-{Ñu`õ’4âeú‰¥Þ$ËÁ#3W¨fzÃ&Ó Ù9 xW‹v¼b/éÌÉR¥ÀjÕ ‘s-’™8ÒÆ¤D‚¹2s*§~õÒ0Ÿ©  Â7Ö@ïÇM \b'%ºÙÓN¡í¹ùp!“Xé@ÅIÌ®o“ÂP¯Å”Iÿ[ÆóQ ‡´£D™‰PµGÒŽÄ:C¢‘OîbYo*p,±d¡"dxZbbåa…íרR‚,q„‰>‰Æ´«H\`ü,¥,©Á[kŒä Π¯ÔBÕ™œŽWpv8©Ñ˜±*õvÎø 7cfë^PÅDÑiõö¾XŽ>YÔæ€)N–VÝз´Ï%|&¹œ¥Sr‚¼­D‘S”½ù7³²d' ¢u‹Ý +¥ï•Ö"YmÀ€wCÙˆò‘¸ô¡ÀK2î1:it…º@?ê’¹Š™“oÁ–h!÷4 ´t Üîy°lyÿ)±‰®?csäAÐ#*F‰êŽX}ÚQyæ3Œc+kËR0.†ø8Ø Zq÷–8‰Þõø.M»µõ¢‹¬MKpæ-3*›w–Ú'J§n¥,ÉFÄ(pp:vå é O6f§_¼ãß"ùMÇühëøÎê’»Ò -Ì.§b1ˆ„Añ}"b©pƒBÕ½þv-ÔO„ÿr=…vwŽ½Þ„‹‚¹Ž©‹ª”™Ì±FUŸÎ ÿoë~3w:~± ËŸx6§÷Ò£6ÄS¨•ŒTé"ñ@è‘ì÷ž-âìh–ëê¶#i|ùk Åc<Ð ÜzKœWÔòv+÷ïÒ/õä|:Ž›õµO…ÀíÚš?«d“È"É¥‡ ‘r7þ1'nãñ„ì]ês¥‘gç?3s¢¢Ùb勚tk¿¾‹>'ðÔc¬sèìÉòè…[b ‘î3¥e1Hæòz^øûgU_§{)¸_zaèqy²§üiW‡MxVp"½ÛÒk­Ù÷L æâ&|0ÃJä^v¨fêÑ‹‰}¦’à˜ßê<1Ì'ÅmˆÌ&$f˜ÒRµ®ôI´œÁ"QûãÐþ¾ÀŸx”÷¶d4Eÿ¿ñÈÒ*SÈ''{Bǯ§HI¾Ÿ xI£ŸqÏ9ï4<§)å`9àõä:xU4Ë1"_ÿnÑñ”ÈŠGøëìâÄ©´½lðª[Qãwû¾d5å4ë-aƒpœúÕ¢â@9e昵¢d©˜Ÿ}©|пO†È½™ŠEkËÐ×gd|ú©4]¶FtšUœZ¢ó kƒ¿-aÔd*Êõo7FÇùüÑÜ®bÓÚúK^k“ÞŽÕÏÔM¢ºStT~[ÿ.êÅd"6Ôû!$·Û#tžo$S>MéßÑ•næ©ÉBçYX‚öÿ@ɪqð6(Ú¿õÿ«ÑBÿE·%´5ñ‚?v×Ù(XÿÙic09Ìp jP ‡ ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2cÿOÿQ2ÿR ÿ\ PXX`XX`XX`XXXPPXÿdKakadu-v5.2.1ÿ ˃ÿ“ÏÂþOØFÅz©]6)"Ÿa]#ØãÉÎwÞ„VÊÞ§ÌÅC_¾ÝÄe«èzæCªöU˜)i›$!;|èÞ¶R.Ö)ò:œ¢ƒ:ÐÓD\KÆ6bÀ„:{]Üü J­ž Ê;7¹À¨{lbÁj ¤Ò`V Ü¡;µÃ†ÊœÁà§o¥3,@—ξ±ææÆå£¡0N¢–¡—Õú9e¨*9»ÿ]³à9©Þ†‚ǘòº½?³ÑB’6±/:õöŽGÞºa‘š/~Q.^ÄËÒžÕXG•0b‰S u¶‘BÌ¡(p‡ë~·„ޤáB lùWð‘”E€€ÏÂÒOØ`%ðÄSÅk'Ú¬³I½¡<´Äñc]‰§Å[”4›$•zù±<úÃ+qÛÐíu‰^e2%kç9žz_\<&£~P'÷º2Ýß/S€JqÛ§þãNŒ³C“J{Õ ËM.ï½CD%Ó[(„ ¼ÓŒ©6)^à³È„‰0qûãk&ØM𣃞0Õ••cØ+q¬–“ô~=…±+W~i‡¸m=Êå’?Ê$ÆðìkD›cQ® ÙFaj;¬7^uÆ¡±‡ÞAúIegî]Æ$ÅÿcÄûJÇá`Ï·ád€œ6.ÌŒ@O6”÷>&QPl<ìûßÿ -î:eã'eR3/¹ôTFYøðî>I ÎýŒwÜ~½ýd)tâÒŽú½ý´!NM"P˜à‡O^ŸÿˆxÚ,)ÊÝÚÂbVݬhù…ÀÞÚ‹ É‹‘‰ßž…|¥ŠK…ôj[4pMõZôœÕg¡ƒw¤“­=Í0Ѧ³ \;Ì/š4¥7è¿°8ŽOÖÿpÀ+âèn"U‚M½zð(ƒYg*Dµ¤…©ö¯Ì;š¥ m;÷Lq-8•œ(« Ôu·_´Ü›/2˜\5QVëMåæ$ÃÝS‰ÜÛ_îò… ª®7S•?¶3óñù  "B„ GŽx=[z˜;åZÀBƒhQx‹›v 2QŽ/¥Æ–Ü®*´ÑTšH\ô´œÿ%‘¤2~w ƒŸP'ãhy[ý^Dµd_•¸O©ûK­‰­ˆœù%gAD½ÇxØ’8-®Z*®€€Ï΄ŸÁð‹ŒNü+«„²CÚ²ˆX™«3¡Q@L}Ã=~&Ø>m\¥³Îê„Û°;ÙùÖì-bÌ¡‚ýÍåeèr9WkX§ Þßx‰l”EøKÚGÐ~J«o³Æø"ôÍzs-QBB§•s“ú¸’•˸&yK—/™‹7‹uwi›ÀÊm¥ m;žÆº%±ÑB ¤¤å¤ÝÜ›b´çaßñQï#&R5\>ßû:ü8Tõ\–®Ì»…úÞ ÆÛ’àšú–]Î^nßÒè3æ[lcL¤Zé}$Ÿ±E$GàugDŠ‹è¶ÀN?…(DÌ´v—`ª "n‡¦U9K$m)¤M£ B±C <ì‘r;ðo¾CaWr¦åzýÓä«"9íÎ0Üï!áwØŸ‚yÑ¡§C9Úº7 ©‹-$²#ïS…¢$>R±Ñòm4_Øءɪv*²Šáðó9 +Ë@ )çθ²Ó,6®'©r?$Òm®£ï:ñšQ=5¡PCGÔvmÇáÑ„~Cðé<ÕÖ“ÛÚº~sP7A\'Ó¨‘ìôÔˆwظ$ö{-”P}H.Ò‡4P¨múXë-üN´¯ŠŽþdø(ø_Æ" DÉk&¶Ùj“1X~v % ÒU‹Vðñ‘XóDÂu½ËC¥Ç>ú+N5©í7lx=Ò›åÔEžâa€Ó=Ñ5T—Ád,Š¥â~r—'‚I¥F9NUƒ¡òb¬5f·Cë#÷…±ié¶È)ý;"˜'yÿ9pÍ6;aYÈЈŽzî’2ÿúñì)y/8hăb½KWd+ßý:–‡æb×í¯[‡$"r°DV—´A͚åg”íª»2Í©L¾¼ïö€­\”™3X’ ê>!¹JÉÉr­™LA?6§¥ØoÇ‹­IîÜ»›»#²¬š ëøC¶g͸ Æüÿ&¼SXxV™®*Rsâ;”[±€Øú1«â(ó“9Çà+ŒètƒEÀ¥J\ΜO¶&.³ œÈ–±óëcXæ3Xo§Ó‘ÇÒÓ‰“+΃RSÀíÄ*’ì¤NbWYu°FÃ[ªJ´,Ž“oçn ¥ –Á…j2K·SîŽ ûq•eálH{W¢†—‡S‰K8M¨‹aFPé„}Xg¢Í0Áh$YYû±T'KRÁAˆ’nԌؠ¹=£G{¼fÖLbR æ­!qJo+xR°ù Iòf6 LÃSPKÑÑßFãC–ax_½ïl®e€“äÆÈ¤÷йEC ùºål½‚‰—?Ž`f%“›€ žÇ&»4éåèfj§ eL®¾6Ë@‚ο«í ÉàKuº«x’€±{9ëRÉ£´Rµvo¶Ùmø$7(ç×B¶~Ç´ ÖÔLÙÎ*£O3\šƒ­žxÍ qÙÁTtô6ü|áÔ…¥P)qœñ8’ÕòŒB‡Ï 'R?ä¥ÞGîWœÁß÷ù‡¹· 3¬Óx(CD¤Ž"¤J½Ÿu4áÄò.9ÀëY<ÄwN.¤¤ ­ÌÏ¿±¤Cr S¡î§‘ßOrú¸Ã<©Ý5‚F©óÐìœ&aý¢*›2<>_”)Eäñ5]óï7®ï©R-ó»8µ²|‚ízØ žTŠ jb¶Œ'À[\»?ƒŒXÿZ÷oâ)fšõ ¯î¤ü­‚kÓȺԮMF Õý/$%_ ž½§qšÒ.gÞ0ËÂ|PŠíE½tua%5 eÞ´UF¬y¨&¸ÁÊW}iò•®voUþ|-sèÕȵ>ÄQ=þ¬Ýâµòt®}À4!ãÃ]Áý¹W6Jå…~³—Âó¯IdæQ‘¦=„›•}€Ž6)^ù¤®^$Jᚢ¡=t…‘¸w?Myµ2TšiÖ„÷/½YRpÍN@î½ØáuÄÂ#l‚ÈÿPŒ[ém¹5º¦òm¶u{¢ÅЇ¯ÁÚ¬çÊ–¹cÜ*\íÂKIÕuhL0B`ÆöTµÍ$ý8 s°H¾1‚Ì%Š ƒg%ÂÁ^šGIT7Yñ{ ЗeR¿ó»FÐw½ÍFĵN}îHXÃ…^F+V»4ÚïA_MjÓܪP(ÆßÂöÐÓ8;Á+Ì"z-bV¢¶8Š~Cl;9R·¶Z¥›7”ÖØeáú¾2éðŽk['ï.4 ËSÕ·q4Yëæ³T‘ÊÊ@® ãý ÔnQÑ ç&–ÖîÑî®á#ØK–Ûáý&d<ÞCv«žò©gxÙ‹yHcûˆAŽ“HCQ¨ã¾®b‡Öú(„.r8{d¿²´¿™Õ“AˆðTæ›ÿ´&’¤_Ÿ€+€€Çᢱøh”~wø°ïÝWNO‚)ž¬LBÏÈ@Tí2Ž8ãñ²à“èéZt%”£'Ò²®íjׄ#»ÀG%ì#'ŽÌ)[¸“‰Me.&Þ± Ži DIHÜ©€-[^!Ä ëЙүhÅS¥!œ«<:¿*˜í Â!“Ô6yûî2#’ú G¾»»/0Œ›ÍEøöÆ€º\6ˆÅö’ûÏÝ[(Ȭçtêb‘3vBÖN>1e¹X`G$Þþ$”X,Ž=v}þbò{»,l\W5a’‡ºDwôS¿C‘Hl™üì {£t¼f a3ö€– _kïäßF †æ^ø“8­$Ê^†+mð¦{\¬Ã´ƒõt–®Æè>fеð‡xöèîÉxº‰ê””ßæ”ŠOXfAùCWõË,£i ×§$,üØû„m.ÌÒÇË.ó‰ÿN̰PUœ$ƒIÚÚµlãªr­6Õ4íOšÌÑ<²DòM¡/²ˆÇ­1äaã =¦_¯<"e5gý#÷Šê drjX¿èÀEЪRL²‚*Ys¾}^å’ZŒ,ã®ÉDçµòäAc:VÏlh¾ Qž hEÞ"8úÁÅïkY´mvü ÔÔªƒªdON‘zjy&f‹k/Š™&àIÊ, š‚Qcq/„´‰xë´r@&|¼Œà¼Ùffçl°Ê’ÝÙyðÙvû KA ¦¾BDàÏf¢¡ Ga6qQQÅ·¤¨D¶®òýaSÇ+š0.ÂeêÜó8 1q í×-àh…ŽQ‡ŽÔ«¡QPi!½-0u'r{Ÿ{à‹üXnŸ‰z°"͸;Î#\€Ÿ{ÞšÊÚmsd3düXZ({¤>ö¼,ÜŽyáô¤ìoº[UC ÙÐÇá듇®[ø.øôêÇ × #¹F/Üsç“d¬kaÙlä’·`Ê£+Cÿ)ÎLšÄ8NÒ/MoI¶âB2Ð^õþM Ã//¶Zgn ;€ã7‡n¾õ/.À=˜5uî…Ø"D É˒濤*ou :i®‘ˆ4—ì|•’JºÙ›:ø Vóvºq™õ{¥Å¹Ê¡étû‘•ÆY¼Ökž&ëHÔ‰ãȺx݉FìxäœpÔ5”˜Å‡Ê£EKHÂÅœ3½¢ ©\‹É)xü ™ŽŸwáEº%½ì’¿/M"®ãtû¿3´bšÓþº«Ëbï(œ’otÆ}ê@…õΓªô¢òXdÊ™ê"^Ü¡ ÉX¥“ eXe·_@Ï}Uо\«òH¾_n¨ˆ–ñÓȵ…sô;ýX¦ú‹BhU ÆÌLMý;Õ. ,Üèÿh“½0>»P}µ¬J¯â*ÛÔwH–ŽAŸ„áQ~Ý1ÅÆ‚Öˆ˜ÔÎFvóÚ‰—@8Vµ%þ?l*G®ê6¬¤(HÞû»$q;mý€Aæ3ÇL Ù¢ÁˆÇ \¨„]H´])Ey‘<}<Û„VvWM8®@Å?&Ï ¹i÷q²$ÑQq±g•v«Ù’]L“ôȘ9Þt¶/YÐØ Ζ š.Íy HÄtk€S~_WV?ù”—T3ÏÚêMˆ¸ðÀ\ÖÄ#°á3ÌÕTú_Œî¤|ÕŸ÷²˜Lþ<ˆ_•Å“‘‰÷È1àI Ð!BȬ}¶†œ“;ð„9‘7;zë.{`xrø¥„C„méøz€[sÔÆ .8“-(L`ÿí­9l$JÏcË'‹]øš>A5K¹ï¸Vº]SþVmÒAmG"Z„/ß²Ù’Ò»â,ä9 …³8cÖvAžf‚:l¢®¶®•£îÙgÞóbœ#}¾Û1P– ¯…/l±¾¼¯ìOé]'íYÈÑJïS–ÀzÎõhWY´ÖÞn CÇó,¬|ɦK¸=§uŽ£Ûø¥™³üæ >N8È-›ƒY¸Â !X®(º¦ê"¬N/¾sC‡:1ËïE¨o›o!ã³P¬v+xÊ¥l|ÿvK+I׋,£¦nL/o·lÎlvŽVÈÜl„³4“ Tƒ? Ë|à¬#ÄÜ÷ÜFý••¾5¾ÇU crüOP¶Ó¤.ΫždJÓf›Oôˆ‚d™ªx™-LJ ÖÏ»Àš+·S´ ¤ Â·õÑ=ùÚ@Å+0ù5ÈÕ“-«QL{.­¹'5J·©nªé¥':â ,H hkÌ® ½ò¡IZÊ6…Ô÷q‹Å/ JˆNœc¤Tn†n ضÑd,K‚Ò¯¼Ù·C(­N,´?{ª”(‡ÞµçÔ¥lðlý4ºíE[#[$Ó'N±ˆ„V¥ÚNäM‰kÑ«Çf@ú£äQκ 7—Eþ~x|(ÄUÑgj𬵿Vtç œMœ„üD†, _ÏÿEäÕ^Wи´Æ.´Fë?õmÌo9âÁLûe«bø_yáu,5 ù¶Õô`í»6Ó0äa×Ö$0 íÐMŠ&½wý´é¼[îNPŠQ_b߇徿ìm’ãaþyY«Æ+7Jƒ…W³veêq›fzä- ^óµÞÆÓ˜²”üî¹/~úVX[¦#ná F£hþã?ص.î6=¨Œ%È«Žüµû‡“‡M†ˆm“¾U?_¢˜5d†–*$“›/ãÆYl§Kú›F™òÌ?XsR3eè¿f¨K}áPž"þ¨‘ „ÃDZ >àÄ}J^âXÓ>(ót5ô9-€O¸qêŒ8´VóL/µÙƒ™ÜpTA“üÙJ2%6È» ³GsÝÙ{–I³­^|ÎÌkKþ øn|š¿Hóî#ì°-ÎÎð- qDI=ñ§NµÎ?-r´+¢ôôR{Ÿ‚E3[ƒé?§‡@>ËŠ†9jvÉÀœ'Èü)ˆ”[þ j9b#àt^ûrô¢Žq »˜)Ÿ¦¡÷y¨ÂïÀ ¦Úž‹@ƒ$\mKG0ë,_ëúx•\OÚ¡u‘”ù2 rœE4lä© Ç`EP^PmØ7ßÛÕ"'òÜêMlâR'Û0q0Ôo¸ÈIpº\ªËbd7;À˜äË~‘ûCÖJš)Ä:Ô6ãkžÖ…I a¼,­]SÈ‹Ýxý3*nõ¯y9&vØÌ“\ÇúSæ| +™3Ù¼P9ÆiÆsÞ…EehÃvÚl…,_=6ƒ^¦‡÷„ˆM¬Äîé3œq’b£¬“Y•>~0,¹DçÓ]uñ¡æ ç\é•×TÞ¤ÝPŽC„¥Ë§,·O¾ÜzaêÊ«ÜéØ5ÎÇ}€ðˆˆ¦«ÔÞ€?ÒD8—U¸äŽè¹“ÂÊvUÙóðoïsn ’âíž*AöÕåiK?«“„Ô>Õ¾]!zÌóV¸Aíu_1 °Ç¢Å%û}[]OÐÈT5ú ¿À!¤X’â†Né4oÅ|Móµa!¤‹ßáY‡.ií>Gƒ–²Ø‹$ècCõí•|K.øˆ‚ÖÜ|Êoãd„&ÏQ MƒÜ—·®eìÿ"V¼Žc-  –’Œçg¡Þj€Q ULuÙ]¶)å [p|V½ì+áNúe¢_3–óóÒîEŠk¹>¨a 2ÝR@iK=ºï¤L?&Gî†È´Ø¦7ÁJŸ±JÅ«™c”zûNylév3%ç4 õê‚“ø`Ž7'Õ‹åóžñø®®‰ðËYs‘i±ù³ò€ÅGŸ¶ê‚+oiÍ$Ú˜2Q7G–|qÁA9f iú@ã¤7ê*Î,‰)Ý-J)½W2GV©+¸ÚH6¦ïO¤i8ºù©R+ËðH6c©À0"×7.ÄÇ•ÿ=[˜>ž]ÅÌ(Ã-Êù‰++)*YÓû­3BTákCŒÑƒUƒ&ÚtìíÎA fí5`Cg7õÿ|Êx„ªêX'DN$®®ø—àœ€ S:ä5":Û ä'¿W9q É@»«*®¢–‰àÉœJËÖûÑ嘤ëø˜kÁæ¢!èÚ H /º½wRL§—+c Ñ#"M‡ñ ¡ Á½¹-vk;nŽ3é¯ëãyQϰž´ô™Ad­4GŒïóÜ"į³z2âTE3.Sˆp)žÜ¸ö˜cm4!‚ˆð”Âqñ5IA#ÿy¯4ظì)6À–÷9qå–p¼†o4y€¨:"6NšË†»¶Üè4थËzì•Vý»t&LRûìbÙïH)ÉûlpZwèEri|äôØì5C,Õ’Ç bf)fòŒPk-þ7;ã£ÆÒ®Ñw±Ôf×ó¢ºI¾Sû&L±ˆðJ‘Ëü‘,›½ ÖØQþ~Xì%*p÷ž_¨»sj ¦ž=T9T.‹—±•õ4gIГVÄRVFUA·U‰.²Ó‰|#"èÂŒÃqkó“Œëêy¸¨KÓïè/ÆŠ½šØÝ­ñŒÚëŽXr¢ŸNÀ·Ð¸™ÎšJ`-j*%ˆ¥›w½‰Ä4íZº1Ú[‹·ùݯF6a&2ó'X¾}wø/ïu’.c]Þ¬?ä%³ŸÉ.ò0¿@®6«ÔU7¥w†]»ùîxù}ˆ¯¶+Åg>#LoÚ™o'ùLß*,±¸ª2•˜+@/ˆ0Õv«ÜjßµÙ.”¬ ¬~prSó£¡x¨sÌrѨDZÒû7*枨Û'ˆßÜÙ_ë03œÐaÛ²Ðr“AK'B™Ûz)Ü ×š'˜3ù.7äT‹±¿¯J_&ƒÒÉYÐÇÜÔÅ€luì#`…»Ñ\(CB QÅÒ®¡³`eýZ³¦š/U_4“FyáûÂ{ø }’îΕöK«S©XÏM5‰¨UàJG%Ø©%LT‹U¬ÌÛ«iLÚ‘êùû~+3Çç,€€Çá¿Ñøtžù€äw†n^.£÷ôQ¦¥)‚y<*p‰](bþÚ Êî¾uÜÖsƒhàD¢þÖö¿Öª£hS-Ýÿw²!W9{ ³±VíYbÇØBÕº‰¶@ÃS~£ÛGÒòÞÚRÍ|)áX®0qç–\¥#á8©V¥\¬’E×§³sœWϺ!«Q‹FÀ%÷­ÝsýÅÈmæaí¶q³>Æ'Oa<Ÿ…0.lÏçîÒH笥{ì‘H“âJ4o³0õâ‚ï¨ÉæÒDµ^iš« „ïÎx.@=Tµ› î•tð“–UÜ{¥‰` ´ú]¿†ÿe|î z–¢}_Z'æh)ç!•Å3˜‚€T» !”ìUHG‰rÊH/úF!hú=N-˜OFÅßJà<¼½{™u«î#d‘?­Áßg…ùéo2…Œr¢nëkƒ¸§÷Ëo‰»$íò]eÜžxî0ºXÜÖæú—.D±ý” ìŽï‹>#ß;œOýü ür‚’¼NfÉ¿êç¦ü|¦ 0ÊžæŒI[âðÙÞœ /­tRœ¬m',Ã89Ï0<£G;ßùe«rÍËGÞ^†+õ1á¥sɼ!‰ÐgÕÈH¬x·×PÁ;€¹¬§Cô¿ ¦™tX¸±‡C²Î¡âåè?ðǤMûZʰÛv©ÌâºèÔÇVÌeo(úš¤7E4;T÷uxÒùº;î¦]ÛóE#f aÅ[‹Š§äÚksOêÆ/îòÂÅeM´ß«‹tb<-ÕÄ®'\çku= WªuíeÆsHxöùí°³ð—¥ùµ›ï•'JâÙ£K“ô¡ƒÖÔáŽbWUÑÆ„çÕ£þ@·|„xm°¬Mò³Qïô+]˜†Þ³äšf¸câ¬`ƒïÈãBãx£“žD$Í“õ¢ŠWÂçc3¹ ;SüP³À`V•ÍiVâjMmàüÞ;›Ç«0˜>AL;/Q QÀKèÝ_œ»1ЙhËzÙì‰Ô^ŒÎþEÓX!,Ùžn5i:†%räƒa5f‰7³?iÛzÑu³~iú¾2-½éJ‹Àµá» ËÖV(žäÿr"¤d`¹¯>:´„þŽï)CLÏ¿ôWs|¹¢ž3¶ AuºÖ¼éš1ºÎ/}M—Œé[nÖ»ª²µÌi¡ôè}pšAÝõ€ â‹êþ/x[I(œï.ûÛ£šõv¾Õf±ÓüŽãôžžŸÂŽ‹Äå ì©l‚BÑ»TÃô«Xe­û0¡Ú^‚Û?43vb\@ë­çíRµ2=Ãq†“p†"ƒ8Z2ØL˜ÝÚ®¦”†äiøùEfKÕü¬M $Lª6ûÔ9Ä$Hº'òeÿT²‹¤ 1Õt“ý§4‘ÍõxDê“ipÑå‘?ª;¥†E¬ÏvÖg¹·áßtú€¤oû«äõì3¸×BdßöÚ.e£QÎ)þòû1£ž­;sw2;–m´‚ûí’:eVÙLî¬å¬@·LnbD%¯²Ê+:N‹ˆ–¥I’ ú<úb:½ùš+E'ÇÐù]k‚ìä³¼'×ê†ÁÓŽ ŽÞ•ùçÆgñévd8ΤÂ"¬ŠT2ÉÄ Ä-l±Ë¡QÓ@ÏX¼ˆjÿMë7Ø¥\󟪿u-Ù·îêLW}(ï¶gÖ”vLB€©ç}Á¦ë¯ûw0jQ½ú“ð8ñ°ö”¶“öyd·ðUø’øžÙÍï’p+ˆ\:¿Yl¥22rô»—kJðù3E}ó p©$ C=T½­S’ÿTwÝÝ‘ŽzBÿl»Æt~tþ?wTÂÅ©ì"FÑe;ø噬4îºþR‰‘p4ý³ïÞüérµ~sEC,]ø-0 4ÕÙO6Cf”Oe¸`Ù„tc´ö7ǶR%4-µ¼€Oj¯»øßÑÇjaZ˜žóÔ–Ð=hŠ~š-¶¡#¥‹Ê¡Xr˜ZßVå8 ŸSªüä9„#ÜìkJ\öûa¾ îÑaÚ6³ívÁk×=à贼⊭¸á{A¿,°èîõ•äCNEÄ®‡SÁ}pØz@H:|¦Á˜ã€«1?N¡Õá%zغƙíÖ„ü„Ñ mqŨ0Qã½¢€|8ú£cß®Ø_ÀèåkhÖéHÉ,ÿ9Ä~…‚HÏ»º½}e&ÒÛSªw¸«íÁÎÍ!ä5ˆR œd+7ôñâ|·O'6¹Å¥hHqƒ&Ðé“ ›Zgô.(„ g–?ýŒìÅ}è%Ñò–å ´¹Þõ˜f]yløiUÈß#Šk, [·I׿îÈùÄÐ¥o2e-Õ˜D®$㦀׎ç£CN`á+§Í:ÝÏ‘)—˜¿Ú>¢äŒYeŠZ]4šN^6 »0­ÿoê¼HðéÊçdŒ÷òÀ¶`‹Tœ¿¾^ CJ¬Ö>¡p¹œQåìê(+Ú6ùï×¹àÖœ †â““Š–Või¢ÉõZ+M0¦Ž SøzÜ4 ï«Øy ¤õ$gó¦h î%„  Xß\羘ޡ>>lNÀNË_ˆÕøS'€©J¨ôH,°1ˆd/YÃôgÜÊ‚Œ›6”ž¢$xeü"޾ÓSwqSÚtŽ–å»4®Ô<Óh¤©F8" HÆøePÝèwQjf|CU×›îãòê´rŠˆTÇú"/‹«$=ÅÐË™†;ÀÈZñöÉÕO¹@êº&ÞÆf ¥Zü•ˆ±¤3ñÜG­3lÜ2Ri/!£òè©÷ðUÌYHA…Aè1}Ú7?|5£K3eL\0p«¨ç‚)Û÷€3_+>+È_¶ûûlòeøGÓ}›Q'Uðôlÿ3ý.Ù£·ë°ènD`§mÞÆX³¿?| [üC°|6~ÏŽGž;>^µ‰@AjÄø!‰/—“wfS¼ßïŽU`íP˜æäWy/£š©¡ŠäÔJ “¤KÛ1ˆ}Ï;\öÔs£€àDÏŽ|ûµ*ÎÿV V½Q"-ü\ÞÁ ÝUß[i¹H…3vã’OÎ9?»½pFE7*‘À[Î|X '•¥ûÉØˆ ([·].¬Ã/à|dÂùJÚ ¥Ã9g¸xK?ˆ€A«Or‡Ï_Ôº¸óÿPEþDz j=m†æR;Ä XLø}r8â4º‘Þ$|}Žo°V lnvãš3¶“ãn–‹Ô(’ðºâ}£¼Â¬€§tE¶!‘ß$ŒIRò©Ñ%8--y­™¦Üº,’\y‹ œ-Vœûwòò)¦A<ç†Då¡gBo)¤Ê»ü›·qH/?vü[«Ð+;Þ'2¼vÉ{7ŸG½Ù‘NÀo4ÛOÄëP£„ÃÞA{É…¯CœH ¶ê)‰Q§²\ž÷Üù”ÏíHúÊv[ÆÉˆš6+Š«è›Þ2ï¾èqíqGÑ“w6v»w¢¯Å8^ƒtØwëÒ_.ËÆ[ub˜å¿? ›$æëû—ÉHŽ©´ª«’о‡ˆIÌ5eêÞKE@Œ!DÁ%—‘Á¨´nÁÞ²•1³§jÙ‘VO“¨ Z o|$‹óé|P“ÜÀþ6lç±@3Q75adýó‘SAWöÊÞÀqIçÖ=Ôf7ìÕªˆƒ *¡«C[q”§·…‰’H_1yÍÄÏóÚqt•–ÂKû ðÖ²Q|¶ÉcD]ï3~1Þ½šŸºŸé_ƒJ´D²·@Wé_üê5/BÔ¯dS3hÚ‚Y°&&¤Rc§ôçD . ûõ#2³W`D¿Z쥺ó5r¬A pÏ ˜`¿J¶âKŽ`B*—íÕˆùnQ Ô1}¢S3ØÐ²xtÕœR|þ/mwˆi˜Äë…eÞgxL†Ž¯Zªžx’è[»B°€²5SõÊüö|‘y ý¸|û6§„Y6„ +¬¸¨tØà씯_ü`~ÕYz®s5)QËøz܉^7”ÕnL‹JÒ!0;r#¹>uȉp²ßÒWmBrÀåLÃGŠºQT.L»yû3tH–½¶üjL9îƒÖêÚ¡¬HŠ„²s«/|·2l€‚¨2Ûøµ:Ú•W½0Ó¤OøÒ- ÷E zÑ2‡uåœ* (c¼uËy71rß •µ]ÖãâkiûvXƒr“”¹î6ÿOÍ zÝx¨´(÷La“ ]ŽA– ÛUx§'…‰ÒÚzÔñB¹Á̑ɂDHà˜ ztÐ#jºˆPWþ%TŒàÀV "t,r(î,—¯ ó!¥|øÊæ“:C×èé† (~WkWV¯«¬ãÊŒ<Õ°æ·Ú:çy×` Ýô´X¦)Ì­‚Á|’ôŸ[§ è¶•‘h#ÙXk©b“:ö§ÎÌØ—C…R9©‚›,¨Jö¤GitßEÙš/uãA«åà£íOݘ2#ˆE˜ßt‡÷‰Œboaޝaï¼YµoÃîyt©hû1‡¤:ÄfþvÈá´»Èq+¶œçK·¤S€ÑR !ÉDЛ/•œ—d©™—‹<‘6ñ|Ûá­¡ð[¹,zBn?ïj¼çC€ßŠôØÇÇ5Ö¹(ÅêZ0X²S9Êdk¼_Ácì#Èøƒ M÷Õ]™«§Ñ}ýSˆó?MÌ[´–;Àà†KŒZjºààãš8¾&8+(ðúO>&(ðx€*/LÊñI'°pØ7ŒÖÂ1&ˆÕÇÓîfò(ÝnŒ µA`KùËŸðÒ˜Ot£Å¬aMQüŒÊòö)lÒÿwaEÊ=ñÚI–Üû±ô5ë¨*m-S#ZÝ®/4L$Ÿf+ѸH,Âã¤>"Ç_OO-}æ¸z 7M™. 1nù€U™“ñ³8X¨­gÁîWS:Ã+¥~”8L¢´€ÍNþòS‡J©Œ”Fýc!r¥‚Úò3bæoÚÿs“‡qÒ²îÚ,>Oc"5Pj#LbÇkºÎ(S‰íê›ÉmJ 7YkZ?7­™Ä›—ÚR³ylSü^» ÏT¦ßxä<~}bö¯÷¹ÙšÚeØkIÏÙ…GL V^“2ÿº=’J®=–Qzcwìðð¤ügX÷NÎa唸)õÓµx¯Ûd­Ä)§ÊèS&Þò-ûL‡ßÔ"è'OáâÛ(=9p£$r§ï§uÎÿ>ˆìòŠèm½m×CƒÌ_¬nŇþGàNû C≎HwH‡_‹Y…yöj¦˜»gõùRE¬½†´ã+uj@LûT2hÐsþ3ÁŽOøÀK;‚™}$åä »Áè-ä·@#W2šW2=3%°Ø³‘6;ïØÔŸm¤G´…Ç|™¨© n8Ý|nËRÃÚ¤ê÷ö¯¸“ïs;Îë$ŠHÝ`ÆÖ¨Qâq¥•¾åt•ÜKPc¦‘¼í›¢ „Ù‡Öã˜+-z…ª*…‹ÙÀEˆäµ«d¼Zv}¥“I³Èmœßä^ô¬–åe äÆay|¦'Ù¢³Cû3úõ¨ÚòàIlÏ»cÛVÕC5@Òî]t*¿ ]O(÷Æ™ÉBÕ>r‡N(¦ÝŠôÙ…žŸð±–zÉ« FAe!p)}ÑA†ƒqè³¹y³Bqä±› á* T¹N,c'‰‘ °šü{dø*0`†~öØSÇntj!f2k§ÝÞ©{å/2u´‰.¹‘9‰…[h Ð#—=hò‹™Y**®s¸}¿óËSÇë/øŽÐ²®0‚¬æøß¢YŠò»tö!šˆùËné\årXÍ4¸»ïŒèdä^•kw̱’¸Up]Q›»HpnØ.¬xkûahš ¶Ð+ÐT 2¤»P^+ôŠ=Â!ÇH¨œ4µlÓ<ô³áõ[/JŽ~ˆ Ñ>à_V—³ÚWkÄ~ǧÿ#Ãd1‚ÿ šúÈ]±t0÷Äø&|üTx´Ä.÷¬|0÷7ç˜þ©çs€»qû˜Ƽˆ,•¹[cËÀSȃ¨8X)fÌošëÂy^31¯J;ˆ²Aû›<Ênôí&S:F²©:ìt0p£e+&o]&D”ikõñ™Ú¼!TirįýA§¥y B~ÊR ã¢È&‘×/¤Âß©¬Òyå' !îÿÛ ]Œâƒ•,G¾2Ö¹¬fŠºD /š¹úGkd‡Û¡ýÕ—ÙLÇ@‚ÐWèøÓ–°>µCüMõ`¡‹¡v·V„aCó¥› :p{$|:‡!T`÷^'н(ú„Oÿ´8£¾+V RÐT”‘–_3ÇlöÎ;ÚÕY¤ÃÎÛ»55fb-´ÌÂÁî@l‹’Ï%Y†NW2Ú¹ô¿ùpiUEðŒÛâO¦ '‘š'Ùö…ü™øÄLÞ#ìd:[¿¾ßÈÌân#¡ÇDË™Ÿ^¾7à[Ÿá H²‹ç!…#ýèjRg~®•‰Ô`´kX?Ô(/1y}ø,55±A.܆´ð›u[W½8w6wÕªCë‰ø8ʰöæ<Ä\–ã \ªG$ ,%+ÍÀ¯ªbU>Ó‘s¦"‚±³OPþÿž+ËÿM÷Å%ÂÙ8¼uêõÈdoÁÖ/ܰީÄamñ({Àùâ3g]xÓ«ilZ» üU¹Ûæ<+¸I£.e¡Š¥EÊa¦¾?æ9øµËó4OÝÏx°›äÍ0‹ü…yÑ´· ³œª’·êÞÜD•ÍDZá°‰²étodÙ*ðLšœdw–£± P±—\Õµ‰èµ¢vûò Ñ•´B6¸¸:iLÙæ!ò¡ˆµ3™ú™–y@íV(ÉGm—ù#zàb®]3Ãí½Ô\„—(¤×…ϽÉsô•QÈ*Y7í+q.j7rÙ@å¤W1Ÿ¯÷ ¹0¹—Ò­mk,7UÞJÀ« 7O¨"žî«õ‚L[£ý? ¿?¯1EÜ: 2ÉB¿¼Ãü Õ;äx^V¸2Éþâ[øáA¯XkÁœýnª@bH½(Xõ èô_EPdWhû'&‘ÂüÌÌeìEÛŽ‰érª9Uý>E0÷F4¬ö½ÙEšóytÓþí߬µÄc [%Ÿ¼) ¹³»~Yö|þ>v~ׇ­Í"xCæ:.@¾äAU˜þ6y×C™ª~Ƕ½ÓN@©5gØtÚLµ„Éãb£C 5bªÖëôâê*+BÁ¨1(ß«1? $Mîç!Ð…s9A`Í}Ò5÷à¡æÌ¢¸Ï€¯©ÍNgŒ“m)Y¨è®š‘CnO¼¡Ë”O®P7ü”×o©™…ð—s}ˆ¼a¬"Èbe…Àq¸[çù夕bÏÔ§&‰f¤ïßì±Éo7#ýö¯¸%ÑÚ||S,muZ¶F|˜O&%ÏÞPŠø@á,ø‚½áð8Ц¤äwÜ=ôãù5@”9(¥£jÒ9¶P7ncdOÂçJ“9b*Ÿ´ý²1/áJù‹ãZaˆQŸÆþßé=HNdÌëAŸñ„ÂÎb„4HÚòÕ7²ìL0%4Ååz¸Âý ‡Ê¾Tí‰1m“ÜóÊц&ýlÐJ|¹ÈP¦¦…ý¿Ö-hÆï¼¼>wĶÕmpí¼ÑA8¤–„v#/>5Àû YµTb•NˆÞ 'æ¾›´p”Aüî°O¬EêÀ©ÀiØ|TØB—nR®¤ÓF¯…"w¹·÷# )}\šW|5y.ð£–R™Ûê!ÞTêØ7ÇÝË…¬Ó¦þúN!4ó5LÅB"y%¤³¢ë9Bñ¿&ÄlçŠõ6¼½@Ý¿°h\EDÙÓª>¼ÿSIØ%;J®È$ÃW7S)·Œ)rÜv_Š2 •­00¤•^f9-iíjûw7D}îº BZì=;Ã7Õ‘Â–ÜÆš&øueçï>Z>çÙ[’YÌh‡N´GKMEy´5¿bEØJ4ÉVîäÐYÎm«+ˆÖ³–Qqö«T_üõKéLJX^¡N¶kÖö Há¤HÖÓ꼇FZ̰Úñ7µñßÂ*qƒ,õU÷z±IfjHükn»ÀŸu,7¼ƒúþNò¹³?œ?§ÖÍŒ¯4Ùxµn)š|Á”Ÿ½«[på»Ê@>0 ÿ;¾ì·× £T1ÐŽ©Èaö9Þ¸XR´Á¥†mò"ís7–P îÖEZêP6f ~`ÐÊìPé±hèðê:[i¿ÊšÆÎU­G`ÐåéG÷6bƒG–`Z¹½P)4᪄3™—憛¥Ãü/5˜Íû+Íÿ&f-™½åçÈ`ûwýBË5kEä˜c´QG›XF¸8E8R··c,»»ŠÞçĆþ5j_·æ!¹ásžì¢ãBÛï`f’ßALTômë—ŠF{ñêtÊÁXÜ¿m7RW8æ`a×.yÅRù¶æ,X–p«‹üV.‘«´-.l"¨eÍf(i ¡M ”̘À“õŽ—ÎÐK€^@?ÿnÆ جÎRnÍÿ{Öx{Æö\^v±¸ß‹<ÄZÌÈçŸ › ¨í>Ò£ ©ce7„ÀggÊ¢ÛØl©Äd–ÿG=¨a˜™O"Áˆž0×µK¥’ª±\Ê}Ï[½µ ð½ÄŠïžp)6ÐG»EŽf¹°×<<ºOX§1¶/§;"‚\çÚþé åe[v8Ȇ隂ÙW”DC×íA+'XÀ¯øsÑ÷ãÙó%§°Õ‡Ÿ<~êÆ^¿¹øÌ–6´’·ä†E°5>0Ï]¸‹[à±ç¹[îm\–Ò¤Omà'èžKéaa6Äê(lXŠŽ"úfKA¨g³ù¯$µ§'kÚ¤e3­¢»75×, "?Ærã^çGÓ¢ê#ÄrùŸí3fÐéO5q°[¢uÂu!w‘ÉZùðbOC£y’re³Ï îÜ„ÚBÛƒ§ ³VÞèÞÒ>6eqÞ³_<D7¯Â .É$Îr“»†Wù"0Ñ\6¨ãu ̾ÂDÔùä8ûŽNG¨¦œj¿Äcïb…T,‰;FÕÕ#U©˜m ^ê†Îïc š‹¿YVÔ㟊µ§Üßמÿ;µ_!ÛáH”üû¾XC²2¦ÑŽž]'×/›+“‹ò×Qßé_ØÒa–ë‚£'Ž¡K°Æ<©­X”•t0ê?fé³@ùOó“(Ìq{r$ã‘ôqRˆ¿ì$tònÂWÜ[n,T2D T<`$å3?žážfE—ôhí¹= /ʧ¸à.w §*N†ói°ô÷®ÚÌûj|zhu˜tƒÉ—÷ŒòJZ AänüCÛvZv;ÆaØ^Ó ‡TcÈù )§q- 3}‰hþ ™ŒIÅt“k…¶xoã&Ï |!ÞŸUø’E~Òù‚Ü·ä7|àú7±8¼9=ž¯‘ÙÂ’ƒÉ'ço¶Iåüunó¾©a~}×±‚M­ŠÂ᪳ÕB_Ü|KÀ€¶^[Tÿ3z£2ü¢­Jew±…]Û MIWœoÎWæ)_váÓÞ&³—Bõ}ÛÒÄ z¯:½ÛµÒÚwNN£iŒAšÍ&.uz¯#‚ÙF‰)R«|2üÿ…¾pwM§UmóâB‚\ž{±Ãâ íÄÅ)CjŠY›¾ÀÓ•ì ÝÒRúãa¨eÃsçë"T6wB‚kÁ¬šìlÖ#)d6Ò#ýÛR^’K¯²ÎýI/¶1<ï±mQáõ$ Ljž-Ÿõõw‹ˆÞ² Úç©)ã“™Fõ=º¥oGn¨÷Lý1L+Q3Ï¿SeW¯Ñã´ÒÊåz;ö6ËO'>WØÿF<¯’H¼ lnþ~hñKùÊlc'NÀð{ò¾"¿ÑÌþŒƒ2Ö£S'#E Û§˜:í²Oˆ|àI­·ëßÙF½rØ E@˜”FpÍ&Œ:4ÚAµ¨;wÄ»ØoäõÝõPŸÐQW/óú ÇÜyî¿ÜÇ·íµpP†îèrÆ¥±ï1îQÎ5Ï çòˆÅÌQü×H¢/¦¼Þy-Z¬wЋ Ô€O»Ø¤n„–‘‡* µÿä±%=ØøÖ¨²,£Ó »Â, ßLb#:YÅÚ²NÉx©ö œsûþ!y÷5P¤ärÒ³B´ø{3îýW $Ú$¯a4¥…I U)RŽ$iOæô·Çz•eÙ”J ÿbTóÙÉxo»­Àü8•ª ©JÁ ~Ðâ%í~pÓ{ª4÷?/òh/åÇÌ2 6å"Üyûo™ç ³Ë¼ÑôÿDÌ}>틦Äaֱш³Œ ÷Jé4 yo¡ˆ „jÊÓýjÿzSéû»ÈäûIUäê’­êD·™±Ïõ²‹©Ûp ÕA{ÖñÎcÞ‰Ïa]%PÏ4:f(És€}L˜ôÍ ßKêE…¯·M¾ÓL­ýÕ±>}ê[C¢!ÂÃl(PºÁžè”[œ«qâ0vÅCrûSmtÿ}.~Š Sù¡°j²™+ËyÑôž›Fô"ϑ鿦2XÞŸÙ@®–ÁMé^bì·kötQÛÄ{u¨—Sˆ‘?ŒE8UMhGîäT¹ºÌ»eè%Ù¢ì´ø‚™Æ!½EvÕ>Ž3˜ã6M@ŸŠù‚:Ê1— êæäÿhBsf9ÎXB²•Rj–¾è…7Ä1 Ôöxca¤¹æzý¤)šRÚ ½Ù„öÑï£ ý¹jW‹ŒÊ_H­»m6ûÍ1f·öp-ò'}BÊ@Í‹2‰ /µšUªJžBžŠL—Ò¤¸öE•‘ðƲöÙø”†Xö¢É6(ëã­B–†××üJo]ÛàãIÉPU¡ìtÕh”ê_OYÉ˜Ž·Œ#p½qÁ|îö¸51 Î~ ,æÂfhK@YœÖÓžîFΊJð‘ÇUÜ ŠÐ%µ…2»£™’+$fËLGªùùùK«U#Àéôoßjaàó8r¯åÜoXy;^o¬îèɉ‚;eõ Ÿ$‰"WŽmJ£ƒi ZšÆÂn4ÎS>€çíïÙZgup ÉȘ"‰“žQˆE ±ð÷U W}¹£©[´ÅÛµÖwüÄ÷PRÄ`êŽMÛJA–â«,“º6(WÙr7$'ûEˆ8ï»ë®Z(&LMšÍÁWe3cuÚ爈‘‡T ÑT(– Ý2K{+v±ôø):å%Bº½eŠÏ;É©tÚ?šSöÚØõúþ 710¹ Ó …¥&N>Œ…‰geùËô"NøÚ¢§9|^lɂ؋€Ùw–¯çæáIèÿbtXËŽñÛÄ(Ùh™±ŽÈ”cœ‹£8ô'f¶á³3mP‡t©Åüéâ¬2ÖcÓûT<&`Ôv‰¡÷q>PtC4ß8¶‘,D¦{9l‹^›Ýó Ô'õ_öE¡@¶5mÁG<ÚüWQ 4óÈ¡i˜ŠžŽKÐαfê,„ìVôg2Ÿ²\Aô¨åU”ÖÑ”ÔÚN¾Íe=ÝÅcdôL;CHN»æ½¼ª>ð÷j} åãï$Á¢äb*Ï9bFVüî:÷ÀTTò”p"ø£Wv­#ù _3Ê?5|œ]„ù}~à}PòªÈ2Ò¾j"œ¥ Öû|U ͈ ›J-”œoXº9…ðjY¹”\5¬p ±\PÁÒ"AÏõMq4t´7£xRÒÂò½&òhj­§¤ÜžX[¯TŒÉ\Mh€+³Ê3º$ Ã>2¨€•á]ZìÊ]Âc&°£åï; ¢³ú½…^ 0ŠX¾åßi“ ø?YŸÇAzFc‹­>ÜýŽ8»NVÿÏ]²”BÑ.ûÛÚÅð.…&ÊZ–.~.[<΢VR‡D¦È úNõU@~Г`ž§^ĶýÏÛivÃÜÔ*s1=/xXχz‹EÝ#Øf2—•ƒ ”ˆ”ð¬n`çÖ,v9 øíåµüÛže͈ùáSíÝ’¹N[VÙí"ò†Ï~8t†!fú‹Ë–—Aj¢”È›³BÕsméoâî¼³i^|„8­=ºÞ9Qé¹½ã马[^lûÕp`ò‚tºÈ ³˜9ûXGÆåc€tn‰LÑ'«_„¾>ùõŽH[5jx=þÿLÁ<Äèa‰¯ž#˜î×fž‹cM¬0)¸m.¶¹P–ªÂfDµxi5—_ÙëîkMŠéRü2fƒ‚É«Ôzz†J] ^ºóJe‹4±õóSÈ&¶Œ‚8™$ @ý0×Z¨ì¥€÷)ƒhw•ùï½F|8šõšhòþE,¡Îôì…{]n—Û¿fý€É«þ”‰‡„¡ªÎØ-Bõ B‹ı„‚•Bâ0öÍfIÎ@³•R¯\7Á؜槲¥]k€¤G|Q¿H!¿nXw^òî:)ùØQPÍ&K6Û–'ˆ€*™£‚7í9"o`K‡z2Ò†=˜Á±›Ý °Žöê"žßý`p¤ñ{z2IŠæ¨aÃ$çüëg$cQ=íjƒ9APYíFà6¥¦Hy˜†dħœa:à;'½+ù 5ˆ¾´lûQ(­CôÁðš4CÕòN¤ðh2G‰ž öŠ¥iígÖÍÑyÄ1å6‘k¨ì¡×,+eG…¢9Û UóîG¹Ge{ÏÌ‘…ƒ h*îVÂxY}+U¯×­&ì ¿mðMàª2$‚$$@#U+fzt%Ôú„©óÚ"(9Vê“îÈ—üÆÏ SÉÞà¥ìˆ-gy’™Ø2‚q¸}n÷û p§®ûkN*û¥õÊk=’Ô^ã¿Õ¡Yb5u}à*ïÕ ÒàŸÖ8_&ÅìëY î»]¾ZNÄç…|`ßeרÓ),«ZUl7?$Ü™”I÷°ÒßsMë‰t [L­€Ž HœhÚ žÕ{ƒÛ÷ ÜwºaøVêW âœ7ñ·Âäq‹u¡ÓBÄ€:«Ù¼è¦.6ßžOƒEuDß8|û¥La›/HP£ò:|•Ê´tùü‰ÈÉ20 Æ©¹¹B1„0%LÕà¸ã5‡û„ÞÉHÈRg^i–Ѐ|ºõœW,ŒM>8± F)ÄVTBÀçóâGÂÆ”V&ؘJéòaŽ©ª¨"ï”"O/X—«N¼é[­ûÐ&Þš«¥þààáì`Ð/±½Ç½Ë õðøßYËv†(%Š÷âØäçÓKn£oy a¥;þäÓiÕzi×S¿;ÇéÇ-XZd´>]-’ŸBqqU“ áŽx´“à±…6áÐ pRZÝPø»c䧫﨧- ·ÎÓQ]Ã9ÁaøŠþÕèðÄá·ôaUöÍF˜¹°&“®T¸¡ƒ˜å`.P¿˜ ?´\€Â)ýs(püÍ ‹L-o¥ÚU¹³:8’å›ÞŠö—½ D“cJDÌpfÆ*ßʼnS««§aÇH¬)Ñ)nUÁén=u¤ÄzðBLkÛèIkÈŒ¼8Û£Ufj¹Ÿ¥T-ÔFÙàïßöÊV•º@kóÆi\•P§ á8K§öØÂÎÇT¸~nrÛÀƒ¾’ÒظE& w˜ü5E!cê™'¸+ÇáÃ}á†/”dƒtˆÒ0t6sþÔÆ¯¸}"…ªZ½*>•Þíÿ]Þfb39Aöl=”Œ &„ˆoU{Ã` ói÷È­Ó‡õÖèãlZÕRÎM•ör>¾®ðê°ÕÇÏóî˜/X¡jClj^HêÞBIή;S7ðÅoMá‹ÚIð— k:¿š|kI~¹’lSÔ—4ÙÚEîoxVx4´ë(> ×É Oõ=žOΨ?°²J>çûOFQjùS»)Û'To½Ídpƒ@ È ©(…¢îÇÈ–5~_ä0J¬ œYH.©ó®|z2&#Ñ\³áZÂã¯3…™˜¶Ã¿Ä‚+3­r&ÑWOÿb´xƒtjxÞ]>óáÂøÂËþ^['¤ÙS R¸o©pý ¡&WòPV6ʼnŸíÉYF Û¦Ð[¡3rJÆð£R Eö?r§ú®j !cC¼ƒëþø]ƒ§Z å]û¼°5~\|à™Áªø8‡Káÿ.üƒÓnº™0ÕH.Ž ,%3÷órÀ~ËÖê<ÒXâ= ÚÌÆ óïŽ"ò»7ĹE8T~ÑÏý¡ê!«×%ìéì•6´É6Â/¼‘˜%<ü[Ú© ¬zdvL¼4åö%äÅ9áœ.¨øŽËúIvþSdåb h‡‡¬z/RŽ5Ÿ[¿+Ìdýó媽œ<0:¼=ä,&Ø¿û}‡AÊΕsqvì!pdž%ÎÅð:”É™—ðñذæCMC—]bÏh‡ÓC„Ü´u´£Àeɘôªñ‹p£!4H«l¿ñìJÞ'‚KDåŽfÓ‘¦ªwÈÆJ/%ø°Lpœ_ñ±ÍqI2Ô´Âq™M€€2Ô¾ŸŠùOÌQ͆9|fkBIŽ•å€=i)‚¢óŸFaÛ 7, ,îò¾TÆñ±Ù½bDÒ‰m»Äa)ù¸3áÈ0¤¢¹¼NÊ:igÇŽßî< Çå[h½;°±¤æt€vW›ÛoÇ ¥Q£)“hY} J?&Ÿ§ >f‘µ¥$1–,ò nVÆ—`'IÜ Þ`<9íoçÏ4íú`L·?–À5· ©i”ôÙ¿•Î'þ*\_ãL)D8,‡ÀÛ`»s /¥ò#øÎ¾?³3“aøê°ú[Òêø—©‹h‹‹XØÛ!Æóå¼OtÙ'êx›6βL8Eô.äYvnøeÝ™›ˆm¡Y óï)UcæºñBn_Æ íZøâ†^Ü݉(ÁšÙzêOž•¼óÝ= ê轆Р/‰üiTÓö¨ÐÉn!¢¿ ¤R¬=•­èRs¨÷˜”¹ÔYªÀïÜWKª ƒòw·" ±Y—ÌæŠªPÎS w™0rVžk[°e›„·6´ßÃкÉG¬ pþÌ|¦=4ñ{;¼ŒÍcR¦†Ü±/ܸx&[HúspãP/y°?"IVî?ç €€ãøhðÐá ¿ÃAqü4ø_ÿa _ÂüÇð»?…õü/á{€ñv³ ( °:xR<ÍíÓ»a•—`I`;uwV<§üèGˆž˜DÛ~€:®Ýf¶#‡!ÓÇY^MÙGíèåyŸl ýÇ ãYų‰±o—ê|µ Ot·ž!ÚO× ¦Ž€æ ÃãÐ$ž‡ÌRˆÇYŽc_DÖŠò{ÆÏ¸ÛÜ÷?‰|ž;w¹è“—|%§f2µUQ«~EUKÖùêgÃÖ7—a_å5î!m„~Êñ3»÷®uZ`hÐ!{Jþÿu¡‰Å~¢‰ˆƒCÄrÄŽu-÷EÕ+˜–ñ³Û=Ð = >§Ñy‰¾Ÿ.Hœm€½L¸„æBá¹² ¿ò׸•¥H}t) MË[?†Ý{¤LFƾ5Û/:Ï;ÐxúL}@“µ1´°È‡Ñ“V—ã­¥]&ûØêàsÜtD²Xðcû×¹cÖJ:mooK_ðªF7 ²CBéZOà‡²!²”6wgµlëÚ[ÝÛ„oÞ ÿÆ@ 3gÁ¶^Ö¥÷'ÿ{ìéÌïÄç×ölèV¿J™Óld˜þ˜ÕÎy¿~§S" ¯øÏg¡u…§aÜ€Ì7©"Úõ÷,5þpž|vK¨3RŒ{n„Áñ€!¥Lß·DŒÞ73$4;ª‡ïDÀ©\À …ž‚¦âx„Q³Pù1bü!áï5èiß¿É]±ªÜ¸óþÒÔ(Èvú•¦s¡à`O$9O+¼Óš§íŸ°wÔÊPÍú?º[¥–-7r¡Ø¥›(ášÉ ôljÅS®T»ókb_Ö=`Ÿ“Ýósøv¦±Z«¶è,%#€Aîá&ùvX;^×NðÝl <¬6AÁø^íâ¹w’IØJÒõx¾ö8½&€Mµê´õ\™ß.Ãçë—ðê3ÍYŒÁ¦Dó™,õd¢£ÔýoäÙÌ8ï’ñòÒ=.õ2Ôë&v£ÒhF'ûTø|·«L"iW3ï¥Ëø€ø/ú%·9Y'\Äq'u„%NšÖ¹^® SÔ.w°VdÎò=˜&¸“Çv¨"TüÑ›»¢f»$3kå–MÝ,U^‘¶éØBýí‘ZÏx¯¸64½|ª"þ!.Ô×åzçO!¡–„øg# hù¢î1òU&ò¿ê^÷Æ6ô.«L$Rv.{ÏÚqnXÉA­Zrk”Û¬íJ{prQ&È!uï¹™øxß9ÖHßRE Ü©GØ|æÞèºöd¾òÿI¶n@ÆCt“e’œÜiìÛJ'œÅÆÉ !„ªr5Rì+ ˜E™¶Võ#(¤’§;šTØï[›ØF“Äê¢7ëxIÑÏÜÌ6yiéEž»¬dFÞ…lʪLçñUÎãaÅ2{#}äBµ†…&fǹw~? ¨º qÙqÊQ@í¯ƒØxG×ꙕþãM{÷¿ŠÐŠŽ>f7ŠvTæÓ š79¨y¥zܪ¶G:tþüŽc¢ps‰&,°Ñ2‹Òå1°ôÑ®ÝA‡œ SÔgº¦û"á×Í‘Ħžà8¡”ìž*~ÅI—E‹BönRKƒ_ uK2<Ìý  Þ¯‘s tŒTh.?jdŸrâét!§dThÖ Î¯!¼›—íüÜ’™krüöAw7›Ö· 럚UC%YÏ‹s†~€¬UN©H'ÄUÎ9°àÿcèÇ÷WQ›?¯%Wú}Šu¸šØ9P üXç-òý¨$Ðýub:­kQU©M¯;XÚl[bžïu“UšRñ•~>‚]a{¬ŸmFú.G`pŒOÔPÉ²Ï @÷‘T«hXç-õŒñP!ý¤Œ3Úñk¯ûö\^œôø¡‘êp=]÷Þ¶.­5 f™ì0$ VVýó0ì_ߤÊ*›ày-3î¼ÈXÖz«ÓÓb6𬨼8x>žÞÖúì ·Ú‡Å$ÐaXa«âVqzZíÚm’¾ü·3iÎ&CYÞ yjµøxt9’k—õ’X¥PŒs'Š <Ñ1§cßšûÌ’}†+áïJØyžØ:’ö=`×Ïtð ­,ÁàøðUE¼{?F²™}ŽÖ]Í÷§Óït‹ýi‰Ô³f=¡û4.‹%ý•ǘ)´.¥¤“7Þ”V™“VáLN+Í_¬Òdò–y³ciˆ‡ú–]vHÔµö5ý98f«p£Žbë¸k‘ÅX)™¶ë: zo‡”ŸÂç$䥨fZÄÍÌ:‡–üëAŠ€°À[»·2ZS5ø;_ºº">–¨E]FĪœl>݉0ÖV L eá‹R79ÿ*î|A†È`Á¨¸¡UKàZ\ù§È"=£Dhç…=ÿ4U"€ª§ÁJÀ#mbàÒ½*œœ÷~|ð‘g^’bÃ1;4Sø¦tÏÏèDn»át ñË©ŒŽ²´j«¡òïâ’+ȱ…:†éÉf•ÊH:aÎàÆ/¤ßUg‡ù6ù3åPßú¾Ü)-á²ô|Dá-J¼; Msªw§÷¯™¦/ð;uµ2Élý€€”?þo'ÌäÐ`UM%{Ò\â›Ûж4­…4Âwh Çrî>Tß}Ro¯‘.äåí·ÈÊͬ0ÇßHË¥(†` ß½Õ­âõ`NÔñòuÒ|÷oÛÑõuý}]Ž~Ýýÿ7¡»ê쇾®Â?oFß¶›ý»‰ûzýµ'%óêOÕÐV~­Õ¾}=úºý]gþ®Àÿ+z»íè2}]{sêëzûz.þÇðèsøtü,Þ'êý[k—ÏÚOÔïúºý]U~®ª¿Vèÿa¾³êꃟWU¿ÃÿBþ½ü7“øRÀøuE õ¡’¬…;1[¨ô–ÛµWDÔÒÆmµö+ΠèFÇö~!s!U2_†Éçp8"OÚ,p|×A D#ªKÀŒá¾¶¬ B€`OËéU MÀrwí2ýçO£]­Žó@~¹•Ÿó¦ˆ5êç¿Ê×ߪÓy 7%ÁëÖëál‡änÀdò·i†a­¬ÉJHsÀØy•¦ƒáõ÷¬¶öËy~Ìÿa©ÚØH¬–<5–϶Þ÷@áA°G{®¸+­÷ê°îs&.Õ´×çžk °Zÿ(š,ͯçùd:Íþ‡wbSÒ˜óÒ“ìí©Æ„­oíÑB‹×)ËñŽTÉÖ1ó]ò¤ÝZ#(PÉpjn•'›|—¤…qIÕ.³R×íÚÕ÷gâD c7 2³Eš"‚L#òÕ„ž:ÚåD;¤¥óïË•Ðä+ÐÇPöʧ2'’út!žæ/óŸýX… B}1«×;5©Õ'æ¹¶hªÓP31Rí 8;S—±Ën?¯/ì=‹wy›ÞÐuz¡´“˜I9î1Eº@fýª(áÓÙü v>ý3‡ý/©NŠ£¢{vóAÌAÂùòÍw2|€¼¿–~“…;죑*Xý0Þ€D(?ÝÝ« ×ÅÍÃóUÀéFIBs7êáг°U|RÇK÷˜¿\uùú–ûÙ†È/8Ì6‹ž=ò»T|ïŽô¨ÊÀ*a‚:Vw/-ì8Q0j>D4&yÕT›ò«\Yy†Ô•÷òö˜GB9/ð&ÃèÕp:ó‚“ ÄE­å^»ûdÍÒÁ'TÞ[¸²€èÕ®ÆÞ(ŸÆ,w‘8¢ÍBëšÓz Ç7ØJ£>¼ý6†Oƒ91ËH‘#HPœ¬dH«ŒjµÉØ èÊÁ½nŠŠ'1ÑôP—gßÑh_ÉhO%’ƒD–ZùÔ1[‰ÂX4oÈç½7þ80ñîdµÀ»åc]Ú{’£¬žKc»÷æŽ0BnoÉZ1™É¥ÏwvŽÎ2 nűÝ[Æ܈®Á­V/À;„Ú]3R>ÍùÎ3IsÖýùÍ®` (ÑAóº+°³ñ³ϬQâ¿-y*úp.P+¦ íÁÇ W1›Ø›èë'KUxå†\}kýE¢ý*)Dâ(Þ/ˆxäì2¯øiXôÇs/R5ן¡oøF„úõ;/Z(§õöy¡ØßwÌ’À™Cø”Ð-ýAƒÅ\»Í|ßçJWóQSBWîds…"xñTó§=9ÔFÈŽÄž4Õ cöÅýn³íå¨\êhhÒ^¿Á«>ä;¿RK<$,,Ó8,:”®tÞ›Þ9N´øµ¾ fœ{Q|eço[ŽÕÔ4¦lbL÷*ŒÎÐ0ótJ p뮤Q[êiIµ)/««YCå™À#•øƒZ|µØìðñÙF˜Tx‚y_kƒ!^pìÊ'oûeâ|p裴cÁ¢÷8%or|ö«üt6,KûŠ äÁb¼ÿa"™Gæt°5 m팀¿7[ÙÖþà´úÁeþûÚD …{µéUCJ/´w¶¤«šìÍ0§z·0Ð*ír„⣒Ê4…pSâ`zT¬î´< K@8¢2”¯XÄ»ÂÏl³j‰ò,õ4D½MuÑæ¾¦M+ŒEÕ€‡+ïLMÇöcPqó‹„¡Û§ ¥|k<änñŠ6C«»v0*?yM‰â¿Ä ;žòš²RŠ5OÔË6O“C–IgZœ5‘ þÍ'üŽL!ÄPgtÉí}vV„­N®Õ³e;’ÌÆ»°ã– ø–±9¶ÃÉ›6UŒg Ì »o›B½+*SÝ•Ø6rnN¾ÙxëV†üª8Q¬”¤šÄ*†}Dáµ:vkYNBeЃÿÈ Qz~•EÂÎ(Ö,$„Pé?Ï­vë5‘tödRàpmMÁÓ»\ CÞÃø@F˜k‚Ô´U¤1\_ÑÂìqºl,:¬Ô1½¼šÑ⣮Éå<Œ ‹>F‰¼ŽðìAóyLõäO‚ÃÊ»’u,FÉt1<F© ˆHí8[Å‘–éyƒ‹íÜ%wFöw¿YÐB zSi@ƒqÆ{‘å±¾ÿE&Ç:;»õ¿ÿ|qž´÷wc±Í“8›Õ;m¨R'çgçuYè*®GZ+ÅH± ºË÷»ªÉÂ…À»ºxåÛ„?×ë*Ø©?²n§žn5Të4éåÔª®ŸøX¹Œ%ÆtKs;†]P‘vMbUâÂ/Ì0ôLOÊ2-ôðs³,Å óÂ㣦e/ ó¢àùÓ}ã–°VüoQT‹Á®‰„Hl r3~¢($ tÛß}rC"ƒ>rÒ %E¹I™XZ>KÛ†(Å 2O>œpK«k"ææQ$§;þ]NñÄàœ(>åÝÍŸÁ‘Ö ™®ü 7ÌßÖ8…®¡†&]ýþ"}ˆÁ¥ðýŽ¥áðû@ñcàž¨»6½94ÃE)=„ÇߌM‰Âl !o€Uº¢L¼øiaPKŠçŠºc¯Ÿ2ÔÙ‹”`3è{†lHzí=ÕzÄ€KÖ€·ÐÞq(=öz|˼t]NË*ÖÿÐ*°qâsÔEÝý,!!Þ©Õç"òÔÙEDP³ÒDÿ>é'Þïj“u¦Ñ@ÑP¾Õ+óí‰0°9•—œ^ MA\B«² ØÐ´R*ôXVƒ‚W ºâó§ûný+*XŒK§~Pþm‹õù\„Ä ê ÈØ–BLÉp)}Í»N—ÐýaÅ?A‚`&û]c¡b÷†Òâ¹ÉQê:ÀpZ[t•Ê‚8=*´¶DZi#OkíD'è—nÏ“'To®é¸qÝGêÛŒž¤Ú×¶'‹øþf6½¾ÂxœqðžÇ‹üÝøBÃÄ #þéˆc#\´ç÷[˘ÅÖàðË®ÅWׇMW»÷ÚOÁá«-~?S´Eµ;|¸o§6åþæ™Åë%:óÝ‚ë¼ìÁò–‡Ê«»f—¸ƒï¯P˜ÛÆÿr‘ ¯-Þ—GðØK^Ÿù”.Fê#ã Az4ôžÙê¯K.%Ó­¥Î /.´å¢ùênÍ9æÔ(Rõ¶ë¥¯ Bô[MT_ò¸°˜3É&²ð ¸Ð3š àŠ; öEŠ &¢( à̬ï¼ú$ê=£%úùÏRÒ9Ʋ,v˜;n\ùéE@êéÝ”‹À:ÆQA°Æ ˆQ?xÏÙÂÊåýP$V’ŠŒÒuÿ9##ú¾ÙÑàº- Ú@Qìy³–A—‡¶¨17&°Z«~w-”µh±ê¶BŒ7àwt@©ï•8­ÚÐá´ø•þXÞz¥Dψ£)s-øtVéÄɳÉiŒÑË= ÁáØ=¦*î,þ.U`e סþ©È)jˆuj͵8²:Él'iÉçºùá! _Ç'/•&#¨h}wzJÒzAHVQg‡Ðõü6 ,ûEÞ—:ò![þøè€¿ }J (”Õtª ½fªc–äë·”÷%ç˜2áD.fw>'†À—z{÷!©îhøI•š\Go3†òðý=ÏܽZ`"´Š®iÑeK}(áøäb¸Ó"HkMðäÈÒŽhÌaѺƒeÔp”a TeûÖ{òÌhb£OÀáw¼ÍÛ®"¤šÝÚy#8d+Bêàr¯\°etΙÙ8i›;mÌÕ÷H·)Á˜uΗi4Œ":¥£—äoŠñnB‘§·ª…‰ëDÔý¢¾¯,År4ò\»©ËeÈ^ãݱa9ñûÝ :ÝyÑ«ù¦±¿Í Å_%¸œ%ÜŽ¹ ~_±{°¿Î?ð(àýý.jn+ñ×ãžôªLÝeïBeÆ÷*)ÆÈïc­â~à€d*Ì‘ß>=ošžÅ˜µ 6átêêcöÁ xbKUǨd%w–ºú˜Ø>ºI —X_U¿¦á’¸SÕ-ñ* ´ºÛžˆ–]ðÏ‚”´#i¿¶m\ÈÿQ{kùÌ/žNHóÕYdÿ–ë9_8ÑÁÕ2j†¿(õr·´6FUOÆu›ÙsÉíáyˆ² ŸR¢ùYíéE%½k|G5Ïîp€.ë¾T‹üÿPÅíTíi{~°Ûœºš/Ï¿ù½µ êãÀiFïåЂCX¶0lwZE1G?Í_ìõÅ´¦9æás Ûè­sö%h•Ó0¶’w¹_Cõº ·S?&ÉùØNR¤dv0œ®AûPÓ,{àù{(ªŠÚE¾(ã͵hñý"¹ÜDw MEPHå—¶“žÉôÐúcá¹2çyvâ8¯ÃЋå .uýÍbï~¢ý4ÿ$> ˆÔ…Yª‚^3)ÝWâëòŃKDŸ»zT:•8ÆrÏÆÜpöSÚäšâyØm^ò«2¿š¯ºH+¸ xÑK‡âÀ—Æ€¡JP6mÕ®÷Ãì¾’LäÙà Ê/_ùΧRÆÕ’ð¢E=;Bd›p ((Í»¶lz}ªß+ÜWc¤,Ú{qm¡jL™8&¿˜ÒZĉ@@ý…ëo¡[ `ÂÆÓà-sÂm`k‰ºA•§ÇyE’X³øEÂbTè¹åMNþ"©ÏJ¥J÷ü$÷™ùQµv!Ú‡Fñ$xr‡„vä4º?ðô"o‹§ÿwmúbøˆ5žÇGL€xD†ü£°b$®»Ó/×./â©{Ù`5ÁˆÁ\¬ÍWb¶…ë/©aÛoHõ™²ýÁ2ÈÝ R]Há«.æ´ŒµçÛ®Ã1;RÖóņ‘úÙ¼ÑElõÁ½ä¨¾9îä·n'1éÓö½TÞjÀ›€H§Ä"Ð8à—uœŸ¯†¨,{lÀÓ»¬¼¼ü}—®ý<íU-mÝ×È>æ%å*;lvßuÊœžÉPøQJÅð)¾¥G%N¹ÎñÓªÌÆyý†ØÕ±÷–±\¶€ùA†­•N£·»1#“Si»áøJ4Ò#4ܳõ%RHÚédXËT^õã¡’?JIͦÑËkÊ×lÛÜèÔþ.£~ð¤í2šGï€4[ñ[--½–×êpä¹êy9ã‡fQVrÚýmü§:o4<ŽÕòBÏã2Åd:ä4Íb¢D258t÷ÁÓÔ»]óš@iU®B˜­ÂüQXP%‡~†|~JØw­1qXå?I&wG¿Å\å@éÈL·óªìêìV8-NH ´É¼÷À8è%!Õ¸Ö.®Z©ôm=tH¤lŸÑ^€13ècP¢fýRÝ65‰G½â¯wÃYïvLÎC¤må’&–ÁÞÈíämLˆt;H’›ir0q¹¯[¼Åù¢ëÓ^«y#µ™ó}„‚s¢Ê}&&l½ÉßÓLÒQs ›a™ž¼p¨x‡X¦ès\rŠÇ‘6@Û4ψÊë(zá¤! Ì?È5zÜžýŠÃV„ ïy9@@-{6g"ÈdÉ\è… q£ ÃöYŸ´iz`>µ^©-S˜ƒl–¨ŽHf†¨ÒF¡; LçqFãwÚ²ûÎNwÛœºŠú¼”g"ý[ÌHƒ³ò<èó+‘7d€?³X TNòÐþžÿ! ž­rÖ3À°;(wRÚO;•ù­èà »âà÷”‡ ‘llœÝr)}m»2$Vu篆 üµ˜äh†b¤Êf4Êô?ˆÏùšdú“³êž8 ×ÿ~b ¾ž @6Düê÷©Îáãš'ýäÍdh¢!—i˜|Sµc‹ûÙÎ~‡ìÇ€ëÞsçÜXOLµéFjÛ…?†=›”‘I6>Fx¥SêF*ʯáOí~N”Âð–·¹mcƒkï;r›”„÷†ž¯°§fËÎ(—šÙL±eô_Q/}x£¨¢üBLÑZÂPú¼aN&Šòý<Ê1ÐxÌ/öëÛ[$ÉïyùtqAꛥv™#™à;ˆÂä$`Ðø™m@T> “°\gÆIób×…š2ZAýü˜fŸÃËëj9ÓÔ¢¯š3ºw¦ EÙœ¯Ž˜>ŒÔCM-eÂ'’u§ÉI1¥Ø°¨Ú1ghýiy @oA €$ñ—ÖS*Lª´Ð&w[¯ætÿJ­Tg3Ηº hYGuÏ)k¡m©ˆsm­‹Póc[W×Í}Í4 uŸÑLÓÀ>“@¯Wä®]@瞸PHoyÌg•¥s )P•"´Èy„Ÿ<—ˈ¼«‚ïa·p)½EŠ­ì:êØ(tÏ㕊ïÜ“"šR¬`ók‰Ì1 ñÿ9"ÏòôŽ:‚Ñt^oš­jѸ³t=faÿÚÒÀ­õðˆ­Eɾ“Ò§¼=ͦ¡,~^¶èýËÀ¾*á>“š¢º›}Îß^"gd½ì qI”¬Â¾|¯âhѤÛÄÊ¢†8½°ÿ  QY+~¡Ï|øÜ¦ó.íàpN#ÐísôÄšÅ}y¸ªHƒ–HI›YqqŒÈÄ–îœ<éV¬ U¡E²£…õ“»¾1ãe{!!áÀ¼¤UÇR/²X¯¡€Õ¢¿]]_ ¥ÄÔŒ®ìü“ˆÎü¼¡ÿC>'o™"ßAŠ"<Ú‘íXi7Ppª²(¹˜³ˆqô[JÌA§˜D]eø;úxZ²¡¬…?°ã¥öÀNšͧX˜28ðÁQ|6±gÑs“¦¼«X}³Äæ8-V>Hp§ð±þ8‡KZS¦mVèÈëCUI x™+Y&$ŽršhDô=½ãÕnw1¼î‚€ŒïЈÄãþ˜…§ôñyެɣÎ^öôiLôfW%d® Ò­f…Š*EåÁ qs@vÐTŸŒ$Ë~:¿‘é~H(ò £Ï6š‹*{…æ%7TöÏßb‡ º‰ßZ!À4Ækïx#º¥æÒ›8ñQÈdÙ`¸÷'¢}7êŽÉÂÇ»œï¼EŠåêž]ø®ÒÄÖ/÷'ÉìÚlwÍHóÓ²m‡Ód!#Xƒü Ìáéiè ùÙŒÓaªÕ¡¢&Hq+DÐݼDa8êa³ñ6‘u‚MòÄC]”ó.?…Ïé$扢¿5.(ʤ/éSmÊ?‰öCòk‰Jk?€<ã%SŒºŒ&`nhÎËt™Mg>ÃEãD ¤¾ÓÐûZ‹~ˆHÛ…\ã‰`C !ÿ>»2Æyn¡ßüü” u¶ÀÉDáùNÞ¶³±ÑµuÄ}Ñõ‚ñÍo’íK—wíïÚ«Ù¾aÿõ¿æÍëÑ×PÄx?ןâ.®ŠˆÄõmÓ5ÂíìSÝχºhžÿož¶úšÀ  oc{ûF[i¡ÏQ?/e}î¼@‘RTÄ…ñ˜95®äÙÊ7O%β!± Ñ0õ˜¯Ï–ª3Qzk‹¸ÁI«Í«q‰k(Ý%†Ý†­/Bøšñ}ÖÖ›Œ¢u]¦Ûí:JM%zkú]ä´>±’ &¿Ó.‰`Ä¿P—c÷Jwÿeª|Ž”Ç`ûg,ê§EHáíØìwC7óc¡‹xЉCb…öa 39åm”Jè“h©€×{çífS@•Ö5Ñ1î®V©¢\‹T9òßßsÞ Ccj¶E¯{Ô‡òEnBÊKA´§½e¯ûT[“2@Þ`ÑY„}"¸¡äú_còFpµûvÎ˳7ƒ|ß©S謙w0u¡‡FɲTËâxˆq+®ØúgA[ñ™íLŽ*³eƒSËYK ˆ!å£Ó×ú ( l~ÝQNÇ DˆK½OQ=ü¬÷cþ f qá‰ì™è¬¢´ýýQo5‚R´mwª÷÷}±¹Ÿ¾¨•ÿÿ1 ©¹å¦fËVÒÐ(¥øU.R‚üìv9“˜’”Ø(™nÙ&1dó-<÷vR©€ëÕ,·HÏLCÝ$ÿrîçüp5gÈ ’})Z»„J£Ô“ü˜È±å±¯¸ˆ‘æfyÏ¡á“P”¤òÔ/y#GXqzxå›þY¿ V–½ú±ÀûÕWî½°ÎJ b|nNú½ÃFhaä+„ZXítkÈܬ†nmüÐ<ÅØø—ß /÷Ôº—Ë,gAöÖ¨…÷Ž7uê@µó,>Ñ÷çkS­uÆû õ øÎH"@Õ1 ½=ÉV?(yClK7³Fïè‘üï¾#0‚BtòšõsdZ8ô½A³  –‹>þ:r"ÂX'(â&Í›"Éô‚—•Þ ëÍýÖѨ8XQVõºÉ$yóöž^Ö1BK‚Ǿ—è(¼ìæ†Oû §íÕÛšLT+3›´»|DE¤©à»)Š‹ôé2"0å«­ZŸ°ºòœŸýxENÐH¡À ¹ÜŠ¥¼»UÙ”øj£äÛ¾TšÓ\µB!àéfc–Õ¡PÁ Ú¢;ÿ~¿6_g?Š"†ªmÔW ±m.0쮚`àxØ_FkÖ±Ó‹ÿAáãA…’Õ¢•µœ³êPÿ}I½¤ A» òÁµl•öŒÝ ‘Ú!&vl¦I?táÀ•€Ó¼„÷4ÿ]†êÓ-¼ßµÈs°$j J¬óPMßÜÕÂuÉ ÊAM<4® ½\>:sã˜ýQÐ÷ œÓð6²PšÐÿWM4:«P‰‹óX5Q\-£úÕ™Ò £¸"à …¾ïÙo)6®X&'\<ÞŒ\O?ì–“ü06Éø•í QºÔáÁѱµ|çZc 0ÊþÀ°I¤²´ƒr/*s'õšq:÷¡C$×_jR+ãüábýYvöš+ÆÃñ¼‹;†×·‡‘kã§l¬¾ŒTh0ô®ÐLM8æëÚÛeûÙ}üW;çV5¹ž) °]íRxÀômÑç'ið‰úLƒؾìö¸ëÖìm¢‹¹åͰ¤#‡á%×4 $Và’åË`¡tŸ0¹¤ h• R-xpú£sÔ3©/UÒåZ’ÁΜ4¾hrýÈýû”œ…rÚsS;hÙjŽö?ú’ú$·‘c~²Î4ZN¨Qø,}ðg['‰\FÏÉøÐŠŽ²D°+ŠÌž$~ú's‡}‡ã«Á^·nàÏò—O]& įý‡R£«G¥)?ÿœ;½®ÿ1Ê¿éa¯ÙgZàÿuî•Øëhld{ù±~rh^%¢œ}ÊÊgóÈ7nª6§"¾S0¶`‘[I4w}ã{*HÜ|cà(A!½2P§]É =Ö}HØÊ¹‡ž’WaQ-ˆ*˼ÇùœbÜ' ß#B‹9‰‘ÃÌÕ6¢X·‚¨ut”}°»èLOæ'Fïô”kªÂF~ùofèã °ëÖpëFÉÍ#@œ(‚gÜ7œÖˆò#Y¡ tÇÒ8ªŽ‘¸½ªiWe*ú Ä15f ÷ï†ùô­¯ gyNõëªãÓ?Ÿ.åv+Úu+ãêqI·‰Ï¦S‡tˆª»é8àØˆè8]²ÑŽ4E–ÄœßjG´Ûwò_´R¢¼lcÏyÝ·çy,Š;`³\SQg$æH»æ~iz´cîXûú\C²5£°~ü‰vi6ÍæE«ÿàÜ…J’†FãÍüS“l˜Xî/qqnˆ¯Í ²Í¯\ +PŒ‚p‰ 8òmïíw)ϱSgû¸ü³tñºÞñ¸îf\ô@Ûxl‘ÔF‡.~€2 Á^KÃbµo t“».e- æÛf6a~8T$lPÁ#ŒƒðF¾¢qKëçÀm˜,~¢´uôª©Ï.©2C^²†cþã]‹&ºƒúýŒÓâkù©<å;ë»ìÏ'ÚndˆÈŠo,ÎÏ]'\î¿ ¸=>–g¸ñs}ôå×åPÎÃÂ)2tŸ¤*2[C9¸d¸2VÛ­%CT³ø‹E®hw®!Þbp!7˜TÃÖ’MÚTúç»\¥èÿ&oáãi—`­2Õ0Ò?Ãtœ%ÿU·„ÁYiÓyváþž‹Ô‡Qý œÞv:eîøÚÓ­%ë ¥¼x‘l‰±Yýßœü°Ã+!Ü]µá§–¸\©%3\*š;pÖ{¯›b¼(˯åz Rõ­hßFDx¦þ! ZµÏ„œ/bCü…\…öcø)2m‡Ø8Gt›x}Df À ïm¯þòë€,£ü¢ŠPНüÖQGGdŒÏkÖñ4ÑÊ—ÖW©)&zWÿlìÑËXt£áÜn%â)š\«Ë‰mÐdY -ùÁÕ\˜Ð*&o ™q¯`c¦Íž ÅPÝ=Iņ/Òž¾LYj];´Çagòàu|ìgÍÒÍ4eC‰ñBúö¯+†øÉËÙØE0[[óo“D=¦rZ¶šYØ1uŒ»-/¾µ:Íõ‚ñL!/a’oZ¤:äL@|7Š-c$¨ÃkõÓ‚j à "¼vRÔ­é÷!Xtë9+»z2ŠûF÷üš+Œ:Õ€Oƒ+©tt XI0Œ±ËÛ! 5Sݽb÷g¡ì?¨ G•÷ò¼|,<ÄVol"Ì'+õ®ê‚Ó€“š¢§ïãèsn,Š îSŠaôTÃpkÍ|9˜b9ßF¤²õ‹¬ŒªÎ7jÍ[ΆÉ'nYÒˆHÓl@‹/•tÓ<ÍELê„ø¸ËîµM×çZ`äB9ÞÎ"ÚlLŸÄÚ¹s’¾pοÌñ¾x>C@“€.iöé+„¡dî=ÜÏ™2³*rèV`°T^÷ÜbG…8"Ó A¨jîŠûM¤g£çÑ4uê´(â–õ¬Y´>ø™—$ëSþqTÃqÒµ B6YÊí²P”h:Æ_¸Øz¥NÙRÈSÍøfhïÄPC +ÖÜfBªù¸èZ©@iýŠr¿²òÉ,…QÇ=÷_2Dà€•`…L±Ý÷ € { Ü•][~foMPft`Õ|üµÃà^ýÄ1ðëG¼Ÿ‹ó«UR¡û9åž52a©é1s·u5eÊ„™ÈZ¹o,dhì*•݆íÀxNEZùUD¼I„ W¸Žê¥ÀÔ*ngD¡LsaNò{m÷¦(öšD±D4[d|Ô+…•¥Øýî(а8§Ò³‘Ïq!PŽKzNÙ6Êñ(z¯Ê„ƒL‹ÈxC[¹økEvTz×d:?yGâN{]Î|&rÁÅ£yÁ­àÈäÇ8ÉÉ”_YµO^—†¼!ï§”€‰I¾¿é‘³Âõ¥6<+-u÷¨ñå–Ä ’Â|ÊQE®|;Tè† æwEzÿF…È=~¶‰¯oÛZt¶àçñ8Ùó>ì´ÍÁNãFtÄNVÞ¡ï7Èj™¡`?wVÍòŸ©£±åÀÅAƒs©7} –ÝWEO°‹5äܦìÞ(ç .§þg[”iü­·³¸!‹*iÁqÞ·B¤Ç1 fóÒÜÿwz¯–Üá-wø ”dR¹ÔR§}‰¼‚R(;‘?–ÜsLæ|ÈKà(%¤Ñ<ä%Ù’ü}]¥?ƒ.ý]Šºó3)ž›Ó|®½å´u¬qÝœ†Ã –ýÄ£”—(3ØlÿF}’ËŒL1î˜èܵ»)íØ.¸í£×@R— ü_x‰"¼cµ×ðböÏŽ‹W£Bë ˜É !)Ám€‘­•©21¤@÷è0©jòüíˆ5<[:+YréÙ:[óÄ›…W=M"K7K‡ò¯dϳpã‹4õQ43+Í•C²#ûF§Ø‘Æ_“kµ;bû,9Ð9̦P‰ËÐ/æ~¯½Åö¡rÇÀ½£ÎYZ“§•›Ø~0“4ÖºòS7&»}è•}Ú˜ûRãJ<ÙÖLmô‚žÞM7€øÝ{ÐЙxæ\$·Ò]s/Ë_õ,Ű´Xí⸴U}¿³íöpkØT+˜X—_HRÅlXÕ—£§Š¶.÷2«@'ÊPp9c’ç®…7„±UÛƒµç÷ÍEc@iŠŽ“o!¸Í?LZr'žCËÉøf° r_ñšÿ{{@÷Õñ©Þ‹‘À”Š®ÛZääŠmšÅ"º–Š ÚƒÄ¸À;ò¶Ëüo`÷¤ÖCÌÁ¶N­ï F× +k½V}©p8ž €?´ÆXSjíLÉ>j¡ÿXövòžÿQäÝTš[»cñFž´gåÇ¿óT!Šå[ç£ÿnÞ: ࿯ï<¸vHÑÿQ˽ñÁõq»£Ùß’7r ëËB¦»aŒð z«²©øØ¤ñOŠ ¿öÍ$mÜ‚Yšµ™ö,¼¥¼d˜®»xᇾ7­œ„ˆáa4®(–ÑßüRÔéõ¥“´w©‡¤ðÆB…ÄG‡Ç/ž0sI_0Áb—ƒµ[~)Ñ´ÂýÌØv ÖÜÈK@ËÈ(˜¼XëÁû-€ìöß!y’Iƒï¼Îà”p"ýd¦ñ‹!ؘ¬ð­¡fþ)_-td8ѳmå í©EYžø¹I(Ø•™q)@)€“­‡éŸMXSåŠ$.$ö/æ~)ezØ*eüÆyúMtí0§É‚ÿKR?ù·×ÏêöDZ,Èbʨ©ÿ!gÈï%ò”–S?mݪ—,^êm“RÏýÌ í6Ò,bËp°DHtd¾ˆ5k´—©1$ñÊÁí3Zµ¢„Um·…n ùJú pΘ+˜9¹‹trù]’„îZæJÚØ xή˜’)>@ͤ“¾Lоe„ÐÌVkk=í9­™wÐÞÚÝ >•hfµ]Ròb€Få3¥X¤7R#aÉ3óͧ^T‚»ö¯Œ– >!¯ ÈùP ãLE’ìÆÿ\ü&~ Ø 7´V%„!þölë_°þ}·±`X Î*òe%1ÔÐ5%ÿdÚî´•ªä®¹I#9ù²_~èV*©)b–áû&§ùaYú0Ì~o;´(Þ¬â@ Ð`{º,Ó}Ù{™4_ 1¼ËË%á†G`ÍbmO¸Å­²¹Ç³d`$éQæa“Æ‹åÊ>âÇÑ'1”GxökEGÄâê‹ ¡‘P4b†wj÷?Õàc÷P픞6Á‰,¶r2»¬ßŒV…U÷APЦÝCm_H/Nï5©Ã€+š±6È-°uîQ(ÖîŽñ }œ¾Ð€ÍŠèqKEå*CÍå˜q¥(ýYÍ3ÍVyŒ3ø^x–OTG¦HµLXˆÐ,SPéÆ?L˜åÕ£kÞŸêHÓ‹I3Qtê’òų‘Il ¦Ö)Ân~,ïÞT¦…qù0í2½7Xôó¬¡þú´Ž½ÑH$2Lqá 7 ŽhÀå †j,k›âóEø=K°$ë•Q`‹~8çûß©_­ ÜDäl«KëÞXë26Ђ¿ŒÞ¶»Õ;cÌý.#¦A2WÓvOíûøèhЉ&«Jþév¤=·Äpû7Üv[œ¥©4øãг5êq³ð»ÄðOyZ´gšÓØÄ>)vdQBfg}È‹*šV(ÝsºÇ¶¨7ð \(ÚƒÔþeò$é[¼(o1ý„©ûg²§•a ¿-\Œ™„+6­kd;ÑaóìXc'%+< °úâpBªÓáB‚2î3*eœ;HØ2Jf¸sa,¢¥¿Äºj;ɘq[–Øú€ð',Äo|$âA“ ]ßÖÊ”ñO¶jr«ü ôF|Bºß{[ ÊáS‚¥w~+½ÖtÏÈ•‰íÇÝ{ ¯Hxü[蜬Í8F­W›ÁÄr¿ßß @Uºp‰vñG¥Hìo@Ho€ÐS•îPòTg~䇘7¯%œ1†Èo;Ó'^?ÊnH MRód;ÚØO:Vµ¶¡%ÙcØÂõt1ã~©™“úÉ´LÉùÿ`MKÇGuž»6­)ñÿ\ §ž:T´ï¶Ð[ÖŒK °ÇlÛçoMÚÏJQ¼¹;Jjúhç+ö9¿×r¿Ž>0[´Åa?ÜL­GÊ.ê(K¿5Â^˜/„§±# b«ÇùØh‘;; ÙSC}ä›&ÖG IédtàLGSQÌ«¿þ‘U7˜/h‘a-šHGnƒ&<^nƒn5vv ­« ¨’ƸԴÂ8uì,¶y’Øjn6)ìhžü3Å­ÿa¯}¨f½æƒlL·<¼ÖÁ¼ÊJ­*õ K©ŒlÑß6E‹kí“ ¥­óÙ¡‚¤ &QU—ª¡¬½Y6åž‚súç«=c\=ÚúµJ‚%q!²ùÀ»Ñ‹æ¾."ð缂™'Cà÷¯Ã1O½o‰p&´?.Æâ&[J×"n*V»Zö¹dÈ5m ŒÕ7”n4p«(e‡Yµ©æñ«ô@†7Z"º BÆ=‘ñ1„ò\¶²Ì¥Î«VD¨˜*{¼Ž‹Ÿ®ßöXþ]ø9OüVÈ. TÀ r)‚\³?|!,ø”Ë74ÿ‰ªÿ?¾ßépbð¬è«?è´l&ƈõz-ôÉ;î1 a¤ÿVæ8%ƒ#§y¥'.ÍUÅyü.³·w•HM—J²ö‹´zx>w–85 |üñm’ëoJ­4|~Í€ø>(ó?çt3¨*ÚßRA:ض¶ïøö çU6Ú'îXÑ–røÞý³ãK–<æßØíˆ©Ièú­oYNFÖé;H;ß—VGH1ß5§—s£.jÌ‘Ù1Þ«ˆÚp‡k¿±À˜Võ› ²çÃ<«×µt»?Ÿê¤ oºìµ8´àzR«mU—¬’'`s—ÛVkè’Â)l³..²W^Ô8ï ß,NzÁ·þÆÝú nÑàÒêg£¸éR…L¦Êð†olñ¼€AH\¤·øÞ8›ÿT4”#c`Y­"!yhrq-âMÂMiJÿQ½é.L0:Cg[Oáö—Б®Q:zDÁfú¼ …·³i/n%Ø xþk'F‰-¿‘ºxìu¶Ñ®2Àç'Ó¸¤©X9ÿ#X{ˆýå­æ UÆ ­×¾¢—TĈËñýî·a™È\dZÑ¥1Y’[‹ÒÃËq:Ц•a¬lªIj"ZKÉU¶™ƒ7íôGɨ5¯ mÉ"î‹ G ¦—u¿ÚŒ°ƒÎå!øúÿs¾I5$¦%Ù:N$o&ÙàR¯”¹`èd^¥òn»¼ÏÏÅâ¨nWJð»ÈÉÅ7•$jÑD £„â¥ò²Êjæ"‚¬«¥‘“"?íjÛ‚|â2ë#FÅáík+Ó,ß$–ïpƒAcÂŒ{ÇŸèSãÏ´5¶ÅRþ¢´ø˜;¶Âr¬øN¡/m÷Ä~0Å\ò@¡>QÜ ý;;Y1%º¾ÐÎ5é Iju£¯»íŠ,Ù,¹<…Œ›ˆ•—à@ Þš'Sï8'ã3Ô(ŸPËаlÝÊçø[ùðÜá`[è0 ±¼•¡êÞùö~‚Š>DYÅZ³ÒtPÖO‡AדÆv"Ói¡Ng ïEÿ`k+ù21ª{ß» WÞ譵0yrg¸zû â·?aƒUjÅ+H3»<ÁáZç^`;Õú÷iwY!“S&˜ÿ~ßï… 1@¿ãõ12%(»ÃøµÛºf¿y?@X¸È½ÅV!z~*a£X}ö3Ò ƒß5¥zL…ÜÙØ±éБÑ@Hû¢£À£c×cŠ&5²cÓ§Ö÷­¿I¼Æ\®IJ“ÖZá ~.L•¶†i*òAà® $ÿ7a1¬Â¨0@GtM;w>:ל¡_ü½rK !è8{a—S²jb C¸æ†Y¡‹ç#äÄÿKáInL]jm»æº\JûžØ[CÜËÇúî8º˜Ö@ùþ’KýôÛÄa`lØzm´µ<Åô7’b]óM5 ‰Ø¦“¾r2ýrÐKâA}õ£QÏçü×÷Ê$¹|i‘5 +!ôÔÚ;Þ5ïOoÏÚ<õÖؙʒS©÷ÆûLæî ÙZn3/N µ•‰é£ãS‚`@¨);¸®1lªÆm,NÔ)M‚¢zŠ¥#Ô’ ¹ì}É^oaë~¬¾¨-Aš€RÑ=˳Wov Š(¶S‚âxêòá{âËz&ã\ËrÚ&dœf,ðÏ€82ýÍ ®’l—À†¶…!µ±µ`y ê×ùô÷8c†@Ùr,”'~QP¥’²‘`|¾Ì+§g¡HSqD'ß÷ß„‹)}Ïi ®û9…[ö‘dNâ8i5N;èïZ€ÅÖìkmÜù0N: D"°—FÄ_¬·¯ö' üŒð´ðåˉñk3ç†4ôc‡Û¨Ð-ã}U«ìbOëÔÁ³†ß®èJñ4âÏÛíBÃx¯ßó‹.Mç aƒ­Øñer…‰”ÐýWQÄ mxC¢n2…²ùÅȉåðš4½—Úš`ÇÚe€ÊvT±îÎ帬¡f«V.kI¥U~Ø?­p/À–*¡¤¦û¬´5Es9±fìnuaÁØ``…[U.ÀSázØri²(£Câ òq ?ƒeAó7`²‡|ÇßÊÚõÆ#—™~¼&æ<"îY+9©®©_Ž¿ÍDp¥°S}/3Pý©!åê Ö*k¹U?—à4RlröF©á{µÚfÄ1³ˆu’øNé°Nm/KG¤1äaæ#ñD40ðÜoÞJ3±ñ:á¡tŸ|ÉËÆ¥û± /Ö¾‚³‡¶Þ <|_Ótµø®Kì]„‚4»ûgÒÈ4öz0ߤ Jmõ=ªhõ šl’޹Á&ƒ0gÍ: ”eë>( ·ä¢Û2ñŽŽ:àWpE§±5‹Éƒ¯é£Šì$;gÍdcRî!­Þ´lÛ(&-Û÷8îßÜð ³ù¤ó; Gè=†hêºß0ÞñÌ¡ëàS¯²SõÍ!F¿2=y›9«6÷# ý˜ò¼o9f~ºÅ1šyEFÁQIÃL2ÞóádLéÔ[ø>¢×"ˆ÷°Æ‰jŸÖÈŸùÞkTiïþýÆç»–°£rb×_ÜGÒ]Æ´”Å5A@£‰"Lß«•þÃг°Ï¹ÏgdZwåíY…;/Ñ UÕÂÇz)Ã}Jyÿ{$g…U#âö ?ØgzLôSRiLb# ’$W Mªéñf‚…0=A|q,qû†iµîo59t×ËpfÝç´HèòŸ„KxÎü­7çbã¤J\I>tÖ¤q Ó¾1`$Ã}hþ2³kVRðÚk¿r§oΓ75¸@Ìa–Ž3‚¸îŠÁ}>e´üŽXÜÛ3ƒ‚çßßWEËHc‰þÂî3VfkíÂtV2žJ‹vȆê,˜ {šð‹‚+áF‡T5j[Ø@Žâöxn(ßõ úQ ¸qdaªÝ¹n¸¼h#H*¥ðC|7ë¤Ù°&p­ç¼.e./¹žt@E:øXìûq×0ry”•fñ vŠõ/ö$uÌn{Ø'M°©»È9Þæ°|⸟áNÚGê!¡Î $fÇ1â ô6äç@²XßAϽ)þŠÐ|hÈ+:·Þ33:e1æâ1”úÿxYÝY#l\–(~вzSi­Ú"ÇíÄL²ÉUmÒå¹jùõa¬¾9W‰EÁ\ᴠѨŒYR§L5æ2¼—óo©Õ{‘+)¿s2"°s08ÆY‰HI°¸rz.-€º_8’A/’¤cù]ÝsTûÀ»$o’z³lïMGŽ?ŒïÑ\ò%ûF ø'ìŽ5*<áwžÂ2gèGFiï &þ> ƒb‘Å:ÍGUv»fNŽ÷™nËÏOý6{\à|Ï ƒÌãˆzB(ŸÆ É6øûJ ô±s¸ý«¹õÊ®úǶ+°cË—œÐíÞnz³#­LÅ÷ÛˆSçà¨@ñ_#õ¼nív©-Ìi ¹È°ùfš8‹B;Õ"ë튽D2€Á2/9mÄ0=×/ø:Ù4¼P<«óˆ³}= %¡·‡,›0hô¥ÕŠ-æXàU|™uBT÷í«f=þ+Ïî¡ w_ŒËea?Sª¡ÿpbø¼–¶,ä$KßM‘ú~¹ S–?ÌøF ½¬<±âŽxrSl#I@ªÖñ˜M滉ƒ -º¯¬(V(íôHjJéÆ~Luº×A˜1™ÙÅã/Â$ºn%jC‰¨¼©>i,ªZ·m ²0mƒ~éÞ.áSƒXOâ¡914d*$®¥µ™.m$ñ×(¡¤, ;ø.œ^49'»8òÚ¼^vÇÔöÕ¨3ª0ò&ø:à­å/eÓ#ÌÅ`n3Ù§ê†ÌË_y_98Fïl²åºèeìö¿ Q4-ÅW…¼* ô*ï¢ëSÙŠñ˜—xÅz¹'¯Ø0޼ Ù÷¿Ú,jºÂYû_×`élf !´pm7’Hư°C¾2ìš,¥ÚY®¦B¥`7Èœ.æQ'nZ¿÷Y„M5ÀÜCߋϰ•ÇÌ„P®çmnð©FF\MÇQ< —æö—KòÖL“‰˜òÂ0}Ó¶i÷+qlô¯>³ÜÇMÚúз^­idnqôe8ňŒâŒìŒØ6¶à õŸÃg”ˆJ`ÔV±¬ëàÙPÛ¤•QÍ?0ÅFAŒÃîMüF\_jum¯d‹´%FïÝç䳯ïýЈZÐÐÐ|t¢;9Ûûí]â§‹Ñ €˜ïÀX9œ„wwÓ$w[é«åÆ)'­17€ýî³ßÿHvkmDÜÆŒp~ Ôî[q´ {w¬Rö¿‹“¶ÿc¶É<‡üÿw€çÐ~eQ5*ûýøB4ô¡SôÝ|ùd¿wíà ,—ØÛÞ=É3ï@ñÖ¦2+ ss/ÑB¿Ö̀׃@êbkFÄ @ôŠ(” dâö~t1ãŒ/œÞAðr ‘¼˜tÜj'I¤7}Øk7æõÂé=‚g4WåÑ4ñ<ï)vG-‹`¡Îyf´؈–'U„‰HæÝbª’9²íæ9ÒôBãz)· {] [`À†ŽÅõ8…"ä³Å,U´ÄFé³ ÈÐC9õ‘¦£Â–3"-zµp·ÁO›Ã÷”£Ò–ÞHÒ)Öâà ‘„Ù;sÿvØÌ|Ÿÿ†]»ûÎNÝÕïÐèô±þ-6À…“¥º3Ãkx»î@PQv‚PÑÃÑçÍ%¸d׋ùüCeøÔ ¬•ßÜE®¤w,A#+FšñõëqF¶ð^ž/ˆ¾´w‹œç˜ËI-s$gÕ#PÂþÃRE—Ôœ¡J³ që ±ƒ!L’ý -8&Úµéõ®TÜ´d§.<€kaƃò+7ËsFŠ7«[Mæ_T÷i* æL‡©[þ"ó¶NTÚk|d•<{̬š؃uËÏzüHÄ8tIv1q==”H©ƒ—Žo[Osi§â¸9ˆ›±„¬Q˜dÄÀóY'h®ÚJ¤²~Á7¤µ!­¼<#¡øJù,¨ê‹gO7µãýÀÂÝl÷¸|haÚ¶²U¼aÐ<ŽÊhgêDå_€›ä±âïb…=êå¨JìðÊM,-Œ­nõ¼9Q‘ÑÅsvic¹ŠRz>³~Âú+ç=#l'. 2ìzCþMFÀ¼ÉþØ[v|%3]ùHhÿ: Ï¢OõÆŽ†æ›d”Nc*zcþ6î× ê–uygn³CÎ š›ÅS¯S°…´ÝpÞBûEª˜ê,Q0üòpÙ †ܹ¸ùãæ9¢®îµ»öH0õŸ—™´ï»ýæVy9ƒÅ·÷›"¢©—àóêSkG‹c‰Ç†/ªÅQ¼Àøœ©ºÒƒ¦w0À©ßr¥ÖÅátö°D:ÚûuHÇÊ­D# sËl_šú­÷¬¼ÄFPÒ,qsBñEä;ñnýHY&ð/æÍÞwæ¢Ù ž­Í•4ËÐSƒˆ#Žš&<[œÀÙQD}t©z§EÙ]­B÷g 7™L|gЍ†Îé‘î],\g“¾|dibix ‘2âUW¾ahÿU1fÍ@Km+¿y#ûOhUŠîòÉ'ÿŒ3…a/¼J1NšÓ\Ô „Z9]vUgИ™Ÿ\/~O(ήO‡\>d+¯G`§ˆ<Úíµ{t\T¢¢*oÐ×ö}á ø&Ët¤)Þœ€¾#ÐyvÎ,™@5ëTÀcå«`UÃ)Ùú€½¬xÙmcÄYÒAïw,3«©40 Œ±QE‰yPQtDp_æAóãÎod #3±(·¢ºœÝ³Tö7Ø Zœ·"[B5œ¡Ñ Bš5ãÇ\¶¿þ]ŸÌ¶¹‡Å jÖkæ¡Ûø‡íkÙ³‡sü;„<Œ‡á²É±Øã;< ÕƒÍ¼4E^ØÃ7˜üóùä*‰lX픲p¥­ÁŠb<­bä¦ì½Šã÷ EÚJ¿CmfPløŸã¬C¢î‰^/ŒÚÕ¨gÚ‰˜’«¡b?ðà|Šzò–’®wÝI¨&Xt»‡PÀ˜0ÀDA¬©À[—›Ñ%$8)0š‡f@âún*¿íŒû‡»5U ’Æ5Ú·œiv{–ædô`„a.ö› #WCAŽ’4› ²Ö/½:2žëË $ÿ6•­»lGU'ŒÖ®üNÛªÌ>O€F]­¨_Z½þrÊ)Ý”·.-·ah.[3÷Cjë ³å»§7ËZދ׬ØßŽñFÅ-<œoMä©Ý8³ƒž¨ëÙí¿ì:žóþuùAǺ:±¯Ç;²ÀøPžSY±Åâ›Ì0bî6ˆìì—æ×}c˜òŒ¸ÎòxܲãŽ5û:3ȃ_‡^?‡Šs¬Mxð"‘žª¬…h>듲Œ·Øªþ©Æ¦—6c¥cÇÆäáÓuzRý@-݃T¤ÅVþ©¹…`õå¾p,>/f}JŒK,½(R7”ûÞ "º7<Ÿ6úöÝŒ,6á>¬…7.Æúá,õ¦Å[î…vSŒ5†™6:‘ÀƒÜäc½„‰Ѽ»½ihæ zgw7탲í«ó“®³Å·žw~xµ¨ÂIyÑQëK‹¸Ð2_„ú ä¢ ÜÐB0µâõ·Æ¬g’_ioèpª¿›–4»÷Å)Ý|2(´Ô˜€g2É[2…ˆ#41ó¦8u*Ê¥Hb'J׌•ñz–Ì`š³õ1ëJ+U!Tm“ZrªfcãÁi¢\«éÐÒJí³1÷ý> Nû2)%z ÉèÃËál'HŒÚѱ«/ie‚}Þ+ÖâÇ æ@P j~Ƚ‡ 640v`ÍIÍ—¢JLÑýLJ*-¨Ì‘AV¼ ‰8š âxo:~Εӷpã_¯KHò¢ñÝ@«€>þ\¢Ð(Pÿ0U^+«§¬XÓS©T&4¥ï$²„¯*Ò¬û5@A.ª,#@a´_ÀA™xìIÖDë6¥Sâ3q7èð-è)ö0éðƒ¿ ÓDÁc­ÚNžà Vãµq÷ ?Z;4…™ úòr†‘‘Md§D#6®¦É ?e=§ûŽó¨&ó+D¬f0÷è+J÷§Óg ‚…dÃ!ÒAPok7U¤â ÂøÃ¬ˆôŽ äîžUJ2vÿxäèú›/‡éi±ŽoŽÿD'Yþ‰ô›Ûo™ÅËç1žðß8åjG’Ú¦Prrdz³ýÞÆã]§ýh:>í =£¬&tw›-ëe/UÉ\¨¬Øe`2¯‚÷’øñ¡]m‡#(¸#UíéZoÔÉiPá¢Ô’ÿ¯W7ëÍb]–èy¯òkÿr„jÖ™¬û-»Ä:š; óý} _5ÙÇDØÃ®ü§éOÔÁær,c['zÍâ»ül'_a#‘„Ê@Ÿ©YʬÝF… öL›;5FFãuNà£OoÇÒá!%©:t*<5Y@RO~MXÏD:~:ü@/ˆa’ ÖÉmTÚ´wÅåáÀínI Uχå]19ÇêedÒC›uÕ¼ÑÅä(\N†úC¥¡ž¥»ÈËzÓ@€Èvó.zþj>ñÁǼq\æ{”Ô=¸5HbÁ½VǽLdª"Bnû¾Öot0 ÂéSàŸ`Q§ªÀ¬ñ#'Ÿ‘†kš›ÙÅ‹YœÉ9£hŒÔ_ùçHõÂ’y½–}û²ÝÔÿ/önçÅÌ,BÛ}¬ ÀÏj|±VÊéö`¦š%+þuЫ§;ºWoI(¬ºúËÆ¿Ô-P4y]«òÔÚƒ\íOgËþrÉ€ÔÄ‹ŒF”†ÆÄSDÎôe} ºáVX'cu˜)ÂpÏÒš¸:. DäiU<¼96«6„•ûu?‚Gþžyó‚óǯS23i^;ÝŸW-©G{‘ã¶•vŽÀm‰z§6%5©»cŒ³yr¯é…s«Ý¾bž..è tÍG ô  »!Iü³’ë€ýJÊñ|¼Än®ÿeè66¢I½C‚”í{^Œ­cq}Oìï%_´å•à«Yø.øñYÓDb·¢œ]+•<ïK³SG8ÚtÎýˆAcùÁ‹L$Åk±3ë=“D‘Œ·…Å Y8®°½iŸµÜXÁùʸêpç»bð†_%;PÏX9°~EŒœß›\» Xg'E†‰ßðLèBàØÊ˱ ß`Õ"S‘9òÞl„´pˆv&©+Ë#|$† ž¡àÁYBŒûé·¼tøØÔÐZQ†FQ8Ê"W·Ö—€³ nå!òŽðÐ`Ž´Çzž‹yXÚÂK<jŤeþ,@ÆÅžCC¢œþoií Ö\´kˆË%M”U†2›Î•Â:Å„tê±âÈŒÍ[g&ª¢Oïl|‘44Û1îþo¢Mv 3ó.ëL 7Þ”×›BBeïÖ_õô.Î#º›JiÄ©ƒúÅ~ÃþÁ9-¿Ú>qµ`I²Ó’ñ—.>]W‚%üè~õu' ˜¶»ã”waµT žŸä˜f¬Ií—Žay„ ×î¯@fõ᪗ÈÂ8š²¢—Ií8š$²‰bšd˜ýTçw—º¶eQYx€!pªMV NPôÐãx{Æo%Ûá) ø­•™œ²‰6¬x»‘ã€``.™j˪1Xýn4ým¡-Ï1ÁÓ’"e‚?$w•xõæÄ¹ûË‹÷PëwéX½qGLîa¼1K„Q5F†ÇjÛF¿ãôÄ ÕY¡ù(Dì7©ÃÿbŸ±9f`W’ˆ"gŒúx+—ŒêkñCsÅü'Ä2½/8OaL Hº(…uZcjÙ´wáHÕ±y^íI}厖L|» ª¶Š…­<Ž;&!}lÜMI6¦ÀzL+ax¢Pñ; ,JбŠaj ñcöZTÞ2¢Ò±hv_¡ª!^.Š úõ~~ž~,©i\y…bØ®FÙ×çÁßÿ\z„Hƒ]ÒœËBû©v®àÙ%›ó­¹p‰G憎ëh;œc´(¶t&¹1G^“A¬°»ÕhâVïìÿ|7¹*W³n|7TlÑPÁr75!‹$1¨ŠÌ7¨BÂëIx].?æFŸýDÌè‹A+m8PÔd—d”cýÑUÜÌj )Ö<ÿg´¥˜pºUwü¡ÉÊʘáðLš ÉÊGõQÖΤðŽ_óÞT¹f&+˜åφ#\Ó¤$1|ºù5´½¤«Ô ŽRâ§)IV71Q¸Æ8Åíã&ËX(½CþRÀwïš¹'Bµ|Ê—ïÊ=„~¢gÍçÿjÉ|œÚ ÔgQxYpËñµ²ž€ã®—(S=z?&È22óû,”cãõ[ˆ*ãðåGÙAUd“’Ša-5²žÿA fqoÏ{lm ÚÆ™” äUúæÚ_§Kÿ~F›VÕä¸<75É}ÀP¿¾Â¸­&¾çO9v‹ќ–隇ݕ<ÓtFR«¦ Ê*2Ða©'þɈGJª…å?–-ê“(_ò3%ZLdD©`-¾qÃü<ªÎëòÔN|ÝOkÚ®ÚÞ±¡´Dä벌¨^û‡“³ 85Ⱦ¦›r8„j† òê ‡Ð×+JìLßP6MêEV=KâØ§(šÖ%ä=‡¬µU"uî‰WP=lí‡Ëo€Œù#6ñ•,4ð“ýa ØHYÇ:Žƒu¡F` Õ®O-c5…˜.o>'Ήv’5½Ü1L1ÀÁ Ç|ægv+Z¶.—¶ë¶¬Ýñ][ª(ŸUϪ€YõPwÚûü*áPßk×íký¯¿ísý®µÔý®íj_ÚÛû[ÿ5çöºþÖ°÷–ÓCÈ8‡ ^rËÞ7°ïÒN„É MPr47%3_,¨û>ƒàù Xì9ØfÂê;‰˜¾’9þQ “˜B;ü\…¢ªÑ“2n§õð¿0¿cýŒƒÏ5;«8ÍýëžHW¼L7ùž7l&LÀñGÒÅcƒH%‹ß¾ áƒ`ð«$ÄÀ$š»–ù‰åìp'‚Nй(QG a(Ós÷,Aí+âêµ±\óÇ¡9ÊÄ‘>0aѤ㨒ê^’,“ mÌm<¤OÚZqq%ø+ô{aÖx6Á²!O¡Ä³5¸§=g2´óZð­·æÊG|0(³uç1 ¤^Yüw”„|v>@4ÕØ÷ꌖ¤ñ"tûeé'×ca4¬Æ¯a%†ŒY™Qˆ®ŒÔ¯?¨%/›»‚ha"öŠÒ[Nf¥ÆK}BŠ¡ƒá*«ã¹R¨~ž6!ä7žY:þ-ø–7i0K knT³×ñ Ж™<ü­W®½ð € Z]×%k9Ùî‹KUлkD„_}»s'ÍkBã5ê‹ÍÆÜyçÔ¬=’1Bœ ?BúÒ"è€f:¬gdȵ ËÄíâ“|†ŸÞ¬6”ÎíéT;Ó>Ðß0£ÏÜP7È‚ìËîcf(’µ/À¶ÒRògÐøU(Ã{‰Ègë ÒøKcßP–§ñ5ðZ‰wÈ3.Šiï¹ùe’äÛìfšKGžeekëcúÀoÊj>X•9& Cnº,ºñgÅP”âôi–¨?hGQ™ ‰¯üÒxÞQÿX81>"r× '£Öüá ^ø‚5L 6}¡,ïunÎSSæ½ÉIÍÑFðqýÏS<è‡óEð¡å0=•ûê³ hªŽè[÷‚rQ_'¤¡“åò7‘ŸÀµ+-÷N3Ìì¼V´Çå8ž±o¥:äªsL]±èò<9 ›¡è È! IÎ(1Ž[Ùq ðYoÇnë´OWÐ×7®pâä6žÇ%ˈæéB›øüW'½IšV ²‹`‘¯1¬¬&¢ˆ\TÞ6BÉô¡ ŠŒFŸhFcö`z‰W<ÛÍO^a¹ÕXåvÆAø-†¯Ö9!§8=EãUÍ’O›qF®b¯&C‹±Vy[Oœ´-êˆÒ˜ÖvHªƒÓ÷–÷ÝB º•ibB´½È övÓ¿-¡;ñ~.…÷:Ó¢./» 9ƒ¼Ž5"†ÞR÷/ß¹ª£Bü5ý+Ðø«ª_ÕB£ ÆD¥›Æ×ïË>xejƒj´!bÇ¥ÚN‘ ~KäA¶Œ«EÝ}iNnµÊ¥aò%>àIœÇ­; Ù]zÓ&T& â³—óã–òÙŸï’Œ6èO Qo…¶SRâ™m©˜VöüÊ &æpÙçÉú˜> ‰çjVø?ÑÍߌˆ¥mMIn¾Q 9“¦‹ g¨•ó  àÜü:sÆ%„˜­ ËÞk°MëÔ´lí¾ÈÓPj“éîIŸ<<í´[ñ¢ûQî]n´Cò=`. ð°þ¯¦Å•–ucðáêI0+’­' kP©¨6ኵ‘t'ÀJòM‰ ¬_Knè€f:·£ÎÍn{ ó—h.MP}1«ßK`fìißñThÃ{Op ¨`a¦Á˜Ï4¦áAš4>•m`H:O=¥¾0á +¬¦´ÎüBô9˜zïªå4‹AŽSÂa3š}]¸ÂHïÇ®¸ºé¡J :=¨ HR¼ïÈY9¸/Ýç·>›tf”vDÅ?ÍÔ®s‰snûdœ×K1JëEý”ù°¾Fû–ºY›¹lã"³…ÁfFȽˆsò[\ô»H×4_@´([Í2;‚´Ip³¯T¯€½;£E#ñ… æ2ë _ÏûÍ©‰õÚ¸ “55½«û Ä‚œTÞ²*&z¿3”ÄŸê…­-m…é!©Ä¥Õ¼õk1¨õäƒñB“ÞÕ¶pã/ížýš*ô¦{áì”îÅyçÊ“ºG°k3~àð#©üã E‡6·L‘‡{E¢Çf}~‡ä%aSTî%FlÊæ+ørÅGg C6ãÄ{h›,^=ãrEbMÖ‚ÏÿBÅuŸD”¼Si-ÿKÊœ¶—œ&¨¡¸Îôøaè(|œå€÷­ÌÕþî™àŒ´ØdržÊá›)çÕßþEB!‚¨Öã Y‹X…‰åÞK}ÇÓ2Î?ßÊœyÚ+´nR¦ô’sB–Ùd÷‘d%ˆqlª¡‰RÕ?œÞ‰’öt¼ï<à ·ØvÃõ)wCÿ‚2uˆáàãÔ‹CJ@ZTsöÏ…K®aÒˆ €ß݉O+P:µ±8õãp¼Cj:Qâǘst53;×Ýò_ÐGõÇQ¯Š§.ü]'ºµÿ[…ótç…@bŠ\æ¾B#“Z(ÿu …žôXtùB®£6 | Jz*/p$^·4jw@!ód› åYÑH7–· ú{¥»˜ñ¦…!¡†‡Ñ|zv»ŽÆþ*{ÊÝá-—^@ Zž²ÀÒb óææøÈ¤gŒ»?ýD«y7Ùü¼v«8â¾öÄ;‰Åžluü7♦5r'ȵîbÆÖM#.pz³­ï'üùkÞ.G|€7|ÝUhxÏüSžwä«ñí{8™·Hê£Xä–_bexb,÷ ì“5*›û—ÔÅ„²ª!Z•<Õõ;ºŽR ½Z½Xz÷bÑâ xð,6Òã«Tr)3×M3¼¿ §¸²#>÷ ¾o53ÅZþì0¥RÇ>õ.#F6‡ÇãÃXñ/—§Ñi(²'¬Þ÷^gêç!™K óXîÛÊm<ÁÊk³—‘†ª´é«pbÑôµÉ¢aûûO–›$Ò¤‹Ì5Ÿm)hÌ×1þ9 B*n7úá šQw ô¥F ÎÐWärX{ºß-Þ¿Ti÷Í~`“ŠËÊ;•×õ~k ŒËhh‡""twæoŸãÊ=ˆYL™ÓéÂ^é·«$k/ÛÆ]Äe—etqœ / Sªìü¡Žâ†ÝŒ51 ¸Š ¿7l.üð…ÁÖŽ:c̽pµå*skÖEÁLC,(]õ%épjÞoãÀlxš÷¾[R…½H„ùκèHIJPÌa;€€S`ØPww±•ÇL Düå÷Onc5b…âõ¼|R£×õÕRŒO6­óÓ2÷ê„ɾïÊy¾[wVãiBRƒÜ6‚¢U°@2ðÛûØ"U„@ðÞf„"`L¨%æ6B&µ ÐÒ`c·eÖÑL+’w¤_ÿy·ËÉr£†JŠÊÜßRÛ’ô=…ç…W×RØ,õ•÷›q—ô²Ö²ÏnM‹öëªGÜ×U¿‹b.¾!ìNƒ!Sàüoõühç!c‚ÙÖV#Rðb,‘ËŠ€ÿhò5Có­ôá¼jcŒ¸‰@NaÔ©\8R…l®øÏ5OedÖR[®1BT+D ßC[2~ fÿ)QPI†ÒJ¶ƒ=ì”V¹·?šœ¨•µÿz–Hä Èèéú>À µúeÀ ‡½l#á×Ñcõoñíx{BZQúz­BÌ'ñ2šH‹ÈèжKùÀ2þ1Hkø17åéXº4e%Yß?òeÖqж«Þf†<Ê"˜kýb© ‡½ÆªR/ëø[]U^©¨îü3Ь­“Húdø`K1j+’÷:»ŒÐÌéŸ<ÖNÚ&ŒGzbMd‰uÃ9ÕUÐôZ ‡>êñ/nÊûÜ’Ê}rAÖË߆®Ë™~'zl’à½yüÔÔEhdΊ«Ù¤ªRâØiðKRŒ|Ta³­pÑ;­÷¡…óŒÀóõ³*Ö„œ*‘4©Ý~-òj²^3õ[Û):gƒÄ5èc~xhÍóï;·‰œ–¹×.zYm’­B7Z†árßÛÖ4übNC7øařЀìv\½yƒ” ¦CZ,’òÎIÄ‚]í„nUýÏ¿ä§5+¢4°„’Dú‡øÅ¶X4†,X7‡âŸº÷´jz”!žÖ°©Ö?ÿÙicnV BþffSuperCollider-3.6.3-Source-linux~repack/icons/sc_ide_128.png0000664000175000017500000001632212106676016022020 0ustar dandan‰PNG  IHDR€€Ã>aËtEXtSoftwareAdobe ImageReadyqÉe<tIDATxÚìY“ŶÇ7"ÇVq@QZAD™gév%ÅÀƒðAЗû¢W>×O >ž'ðí^_ÄðÁ¸¡´á@8oCeR¡QÄdRÁ“¿:{ižÌ\«jWO¸3"£v÷®ª]•ëŸký×Ê•™F§tJ§tJ§tJ§tJ§tJ§ü½Ê˜“úåÆŒév¿6þüóÏ©ò9RúÝ5Ûå³TwM#¼Œ;v®;ÌuÂZÔpOÍ?Ñ×È[îØ§êüÑ8räHqtl¾8:¯¨ƒàF>÷ã?¾ð·À…^Øí¿º.‚ç´&¤¨"p¿ºß*ŽÇŽK _ÎI ~ûí·¢ò}Dqåž={úÿ6˜EÄÂg9‡ ˜Î9çœâ3G\Üãðáý{÷;ß¼ˆÔ©u¨cÇŽ-¸ Ç2 €lÙ²¥9jàÈZéž¹»õÖ[kéõð†‹.º¨4•ÏD„ûûî»ï¾+@áܳ¢ (Ú©Âk&L˜PZlܸ±9âpÍ5×”þܹssæÌ1÷ðXІF>}zA Y…\漟~ú©ñí·ß6¾ùæ›ÆJ’üspa X•Á—_~Ù±¸öÚk»Ü ~jeûØÄ;î¸ã„kçZ,L‡,¬CÈÖ{†Í›77œß^D-Ïžƒà¹!Š%¼ƒyŸþym.â¸:à^d]áßÿýEаd‰æÉgŠøÔ~¥÷ t§m “!Âá\¹F«¹ó,÷8ûì³×_}ñÎ>7Q+€à 3|öðý8C4ӂW—ÌÆÖu#ÇÚW»»/V¬‚ü%K–4Î;ï¼ÿ¸ ÌÅÝwß]D¹WØëü¿­ßµsž“3uêÔBˆ¿üòK6"¾ŸP¯ ‡†ö»hòäÉ]ßÿýÿ°`Á†q_±öüeË–/\&ÜŠª¿ñÆ Ý®oWýç¾ûõ×_ÎN7öìÙS*ìŒ9»øâ‹ËxüñÇk‡ .ìnÙ}•ôIχ™[-4Ìí·ßÞ˜2eÊ ¼0¸Úp¶º0²œxWøÑ@ ç}ðÁm"žÒ6‚ÆŒYí¸‹‡ÎUÆâ—.]Êøÿ‰i¬ú×Ð#}ôÑ¢÷[ìzÝö¾>1iÒ¤Æ-·ÜR€=÷Žò7GÀ²cÇŽâz­=isÚ~X5€{ÁgÿÎäQË}÷Ýǘ€9ˆÂÀ$«Žž+~7G$5fçQ߸w0üýû÷Ç:´$qçÎæ@æÐ˪÷Þ{ï…!Àm·Ý#5©~w..¢9XBϹüòË+«`!fTØ:vµŠæ€¥Ú¾}{£¿¿¿ kUÁÀ}‚µ Д°Œ‘Âyï¼óN%SPÙ t*È”Ð1mÚ´"®/Ì8æÖ‰Íƒ ÞtÓM'ì}ÈžµŠºÅ³Ž!U\ÄXõŸKþ–Ïb†ë.(@@ˆÛ¶m+mBÄô}õÕWEzY®(„£ÑXX)]--üði€ÞÞÞžV´/[ˆtaÃ!7âñçïºë®â…µ^/Éòb ôdŠYä ÝR1Ÿ|òIcÓ¦M¥I#&fãÆ´6Ä,žQÂuëÖõ IÀõêWðG5Ÿõ(zcë³¾>f‚A ‹O.‚€XâÓëý”°XTΚÌaIÐh)ìôÀÀ@k<aÂG~þùç” ÿÒN,´‡!>0×i¦:î¹çž®±ÿKc©óçÏ/ì~.°#µ/ – / Xˆ Ñ ¡€,ÉZ˜ÖÉÐ5€øá‡þÒ«s`à:´ÀÑ‚`ðH+ÄPió‹Ü³l/›?0®‚íÖâï#Tß®IrDÈfΜy‚ðY\-Ác20í¨òvMð<"“o¼ñF‹›ˆÙ¢wcëS¡b¹Ž(´ï¬d³fÐ4ÀâÅ‹W¸‡[¡©#l9Ä)DvˆpT@±†]Qùô|T•jŠv¯—¿ÎUW]u´„–‰j:tè/sbZ@®Ã«QÚ¾kúôéÛË$Œ+Ùû·?iÉ!»õÓ¤ÿ·W¸¯„«ôòØýåù,ž‚USðNYç››¼4ÃË€ §1q#%Z)—Ñf ðàƒö¸úÍöß{ï½RµAn¸áã×zÊYgõ—pk/õgûøiÛ<'=R¹7.—ŠdP¦jQ@îEì@ã4Tžs¶SlàHÜÉLíž1cÆ«›7oþ¾V `éýJ’8s>.6á7Bª§Ðë’ßCs¾»¯šQ¯B¨<G?0Äÿ8Ê÷ÃgÌ ‚a`2VFÓÀkøýõë׫Žw0D"Ãq¿-y¢©˜B¥°–ÂÊÚ4À²eˈ;ÿ¯fûÉç—%¥æÂ… ÿ#õ+ç2•aùjß¾}…-sR=,õ?É= Gn†z}¦¯y7žCr sÚ€÷±žï·'¿ 0YtÏš5ëŸ7nH.ˆ=Køœü½hÑ¢Bóiæ3 àÍ”BÃháCµ˜€åË—3Ô»ÆBþüLט;rQ‹š»ç#_«DÔB•øzJ½[U¿å€,ü£™'ÀŒ)¤9wW®×¦¢3(EGRd2Ói¬¿øâ‹#miw£¥šðÉÆ…чhõQK£¶µŽ¹§z»ß+Q­[·n=1?ÖcËöð˜vˆ]#qz­?F‘ÒT¼»„ºsïfÉ¥†I.!$ƒXÚ6p7Y¤bY,¾¿-Ñ»œ¿-$ÇÂòéù_˜}hÃcö?fã­œ õ=óq±Í Ÿ‘¹¹÷—QÑX^¡ßžÀ¶%Ê"X°Ô€Z…Àê¤FüìÞáCí2¬ZE‹JöÄ&±vzf,u¿¨Ð°}†r#ˆ2nÄ9 ž/—UŒö3¤Ž-ÕÜÁ,xâ‰'æº{&çr ÖïÏeÀbÿ°ÿš+„`4׊†a8Uür‹ ǦÂÜ ™9 ;ꃟÊ}%n`å ‚QOî­ ób*™O qLI®Mý€SF>§ÍŸ?ÿÕO?ýôûJÀ½ØÜª½ßwýPUšzû©%k öEË©~_fE=s¾ŒÂåŠx Ðpf¸·ÌLúì³Ï²ïIg É@渀ÄIRm*XÆF26«@µÿ¨öX´ÏG¬0ÿœú—Ù5¹¸;½–†ó…ŸRÕÜÏ1àâh|ì¹d,Žâ¨w'¦ Åah3@¬MD«¤ÚSÚ›A'ƒÈò ê,ÇRixzGHþžpµÁŠP4aHÆŽôúv‹Ø^ÿ·R|ƒ`Q___–Ä„843>b<@ qº+“@wóžÜ÷±L•ð°y–äKm”ûL4-Æâ}ÁpÞûï¿_|®0?™¥Ã½à þ3Å´aÖͽ)l2X”‹YhZò©ä öTŠ<õÔSÝšŸ)sÚÂ'à ¾ÄìSïÅ9Ü Â˜ÒŽ2],äVþ;bÛám—&¢ÇhêÁi#k¸;)F.÷&ÎÎ9» uã|Þ.C¶ U&±„¦s¢ŒúÞ@ ±áãZ²‚Ý‹LÕ.öÇõc*Jòír/(9!0|µ‰»#Ç[¢zší—,ãî¿r?T*~z® e8×n_ñþh -kYžWã¾V µ€t ¥L BNiI`Ô\À0G.¬7ü óëcEز/p4T„‚†ÐÀÄ÷â†QAI;Ó4[8“)ÖVÜCΓv´a3>*cZ œ”™zÁ ,«,ਫ਼VÌ‚…ÿ ™r#…Ü Â˜üÒ\ÁX' Û|PL€å¦"ìØùÖ‰“þ`¬ ãÖ†wµ‚P鵡°cZáj±É6ÎE¹OöM%ÅÝo[¿“ùÿ6ø1OÀç9W'F–bCÄ©¸¿e•nv¬Æ¦mÅà?wÌC‘ÀOÊ´dE§¼€Ô¼‹:I YhƒA9O@3’š„±@Æü5-`Yÿß'`9Ó”{·”ðÛG[1MLí°j€*5 ÖÃcµík€,¾?Ïcå¸ZAµ‡Ï>.šöîš©ôÃë1™„žAè/«‡ô5S/˜J ”È™ iƒ±s^L ø@ÒË5/Ä4€<Ÿl+“›f†ûªÅIwníA£ 诀ífíÏX mVL „/èÏúIÅÍ ˜yÓfôh…`£u)M`YâMkPÆ. §¹\Y_Hso5¨ ;H¢l@Oa< 5½Ù2囆÷*±#ÝŠÈ[NÝTËöÙ°aC‘¡K°GgD˜¤–£ú-É#vÎå 2x¥…¸ýù€9.áBÇ ÍŠÅ¡ýíR,K­ÑØP½ 1ËùÜ•,…±4ŠÛ?jÕ.‹=å’RE俆ó cm%÷Oi™ÌªÖò&ÀÝTåŒv1ô™ÊYã³L{N½ ö—ïýÞš†N圔Íå·hŒ·sK†“±Ýþ$ÓP’0ç/æÞÆ8@¨µõ“ PH ¶07V-/[¦Í6YVÖH™2`%' ’éWƒU ~¬þ©¥ “¬ÙÌŽEýû¿XT1‡v¼òé§Ÿî×2MP£Ú|@ßGO½¨¿¾jv “JµL>[È`•‚&{÷ÝwMó In.£¬¦©8Šß¦ág*C“²¬”èPÝ—Ë)K EúZ ŒvÅÀÀKXN@»øÖ¹‰ÖðpYá#´œêçYÍÅÿýÉ-Z˜\jU_ Ë ”¾ÊI¡î‡T"ˆê“CÃeL¸aÔÑÏ IÙNÆêYpÁ2Õ ‚e‰XÔ>y†~êUÎáÜð}CNûפ‚ÏÈÜ€TÀùšúÏ@‹x«¡ìò p5-  A&ÅÆ§ÂHÖ6V›³'¡Xk (Ö뙄ãÏ­*⃎œDéÙ¹ù aïµ ž¶ù„®¼UîæêjSþ2g9- ²‹Ä2w“/p±8ÏÒ#lO®¡ùøÜ—ÜB™ÊmYüðCsCãJ d’‡EÍ[€AÁ~#xYºÅºûˆïåÔ?í⯵ʤ÷v1©ÿÂ,[Nzùå—,_¾|&›ä–‹Á¦'†YC±,">@jéÔ»ì®iYX‰Á%™Éë¯QûÇØÿ¸Á(YƒÐºz¸<‹ÜG[³ÇsÇj~aÓLÉÈÔ5Ë–-û¿Ú4@K ¼¨EÑdÝøsìbš²ˆÐLõºë®;œ)³¦?¿#{ñ[¾=Oõv!wœƒÍŽ­þ~Ê<‰KiÉûCsQµ5–q}N¿d•k©=ƒ^{íµu eÁ|ôÞÞÞì¶hBŽP©²¨’¶ï+~°¸R•Ý¿r)Ù+¯²‘„—,;ž!`6ÆôW!Ii¹Gy¤ÐlÚàÏ’%KzÛÎJh—*{´Œ<ß»ÔôfB³áúz)  xyVÿ¨{ç:„îWÈ66–óÙZÇ'~©¶¢÷mÿKedZz×°×_}«QgQåÐ϶ðþFN!ºÙDä°ñÖ=øð»ß~ûí*U…^7hd±gÉ`¶ì%ÈJ"DPS{ KPô~mƒ‘¿Å‹_^ªS—€{˜ç4TvËÌ-#ÿÕôlëT2·ù "_\‹'”½ÞÿRß°D;å=`ü¼ƒ¶Ä-oÒÚÙ”•g¥}ÎŽ¡ê‚;„8‡ewqFYˆÛPš®cÌ«-+Xá«ÜAÝ8’hëåûym©P1ùx1Ï ¥ C°6¿eI´(³sh.P‘åï|¦>kø7,žŽ¡M§“•ÉÄ”ʪ*²¬¼wp__›Gªë¯gAåºCôãQdd­ÊžÁ\K|^[š¥ªýÇÆ£Ñdó*ësIä·|’˜Óì3`ÙDš OOOO¥­cÛÙ;Äõ䢃YÏ_‹Î…ŠQ¥"¾Ïí°‘ªdÈ$QI€@¾B,ÿÞ"t!vôZŸàùs,;žQx¯ œv,¿Ï/DFü Âp÷XUUŽmmÿî»ïš·ç…ÓZwÞbˆU²rªnÛ.Ÿ!^GÌ„?,ë÷D™B,5î Rå·ùÌê¡>ë»H£÷˪[o½õ…aeýúõjpH\C‹Âíßb›7ú."Þ„L´¬ šª®r]ê;T=®’ aûm€‰aãMã*§}îþ½íȯí$z§¾XþÓ†²•>žÃÜ u󆾙CàÍñãÇ7O†v;i+Çïn¡Ûó(¦f¼ üòíÞç¢Z6Ïè”Né”Né”Né”Né”Né”Nå_ í]^ñ«U(ÌIEND®B`‚SuperCollider-3.6.3-Source-linux~repack/icons/sc_ide_svg.scd0000664000175000017500000000332512106676016022271 0ustar dandan//SC radial icon XML(SVG) generator //Batuhan Bozkurt 2012 ( var cids, fids; var circDefs, fillDefs, uses, wrapped; var incre, incre2, decre, phase; var radFor; var w; ~circle = {|id, cx, cy, r, rotate| "".format(id, cx, cy, r, rotate) }; ~color = {|shade| "rgb(%,%,%)".format(*((shade * 255).round ! 3)); }; ~linGrad = {|id, xy1, xy2, c1, c2| "".format(id, xy1.x, xy1.y, xy2.x, xy2.y, ~color.(c1), ~color.(c2)); }; ~use = {|shape, fill| "".format(shape, fill); }; ~wrapAll = {|w, h, defs, draws| "SuperCollider Icon SVG - Batuhan Bozkurt 2012%%".format(w, h, w, h, defs, draws); }; radFor = {|cnt| (90 - (13.5 * cnt)); }; w = 100; phase = -pi; incre = -0.95; incre2 = 4.02; decre = 59; cids = 7.collect({|cnt| "circ" ++ cnt; }); fids = 7.collect({|cnt| "fcirc" ++ cnt; }); circDefs = 7.collect({|cnt| ~circle.(cids[cnt], 50, 50, radFor.(cnt) / 2, (54 * cnt) % 360); }); fillDefs = 7.collect({|cnt| ~linGrad.(fids[cnt], 50@0, 50@100, cnt.linlin(0, 6, 0, 0.3), 1); }); uses = 7.collect({|cnt| ~use.(cids[cnt], fids[cnt]); }); wrapped = ~wrapAll.(1024, 1024, circDefs.join ++ fillDefs.join, uses.join); wrapped.postln; )SuperCollider-3.6.3-Source-linux~repack/icons/sc_ide_32.png0000664000175000017500000000303012106676016021722 0ustar dandan‰PNG  IHDR szzôtEXtSoftwareAdobe ImageReadyqÉe<ºIDATxÚÔ—ÉK\YƯ¥qŒ±Œ3Š–C"ˆb‘ˆ""hî‚›€àºýütÙK7ö2½sÙ½…ªâ‡r§”ó¬}~‡w_?•F; 4]pyõîp¾ï|çœ{ï3æ?þÅüë11yæý…i777‘ŸN 99Ù/†û¯¯¯?ÈkàéŸÏ7,D£?Làùóçü‹üõÛ¾ÄÄDo¤ßmæêêÊ»4*D†vww¾‹@AAA@ ~´R‹ ¦¸¸BF ›ÓÓÓ{M<Öv‡H866¶{uu5òheeeA1ò^ãiUU•‚Ÿ™““}>yòDï[[[f{{Ûã‰*ŒK(T !ñfnn.ü Ãó঱±Ñ¤¤¤¨‡¼™œœsyyiŽŽŽÜFÍÌÌŒ™žž6â­’@‰ÔÔT%â¨ùüùó-%âîHHHø( çÏÌÌ4]]]nŒÛÚÚLvv¶ !HB#,………JrqqÑŒ›ÃÃCóíÛ7“››‹]¿¨AHk¼x±Þ—æææ¸¸¸÷OŸ>5ïÞ½Söéé馵µU #/!ÉÏÏ'LÚ^¼xaJJJŒßï7ûûûfggLj óìÙ3³··ç†‡dm®(³¼¼üç=~‘è7‘+±¥¥Å”––ª¡¦¦& Yž••å&áùù¹ª€qÆÄCU ÙÙYí£Z¤ t®¨ªcb3øòåË_%NÁõy¤ïOJJòßúúzOT <‘úààÀlnnºII*„'c¨÷öí[#Ψ Ôâ‰2$$`Y\Ÿ§¶?È ihhÐÄfK oI4I"#ªgHNœ™C¨Py„‰ä%GPRØ„8`Ý Aooo@ÓÞÞ®Èvžxi“nbbB‘siiÉÍvÖYÉB@ßÚÚš…!!Èó×ÖÖ‡B¡¨Ï‘?3äw’Ecgx‰´”Øúúº¾ŽŽš/_¾h’Aˆ'DCfH°†œœ>lòò`é–¡H¢/`"ìYʈ$úúõ«,,,( Ò¢ó‰É9ä ˜cËulICÀÙaWN‡»ÇcŒE0ŒçÊÊŠ‚!+ó ‹M>ŒZ;"`môa ‹ç*à%àìZîBkÏl¿sH™ŠŠ )Û1æ!3ëìE£LqìA°ô.$¶$ ‹©Æùbÿ£™Nu@€°A€¤³Ž`Û>½|p˜N&`¹ìBÁrcÜÊ ¹ óýôé“Îá<` ‡”-cÖc›ÍÌ)Ű«€ÈÆC ‘pL„=‹IL* --M½ÀÒ‡*”5ÎŽIÿää¤Îa³ÂÛ26!A•ñGþ&Ð××á” Àš=À*ÀbâÍÔÔ”K‚Å(ÀV!¼'d8Bø˜g«‹õŽü‘žžžÈÝp˜A$EvbE(ðàÕ«Wší”‹Š€Ì€´ìíz¢9aÁIVdǦl>Vþá{[±x9(ƒQdfÃa=x(?ÎÊ;äHV™Oc b6œ ƒj«¦¦ÆÆ? Ö=Qa6µŽ!¤ÏËËSe¯««Ó²Cfi\à ÄHÈìá…Ç„†Ê:Xÿx# ‰‡ARãöæÃÖK™ñ@ïmènSuuµ†2ïô‰ºáׯ_×aË IDATxœíݸmUÕ>ð­ v¨XØÝÝb·Ø-vaw7Š­ *ˆ¢"æ‡ú!øÙˆˆ„‚”p×üÖÙ/w°<çÂVôꟻŸgžµÏÞ{­5çxßsÌX³Ùº×º×º×º×º×º×ë5 ùªlvì±ÇÞü˜cŽyþ_ÿú×÷Ôñ³õÿ~ÇwÜ'žxâp¢?Ãð*Ï­rÞµ]çu¯âÀ*W( ·<ú裷ùË_þò#Ž8âU8üðëã õÙPß õ›¡H0œp H0ü­^uîþU^På"k»-ë^§áU@]°Ê• ÐÛ¸ÛþñÜùCùúoûÛó›ßü©Êñõÿð»ßýn¨ï†Ã;l8òÈ#‡£Ž:j$AŽe:ޝãÏëºO¯²ÞÚnãº×üU`œ¹Ê…«\ùÐC}PüÚƒ>ø£¿üå/÷ÿñ|èO~ò“£ªœø³ŸýlPêóá ƒ~ÿûßúÓŸ†"È8ÍWÊŒàû1þüç?Ÿ!cPå¸"ÂÏêÿg×=7ZÛí?ý¾÷½ï¥€Û¤À¹~iïýJ“_ùóŸÿü ?úÑöûáxè÷¿ÿýãë7'î»ï¾Cý?ì·ß~Ãÿýßÿ ¿úÕ¯Fj4à´Üà¿þõ¯‡ï|ç;Ã~ðƒ¡È4~†(Šó æá„:þªHðÒ*¨r¦µ-›ÿ/_%س0—©rã<ð¥Áï+°?[ÿäë_ÿú _þò—W}õ«_¾öµ¯ {ï½÷ðío{è44ßìhx]o(² »ì²Ëð¦7½ixö³Ÿ=<ò‘ËßøÆñZqå6Æëq®"TYUåªçsª\tþÉ×ç?ÿù³ÿïÿþïJ«oÿÓŸþô™e¾ßú?ÿó?{å+_9äsŸûÜ_wß}÷᳟ýì°Ûn» õÛa¯½öµ–¦ÓrØ àþ‡?üaøÅ/~1|÷»ßvÝu×á]ïz×ðÒ—¾txÆ3ž1<å)Ožô¤' O{ÚÓ†g>ó™ãñ1yÌðØÇ>vxÃÞ0Þù,DÕk,åjÆûp «V­K½ª²M•‹qMk[–ÿ¯Ô†¥­W-ïSÀoS&üã{î¹çÞò/iæÇ>ö±á#ùÈð‰O|bÔTϧG#¬ßö9 h1Âl·ÝvÃk^óšá/xÁ¨éÏ}îs‡ç?ÿùcyÞóž7<ç9Ï?Ö³ž5l³Í6#1‚5xÜã7¡ê5T\1Þ·¬ÐH:¤p¿¥ÎÂÒKŒP‡WW¹üÚ–ïÜ«´ú\ßøÆ7nP>¸´ñ eÆwøâ¿øÍvØáˆ÷½ï}ûßýîá½ï}ïØ?øÁt‚§¹ àÀ>餓†ã?~Ð…cª™}ÖIæíoûú+_ùÊáå/ùX^ñŠW /{Ùˆ½èE#ð@§õW€ˆ‚$þG„G<âÞð„áu¯{ÝH(ñÅþûï?Qa!¸DlDøu¶Õ#YÛr_k/I—ï:¥µ[—¯~ã—¾ô¥ÝvÚi§ý?ðüîmo{Ûðú׿~xÕ«^5jð?úÑŽæE–Ñt ¾ÎÌ0¸ïýî _øÂ°ãŽ;ïÿûGÓîºoyË[ÆÂ—#ðPŸþô§€ÓxŸ»ÿ{Þóžñˆàn!üþð‡A‘1Ëj Eê± ¡€q)4Œu®÷¿¬·/;CAÒ¥|óËÏ>­€yiö×J›XÚx$M$ì¾ð…£` »ˆ0j,SÍ´ Ú¢á„7ÕpA[Åç?ýétšþ¡}hØ~ûíG«o~ó›G€^ò’—œ 8ùvïÕ)^õ äºÌ»ct$ŽóY‹×¾öµãõœçüÇ?þñ£Epô=÷T–løæ7¿9TP:º(îA7s„ò者ÅÚÆét{í³Ï>à·øÌg>óüc§cŸÒ¼ƒÊÔQ~uU´Í€$£¹úäLz4\x4!há–åM¯s?õ©O <àßñŽwŒ¦yÛm·µ•V»§â=m~õ«_=þîÃþðx@¥ÇP±ÇXºŒx“Œ$sŽs‘•EqD^nƒ%@„­·Þzü̵Ë×fÅKý‘:¯9¸†íª\umã·ÐK§Ê…Ê'ß«´ç5ö.ï|ç;÷¯ÆT`EÃEôÌo’D𴽺#h甬€ Ÿå;õH —`O·“Ë*9 VAªûqˆÀ%PD`‰Eýuânä,äâJ $”~Wo?ðÓk¨ŠÜè ƒºi5tçú·zÔ£Ž*ôCò“³HÈÌ'Põ¹M³õ“€3õ|ðØW¼Ñ®h™.S šC°Lm÷á›ÆóÅ4fŸ–C@È ×ÀEpÑ|Àº¾À€¥‰…A… W€"¨#"¨§ß»÷ÃÂ|ü㉡>ê‰FGõe5Ô)¿sŽkps-¸=©Þó;T¹ìÚ&À±U¡íÊnW\`¸ßýî7Ü÷¾÷{ØÃÆÆ59rÚ Ûá‡>@¾×HY4ÚÎèÊ1õH@«‚@ž +Ñ9ÀiÒ‹_üâÑÜ3ë,AÌ0í> 4„LÛh*ð¢ÉJ×pಠ¬„ R\âšÚ„Ì,B0á 9Ÿ?G¤eµÑA@š¼W¡þbDPü¯îþî#Ã"Ì3‹G΃Å+WYÿßN€T&A 3ÍçJŠ<à‰àHCinOÀzòçºpÌÐ~E`GP¢pÚ‘èœv+®MË™WšExL|ºwÌ0àž n9ÀÕOAÐ~'®ɢø°\ˆ¢¾ b…,"8ºGÁ'»är¾ú"4"Ä=ø_ÛõV@[¸Mç#Â$ðçR®íëí5$Ìþmèãá!‚“MS1:Am42ÄÜÓ|Ÿ!‚b0ÁŸ.À»?¯ÐxI ùºb¼)à7ÇhxÌ8й®ð´a’]dy¸d`š  ®…Ùþä'?9ž÷âþî…Ü‚ž"ø,–Ãñ«Þâ#D0"‹[Bèc-¹ÐF„£«p ×16ò/'@†FW"æÓN>.$@ò¹L=À€É÷?B„jå[¡ñz ñí£!ƒÏiá'ùâpæ^ ðL¸zdÜ Ú D€J6?E€›ÏY9Aa!%¤ñ}²”´_]Ï 2ªKb„W'×äÒÈM …, ¹!8Ë@Ú.`dyõ˜Ž,‹ð¾z{“éXƒn™äK†Kuü¼®K'‚¾2íœA#]böùNÿg,^ßXA¬ÀŸ'];ð^ñÞg A9Ò?„Þ²c‚¸w1ÉVÜßoX Ÿ /®A`bŽ|Î’ù½:‘ eh² Þû1\áYRñ÷€É>"=‹áu%»‰E8|în3ü+Fq´DñXȤïž4g^ÉGkPˆ FÐB% Ÿ†üûø¼û sÊ\3™´A0•´®ÿŸL"2ø¨4ØÑú˜`$HÁwHW . 3½î͇û#bp 8°{IÚ9ù¤JVQ›3`xÖ*Ÿ³†®‘Q[XD ?ñžOÒÖO~ò“G2¨ƒs'áˆ*Ÿª·w8] "(‚¼ ±*o•‰ÀœkPˆðà?xôñ„ |'ˆS\DÜ‹à=Á1Ý„ÌìóÇñÍü$"\RÊ L &[È<;"CÒ³Ž9q€x/ÎC &±ó"¨Í8bºwÆ3Ä,þG,íëYFmò>“T2C‰{@€#Ù‰ Q‹ô’`ó¿û“ãÄ"è>îZåv§ ¬! õž¶úJkÈKÅL(NBùL¢?Ù>>“{> ƒû! bŠ =¾ ü;°B¾‹9OÀçÿŽLuˆkÑúŒq¹Át0"òÛÚÉ $`t uŽÙ§ù™”\BG䜽G:Z/‹ª ‚#2 AÆ ¸\m%·I¯áuØ©ÊÝþ)Èà)aT’ïfÆ™nŸ‡™i“!/¦ŠKâ¨[L&$rˆÿùP½$`…ô"|& ¢41¾›$|A"ðb†Œ,ú=íJ”ï÷¬—"ô8!L~P¤‹–ôŒ ¸¾ß!¹w“™IH àÓ| #yæ$ŠDû>'e帶ŒT:f² 2 ¸ %£ÝÚ‡yzyŒ ‚½ªÜõ"€ *ñщè@#’ NÏü%Xì“#|N„7%‚Ft‚6BaLfì&¡$yÄb¤K–l2p‰Ò…L¦PЦâç=-G:÷Ì R÷é4ÛùŽI>é Uîë\D|R1ýÚ›%š h€›p4oÀÉT/VÖ½:X#¾“¦ÅgïimÚ‰ðÖ·¾õäDÿðhx’N´Üo31…%aâ“ffIÔ/.Œ‰§<…¼È A˜xt/1C&ª°\™©DIÑtJlGD8²ºofD ¢°§çV„8¢¬æçª—öŽ’ÓÖ   Vq! YÌN?´—|—‘¾•z Þs  üžbÆv€00 ›ÆñϜٹ!’Ò8šÌ„'òG„ŠEˆkГ.À: wL¦1DðY Ï“{% À) í8¹©+k€ ÜDŸ¤â!0y"ý -g¼E¡õ¬‚úP ÷„ <¢ ŒÈž2ê #jÉmUÝûD¥êô»… a MOè„E±*Ä×ñ}ÿGLI¯¡çйëc "¤‹Góøo` †s@ÃÅ!B&Š R"a8/³E@„qÝÌ'+ÇÜóÇîD×¥Å]ÃNþg¥r?æØyI3'€t]9–)Q}ge ™~ua-ä8¸B÷Á)£ÏºeÉ@X ¹©‡Rزø/‚v*Óðë\ç:ÃùÏþ &W”î·@OÚ5éV@Pf÷°Ý"L‰@ëD!"AÆá]ù€ é©¨o¦g©«äæ ÀO¯uà*XDPzÚº~fǤûßçG˹ñ€^C€ õˆGÛ‘/³ˆmÑî‡>ô¡Ã£ýè1b X2E¤ä 8Æíú.ÓßV¼g8“æ®s#¡ dÜ< Ü;ÝéNÆn8œóœç.ùË>‰VV4€o$ˆd̘LBC„D©± S"¸†B„@@%G°ˆ¡Á@æš2 )pu?‘7’|¡½ˆA ®Eè4 X/÷&ðDéLj¦;IõÙ“uLÒ)if×AÐ r‰ØÎ+1éG>m$™e^v¦\Ab÷H—t x=`;ú?ƒ]JÉb1dp ³’† î|ç;¾ð…GðÏ}îsWºÒ•FÓ¥"j¥üÐXÁAñI`p ±=Xôb qJBM*˜¯" sà"‚`HõX ¤e"±¶©«Ï´+Ý2Gð›ŒýO‡’YZˆè‰âY~œI¶,(ÀÕßçH´¬X‚Çô2V ¸6ÀW2é+ž±Œþ[2‰ ªv,F•ÁJ‚ hÕÝï~÷áb»Øú®p…á²—½ìp¡ ]h8ßùÎ7\å*WMÆaµ@LÅTX™WÇbEè•iaË‹„cð„&õ^Ëׯg‘ßvwÀâ°é½5><î³ÎÌ=sSXBà³dHî&?®½O·Lâ+“@“–÷y â‰,fQ€bLÁî€OÍyÆ2¦¿hriê  Ìb–B/F€° €!‚»×½î5\â—Á ”Ë\æ2#.p ŒßL…’OW‰€¶0Á*ÎÅôä¦ÝGŸ©‹Æ…!‚@J™¹þÞóñ@rŽHÙùÚÄK&¦¤««€$=¨s>K†T¬Œ…¥£Ù4\ÑNdä㓉Ì<…ÌBxÊÀjd^ãó™GdôR VÖl1$7.@.€¹¤4þº×½îÉà_ÿú× F" Âå.w¹Ñ5l²É&ÃE/zÑ‘™=Ô§tŠàP+2E|JS"ðñLµkÜõ®w=yh¦®¹fR©™|Á6mÍx¼ß=³›S9øŒÉ«3ðY, ;_7OϤ‹ÒxË™êå|x@Ù÷«ªÓ=îqáÆ7¾ñ¨däH¡6ÝtÓá’—¼äH2ÝxãG¹r½ºæp®sk$€s3j©®EôÅ|~K €´‚i¿á o8Î ÆÝò–·n~ó›ÿ‡*"ˆTXìÀ•ð×kâ' ŒŒª¸À ðȰ|&JMIBI]fÏ¥ ’Μ;ú?“2DìˆQ\ÁĈ 4`‹ ú¤’•Ÿn1÷þw=Ž ÷¹Ï}†[ÝêVõ¯}íÑ—“1…!«ÄZ‘#2 AÀ,G„r·,úb`ÆD­¡VºÊ²÷?Üþö·ý“£@D#TœéJÁâÓÏüÒ¸dÇhr´šE„,Þfóò‹hCEth×íÙëiÜꃘ4ù¿d¶o|šxé€ç}>ç"\‹ûp}ä¼ãï8Üìf7•‰ ™x…b‘+9#Ƶêu…d(ÖZŽ7ºÑFðÞ¬mõÊ#ð3͉¿Œ -*x‹[ÜbÌ r*­7½éM‡ÛÜæ6c²èž÷¼çè÷ïv·»•ш!4„EHŒàw@ˆ¹F4çÓhBB†¡w3%½'“¼$P*FˆEÈ€ á{Ÿô«û& %°tۦɗå”¤­¸8‘ý¶·½í(;…Æ;j J†\)¹†mŠ’¸*À3û€Wò¾€òi í{í¾ûî‹ “)DбºM4à·¾õ­Ç#–b¯F K@ûǬ2Òxï{®C€Xþ Äw¸ÃFði'7à<×b]¸›ÛÝîv#£%¨XiBiJŒV»N‚E` ŸN8L%°×x×îüŸ#À\\–î-·TH&o‚¼”Bai¾vPrÔ6ò#;À±¬€'K_úÒ£|¢éºÙ=½­bJ€>S©Üùb‰Òx ô@wKEå&,€Ê&Ê8fkœÆû|¬MÓ«z,4\‰Ì:åÈ07Â¥°B´‘‘ ´‡¢h'ðµ+ËX`3í жBNy/ð'å>LÄ/³,FÂÀlY«nJ*¬L“ÖJ™ê§ëRÑz¿aÚ˜¥Ô+&Ñ÷˜å¢ÛÁ1®ï}—»Üe¼Ò9‡KA¿a2RRº=»„Ló’Z+>Ð|§áÏ d.#îJÛT*,WÒÁ .ðdȨ̀ý\ð´÷éþÑxrâ\O iæäS.}1h¼D‚Þ@,€@˜†$Ý«ÆJ¢dÝó˜ ƒ&„>ºó‘€ù¥9>s=àk $³èج mQ¸ÿó‘¾'8fSà&콃ä¸V`9À½¿ïSÁµ 0홢՗|i£v°=ÈD r¡ý,"²r ÙA_pßéß;úœ|È$à‹ (Cp¦3iŒ#2áa˽-F€äu²Lÿ¥Q€èÈzø¬ËÓ…DÑ(¡õÁÂLŸš‰ò!!@ˆ€é>ê9øŸÖ°< Ðc6£,’±c @79%{ü±NxZ²±-ÏdL&q½ìÄz!9¨3+à¨pqˆ@¬Kp3€ôøq Jš%ª!¸vÓhîÃõ)¥ò[²!£åô89W<·’BÔßí½Ú«qL_Îÿ# Ïš8]Ⱦƒ—ˆœu Q Pÿ:$HÄJÀLd,"ÐÅgî‹ ®&“h˜z£6F÷ä2M*iÞŒ%S¦™é›ìÁÑõ“±;ÈWL‹vÐvq ³®^ê˜äÌš4—å[ŒÉ Im"€L |¹t¨àNtaB~Îo3'?$@Dȼ| 椑@E Þý€’åS|~ò!Ë"Ä]0‡¾÷†´ÙË4sõW/÷ÎBЀò!@¶‚‰ödYšB˜ˆ@ÓµWûõÓÕ6vížjx/‰è§ GüLôdeȆÈʽÕE·R)\,¥8B¸‰ .1c#åÞ#@L¡®Q–p!Öc;fòÝ@,‚žC¶nÉJ›!!càÑF Ò8w?`']0ߌ†ê5$³˜„Ð}®„4Hì%†1,¬N@G°•’É¡H îKü¡½?5ç´·w˺Y§åùܹˆ .)Ï27BÛÝ/ BÈ;ÛÙeÍ zq3@'  íݰŽq_®Qnn1d)–\@ÆÄØlfO:2M;Ë®²ÞŽæ…} u,B6ƒÈ´,¾˜‰F€,ÐÐp±G€OR‰k~È€40Àõ2â‡ÄêãÚJ'²ÇÿëÖi#Pt;µÍ5“iSÒW€;5ë‰]¸$.“^r|z6¤P .!Ë峟a¦±eÃ*X›YØ{ífýÀýúôò²z‹ ´’&v0)n®â 0Yt…–@“BMdí³åˆ`Ô‘E`(K®”?²O ß«â%8tŒE@„N×ñ23È/BÜ=B€DúÌ.À x4éç8ÇøÔœ/8°iwŒ ÉH×/Ud—éaHq$ÐMf úŽ¥Ù¥[€ä[´™öÀ:ô²¢¸­¬Þbp~À ¿¢ò*ËGwˆ¦“9£ù\‚óPf¥×d½ç¹VV¹–s|—Í£˜A®!9ò$“:˜v¹€L÷RŸÑô,q$TàU³Oîn­I«“|qN‚RѾÀK ˆH=´øzLJÆ'!ii]E– €öGó¨ÐâìŸÀñÝØ!@\€Ï‡ö#SY¸Å=ñ€Ð-R0ÿX à#¸@på÷ —ìÝ8fžeÈþ=H2Ä5ôÉ¥q#~“:2k‡°2R&Òhv£˜Ü™]¾g„ÚD›/C×=Ë– 'l÷Òî „ ÅÀ§õdƒIb…’A™>|šŸù=[צç!H)3¤ü=vè¥Ëª ^Öp1dzðz€ Τ‹LCR ‹ouN'@‘žt -2³§OkÆ5ôm]“}É·ߎHÌ6 àØ à^&˜ø¡ «~>C‚Nmu¾ó2Ìš,Às¸{dT2Š™GË ðt"°’ä¤çDû™ýÌ5ÈÎ(+íWœWÐ Àz0ÿ\ ËCâd ù ÊZÊ·ÜÌÍ *.€& ’²«‡n†|nö½Iˆ>‹Ée\#“A4V£ÜÈ,@'‚ÿ‘!Ÿg›7V¨\KrêÒ ÀTfA‹QDôYކz"„Éô3éb‹dØÏÂäúî…¢x]7$”šø= NË™€Né wÀÉ$ûG‹“8 ‰ù§ý2Œê¬·Þz£R&YŵT›#€Ê¹1ðò8€5F…@%Ü Ã³¢(À¬8f^?ó €tÿ\'«_ÝÓýh÷–¨s IDAT|æÝ‹²¿ŸÏ²ÔÇï A€Ck BðÆeÓ $ùXž¨‹vˆîNëAeò’¶ºO 2Ð@ õ\!p’d±'8vÀ³õ]º{ñù ܲÓiæKtpîŸ{³N¦ès€¬ÀÏÃjóbP!h·ÀS!`ñk„¢"ÞgÙ4Ó%tLב`$ÌR­Ù$ Dà Ö#Qˆ 6²ñ’ñ sŒ´’憀ý2½;=ìÀgL»(?3nbú“’îÜ/óDä„ ÏÆS ï€ô|G¦AÃp±!»§‘ó:X•LÇcuÔ©@{2^!Î(â/F€lmÐ !@Òµ*Ãì‡Ì]6KðÝÇ@0™åPJæ­Çö)a®’†#`V §ç€ÀpÌ0F'a‰þ-r1ã7{ 9N @³“wOÚ¹€€“­Ëº„l+¿à´8`çÓÞwü ÖS×úïÀ#Ûpz‘_€C'€ÿ]ødZm\ŒnŽ‘ÀŒ @Ú­ÉÜ…4`™X$@.ÀQ×1Ó¯ ] š“9xwOì&ätŸ|.ž#$NÐDÁefÓ0…L K“g!á© À«(þ§Mâ¦T@pü+ëؘóÞ#õ€=‹SüÈL1g õ€Þ'‚ +&°ËT9Š’Ôð”}.&҄믿þ³_ÀNžuÞb`þÌî$NÐôk;ò0섊7›*÷™¸áûl¤˜³¢ætŸô$ 6¥Ç  ÇAÂèd'Ë£»h‘‹ß«àqJš'~ 8$~ŠÿÉ£ õ - § 3ð²-×ý#£>h¹)a|:2² }cˆNJF^Hã\½>¿€ÅÊð49ñ#@æÇ³»‚Sæ“10:[¸hÒ¸Ž*4§# 5*æ©ÏÒͬ]Ð_¾Y5CÙçh5p}N˜´€0ùî¤lÕR°ìC”‘1D˜€æÑú¬xš@³Iuºfðøj¿CîÔ¹Ù@!AŸ6%€ßÀ¸Bu‹§Í‚O¿ à«K‘w1d ”›ÅXRÅç™e ¡4†ÉÒ°÷¡-„ ë°Àuý.D2ᙃГSÍœZ&™dx9„ºÇ‚Åš1Ó=ÚîV @ÔXY<tà+ˆ€Hø}´?=¢NÖ“ö#²¨w`} ¶tV»#€ˆòùõnh žÁéÿò5؇I\°À &@épýì ÌBd‡L¨Þ‡´±¨_·PT/»§>êI»˜×N` þFð˜î—úe£‰¸‘¸¶Ä÷® 6Qy6qì ºåb™¢éÑr€#€ÏA¤Ï;œ›XˆîÙ @F\¹ ×  ëð‘°d»°‡PùôðÁRª|²Ê±†‰Ñ‚§©Ù5C†Ùå{“ùë;„g2ˆß¨ÆŠ Rã˜P 04½šÜ‚`ÔoühÉ[ ÛÈ©—ú!B' 5 @ MSÐÄøû,!K,|ÂFÀ,üàô€ñ‚@ú>ù ÷,2eš¹ûv¸¯8‚¥  Spg‘‹ïKæ‹ÀÉ.¤NQxvìTÁXžÂ „4T 6=×£I™æ„}GLB ²€ƒë¡Í±€(‰¸êº–è?±ˆz%'ï:™ÞÆaJ±k{Ÿ êÿ,…Kw4¦½ƒÞKŒ2hä·! àzq#Ú•íá@}ÝI˜òq^`™8¤B†U÷ÅÀ¬ªsÙ]€ì^vÏbC¿ÿ& €ÙŒ‰E™Z€LsÂð<]Œ°c4ë³Íb…2Yæ…´qvÔCô´\Rúæî1%P´xz2€I#@æê±L™ÞÞ Œ$e–ÓòŸÀUq®ó:ü6[èÁ"BvôQFçv pï~Öù‹@`¥À`òdmÂ狹~:`ÆN'@vÑ}‰–O (ÌsöÊí@n€« Ñ6S2Àô'‡@[B‰€êÊ},D˜@YóÈ d2jàÚéêiw\“ùÏœ²P8€}¯-Y£è½ 5ËÅÈzJ€øo R¬N÷,Ù Êr蹇ªûbp¿Ä³!ÿ›%ÒGÖàôãU6ãü~KØÙ‡O¯"qB'@žìé³$.@#‘#5Y¡€v$[¨ŠÞCnDÈZh@tÿ)œMž‰Ê•Q€ Ð´˜™ ”žïs®±ŒÄˆ”‚ߨwbõuo²ÉúK¤5¬ 9ôÄSÕ}1¨¼‹ºQÀŒav«R„ƒ*œ•·LdÀôfÞ]‹’dÊÔä©¢HÂLwdý€ß Ÿ›Àû<‚0ž PýVX¡ô.€—íç€uÊZÇäç—#@RÔHκ„îdçFãsìÓ²R’ÎwY9 Dü7+|ݰbHåzê¤CûCõv^êR²YŒ˜¬B˜€`R ]¿ZÃC>,ýNBfrc Ðb‰¶‡™( H–U–|Aþ,#Ø É”búb‘µ0^Àú„$~+¯À,Ý— ž°˜rB4-Q9KƒLI¹. ÄA®“œÄšÓžÏÉ[ìgL¸:!@·îųÚÄjM àK…B€ÐT÷_Œü?!¸IïJ­²¦exÖ¹¹Áe%Œ KA7-ˆ¹ÏVí@È~üY<â3¤àï::#‰Ë@0×ÀJt8ßµ²é#Ag-Þ”>W÷øòN$OÊ5`=£™Þ³®­Ò 9²Ãi€Ïs˜;ÈSTî½ß„â$/i(¢ßN x­QÆ"âbàÿ S; ®ØwG&ŽÀC7ësá3¥‰vg·š%Ø“40­ÏJ € …ïC×¢qɾ!€a^³}Yàû=­è RÅdfšRO õ¦åÀz·rn4zJ€vî™ý2Të÷ñÿñÛéNf«:¿ë\&¹°ÆÎé@è¬(¢ˆ,E'€ém®á\½¹ºþb0$*®a‚@à²-< ̪œ {i¸÷éÊ-‹1X™Gºd’¤÷|?k€0(˜ž‘Bn%u—èÉC ÄA.÷"¤L1#ÌNÖpü¶ßèÙø*f=Ó´B€L`‰v«sö, èY˜dRßºŽ¥è\†}îšÚšitêAñ:,nÉ‹`¦ú¨WR¢É‰ð²·n—Âwg”.3mY ½‚ ²’ãY‹€›aE²ªW'`’¹÷a&B=sJ€ìKÒu 9R)û N É}ös4¼ƒÎl§^@ªMîÍífbh–ÈÕçdÑ ]žç fSN3œ§¸^d1h´yòLWïÚŒ)ìÈŠ˜D "Ä"d0$ym8ƒC§GB ÐÙ!Œéð•ÈÃÍJבKédžILSâß]wJþXÝý.{ð„êï\mpTGÈaæÞM5<õî{e5pŠÏ¸Ÿ¾Q¤cL¸ÿÕ¹Ù“ŽfEÕiJ€ìä:ÏÔ.F¦Ô¦è½€< Õ^¾º_Ô \8à3,Ú‰Â&$Âæhà3 †ùLàÕͧ 20?P\ÁªP'€n’1—ˆƒHêÆdh<ß;Š€ X2 !‚ã”™Ø:Ý‘4Óá³@&Áf<p€¬…Y{˜½YâNo–‘#÷|KÚ=ÑÄqfk9¿0XŒT!ü€ ÈS/ÍÇSÂÉDŠ@e2É7Å*ô´± L$›G˜ÓYµ®Ó×Õ C+…ÄL`‡A™©œˆ!ÀS —{eÞþ”i2;æY?!Àð^2P•$–d¹9qL78š£èÜN€ìM˜Nkk'ë­f•ºÇbI’Ztá OÏcÒ¹`¨\* lȦ‰Ž}–¹o‰²Ä*Û­ejP2椉®]žÇ‹Ą̀žnàžé@[hr¦˜…Ü\€î!Ò ù÷Ú税„Ÿgýì®å}BGÒº}ër³‚C…%ÈìdØ v!7×G~q!€)îÎUêÚ‹@i£%lM70Ž5#OÄ´ûB 퉶k¨†g°°´ZEC¿H 2ejA@±J(]G½‹N¦:k³æ.KÈÖpøì|‚´±RËâfÒ q|\˜zgÎbHºÉ!@ŸßÍŒ«K&è†@ç>µÏçäJûC ]³Ó¸²0òèíÈcVB–À{Oß ‘„JIc@ß¿?+ޏˆÌƒËôæŒ\9jÁõäK††§b–Cd<¸¿9´Ï®ýþ@ @¤K—Ž  Ðå£ë¨¾ÚÓ-€ó§Ó“ïï‹CBu øÙ-<DÇo§  k„YYÅ>smˆ @€<Éeþ|‡Å`Oó˱t%X)äÖ@ñ¿8AŽ ‚º$ròPÄLʹ"ù@É Ç C«,BvÙHFr'O³Y„^A¦že£p­,ÂÌ7š¶Ô-fÍÚû€Ó-sTO ä ²'ÝÀ>-»O G ltÀ»ôß­¨9æ9‡yÔl†Ó¹>×O Àr àûóŠ\‹€m5B“ó6™@€ë£ýy“ÏÁÿ!`2tIà ("¤ùŸ¦0"Ä"LwÙÈp«.œÞHKË f¶r6JP¦:qø\‚瞦P¯ÌüeÆ;²q#íÏÑo:¦Ýºìt޼î›þ|ÀJ%ÏaÐäŠÔJ=–@7ÁãÀœH=¹ìÌ^îd1XhX‡±Á°ä…‚@ @>ÀÔ,Ú˜G›† ‹€ ˆ ŒMú2ûÙ*FA D‰ ™Ç̲IàäÈ»žÏ+shb0;IÿX€@×E(Ö¢€µÊÜÇ)€—yûŽÚ¡¾Ù… Ò“p}uw¯ìùŸ§€¬ ðìv–Ý¿2EÍC,²öÒ1)p±ûzpT'@V79Ö}#6™_îb)ûfOÛ®è€56`+XÅÿy&_'B\†ü½Á¡dæò”/ŒF€ì.’‡Jç ‚¯LŽÀC×3*™M¤Dõ@`šic@™gÅþŽ™PÂZ±À²#XäŒÀÌI2o‘UÊ–ïÜù)ËžÇÀäÙtBisȘµŒ4½?û8KÝÉNýYˆ èÛÝèÑÕ=#ÿ¯ Wàˆ@È´ZÐ0Bh~@öð1PðôB„<Ÿå0U‹ïÊæG̘DÈ3÷|ÌgžHB@ÀËS= Le‹ZçÐ¤Ì äRh?Xÿgó”y\ R²P€ 2í y¥NÈÙÍùJ wÀó@-A¦ëi]™°š©ñ}Û˜l„º¿‚ÜNíφWóÝI#@ ñÀÛq Áÿ"Ì<‘J÷OOÀØ@ßÑË,ôYß'w¦û2ÐouÃ2-,}úl5§øˆØò±8,9&©ˆ:†` 'Ù6€ñɘ¬¡óëÙø1›²Ðù,€+ê£ø yP,ìs¬M¹òˆ;dÌv±Ù)4CÞÙ/€o$“̸ÎN2ÈC¥ËÊ,F€Š”o[ÂÚ£|ÊÑH|D0ݨ¾4Rà…´:ϽH6‰dži)× 0Ì#\ÓsðΡýÀå ¤{Ü!bqLBĘ—`DÐT53…:hhr Y{(dzÀò6á'Çîw„— ©Ó%ëzEŸ‡M8VU<ã#N@ÏC3Ü3ûöÒy2ºÏh:ù©o6·HÝÉÚ}º @2H¨â™ÓL€õªlPåœsð/Wå:UnWå¾U]åYÕ}Ù¥üÊ/ÊÔœ"‡æ&¼W ¦C1³Ž¹‚—ìc¯Q\"x°3«"$±Ä"èîe;Y® Ðãð÷Ȥ4šI&|Ý>àÓV€Šò¼ß1ÛÕ&Mtî”?›Cf§P„ ú¤˜L"ÉöúÌ»{d)\€U¦ÀgÏÅl²9“¾SWB(ÖG”Ÿg>DÈÞÁóxà4 Ú¾*›V¹F•ÛTy@•­«¼ Êk«¼½Ìþ‡ëæßÐŨaàÅ,‚£ÿE¥ÄÇæiGH@ D½4€ëH=³À# ‚#‹x€3ùÀ¼@IœÏ4‡üxrîé®IŒnJ€ã&;v^Ú:«‰EñÑpívß,rí€Ç¤ è²uM‚brr-n„ÅáÆÔ-[Ã’qÚœmî“tôYƒ `Ã9.UåZUîPå!Už^åeUÞRe»*©²C™ýÝ*Èøn ê÷É &X T‚8fg®^õž¢ø`þ^®Aæb ’‚6Ó|E 1%nèà£3„›þ¸¤°:X¡ì F3¹ƒ {O»uÙ§Ÿ`aøu ±wLT à´<%ßõý•Õ…ÉWòxK“g(-·…}ž1 l Kàèÿ’ÇB.@ðÇÿo\åÊUnZåžU[å¹U^ÍTÙ¾ÊǪ|²Ê.åö¨ í[=T,x±A'‚Ð@)ZZ‘'m²ºByl;ø~ée!Òud ÁX«UB‚ÁN ?Û¿dš@'@ö¤ å‹0ýaUˆášºì“íà]˳ƒ*âëeDîGH”'²Ñò„þ„”dø´E®bJÀ“¿ÂÏó§™él4·—¨r•*7©²e•‡Í-Á¶UÞXåÝU>TåãUvB„êî±ñƯÌçáé.ê-xŸ®¤Š2£YöÌ7æAŒ‚$‰Å@‘àNoÁÜD.ØŠ8!ùqƒ`–‡47»pz¯HŠˆ:bx|lb Bgvù[u‹ï‘xÞP÷ëÜ=òl¢ì‘ ÐÌD™LS·ä¦c!ƒÜ>bjK­‡=E7Ýg%ï…»g™“à¼sKpù*×®rë*÷®ò¨*Ïœ-¹„7UyÏœŸhDø\Uvß*V‰N–XÖ'N2FÀÄ d޾B`ˆ H4&ÑG‘Àÿz„•î_rî’"‚Á)’ZÍN%´Q7 àI¸t°»)ï&5ÉSIòÜ%nM7O3/Q\’N³€£oÛç AžŒFózÆþÜŒôrž“à÷‹ [¡Áª\¼Ê«\w¶"‚^Á6s"¼¹Ê{«|xJ„2]ßG„"À* DH%1Xc³ð23t²ABfgÍ?"è5Ä"°D~?™ÀLXͦO:Âã»§È£â’p¡Ý>wœ=<;¤ûà$‹'×™Í}ÅðrSÂô˜21iÕðH›§”e¶O4{ZÈ”,•¸Ü:®*9ÿ­í§•S"¬7·ˆp®*œ-¹…+͉pÛÙR÷P|ð¬*/Ÿ­;>UÜ­ÌðË|ý¥*uÒ¬‹qX­áúï}·P¦2KÖ GEŒxÓÒ¸Á`,ˆø3þžaQ‚D’)’a[.é°xJÍ.¯ÁRdH9ÓÁX°Leӆ锰L…CV@—.O•½ËBÏ€{ÀöÿI%ËcŠè‡•µÛ»ˆÿ®ªÇV%¯kÍñ\ø5%†—¬²y•ëÏVç áÙU^1!Â!BUPŒ°_0\ÃHàÇ”iˆÆ†aÜLª$´l¦”‘5VBŽA È O\?™Ôm‚9Ÿ Û ~xüw÷ïñå>ó›LÊä²²Åýt›Û>(ÓÂ270¹‰ŒN2í¹ìï`—œlz)¹TJs\{hþ£² .Ù<¢Ú}“9F2¹‚úõ–ÿЫaƒ9ô.4[Êè-Ü Êí«Ü¿Êãª<§Ê+«¼uÖº!×Pfù€M6ÙäÈ2m«:2 Àfþ‘![¸ SžÇµÑ<9†¸@gûwçç@„ì3@vôÀ-šŸK‡ºyYœ=óðèl…ŸõÙQ$ÓÁá«zk›v&0ž‚žÏ£áŠ@¯ÊqeáŽ,÷ð›j×>%ÃêZ‚òGT¹G•[Ì–ò7—©rá¹Âžíô Á"D;»æ]ú g«­ÀéöZ‰} î\åAóÊ=MD(ÁíY`P ™»‚tÀ§ÞÍzº½]ÃýÖ9Õ–c«ÞGT=Ymß·Ú½\ÊðúÎ xÚÏ’²r1o™ËžTåÁ³ÕVಳ¥xàìÿ äÕ»ŽÌovžÙj"\­ÊÝ÷„IDATgKDP¹Œ+¼¦Ê;fË¡üÚž¼ý¨´ø¨®˜,áçÒ@÷’<;UÈ3 C€iÖ.£oÞg„PÀ©'pÖDÆ­kxfPuÐûw!DY¦êü?–Ûú™îq]g¯²L_œ:àäóÁ¹¬€þ¶*¯Ÿ-Ü/š-uǹ\iû»U¹Ù\î‚õ™è¯i!DLºèl)(Ùb¶”U¼ë¼¢O®òÂÙ’ùB„íg«‰@»––|¹ü¶`ñ¯³æ“íšgºFàCÓ3ž‡f6!ß.BF„¬èJ>w—@ÃÍX2aEÖN¶NÀ‘É5{`íV2i¶ƒ>ÏgœÄ¤—K:´ˆö£²:ߪzíY×ø\•ÏÎÖ 8“Àß5[ šix×½¸®v'?I9Jt/k»é\Ö4ÿtë .úZ‰*u±*›Í–º+7Ÿ­gÐÀÍ–¾,JÀ_Üb‹-~R¦ôø€ŒN], ‹2lêÿÙœY×'#§[ˆ$™ØÒÍõ´Ìš9ŸO’]U@[–çàr-?®:}£H±G•Ýë·"uæ|M€kŸ.2Àß2;¥I8ÅøVUî3;%àæiü ³%7+S+?ÿl)#kÝ?ù›hþ¿ üþZŽãT³ÙÒ8ƒ®Šhî>["ÂÓª¼d¶$Â!(B;™üfùП–¶ÛSÌ!B&Fd„Lñ]&M&éÔ}w4{št©û­r"ÔßÊœU±Éï ðýê>_‘Ϩï£ÝSÀÕw‡ÙߎÜgñ¸L*—ø˜Ù’{”j¿ËliüEüd,FPMþÉ씀“éFsùn0—u~­€ß_Ë3¨´dÀ ø0 ‰Œ<ò}ü yòÈc•]Kã¿È¿–¹=¦ÀJÌP¨’zÏ-$½S>I©ú/lGW€ù›"Ò÷ë= ßmvÊ€m%Àe@—\º\Ü#h¸ñ”·\Ï©~©¹Œ¦€ 즀Ÿyöúr¯•œ4 «3òˆæ! Â3f§‚þ;"”ÿruQfN1úØsêé’ÍZß|ž†þ[]ãØ øŽ( qP‘j¿ý˳%S¾àîÀ¹©)àÇ·Êôx®‹f$UOè^³%Ào5[\¾þ*³Õ>àl,å5à+½–pê#|[†  +CÐ/rúD(—ðÕÍ7ßüWå×î~{Ö¢÷ù²·ËœS`ÿi³Í6;°"ôïà_Yƒ†/øö³¥Еßz^o9d¾Ól‰Ø7œ-.Rç7ý=à|x'ŸÿzÀWz A x2¡A#Âß AWùtákêòq\@u'O,ÐÿRVâÐúî'õݾE’½f«Á^ðç×þŽù½_3[ 8rü‘³Õ€Ë„\zœ{¸àwÓÙ)—¯?þÒkMD0¹Rœ"bÁR† —›‹°k¿g~à&›lrliù!Äý`ã7Þ§\~ø´[Öÿèl5à,¬egd3¹%)n.Jº[Ü"ûf0f9Àõ|ôÉ;àÚ¸Áì øJ¯5ÍEÕ2áz³Ó>=º†Vv™-8w"ËÖ—^{ÇøfK€Ëµë±\ïິ†Ç7›×3€Ÿw¶fÀÏ4;ƒ¾Òk‘!èûÍ–2bËAŒ°c+ɲpA%À˜p=©Õ‡Ï–ßr~/€›qõÙ%¶X(‰—Îr-øT»×~^ÿè´ "øýó²ÝluZà†©·ÿþióså!Ìi8+s³Ù’Å‘½œÎ=­üßôša¹!hѵÀ+D`Œ ´›u˜æÑ΂@¸iðb €‹;ŒaF¸A®)àëÏ–|Ýë_ðZÓ\„>Í"ˆ˜pq°uɶš­Î£ (§€'­j$³î>ëÿzÚ4‹X>[R]—LZu¹?Ý ä>úp€ðÐCõ8_‡æotò[@ÌÀ/døÑ}AéÎ;;1 àHOèw9_¯âotÈLJt)Ý|tßI Ç€ ‚Ð÷Wðõx¢ìgÙuÿñÿç;wî\À,€ ºØï)ûXrN©Ì)°§à€Â1tèÐçë•ýÄ>Ì)°ó¾S`×íÛ·wbÀ¶ˆýgðÊ~V„œ‘·oß.aÀyü¾ÈßèÊÐ ¥ûî;(28 {† &±ßs÷îÝ«ûI±sÈ!žCàÖ­[;1à€Ô¿so…Á‘CÀ¹!€Cp@\‚ßéÁ`¼Càý[·n‘28 àïpŸ¶:_¯ð·b€\qá¾Càç^„@ “p~øáVçë~ ÿ¬`r¼ïÜO¸yóæL€Š#ú;î‹}ÂúŠÇNç^tÀû7oÞ,a`Ÿè÷ÃúYå9¼è€›7o¾9p@>«3x•Ÿ\~¨Gyí€÷IÀóÈ#t8„ö@< 8nܸQÂ8 {Ñï·éûs÷Ñ…E ÔZð=9nܸA›A²è—à'ŸÒ¦äÜ«ðÎÇGô€±Î€ëׯã ÀD¿„þ¶ûÂѦ;”&°ãúõë%Ì€‚‰þ­9ý_üšïã ÀƒEk™èïÁ"`;Ëœ´ÀPLZZZü–}Û°€îãƒþþþ÷1€"ˆ~¿˜ŸD+€rá¾3à½þþ~Šà°Jô·:_ó#¯àküz;úûûIÀOFŒ±õîÝ»„øcÇ!C>¸ví)8r!ú;Z÷D¡äÜ ¸víZ sà0MøûUü·b €ØP4À{DàÈZôw8¬ö¤AÉ!*@ÚŒ9²Çùº’?¤Ë9®^½ºSàHBô«’¿Âûà°Ú`%÷ñ–ûxÿêÕ«tÀYøKìÿçÞj+0‰ÿîã«W¯–0€°Â¿ç¾ð§¨@~xÿ¾#`'¦ÀP—Q£FmsóÈ;%÷ñÖ•+Wv` å¢_¡ýo8÷Vü ó°¥¼ã>Þ¾rå u@…‡soµÖ°žν¨€¦áÑGí¹{÷.ùýÅäý!C†¼óÕW_íÄ€À^á/Á/á߃5 r¼)€=›Ca?¨NÉ}¼õÕW_íÀ€á8p˜ÄèÑ£©èQèpùòe:„?àÀ€ð8þ€#@ÆŒƒð#—.]Â8þ€#À†bȉøßæ>ýÈ}lu-X @÷£÷ñÚðáÃ/^¿~}&“!ŒfìØ±þ?pX §ä>ÞºxñâL8‚ ÿ÷é]„?äÔðúÅ‹wb ÀP_økÅ¿k@Αà-€`°ðïpŸ~èÜËñ°‰÷ÝÇ›/^,a À…¥Õå¾ð߆5ÀrvÈpÁS(šð§¥Ö8 mhYˆÿm-ý ˜ ´lii¹ØßßOë@H " 5Æ×s÷î] ü|ÍÎ!C†¼uþüù˜p€ ¿ùWÙÖ¨Ê÷!G@ SÈ£ð'Ï 8õΟ?O}À¹ÿÊïWuÿ¬Š’ûxóüùóïc ÀÆ2~üø®û¿kDb§çΣP ࣄ¿Bü•çÿÖˆ•·ÝÇ[çÎ#-p@æâ›soÕŸ<€døW4ÀL8 áßá>½ëî;ÝÇëçÎ+a À‰3a¿ºÿ°@&¼å>Þ>{ö,i€ÿ=νUÿ¬`#FŒp†ZuÛÝ»w›Þoåk¯^½Š±Ì¢ä>^?{öìNL8 Ná/Á¯<ÿ­X FŽ9 Üõ¬ß}áýÈ#8Ç$Ä}ôѪÂ<ÌïQ^[ËApýúuçöíÛƒþ÷Úµk¿ß¹sÇûÿwm€Xyÿ¾#€hÀј8q¢îO‘?€” ÷Ñ£G{Ïú]¯ýI õ¤öUË Ðì¸äƒ Ü1póæMçÖ­[ÞÏýýý|¨‚!ñÿÖ™3gÞÆ€šþ]νUÿ¬p1cÆ<ð,!;jÔ(OØg%ÌÓÜW'@\ãºqã†e Ç@µ °Ó}¼yæÌ™]˜p@Pñ¿Ý¡ÈaÆyb^«özøÂÞüyêI ‹qÉA HÿÙ,ÐïEÑÛ1à€z¿ǹ·êß…5Àf$ì%öÇŽ; öËE~=[TÑŸd*@’ûRJïð#ô3@P€¢vb À<öØcÊï׊ÿXlB¾¥¥e@èKøëVàUä×ÛW'€ Çè§øE õ3`)ª ðÖéÓ§)€ÿõ8´ö P•|_àû?k•ߦPwÓöe£“¤¼Þ€5à*È1%÷ñúéÓ§wb PLáϪ?äZìû"_ÏZáOJ,Æ%4ã—©&£Ÿ: t9ôÜÈ`(Dà€¢ÑÖÖÖãN^Yõ‡\ ~_ð·¶¶z4Åb‘[„(8y²WyÚé3JC† yýÔ©S;1°[ø³êÆã ýÑ£G{+ûrd-È\êäóã‡"Ê#ˆÃñ¢N:E4°Pü«²ÿOVýÁ0Æç ~=Kü«íž‰b±žÈ¥K@röÉó¾T;@Îß!@-0’ûxõÔ©S»0°Güowî­ü!øËE^^=[TÑ_ÄzQö¥´ß!à·'0ElÇ 8 ÇLš4I«þÊõïÂZÕ—Ðì±Ç^^‘K=ìS¹­“E¡îÔK0Å^•ñæÉ“'߯ 8 Â_…þ”ë߃5 -Æï ~=kÅßv×8lÄ8Iâ±Wy—9Rd§ûxõäÉ“À‹ÿ­Î½ÿV¬I¢U~‰ý¶¶¶º«ü¶ ¼86UÁ·Ù>YÛKé~‡¢ %$þ•ð>¦À1yòd ~…ûoÃjË7iÒ$Oôëç¢WÁ#ri ˆèÛ^¾#@‘Ô€„Ùá>Þ} ·?.¡F„ÐÊ­¾½Xõæó”{ùŽR $o;vl;fÀá„?!ÿ…øÏš5Ëýåü Ý&ÔzÔ—ˆ:ŽòÈR ;{Ѥà€â¿ë¾øïÀP }…øKøË´`‰S„ê^ŒH>OöÙËw(ÝwìÂ8 S§NÝæ>½‹% ªâ¯0=Ò0QD¡ÛˆXê%Øe/9ô *ðúÑ£Gw`0Xø+äÿ‡îcÖ€JÊWûÇŽKè¶C¨;N;"!lø<ù)D@äxóèÑ£¤àWüw8÷Bþ»°”#±/Ñ?eÊgذaƼ¸ÆQAŒ}ø<Å^~DQP¥¼zôèѦÀPX¦M›ÖãÐâ*PxÿŒ3¼p&÷„nc¯$÷…“Ä>{ù΀ ¼VGŽÙ‰)pQü¿áÜ ûðÂügÏží‰ÿ‘#G/XˆVu±—©N>OÉ#P…79ò6fÀPáO¾? ±¿`ÁoÅ?o¦žAôêÎç {•ÿŽ#*Øqß@]V‹ÿ‡|p™8q¢³páBï9Í 9¡ÛØËä}á$)Æç GÜÇ« päÈ‘¦À`Ó§O—èÿÐ!ß¿Ðh¥_Â_+ÿ„nê^t{aì…G›¾üòË]˜€Mâ›ûô.–(&ÊïŸ3gŽ3sæLgĈÖ ˜0"„VnõíŪw>?OØ 'Dæõ/¿ürfÀ`ƒø—ð߆%Š+üõÐÏ6 –8…¡ÛØ«hN>O÷~2„©iÁÙñå—_¾Žpä’3f´ºåû÷`b1jÔ(/Ì_+þExqŠìE|>OØ g@aÙéžûW>Lq@¹ÿÊ÷×Ê?Åþ „òú-Zä ò‘e„º“ߎ½¢ÿþÐCqs)ªðúáÇ© € 7âŸbB+þþå­üŠ*Xê‰D?ö*‚“„ÏS2©8 ‡W'ÓÅÿ6‡b…þ~¨QE,ùí„nóyÂ^iìKŽÿ…A‘;0ãpEàv÷éXÂ~üPÿŽŽD‡Cè6öJv_8I¨/Qíø†Š# 8¼Õ××·3à0IüSé¿T[ñGÄFµØ {Åé$áóT{)-@…`G__pd.ü•ç¯|ŠýTø#:š!´r#ÔÏöŠk_8 ƒêlêëë£C€LćûôÄ¿½<üðÃNWW×@¨’¢PdVu±NSí•ûà(ŒàÕ¾¾¾¦À® ¤Ò¿åÂÞ¼yÎܹsaÆž`#bÉoÇ^Ø{e¿/Õ¨¼vƒUxJ¥p¤"þ·:÷*ý#þ-dñâÅžð— 脳Þ$›UÊôœ$„nóyÂ^Ø«üw9ä k¯—J¥÷1€$Åÿ6‡6¶ž[Oü+ß?ªhCĺ½p’˜äÜ*úç G€ÕÈ °3àˆÎÎÎ7ܧb »xì±Ç<áßÖÖF¨­C~;öÂ>ØËÞHEvá°’7{{{߯ 8âÿ´ù³ ­ôwww;ííí±N0´rãóD~;ö2×!¥"rè¬bGoo/m€ ñ_8yägéÒ¥ÎêÕ«1cÆ„ª]ù¿Q*M7ÚWœã2e_a¶‡‡ûÂ^Ñ>OqŽ«hß?S1ŽÏ“œ·oßpÐ1ÀºÆ×qáÂ…0@k0&¨+üUäO•þióg óçÏw–,Yâ­þjK>2­Ü°ö*¶½$þýŽ8¬A6õöö^À83kÖ,Ä¿E(¿ÅŠþ’ž`F™dÓÊÐmì…“¤ö2Í)¢è0ZÚå8tèNˆÿ"!Áÿä“O:S§NM}‚Yo’Í*e8‚½°öÁ^iìKÑrP'€âˆÿ®ûâ¿käMàî?oÞÇ'-À'À!C6™4i’³aÃgæÌ™Þ*©½ÍëÁ¾ÂQ„þöiž7íÕèÿ¹.dóý3u_A_{ûömçæÍ›^$ѹ¤Å}¼6~üø“çÏŸÇ …&š9sæHü¿‹%ò‡Vúµê¿`ÁBmòÛ±öáó„½ÒÜ—Î#FŒÀ_^?pàÀÌE„@üCîPŽÿ³Ï>ë­þ‹¼¬R†}¯´ÆeÊŠgû$9.S÷Åçɼbìeö5&Î}É h½FÎÈ[ÇßwîÜ9"âLEEþ6nÜè,^¼ø ¡¶ùØ—-¡Û„ºãt³Ñ!v{ÑâÖ­[ÞC÷$¢pà@üCL(ÔýúõΘ1c %ðˆÀ^DBDÛWø<ñýkæµ~4€7±nP‹pd W((sçÎEüçŒG}ÔYµjÕ@¸¿?Ùªœ|Ùöwë`ìUD{E±öÂ>a¾ŠPm€aÆqϯïß¿f€"@ þÁX´ê¿nÝ:gìØ±_C¨-¡Û„º³rõ;dÃ5†úÙ|ÿüh=Ë @4@nØ:aÂ"â²@«þÊõŸ7o^ÕâJ„Ú’ßnëyLJ´AÄR/{™d/Õ#€Ú8p¤Œ+"ÿ9báÂ…^®åª?LV)ó*<Ù—ß® ì«ÑySÀ7ˆÈ™`âĉ}gϞŠÖ•ÿ`Zõ_³fÓÖÖ6èïEÈ=­„üZòÛ©/Áç {Ùe/E¨“ µrÃëûöíÛâ@«þK—.uyä‘ÂN0ëM²‹8‰Æ>ÍïkôèÑžC­ž-ÃìûÌ™3Þ*fQ>O|¾°W’×ó––¯H àÀ€ø/ü›6mò*üaRH•r3ìcò1Ž?Þ>|øÀϾSLL™2eÐk&L˜àm÷¯5Ž €F¯¯üÛW_}å\¾|yÐߎ?>ð{ùöëׯ;çÎÃéÆ÷ë•s¯U ¢ªÕ¸œ8B2þ|Ę>}ºò_.pu¬?Æ¢:I$Ö%ìµ2¯‡>÷'Nô¶iÅ^8Dy½íÕÆçþƒ:äs@øƒ³gÏzQ•N>O|ÿl¶×È‘#‰ȉ`ïÞ½8âšAÂgùòåÎìÙ³ý¡¶¶ØG¢^"Þ_•¯|6]”ÇùþÞ+Èßä PÄ€9 Ç€þßpºQ_–ëùÃ?ì]?è€âß:Ò¬…>æMxjKè¶~oooȱ×ϾȷQ”7»=.§F½×œ8qbÀI ‡~Ößâi|ÿ°WöRw?2pà&þ»Ü§ÝG+Ö0“®®.ç‰'ž`R˜²€zÍ«Rèû+üEåI;5¢¾§) g€Ò ®\¹â9pºá¤Ìƒ½”&$9íå‚ûØ´wï^Z€,Y°`âß`Ê ý1)$ÔÖ4ûø+ø¾ÈW^¾~G”›ãÔˆã=Ož<9B ‡~ÇéFꄉ×+µ Ôµˆvf;¾øâ œ€ñ•¨ÐßÚµkk†5:J¨mÚõ$ô%ðUQ_Ï•Å÷åùpjÄñžçÏŸäÐïˆXꕘb/9(ˆâ?7¨ÐߢE‹%Ô63'‰¾ï¯ð—çê#ÊóíÔHê=}G€žõPm¾Í}ÿ°Wôë¹Rä¤$%'(< .”èïEü›‡òò¯‚I‹ZBmYu+Çúzèó6gQž§FZï©´9N:5F`Û5†z%fÛkèСΘ1c¼n`¤ sÏž=0àH^ükå¿ k˜ÅŒ3¼ÿʉ ¡£„Ú&±/åëû‚_òÏ¢Ün§F½ãKòœùE9â9ô;ùí8)Ó°—"šFŽÉDÃ<° 'à@üŽ+VèüÄ"jýثھ´¢/¡ßÙÙéåð+<QNø×'uÎ*#*8)Í=Æ<^ÏuÍS4)8p@‘#þÍB«O?ý´rM~;¡¶qîKÅ#ýÕýŽŽŽBúÈ9DyñÂÿãt =g~ý9%P$‡í×sS쥔€±cÇÒ%À@'Àž={º1àˆ‘E‹½ë>mÃæ0yòd/ß¿¼Ê?¡£„ÚFÙ—JZá—à—ð7Mà!ÊÍÿó3Ç9;zô¨ç3@Ñ6_¯Šè¤ÌÊ^ŠC”.ƱãóÏ?3Ä¿•tuuy¨¦0“ V•òi¯Fÿ«p~_ô×jË—tOyD¹½áÿQq³ .x΀ÞÞ^ïç¢;)¹žG·—Šœ8À6ñÿ†ûôC,aZí_·nWð/® TPQ”IaBm%öõð×gÊd‹(·/ü?ŒS ‰s¦ö‚Š P„€6]¯’ºžÛº¯¨öRñÓÖÖV/5ŒáÍÏ?ÿümÌ8š`ñâÅÛÜÜ»X ”ç¿~ýú¦òý -¶½$ò}Á¯gÓ,¢Ü¾ðÿ¨Ç—Ô1Éà;T;@¿ã¤,Öõ=ê8zè!Ï PžŽ ¬!C^ß½{÷,8‰ÿ­îÓO°„Ì™3Ç«ô4ß?ì„)Ê$ˆzfS3¢ßFG¤½Ç—Ä1ÉàGܼy3—i>\ϳ±—:Œ5Š ‹9¼º{÷î÷1à&þ•\®v­X#{V®\©TŒÄ'LAEQ&…yµ×¼yóšý„ÿi‡ãKó˜T/ AÉO(•JÎéÓ§qR:ù,xšÖõ\u”ª‡À'@÷îÝ»K˜pTaÉ’%ýZùïÂÙRžïŸæä+ÎIP&˜Qìõ˜&L˜àÌŸ?ÿêýE°„ÿßåøR:&µ”3`ÿþý­©WB}—ÊßÕ*pâĉž32G›>ûì³ ˜p<èøñŸ=j˶yóæABG µZÝ—è×C^qEyšN [Ž/îcR;Á¾¾>/2 ¼x I׫,”E®àÿ>nÜ8gäÈ‘Ll p|öÙgݘL€ž!`’øWµÿ-X"[æÎë‰ÿÊ–BZMˆò{³ÿu_qŽËÔ}¥a/…öwww;Ï>û¬3}útoBvâjÚöF4óú¼“íç,‹íISKK‹3iÒ$Ï!ç»|ù²Q׫(׳,¯ÉQŽ!ʾÂno4Žk×®yŸ!}V S&·µµuœ:uêL8î‰ÿíîÓX"[6lØà‰<Û&_6L ³Ø—Âú—.]ê<ýôÓ^H…“"ðîÆþ½Ë»(g»Ž"µ›6mš—’£è­«W¯z]L¸Æ„Á”ë¨M÷?E‡è³ '@”s‘éjkkrêÔ©˜²„«dÎã?¾Í}zKd‡ÂºŸyægòäÉU'—„Ž+tTÂÏí¯÷ä¯ç£’<áÿù¨ÙÄ1;vÌKÐsÖ׫(×§"^ß“°—C=öųçõO?ýtfPTñ¯|ÿ±Dv(»¼ØŸi¦0“ ê4o/9Ô¾ÏýNz+ÿ¼|¼¬)ÏD‘ )ÆõžŠ8pà€ç ÐJpœ”\Ï“±—Ä¿œÌœîO?ý”ö€€ )þUñŸvŠÿo|ãžø3y×ûe‚æåø‘è׊?/¿ϤcâøÌŽ‘@ÎÌúzŽèÏÆ^r¨8àˆ#˜e‡¾€›p( K—.¥Ý_ƨ؟rþ‹ i󾂨K‚_+þêø€À3Ë©AôDñ¢C’úLÔ;¦Ó§O{΀Çí¤äúžÜýO`¿x$d‚×ð“O>¡= ¤ E!&Mšôs÷i–Ȇŋ;k×®}àï¦VÁºï<cöR¤‡Šù©ÞƒÄe¨P¨$o^Ñ8Î…ÃnW'öövgæÌ™^8ø¥K—œÛ·o'~ f_æÜÿÔ!àÖ­[´ Ì^ZuòäÉ÷0à«Yºt© þmÅÙ°qãF¯²» "6Ì$'ìö¢O Ë‘Ðê©§œM›6y…ýü”žÙÛ©®_ÔêóÑGu.^¼èÕ  5`1Z)ê\ãÈ”ŽI“&uœ¾¸ŽIׇ±cÇ:³gÏöÄ „¡Vˆ“º^…½¶\“ãõqßÕ&PçZç6™Ð5iÒ¤¾“'ORRo9¤ÆO}èPô/ñ_A÷ÉÔI¡/üŸzꩦCýx8ElpTpÎÒ³_˜×”;$UH.ŽëyÑ뻘b/Su¨L)„ÄÙªz'Nœ ( Ä );ÝÝÝ­÷ÅÖH'Ÿ|Òˆ•“4B!ó{Œjã§s*€É­ÂšÝÞÈn„’§o?ÂÿùÌÇqLgÏžuöîÝë=gy=/Êý0­q(à±Çc•.j ¸éã?Æ ±AÄŽ+Z(ú—2ZõW!¸jÐ)ǨU~åø—çù™è…ÝžÄ>Yuu¬?çŒÏtר‚¼¢TŒVi7nÜÈäzξâ½gé<*ÕcÔ¨QL¼ÒÃ+ xâÄ Š0“îîîmîÓv,‘===^5xSDlV“œ°ÛMìë Ö¥RɺëyÑîºoµµµ1!K}iºÿûßS"AÄ”)S´òOÑ¿”Å¿ ÿ1Ú¾³:FöÓyT토-ý¨Ϙó4þ"ÖàœÙg¿ò¿©š¼ ÉM›6Í‹èïïOåšL=œøÇE$@êh±mÕñãÇßÀ2åÉ'ŸÜî>mÃé‰ÿÊœÿ¢Mrò:*±¿nÝ:gõêÕM·ô3I, ðxœS>óÍ¿zËË  z'ê !õz§Îë¾Ò¶5R§cÊ”)CŽ?¾SÈ„§žzªÇ}zKd+þýù˜È)Ï_þ¢†Lš8ÙGà!€mpTpÎÒ³Ÿ:øõ._¾\µ>@œ×sîñËwè\F‰ØƒàÓÁöööŽ?^ÂÐ |K!ŠøW(R¯s/$ D«ÆÏ?ÿüâÈlœ—j¸tÞÔªQ=”k½¹Âäw“Ï9ã3fûÕ«W8GmxM§@rõš}_ET+d ‰ :ÿû¿ÿK= Ð4íííÊû_€%’G«Æê©\ ùNàmYŒK!þþjíççù¬¥±½ô”w wÎHàœe¹]i“&MrÆïœ;w®fÛÀ°×ó¨×÷<î+‹ûŸÎé©ÑâPp@š<õÔSÛòþSAaÿ³gÏnJôÎï)̾î/ñ¯üVÄBñŽ gög‚sf¶ýZZZœ™3gz?ûm‹zÿË[= ¦JG{{;õ ü|@X–-[Öã>}ˆ%Òÿ~µB!óÑiòäÉ^? Â’ïföžÞ‹PrsìÇ9ã3_o»Ò>ûì3/" î빩÷0ZãŽ3Æ‹æ€TØô?ÿó?8 0D@Xñ¯|ÿß:÷B %ñߊeßI!þ õW…ÿ‘#G²jM(¸uçŒÏç,‹í?ü°3uêTOPž9sæhÃùóÜÐÇðkß@¢lmooÿÛcÇŽõc À±ã^`~ä>ua‰äÅeµÓòÛó6ù »=Ì8TÁú¥—^òVÿ ñ‚ÀÃéÁ9ã3/R>cÆ ÏpñâÅ\ÞÿŠV'@jhQnÁ±cÇ~Œ)ÄʲeËÞpŸÞÀɲiÓ¦ñoj~;­‘îý®Uÿ§Ÿ~ÚyòÉ'¡C‡" €<»2ç¬xŸyŸ‡zÈK¯R‘ÀóçÏ{âÒô{…)ûÊj¾ '€ŠâHœííí;öŸ˜~Ç1aùòåZõÿK$‹¿òŸ‡ü¾¼î+.{-Y²Äþ O­ÜF®püÇG~wzç,MûeÑrs–ßÚ!å—¨<|ø°sðàAî9˜/(…£Q”ÄB÷ÿ÷ï P" ˆøWÞÿOÜWîÄ¿ç™Ëh€ÖH÷¥Ö~Ï>û¬³páÂA«þ¬à%{|6ÛãßÎ9+Îg^ÑãÆsÚÚÚ¼”€7nPÇ17š¯¿¿ßû›jä@¢¬š:uê©8 î…ä¯Ý§-X"9–.]êtww7}Ó³ÖHÍÛK«þJÑhmmE 8Ô@àåcüœ3»O©XÓ¦Mó~VZNïøæ q; ÔÑAQsjó‰¡ÅºÉÇŽûS@Íï#&€z¬X±b«soõB•þ%*«M„² í«üÝÖ}ý_M0ŸyægÊ”)„’çðø8gÅ ÿot|œ³|‡ÿ×zý¥K—œ={öxÏÜÿÌ/è^:vìX&€Éòêý×½ D@=ñ¯eÎZþ%†Bþ}ñïyä(TdܾfÎœé¼øâ‹«þA&Oa·7‚J*ɳÝüÏ‘Ùøðá^ïùÊN¤˜u_¾|ù2‘ɳeêÔ©{ôèQRàÂP­ü·b†dèììôÄ¿ ­~òº¯zÛµê¯\=ô3b ÿÛ± Ž(ΙýÇ7lØ0gîܹ^‘ÖrYt§·ió…S§Ny 1üú]@TeÅŠj÷÷X"&NœèlÙ²e ˆœ ùíyýqMj|žøòË/{í¦ öçŒãKã=m?gyÙ>bÄïZ®¼s=l½ÿåu¾ ( E¨= œ6S§N½xôèQZÂàï &€JV®\IË¿„ſĥV•mlõ“÷ÖHîçßY¼xqÃ÷$WØÞã#¿û.ÇÇ9Ëì3ŸÄñ>}Ú« pëÖ-+îa6Í´¢ˆÈò–º+ÜǦßýîw´„H€j¼‹ ’Aù‰¾øÀgI«Ÿ¼¶F?~¼³uëÖAâ?è‰ívmç˜9¾<Ø„s|ÿr¼/_¾Ü[m¶1œ?Ïãº}û¶säÈï¡•y=TB båÊ•ÛݧװDrâ_}äÓÄaoÌ&N&ÒÚ—Dÿ† ¼É!“iŽsÆñ5û™°ýœåy»ÂÌÛÛÛ½ŸË &)®m¨‡“Ƹ™qåÊg̘1ÎC±6™“§M›6äèÑ£;1à€A¬ZµJ¡ÿ?ÂÉð­o}Ë[…È:¿= q× “œ2*ĸdÉ’z  ŽÇvι½Ç¯Ž.zœ9sÆËCzŸ‰ó^šå¾Òš/ÔÚ—œ7nÜðœ=Ó§OÿàÈ‘#'0P|ñ¯!åýw`øyúé§yóæÕ”P Ý}©ÀßæÍ›VýÉïæø‚l/Ê1q|Ñ>óÔÖ0ÿø$8?ûì3çÂ… …»ÿ™<_sÆÔ€Ø)¹îÿüÏÿ¼€)Š à1mÚ´¿rŸ¶`‰dÄÿüùó3 Á»ï(¯Í˾´âÿÌ3ÏT­Åd”·í•ä9gùÿL°=Þí 5Ÿ:räH SR ÎêÕ« ýOµµÙ²e‹Q¡~q#îq¥±/Uù¯òO«0Âÿƒloô^„ÇþŸäg‚ðÿdïæÍ›ÎîÝ»½hZåš1_˜={6N€døïþíoK*@A! àLŸ>ÐÿP±?‰U¦¸Pöûš;w®óüóÏù: Šã5¬àÙ}|œ³âéùÜ^žPÙ% Qs&Þã/]ºä9í5—‚X!•Õ«W÷8„þÇŽ*Ëç;ßñžM›„}¯¼Or$ø×®]ëtww§:±Dà!vL¶Éرc½JÛ£Fò µUÞ-ç,»Ï<ßcsŽO߉ÎsçÎ=`“¸ÎÃ|AçðÚµkÞ9¡=`쬚>}:©…€âŠBÿÿ¯¼òŠPmbJ¨_½‰’)!ˆQÇ!a£BãÆ{à²K&üŸPòfI+Êö9r䅲ʷ¹„ û=}úô ¿+dÚ/ž¦¿égµñçÏŸøÙ¦sfúgžðÿøŽOyè{÷îõž³¸‡1_¸;è~ÞÑÁt5$þI( ÄÔÕó3dÈÿñ£s_ü8ƒnp~/ھ¾¶üw…qê\( ÑÄ/(y\õÍúý9¾úÛµò®•x…·ú½¯U«BèwmrŒqˆþò¿W»¶©]W½ýÉI g€ðú]—°ºråŠUŸIŠKÚ³]¢séÒ¥žàìÙ³‰ßØ/Ô~­®ÇŽs¦NÊD3^¤¤ÞÄÓ˜ x¬Y³¦Ç}úKÄ˺uë¼ÉB^¼þ&Ay]ÙP…ÿ+VÔ}Vð’{[¯Ñ1×z½DüèÑ£½‡~–À/üÍ8:Òýq9gêý¿-pêÔ©&üþÊ+…)™õñ>|Øéëë3þþgû|A€ò¨>ˆMÿñÿ±3"ŠÉ1A¼¨ÝŸÄ¿çU‹°rý€‡.Á}…Ýe\iìK«ý+W®ôª7+DÒØnâ˜Ø=ÒÀõšœ*,_ZUýÞDÜŸëòmjÁ&ÚÚÚxœ~¤ÀÉ“'~&ú¥˜ß³¬¶Ï˜1ËØ·oŸsëÖ­\ÜãÓœ/¤ qôèQï^¯s±ë‚nÌPˆ(k×®ÝîÜ ÷˜PÎíw¿û]ZýdxŒZY}á…¼ÕUZ…±‚—ô9“¸W‘0­êë3§g¿Ju:¢?Êkü(9ä P±6ýN j‡$}|ú¼íÙ³Ç+šIkÀlÆ5tèP¯ÍreýˆÌ[¿ùÍo¶c`Ÿøïrîþƒ˜PÑ¿ïÿûÿó8!ˆó¦žÅ1J€©å¢ßâÏæ¢u„ÿ§|öøZÍ×£\ì›. ã㦎¹Ò)à?ëoEüÌã‰R„ÔSæ ---άY³:ýë__ÀöB @1xñjC³~ýzúûfTé_ùþÕª«=ÄÕÄc6e»Ä¾/úýþ -Öýæˆþ¸ß_©CÊ#ÖC("@Ž=ä(Êw†ðÿhÛ=4räHg÷î݃œÍÞÿÒJÿ³e_ÇŽè¼±Ðz_7¼Š)ì…ËY·n]ûô!–ˆå«âž‹þE íËr\jûóôÓOªôOÑ:Vðª½Þ_å;v¬÷¥B¿©:c6Aô‡‰Pd€ú¿ë¡ßMþÌÇ}"ü?üvÕœ8pà€÷lò=ÞÆù‚"¹Tˆ¢€±²é׿þõNÌ€rÆúõë[Ý‹¤ªþw`xxíµ×¼œ3Ûnâ¦×èþùç½&žæ´ 3É‘¢  ¾›zø}åýfÙ4Ñ_ïï* xðàAÏà§ à<´ÿÚv»">ÿüó@Næ ñŽk̘1NGÓÝ) 2¤ûW¿ú©B €Ý¼á~y¹Æ„Šþi5±ÞÍð¼ø÷5}út±hó×ŒÈ Äõnîld»/úÛÚÚUëÏK:¢ßlÑ_Žœz,_¾Üsh¥·¼³€ ß©,®]&^£lW´Ñ¢E‹œR©äœ>}š{|Šûºté’÷œˆ°”õë×ë‹Û‹%âAÕþå¨uÓ·1Ô¯ÑD'q©ÐŸÄ?=ëÓYMËà žD¿„˜Ú½)-Ñoþ˜ÓýYÙw¨fÀåË— q" +Ø9ÓçBNæ éŽKó†Zí[¡):õ«_•0ƒ],c)3gÎü‰Cè,hÕ_áçå¹eò<ò¤5ø=Ìÿ𲝰Ûã‡VQV­ZjÂ^ôíQWVïd»VÕ´ª£‰Büf° ",dÆ Ûœ{þøc¯^@½ÂE»NØrL•¯×Š´ÒB>ÿüóªQ Ìâ—¢-:äé„XÎØ„ò.1KظqãV÷é/±Dt”÷¯pdÃùMÛ—¿òï‹Dµ=Nʿɱ¦ÜþÎÎN¯¨_µD?­‹æ¨Ð5Pß ,Ó ±BÄk9Šî<´åÚøðÊ(B*a–ûºyó¦çl¡@,t¸ü¡¯¯ï L²ÿ*ü§¶­X#~ÞÚ7¸"¶ú‘ ”ø×j0¢Ü¾ãóQ CSû¾j¹ýˆ~D?c¾ë9ÄTôrñâÅžƒLÓH0ñ:U‡®œ­­­yœ{Ä9_ˆ:.Õƒz±°Ê½Ÿ¿GAÀ|C €¸·7ܧ, åý¯_¿¾á ̆ð¼(ûjôÿAöå‡ýWŠD¹=Ûõ}joo÷=6 h›D?íÍpT¨.†çÎsvïÞ=ÐJЖë„׿fÆ/‡¨"?¾øâ o…šùB²ãr«çVDBzCºc;¦È/D䜞ž}ßuhû ‰”o|ãÞ ¹Ú$ÌïEß—Âý7nÜXsåQ_§†V1§L™â…ùËàO´ÈAG@3æðûÒj¥¢gT+À/X¤îQ¯my¸·(@÷ÄË—/{¡êÌ’Û—ì­HEØ@dº:::~\*•.` îP9Va‰hlÚ´É›h5{c‰rCË㾚ݷD¿VþÕ QnÏñIø«nÆìÙ³ªù#úi%ȘãyELéþ4þ|ﻥÈ9Š~²åÚ*G©œªX¯ÞõÌ’×õë×½¿)"¡EÇÖR©ô¦À)Óãâ>½%¢1kÖ,¯ÿ¼É­lÒÚW³Çd»&8ÿ~åwDyþ·ë\*Ì_ùýþõ>ä ÛÓUџ͘}G›ÂÆËyíyw ÄñþªÔ ǹGØíIÎcm¡ú о€H( ࣒ ¦È$Âä÷Bö¬ y7oÞ<èæT+›<ì+©qhåÿ™gž©)þÕùrjè<*Ô_¡”þÿ4SÌ ÑŸ1ʘͳ„‹ŠÕúíä>û쳺-¹NæcÌrêÌ›7ÏÙ·oŸªnÛÜ#ÎqDÇêEÏ@$Ô°óßÿýßi ˜ˆÈíÐö/+V¬pæÎ{Ï– ‡<Êkó¼¯ò•ÿ°Þ¤WÅ“xOÛ¶«&†Vüuþš‰„!Ÿ›ö‡ˆ~3ROt-VÚŽîwgÏžõY]gL¿›zLå‘þÿ3÷ˆw_j ¨VŒr@Ó(broo/mq@Ü<ýôÓîÓ,Ñý_,Ñ›IY+Êy–è9}ú4ÎÑœÜ[t–ÃV…ë˜{4ÞWØ×Þ¸qû/’ ‰³fÍú¨···„)p@ ¸_¨wݧ,Ñ ýß´iSl7’°7š(7¥<ìKâßýŒæbb–÷ÉhãWE9kÊ+û#ú‹ÑJ°cFô7~„Žî‹J PÛÀÊú¤˜éPV$ÀðáÃ;ò0÷ÈRôWþN*@,tôöö¾‡p@Dî¯þoÇÍ¡›åË/¿ì=ÛÚÊ&­}UcéÒ¥ƒ*èæq5¨(+\Ê%1c†·ò_/ÏŸ|nD?c.F'­(Ë Ñ£h­‚Ú$ÊóœŠÞP‡[æa·'å|Ðù]U šw`>¸¸r€{ñz+4ÏÊ•+½•Π7’¬êäa_•ÛfÏží<þøã¬æä`»òü%üýö·d̈þ°cVDj|üñÇÎîÝ»­å¶Þ[½!'€¢7l™{Ä9Ž(µ._¾ìœ@ÓH·tbs!Àpžyæ™mîÓ6,ÑÍ„þç5t-í})äÕªU¹šxåÝ)ÐÌø”7ÚÙÙéŒ=:Oh7ÑŸ1+*H5A%têÔ©nEíI\‡““:詘c‘æiìK)1&L  yZÝ9bß¡C‡va Ðîè'ú"a‰ð„ ýÏK=€¤œa÷¥pQU¬ #·}5(OǤs£¶_ZÅ(?Oˆ~ûò¹s~>›ypT(Ä\i]J#@+Í„ÿ§ äõrìjÅúÖ­[VÌ=¢Ì§â—Ÿ P/jÒuèСw0 «ÿÑX¶lÙ ÂtIÞH⼡™î]W»¸Í›7{“Ã<ˆvk$½]“B…ôjõŸ|nVyýv¥ž¤5f‰ÝCf.‘i›(·!=@E\[[[ .xŽæþ?­qÑ 2DÌL`&Ï>û¬Vý?v¨üß*àò½ï}¯ê ³ü÷zÛšù=®}Å9®8÷¥"rÿšpÔ{¯zï_o{£×ÝÞè½â|“ŽIçgÒ¤Iu',ˆ~Vy3íþFýçùË_záæa¯I]{¹·|ý¥¸B«j´F^çqÎÍš—ªs¤HRhŠ’ûèþ—ù— ˜Â,ˆ0”Ù³gÿ¥û´K4Ç+¯¼2ÐÛ<­0¸°ûŽòÚ,ö¥‰EÄ5A óz Öß®´ Õ¼¨6Q!Ÿ͘ýQÞ_ùæJ Pû9¿É×Þ¢Ý[äüUä—¢5l›{d¹/ÙY­Ih­]?tèÐNLpõÿGî£k„§««ËY¸pa"7’"·\¾|¹—SnÓÄʆš Uá.EeTN\ýhÆœ¯Ï¦ÉŽ ­†*%@ÎÆ£G6 9/ò½! ‡² ÖÉQéÒ¥B´Lk\J5j”Wš›–Ïž=ûo:Ô)Ìò–â^ˆÞp(ü×ò€«í_š-cLme羞zê)¯’¼ ¢<5j¡P9eäHSd)úÉçFô]ôg=f¿eà¿ýÛ¿9Ç/´(7Í) ½þþ~çÌ™3VÌ=ýZsµƒ:ÝÝÝthééší˜Âˆ0Œçž{ŽÕÿ¼ôÒK!ê„Áų/ ÿ'žxÂ:QnÚÄ-Ìv ~ µ)ªuÎýˆþ¢ÙT×È™ÊÜè¹sçêPDQnâ½EŽá›7ozŽæ1ñD è<èQ^ÿBáEE‰©pãùóç†Ô›6÷ˆ:ŸJr\W¯^õ:í@S`$³¹ÿͳjÕªš^Ù,søó°¯jÿ« Ýúõë½gB4³¯ ó œ[ÿ3Žèw2}Æœ¿ZˆþäǬi]§þõ_ÿÕ+œ†Ã7Ûírttt8¥RɹuëV.æ¦×WRGÀTá] µ ‚CxþùçYýo­Š>ûì³\ÀÃüåµy] »¯5kÖx+ÍL¬²™x–£Â–šT×*>Dh7ÑOQDSƬüs¿]à… ¸wd|oÑ}CË—/çb}) `âĉlŽ®9sæ€|Ü/¹ÿMò /xyYyme“”àÙ}-Y²ÄËéD”g»]«7rn©åVå¹Bô“ÏMËFD¿©cÖµKÅcU P«¥ˆòl·+rLµ*‹š6÷h†,ÆuçÎçúõëžBC-C‚ ²gË–-ZýïuÿÍÂ… gžy¦æÍ°òÆå÷¨ûŠkI£ŠË­[·nàoµÞ'èöFcŽºÿF“Ó8÷ô˜âØ¿&Îÿåi-äs# ýˆþ¼ùìÙ³^J€ ¨ÅymæÞ~{__ßÀy0mîe>•Õ¸æÏŸïuâÐ(4¨ó¿øÅL‘D«ÿÍ!qôÊ+¯Ô Ã"t-ø¾ÔÞFyÿ~OùfE%!šÑö?räH/ä¿^ýD?c¦e#¢?cV×µ T«ÀÊ0tî-éÞ[”NvéÒ¥Aò:©GZã’3E©’æLð^Àvb EwüÄ!÷?4k×®­ZˆÅÔ›RØ}Çyƒk´/­8kå_•ÿ™8e·]« zT;äsSxÑϘó8fu-‘@œ8q‚{KFÛu_‘ƒYN€Ê¿g5÷Èó¾äHñ»-@hº8ðÿ0€Â²eË–mîÓkX"•…ÿòR¨¯ÑÿgåÈX½zõEÿ˜8¥·]“­úW:`ýŒ™–öŒ¹èŽŠ)S¦x5MT ²?=÷–t¶+bRÑe•©YÍ=’¬¯”Ƹ(Ø4-sæÌé;pàÀ.L‘ |b3ƽ¨ü+„gÆ ©¶Ÿ±­•Mùï‹/örÿ™8e3ñTô…œ/þ‚|nÆŒèg̶ŽyÆŒ^áÞ_þò—ιs縷dàÔЊµÚÙ•wiÈrNe_!çÛ±ÏÕÔ^±··×«G¡‘þÙ²€ qo‚ÛܧmX"ºÐªß°sñó{ö%á¹bÅ &NmWË,E³ÔÊ!Dô3f›D?íqTÕ˜5k–'@Õ.{KúÛU@Q°6͉²ˆ^¸víšçTii!“7$­sçÎ% @ñp?øÊý§òTøO«åÕѳ¾ø7³¯°ï•ĸ¨ ÕÄ'§ä·7Î{mñ—–H!Lš1#úsÒcV]µ åu¸·¤çÔPÊ™0Aë˜:¿2Á ;¶··3Ij¼ƒpWÄnuŸþK„cùòåô¨Ïkuþ0N‚$ƵqãFo€‰QºO9\”3¨Õº8c6UŒæ5r¦ˆŽ Õеðøñã5ëpoIæýu/ÒbJ½î y©ôv{ÜãÒgWi|ås*„¢þpàÀ/0EºP #Ü ÊÿÁ á3fŒÓÕÕ5pAÎ*ïÞ†})ï_¡çYM<ò>qjv»&ÿÊû'Ÿ›1#ú3c¾«NH^qÀŸýìgÎõë×¹·¤¸]ÎE¢•×c0e“·úJ_~ù¥3iÒ$ †Gzè}Ì.DdÀ7¾ñ÷i;–‡ ÿ©RzùE·ò¢\ïâå÷¤öußͼVÂßÏû¯vƒcâ”Ìv¥\èó«ÐWD?cÎÓ˜Ó£Œ¹ØŽ Õ˜?¾säÈ/§š{KzN ¥D©×(̸÷uçÎï!‡ „¢cîܹíß¿¿„)pXûAÿ¡û´KgÚ´i^Ⱥ7’°Û£ŒC+Ï›7oŽM„}âôõ꽟Õþ^ío~®uùßô»¿¢åÿÏ;w¼ŸµJØè»ÚÌ1" ýÕ¶)àg?û™sîÜ9«ï-qloô^^/{âÄ‰ØæDEl 8cÆŒA˜ ›~úÓŸîÄ ÉA €t ÷?cÆŒqº»»¸&™+oÛ¾æÌ™SUü7;™Lzå$‰1¥qL¾ø¯vÞ9fÌQ^ã ùZ⾞€¯ö7ßþgÕßVíoåQCåûP›°ZïåïKÎýM"Íkþßó,ú³9N4]wýšgÏž5îÞaS¤Á¨Q£¼‡qÌclª¯t\ÇŽóÒWªE´B]Ý„ AHH˜o~ó›îÓß`‰àhõ߯6„ó§º6vìXgÙ²euCÿm˜$e=ærñ€fÌq‰$}žüÕúj«öÕ®õÄØÿoôšFï¥ëŽJã’Ã@©HzŒ=Ú ãÖDX_½Êî´lDô×Ú¦ÏNgggÍt›EyÚÛõým” Pô¹Z½ÿU¤”¡* Y0þü÷öíÛwSàÈ%îøîÓ*, ­þ?ÿüóÖßHˆü°Û×®][µÿ|^'!&ŽIâeܸq±‡ýÇ9y&䨬1—‡Üú ‚;¨HOJÔÇéhÐCß9äC@×|]¯ô»_@Sæ0×›D^Y¼¿M³fÍòœê]¨OæøýÖ€åQaç1¦ »ï¸ÆuåÊgÒ¤ID„dß¾}ÿŒ’ òòË/«è_¯Cñ¿À<ûì³^Õú¼æ˜%¹¯ ÿ»páBgÁ‚Æ`JŽa39šY“/þ«MŠrŒèPà—ÿ‡HOSÔgéhЊ™JÐ ¯ŸR`º€Îc›É<‰þjÛôÙP:@š&ß[’º_Ƶ¥[\¸pÁŠùUÐóç¸ÔpþüùLôƒ£[ç?þã?D$ˆûEWÛ?ZÿD+AÏ=÷\ÃIg­IcÐÿµu_ ýWëĨ“ÇkGCµÿ×wM)jÿ¦{ƒ®oZ…ÔªoeABD±S|ô™ðÓEä±)ÛõýÓJ¶_ü3Ïó«z$µ/EPÈ @@`ZÜÇ^ZâÈ€Ö!ظqã ÂuÜHÂí{Íš5Þ ºH¢?͉[¹ø'ϸØcöè­[·¼j=Wü¦‰ú¬Çå”n£¥ È ÞÚºÞi»I¹(1õ³‰èOnÌåN€ÊšEýIŸ¾krÊU¦˜ ®³ÜW˜×ê¾A-€PtíÝ»—–€8òÃ+¯¼Òã>½%‚!á¿yófë/þQ÷Uëÿö¯*³6L2¢nOâ˜$þ%8†ý›* sø÷‘À”Ø÷ÕòÔM)Æ—µ£!è9$FTG@Ž9õ,×ï:'rÈØ(úIñ©¿-LM€,œ68t/ôŸ&̉¢ì+Êü«ÙqšVw~ûÑÞ½{K˜"^ø&ÇŸGYÝ-Zý¯u‘ͪeL^ZÙhELmÿlšd˜4qÓZ+ŽAÃþÓ£EÉ3ÎzÌšèêáWª/©Õòúëµ×«õÿåû«ü¿òýU¾G­×†ýÿ¸ÇÇ1S¹­UXP9êäœÑDÛ úíý•È ¤?ûÙÏj˜zoÉëö &x–ò4œ¼¶÷ C\ãêëë{ VÔ×S-c‡€xå•W:ܧX"Z¹^µjÕ ‹håE·Þï.ضïK¶ÓêWÑD}·rñè/ƘýþþþþA+ýE-Æ—ä1$5&=Ë Öƒ ·õSüT D¿ÙŽ¿¨cŽÚ ïN¤Ç'”ŽSiÛ"DaƱ/¢BÓµ`Á‚÷öîÝK1@fã~Pú߃%‚±råÊA¹ÿ¶_üãØ—ÏìÙ³½¼G'Y_7g ÉCÈq>Eÿõë×½ÜaÅ¿Þ÷°HÅølp4hUXÎ¥ èg¡ó¶HMë{C-’{)"ÍÖH"õ,ï÷ËÊír¨ûByºM^çWY8#d7j„ââÞ½{wb†øÀý”îüϱB04)SÛ¿ZRÛÃù£ìK7à°adT36IÓä1ŒøGôçoÌš€ùX­òW H›Ã鋚¦ ïµ_@PNµ4ÓCш~ûÆì§¨E ZØ¥qï(ÒýR©úîÔr˜F¥¹¯°Û£ŽëĉNGG‡×å!]µ3Ä1³ÕÅ}ú ,ŒÊÊÿ.²a~·}_jù§Élsú“|ÙXâ_bmט%ô%úºêO\+Å"Åøò™¦Ðèø«ýê§Œ?~àû®¨€jÝò˜7_TÑ_ùw¥hŽÑÛÛ[W¨ÚâHóýõÒ£ÒFkÀ`ã’ó9èü¼b€øÂSà0÷úWzÂѤë¹çžKL\Ûœ Ð±Å‹F”§µÝÿš4" í³&þýzÈP¹âŸ'Q_tGCÇ tÕQikkóVõyÑçÑoǘUbêÔ©ž 2dÝ„{gžôªµ!ÇY¥s…¹Zã}©À”)S¨œWÿÿ3à0Ž­[·v¸Oƒ%‚±aÃÏûiBkÓöUMPW¯^í¥e’‘ÖÄL•âߤ^×&‰þ<ŒYSM²”ì¯ö›&>q44¾&¦éhPH®jøÑUràDË¿£BçÕwTŠUD´íš“è:kCf”ùg3ãRý¢³@Å¿øâ ŠÆn§q¿ÌÛ°B0´ÊZžûoBk“öUïUøO¡«Eåi½¿ú‰ûâß1krïô«Ì /ÿ™ùúµjý-î1U¾W’v s®µj¬5íííΙ3g¼–rõœˆ~óÇ,ÇΊ+œ_ÿú×™ ô¼ß/Ë‘@u5TO#ÊÈ”úJþ?Îq©€:VèzÎÚŽ¢C@Œ,\¸ð]÷©K4F«ÿ ·¬¼Ö»GùÝ–}IøkSQžÖv‰¿:¸i“ê8'Ï6Y¡½W®\q._¾ì­ªÔûŽ‘#OšBÐ1é¡ô­ÒéQYùÑŸ¯1«æƒÎçáÇ»7åñ~ZîPŠUµš:yœ«Õ#î}Q _|ñÅ;˜€1¼úê«ÿ ˆrÆT™7Í‹®-Õ2Ñ_ý·]”§µ]—ÊJ¼ˆþüŒY‚ìÒ¥Kžø÷…Åø²s4Øœ¦ k¯ê¯H@*ʤ²N¢?c–@NÂÓ§Oï0ÏËýÔ¯¥!'@Ñ 4‡}­Ò'¦OŸÞ°ð0x´.\¸b€8ÌÁý@þîS–hŒª×+´2È…2ìö¬iìKÅbæÎ[ÑžÆ$Hu4™7Y@ÛÖŸ;®÷—øºxñ¢7yò+·SŒè4Æ$§¡Z ©­>‡r˜æDKËY˜×1«€œ†JíÈý1‘yºŸê» G¬ Q˜aß+Ê8”~¨4 D¿«ÿ?À Ñ‚ ¢ó­o}KßÚóX¢1Zýýõ×·®¼¹„¹©Gù=/û’g½§§gÐJu£IBµŸ£noô^q¾µ÷Šsÿò¶KüW»‰½?·ÉŽ ¿°_e˜?«Ü¤)deW};楟 úó3f9o~ñ‹_xN€¤îIÞ›Ó¼_=>‰}lš›¥1ÿÔoÍš5tθø‡ `ˆˆ… *ô –hŒVÿgΜIˆXÈ}iå_Í@øõpE­ÞU+:VTÑoú˜5YW‘)­ÚùU¼Ÿñ‰zÍCeD€Ÿ@ŠÙcÖªkgg§S*•ª¶}4=ŠÍÄû­_7CŽZÚ8ß—¢Ø´(¡B•ˆ“{öìùOÌÐ<$œÄßc‚ÀÎ’¦.²a/Â6ÝH”w:þüB‰ö$'9²«ŠþùÕxýGåëƒl ò÷Fã¬õšfÞÇÆ1÷÷÷{UØõð«°×[+ßVùµÞ§Úkëý½ÿkfLqC”1Åq AÇTë;š„]Ó>×rÌ›7Ï»^û©EQ¾Si\â¾ämÌrÞ(ºÎJ´ñÞ™ö˜ôÙ÷óÙm˜«EÝwÐÿ=~ü8"Ý•¤DäÛßþ¶òþ?ÆÁÄÿsÏ=)4«ÞÇÖÔ……iu)‹Ã0ï•—ð¥Q(W1Ì$'/½®m³VùÏŸ??_Í*7i ¦žëZÿ¯Ïï—_~ù@R|̳º|øá‡¹ ÿêØËj>P^_Á–¹YóOµÇn6Ú³€tÿýßÿý.ÌФDÄý²ªøß*,щ­¼ÖšTù½®7ËÂ}IøW®þÇ5*âvÕ (¯?AÕnó …T¨¿&~¨?â“4ÆöÿÕÛ{òäÉ^^oy±JD¿yc;v¬wo8zôh,÷ž¬ïÍYßoý‚€º†ÛÎç<¯Ö¾UGdÆŒ†`ôïÙ³çŸ1€¬§û<–¨ªþ/[¶Ì(q‡›’Vÿ+W« ÿonÿš„kõÑoî˜UÕ_¿<ñ™þ1ÝÑ÷1($º­­ÍûÜËÖwZ$áÞG½Øu~¹Q”{k’ïé·,Â\-®¹¬Š(ª@ekb¨Ê‚={öü?Ì€ u¾ýíoouŸ¶a‰ÆlܸqPq“¼´fÉÒ{±hvÿ~Þœïƒèo~\ê }òäÉÂZã3+œ¾Hi YŸëzÿ/‘äW¢÷ëb úÓ¿¦–ÿ{{û ¢€6Šú4j(O6¬Õ 3¯+ûa;.]h ˆŽÅ‹¿÷ùçŸ_ÀÁ! 97 €<—´¦‹~“öå^Ä2½IÛâTÓ)Ì1¤Vgx¿ c26Mö”ç/ñ_mU3íÐõ0áôI„®gNo‚]‹r®ƒ¼WµcP’X]`TE=èw-©ïz3ך¬ÇõšZ)\×®]ë=›tïËúÞÜÌkÔ3®ùUjHÉ ¨ @—á0ÂÿÐÝݘ¸¶¥5`ùï&LðYߤó¾]aÿõŠþ¥9ÙLc‚jšè÷Ñj™Uà ñ™ñ‰£ÁŽÚ€uuu ª …èzÝ2ÁQõšªƪ@ø´cVáËJç¼ B=ɹíñãÇè²D  $ßùÎw:Ü/èÿÕ—”GíÇØ±c7¦zÁã$0ñF¢P傚Ø÷7/«•yÿA÷Q´^×IŽM?s挷òï‡{R ž4Îuø1)Àï®®Y]lLK û>r(5Ã/^Z‡zÜ÷vݣä·ä%¢3ìö ã­”†¢y Ú¢îc²ÒvïÞM@@ˆÏ6LЭ\˜~Á6i_“'O~`õß$ž‡‰‡ìX)þ³…sµ¬Ù÷I3|W“.ª¬ðÏ*7i y9×õþ–Õ¹Vð“O>é­žš¡õššÅu+ìû( @aìEÿÚ™§2‚Ö€õ?tè¢}†À3 @e.» ¡XIîKÝL»‰çqbáWÒÍ26kÑŸUήV(92ÐïñIš‚ÉçÚ»†“¢ÃäP{:SD^j‘Ä5f9˜{zz¬åi;”ÖR„þ¸æ²Š¦£% ú,nHÁw¾ó-kÿ%–¨Ä¬ZÙeu‘ û^Y_ü§M›æ=Ò¾ Ýž‡‰…BeZæµTÀŽgljï§VYZõ¯Öê¬ü³N8}ñÒ²“Mi ªm2qâD/@·ÊŠêiWÈ/â5Uyìr¨8áÿÍm×½úæÍ›|~mˆèLbþ);Éi¢.!P—ÖÅ‹°{÷1Ã0A¨/2Þ¥Ô*þ¥ÿjØ}…½@§5®jûš;w®Ñ7qÓ'š—WËFô§—³«Õ~M„5™+ÿ|7ê#_ëoÕþ¿r¿yêmŸVùZ¯5Á®iëÊ÷JÒ®YŸkE(}ïÞ½^‘ͬ®[E½¦.\¸Ð+p*ǧ ÷ã<:$hoܸQw~v>eʾý3ãRjÝÔ©S‘NÛ…C @8h3Ñõ0Ö£üâUy±«÷{˜ÿµa_Ó§O÷Vò úMxh5&ÏyóyÍÙ½xñ¢S*•¼I•à«FmLS ‚çZJ…cU?&Íë×Ô{_½zõ¹ìyåiÞûe»jízmÉá{_rôU tZHÈw¿û]Âÿ°nÝ:§­­ÍqvßY\ü•Óé®Ë»ç?‹‰…B «µüc¥ßIìýލ•/Uú¯ü<ºNšç:½s­kŸ:{öl¢×ë4ªúg}M ³/ Xu;’ÔFÑŸÆvÍ}Ô.ÖÆºOI«r~ кdÉÒ@ @ð//áÿ˜={öÀ+ɰù û ³=íp3…sU[ýÏûM>­÷Ôä·<ï¿èÔ4&õ õ//ôWþ¿„®“¦À¹®?¦Zi Qϵî%J øôÓOÒqýÉY|z( {_”siâvÝ¿[ZZ¼î1¦†óGÙWØ÷jô¿J·[°`AÍVÇ0i  8„•4@Åÿª…tUNŽšù=®×š4®Z¹ÿy÷KkÌš<¤QºÑ¸’E5%|W+5jG¤É¡ëñŒ©ÞßâS­ïi v¤)h5ÚoSÇu+/×ԬǼfÍšº©„ÿ×ß®T–$æj¦ì+ AÆ¥Ž€^‹RðÚk¯þ€7:cÆŒÉý;}iÅÆ¯üoÂM8o5$þ«­ˆ…ÝOZÅòâÚW³öŠ:fUW¢j«¦…®7úNoOšBÖçÚ´4¥¨@ ¢¾úê«L®Oy¼¦F³îEêÌPÞ«ðþàÛõ¹õ;аñïrÀ+êêâ¥|öÙg¤Ô€`ô`‚úHøKКz‘ û^IK«ÿEŸ4»O…þûyÿyX•Šº¯fÆ瘕ïôèÑAç‡mÙ¯r×û[Üv-ú¹6Á®AÇ$'€Â„;;;-@šÖª}ZcV^¶Z§}¿´e>P`£èºïrT °Vç@·…Á¾¬äÿ7 ¼õ_‘Z³4³/9J”ûŸeþ¼I“Œ°¯‘ø»z]‡ÍíÛ·=ñ¯Õÿ‹˜#_íÿÒl9G=„ôεMõ:::¼üêÏ?ÿ<ÕkšÉ×Ô$ǼtéR¯À•+W¬vÒ'ñþÊi×£²lP1eçfæ—Q÷¥h¼%K– <ê#Ýö6f¨  øÞ÷¾×á>ua‰úÌ™3'ŒC%Ôï¶í«²—k‘=ÿa_S^ôÏÿ¿$Vx‚n³µíÕ­[·œÞÞÞñ_y^lÌ‘Ïz•;È{Åu ÔC¨~±-RD-W¬XñÀu³™ëC½pS¯©iŽYvÙ²e„÷7¹½^-[Âùãšžm;×EJIQQ@µ›U4@^ æeÌŠî«–ŸMøããó£ý÷%½Ÿ–è7 á~_Ñ—GíGyë¿<\°Ã¾Wœÿz‘E ÿ³½Zè'¨&Š~ŸÊJÿˆOÄgÎušœ<žëÑ£G;+W®ôžMýq×H{Ì«V­òºþ~{e€ Ñ¡IÍ?Õ ýÑðñ *¶6t¨ÃŸüÉŸ´ºOƒ%j£¶/¼ðBî.Ø!@±\°µò_é(ºç?èvÿ‚Þ¬ÍèuÝx_Ê]-•J^5æÊÏ/•àóS >í1ÑM!cR€RΜ9ã\¿~=×­f_“å}ÀïmäÈ‘ÂÞ¯›Ý.'¿>›•y÷qÍÍLÙW'A­}é~­tÒò¨ x€ŽÇüO?ý´STù¾a‚º>Ò­þÓš%ؾÚÛÛ¹ÉGœXƽšž—^×ͼ&̾Ο?ï­ü«ð«Ü¤)PÁÎs-qªjÝ‹ò¡”Ԙ㾦Κ5Ëkǘåý2¯ó‘#G‚oʾè8É@øH-Zd´PC’lUý¯,þgƒ(Oc{˜ó`j ©¨>IG…Ä¿ªW#>ŸÔC(ƹ^¼xñ€Cº¨¢?é×ÈÑR4'}ÛUê·ùÍbΘ§zTÔ@ÇE6€õ¿=X¡6*ü§¢7µ.f&´f1¥5`µÜÂÿ㙤ØÐB*«1Ÿ;wÎÿEl9—f+¿jc²©åmÍ9×A¿C~±cÇŽw}²!%Aùì?þ¸óÉ'Ÿp¿¹])W¯^MlÞgʾ¢ÌWµíÒ¥KÎåË—( ƒ@ÇÕ€5øÓ?ýS…lõÑêÿÌ™3cñ†ÚR¥µÚ¾‡ æÙªVÿú"Šö ¯¯u®ýÑÇ,ñ¯~ÂäMÛ“#ßèšÄ¹¦B9mmm^ÁO‰Sj‘äYôW¢4¥Vùý퓾_Ú2PªJeЏçj¦ì+ê1j^ùØc!HjÓ²téÒ?|úé§_`ŠÁP›˜ >ÝÝݹo§’ƾä$‘ÀQžÖöj«V6õÎ2%áìÙ³N__ß ûºžÿ4…jïAšB2i YŸë¸ìªt€)S¦¤rMzÝ2á>vÌ«W¯¶B”§9>Ýû• unV„zTÔ@ÏሠGÔAG?ì(«v*yi X-×’ðÿ`Ûmï…£Bâ_+ÿ¦ Ä'9ò¶;pL;×J(/ U ¥~J1+Ê¢VªdÑîça¶+  (¢?ÊüS­{Íè¹°P…ïÿûîn;=4k?–/_ɳÆItšTQý?Y§†M-¤’³& Zù't½ñ{ºnç¹&M¡úÿIˆûšçõÞä1O˜0Áéííõº¬°µ¤•ÍŠPé?ÊüSh>Ž6©ùh]ºté{Ÿ|òÉî×€·¨)Ôþ/Ù´÷Õ¨Ò2á~·›XMº™÷ÉzÌZù/•J5í^ĕϴW¹ëý-n»Ò¶1{»æí\û‘I^‡ƒ\·²º¦&5fœ?>áÿ!·—§!œ¿Ùù'iè:ñAÛˆ:øáÿ„bÕß—l4nÜ8+Ey’Ûåõ/Zßè¤Ç|æÌ™ª9ÿˆOÄ'm9×å¯Qåzµ¬M[@gåüMkÌrÈP´ûy”íª¤‚€¶õ¤ö¥"“'OžDœ ëBA @ögÖê~©þ†™ÚeË–  ²±èJØíµþwîܹÎèÑ£¹É‡pjÔ›à}O«IGÙWyÁ¿òÏ(!Ö¤)äé\“’’Þ¹Võzå+ ­ëVZ×Ô¬Æ,!ûÈ#8Gމûì¡{÷ܽVÕ©{Ïé³{÷Ùçìîo}½¾ï»Rÿ·Þz‹ä“ä3JòÉïÚÿ=tÝu× zè¡§¿kíÃÁjkÌP@ Ðwí̱P9 i»/¥|TtßÑПþô§Qþo cešåìÿ)xVmH± ’5lSZ„m¶7%þ‹…ô‡4fþ}ûö ‘’O’Ï”8 Iqw!œíþûï/œ}ç­Ø’¦Ú³Š ÀÅzºÓ¶Uõ÷—ƒÒTõ\p§´çÏ#Û¥ ð4ÄvéÒ¥ÉM²¦M¥ÿ(ÿ§ÕsM ]{®Ç¼gÏžBþOòIò;ùäw†³Él~øá–S(•cP à¶ÛnÓZ;sSVs˜°ÕbèKpúS@žG@?°LD šäÿ)L²¦úÂÎ?%¹.Ò}œo¿ýv/£.ƺѺ¤¿«¯±±±òOòIòÉ0…8¾ëœupÜyç$ý†Ž  Û®»¶¦(ÿ€eÖ¬YYl:éôEyô GYþŸÛ$+{®¦ÝÿTaÓímÒƒ.dÒïÊQqäÈ‘Áää$É'É'Ã’bå»Þ´iS±rþWŽ ÿÛo¿ÝèÚ»=ÐÕ^†’éWé›ò<:ñ™Ï|fÛôM´Œ12õ$®)'Êѳ*ã$@é?Ý7ôEØT{y÷?dÒßUš0„1OLLS„„äÓ©'ùÌç»NA)‚vå$·ºsª®ƒ5„u ï˜Д[Á¦Ã?V{*—d:¤¾dÛQ àäÉ“ä-Íeà{d½t”Áì-€ç?Çø+•¾à$iJþÇl¿£Àî ¤_×µ=æ7ß|spàÀl IhäÓ%©çwÍïÚ‡³IËås ý6Æ ò_Î`Ûá²= Ó?Bd:v^ìù¨N:EÒÒŽGx è(ƒõ![`#þ?5)ÖªU«‚_¤Cr:TwÿY7Z}ÌHúƒr¸–$Ÿ”®ç@>ù]‡q½ÿýï,X° hÒC¢W„ ) íµ9t{@¶]8R ê¶ú:~ü8IK;˜÷/ÁÌCPàé/'¶«N8åIZõyŒ}յϞ=[JþŸ£ ®½œøOµ_Õ×ûÓçóº3ÈÿåË—G~§âÿª ^«{_ùµê¹ªï艹£«_Scªž¿ÏgSÓ¹l\W•1UßåÊ•âœ?~æxHBñïòs찉ף,’”á9Èž(Ç…‡ï:„ëÃwÂ="öÞ÷¾wðÔSOÍü¾úÎi.æZÓÇôwÝ븗ð™gž bC t{¿»&›LÇÎ3Ù—kû³Ú×Å‹çÎ Û%†@¾GÀ»øìg?ËC ÿq’õÙW ÿ&áØé.`ç:Dc/Tc³îuÈþÏž=ÛJþc"$¾ 1ÏK—.$ÆBhþç `UR_}49ʤ¿Ü†¾ËÏ˸…#‚¹sçÐùóç9Bqàäîh°y`Ü}÷݃^x!kÒ¯{þ-[¶ ^~ù墂KˆkwhÊC8ÊNÍÔ7TTt´ó¾Ç|;-@öÿ'Y•¾ª€éPœ eé?I¿cô¯,óãÎg˜êò bB²2Ž‡È›QGÜ]N<ÜËØm*;à €S8à$»v6¯+ ~œuHˆê#‡²²v¹˜SC3)?üáƒq臼É'cYu’æ“j_°êòKC¼‚ñÿ]€˜ˆº«IV‰ÿ-ZÄEZ²Ä!6yHŽ Âññqî|vŒ)¶0Aö¡êÀd¿iç>d`ÜP* 4ŸC80OЇ-`HJκx`ðÆo’þ~Ç”U¾6BÙ$èj‡ó¦DÂ9l:uõµÎY8a ò>:šoœGxÚÉLÞP×R¬jI$“‹pŒ1|m¨#ÿ$ýï(]¿ýû÷¹ów˜v°NŸ>]düÅnzl?ÀP‡1Ї0Þ‘S*8DxCRâuÖ½ï}ï<ñÄC;³¾|¬9_n½õÖÁŽ;¢ZÛ})¡ùor!ýª¡XWª!¼Ä ²ç}³s¿ŸûÜçð#ø,ï…z ÉO9`™þUEßrfÚÐãï}"I™ cÏ7é·1æ×_}0555´3Üö›n{_Ûû»Žíû~1Ùú .ǃ5š÷íÛ7+ 4!íWÝïj3Ùés ŠP `Çñû†R êüˆõ»ñª{Ÿ©ë UÇâÅ‹GŽ!éïÙb¶áà-ïlǘïÇŘð¬æʱTu6lØ@"Ó€xà‰;vŒçúù© ¨uÞÃåü}ûZ¶lY±ƒÅEº»½IúOÒ/7fG<¸ó—Ääu™ñ݉Äz} ¹”¹JÈVA$![…:ŽU†¤Ä¦°nݺÁÍ7ß\X>%%€]mÄm#Àµ= Û¿k{B„UKàæžªÜ†u‡èäÛéÈÓ7 ãÿ€ºöMYDS”ó÷éËföÿs´WöÖ‡JúC-!…cÄýû"ÄLЦ>&$a:qâD]ΤO´ÊÌ(e(BðˆÝ©”K‰N(âPä éW{öì ¥ˆ½òs @¤_‘×Çâ7'ly¢Yó?Z#T4B%v(×ЀêÄJ%@};iÈñ]€º×»ÚÚΧrž>çw=æ]»v8PÄ{Ë«¯Õ}Oå6Ù÷·«kLM¿ÝÏ ;¦¦ÏªòdÇ„Ý~ïßÿþ÷»wï.Â5ˆþ%A(ñWT á»vy©ŒÉÆ=¤r_Cµ±mÛ6'sª‹õÁÕ: Þ‹ë'²·Ç˜ä×¥½€ »Ï¤mk«/ÕóŠv8¡ ò?:*øüç?¿¿ÿft%Lq’Ué ä_HTc[„];êv3LN1‘~•1£¼VS}è.cž„Ä£áØ±cEò®üàÅÎ56•П ‚9sæL* ’¹ø®C¸‡b»¯—.]:¸çž{Hú{Ž |Ù±9„€ù¨êç)AH½?J€@Ö˘Ó$+ž·ÉªB_„]fû±ÿ2•®á£±×ÖôÁƒ¥ ó.#=gBbÃѧœ3O?ýt±ëÏÝ~7ÀuÇ}ë G@])°Ð•"98°°råÊ^NÙXH¿­µ 2ÊN€Ø•6ÃË*×ä:†¾à0Eî‚<°Š¬s0þ¿HäSžDTJ´µ¥…ÿØäÿ¾iì²¥ÿúž+źÑpœ@úŸs)¿¦×L©)nºîüø=>|¸xˆrŒŒíwQZaÈ€Gù{È9Ÿ{¨nLïyÏ{ßûÞ÷fª¿˜˜ûÌ·1®wÝuWQ)$V{¢úœST‘O®¥QmfáÂ…\4êø9~ðÜ­†4 ÿŸC9o1J#¦ ÿ·-×±ÿâuS»8mm&w˜|Ž;ÿ 7åk{Œ|Ìa û(ÃøÔSO†9eþa@„@ Ê ê~×&~MóeNêìdß{ï½ÚócŸù6öu×®\‚9{ TåaÙñÇRÕ£@XAHÀU|á _Ø2ýg ûÍ€P’›„ؤ©.Â&=ûb÷?Ò¯Û—Ë1CÞ|ôèÑh IJ Ú@ôAøIüÃw`§ŽümúÄ’£³îÆo,ªå¤”óÅÕ:pë­·&©,4í¨&Ì-UW_,ØŠ-Wù áþîëÒUϳÌds¢•¾r‘ÿë.ÒØù—%K®vk\ǘö3®Ùk¯½!I}çN˜gžy†Ä?2G`åŒ0 ÷Ýw_QãÞé71§Ç°6l¨•n§®XF¶9¦oœûù›¯GYþo£6©‰¾}Æ_-[¶Œ‹°D{SÜg×ñ¹×.KÿCŽïmSìqÓpÂ`7¯«8‰0$0~ËùbÈ}aãjû¬¶ó!ÌŸ?pÇw ^|ñE#ëSë€hC.€gŸ}6yù¿n;œ9L=Uß|P :Q‹,ù`Î ÆÿK8êHHîžÕ”³ÿ›j;Ùuí>3ô‡^B „óÈ‘#Ù–!kú¹ÚùÄ®ñÎ;Ï?ÿ|QwžˆBP `å ÷ª ­[·Ö* ¹´@Y=‘¢½`žªKÄš{©ê2˜€|€kx„¿ùf€‹ )ÖI¶ÿÏEx¢ôI¿Ú1('Çd|~ P^@î?11ÁE A@'v S¾‡B¾¯|ðA«¤?ÆR‚]Ç äN€˜í瀓þÉô599ÉE€|€?øƒ?xDÈ:ù~@"„ªäZ¥=æIä?‡ìÿºíØqóYƒ9ÆºÑØù‡À6!–!ß¹±‘?øÁ{÷îeœâʤriRVÎpw_#àÎ;ïôžè5äu îu„Äl¸j—u„bªØÐ:} €<§þ^H@ ü¿7n b2 u¦ü¿»½\úϦᣱ×Ô¤ç0jÌ7}o$$×úÝ¿Aþ)÷ÏÓP-QêóÊÅÑpË-·%ît¹©•ì³’€)*ëÂB&ê®K²y!™&|Nü,ÞP¾(ÿµ ÁpŠÅØC}yÓËIHšÇÂÿôÓO×ÈpV–‡åP9Ã÷}xv„¸ÐÛZ|ŒyóæÍTv´—9ä£R=–aä…t0þ¿Õ 3©NP1M²(ÇCùwÖâjö߆SèÆ2Îcaf2>7„±þ ÿÜõ'ÄïJ–èTsÖAIWk·½„PRVgí‚ . •‡ïs˜²Cí‹ò¬_üâ—Mß [óÒÿ¯+5J…ô—Ÿ¯]»6JRî²]߆SLÆ^]â?Æî„qß;vì(®7A4ݯ¦î!WκXUA÷ÝwŸÓuÀæœîjí‚ EÒnÒžª†¤(ç×é‹y[ÀéHŒÿo@9þ?o¨j_Ë–-Ëj‘í³‹ä¾ §XŒ½Ã‡ñÿ.Œÿ\IÝûNŸ>=xòÉ''OžäDO(;f™õß¼³qíH(;ׯ²Øó­·Þ%)w9>Aèb'ê¶ú¢ €ü0gÀ#ü×C5þ?'Ïê¼yóŠÊÿ›Ûe“ÿÑØ{gfGzllÌ(!&!=’+>ûì³ÌðOôZ¯˜õßž³nëÖ­EXŽ5´uÀæ˜QEJÍØH¹Ëö:7°®=§€üP`N† ;¶80I”'Õ®çÕ ¦mÂÖéKåX}­X±"JRî²½i÷¿­>×®+ícLy|||†”–ƒâÿêkå¾ÄóòûÚÞßÖo¹¿ê9šŽU}¿é1ɼÈý;ÆÉèí(1÷«ûºé\.ïkÄ´ßÿý…ƒÎç:`zM±9f8Mž{H½ê5NS¶lJ}½ñƽJf‚¬ø!CˆsçΕŠÿo2’šž÷1¸úôm[%Pöºç°ÈöÍþ_íÃçn‰«¬þ}Æ Ù?äÿÕ÷–¯}nÙÁÛ^Sý ¸¾ GåäNh­Iˆ).“åï¡UAˆk‡ºÎç: Û—Ë1¯_¿>JRî²]ܯ9fúïšÏà‡€ ?ÌÊð¥/} AÜ[ø…Éøÿ'Y”ÿ£üÿVò߇X÷1œBHð§kìíÛ·ÙÁ-’³gÏžzê)fù'Œ9fÏž]«ÈÕYgú¾~ï{ß›Å:`bÌPMÈ” ”»l—%Å)†ÈË0€Fl¹Êé w'ØŒÿW B›d)ÿïn†“¯cL{(û711áŒÇ–\gLGŽa¼?ap”3Œçà¬su_¯^½ºx¤¾˜:¦N:©Wµ§dU9ª¨ O²Ê0}ÐÐ,¾6c“ºÞ¯Ò—ë˜)ÊÿÛÄåò¦œ ¾cýmùõ×_ŸyžB|oõ\¦>ƒì˜Äsÿ—_~¹3 4Aô6˜æÌ)œK"Ùiˆ¹/b¼¯ñ÷®»îlß¾=›u@ç8 €œ›òÿnÛ/Öþ>Ó»/(¸F¶:¶çðAsS0`„Àgl’©¾M÷åÿrò•ñä¸ÃƒÝ<˜ÜìÎçîÝ»/½ô'rÂ:@¼Ê™ëY¢ÓŒz`ÕªU3*îôwsã7FGÊ]¶ç"çïÓ×›o¾Y<ˆ¼y"Cˆù £«¾±)Aåÿײÿ‡b8ùÈC r vÿsJÆç‚`×¥þÂG@lÎ:WcjsÖµõ @뀉1#@N¤^מrE®cé‹aä‰tC±w¶' ÕÉÎ÷$Kù; …m‹·ö]ƒ9$cOìþÛ0œSÌ.3&ìúCúO!9\9ëRS‰\®ü…DúUÇ ÛdÁ‚Q“rÛí&mFݾCë‹òÄlôG´MĆò1ü€À%¹Vqø.§‚Òˆ”ÿ·ËÿMA±{}Æ<66fÍpn3æS%$$ÿ„o àú믷~å¤ ‚ À&÷½˜sS2Àí•С؟¶ûyø}€/Ò¶Ð\©bïr÷†6[UÄ@Ê]¶_ºtIÛpŠÑØSíëÌ™3ŃÙÁÍŒ‰äŸÙ ë}më3¨8êT¶ÖJ ê¬]"åÿïHÙ¹“þr›¨DDäËsrPþ_ĸc—Ûõdš¨Ûè ×ÜH½, ýÇ#Ãɧ±×ûoÒpÎ¥ ÈÿÑ£G9yA9°V°D§GCU`k°¹¹X»ÚÂr—ÿ«Œ?×Іäͳ)8ýcÿ Ó£¨+ÿW$l•@Qm×WŸ¾ÊŽ‘.Ã%Rîòü(AÔõ>W%œú¼ßÕ˜ÅîÈ¥üTÆä³ Èÿ±cÇXˆÒ 0oÞ¼BŃÖÏÚõ„ àäÉ“FÖDßë€Í1# `ß¾}IríM¶`¬¥MöÀ²eË8y" ¾È€ÌQWÀ¥SçXÛ*+Vhð”Yº>3#·/¤RØý/¿¿| ™¼yLÕ>víÚEÙ?4N–èÔÿ wß}·ò\Ò:àjÌ7ÜpCÒö†®=eÊ>M%4  *òæ‹tdQ ·(2Ï« 'µEøí·ßÊþï*IR,¤_àܹs#±ÿÌ®>&–ú#bòÀÀzc‚m‰»¯u –µ«. €ò37©æ¶¢€|1À—¿üåGø{®‡Hh›\›œt]L²ˆç„¤Óæ‚{öŸÄ:cOfl´JêsÈòé?AÄ2Q"0×&Ô·Ýv›·u ¦µK¦@ÎÙÿ™ô¯þ½L˜7oÌ"Àô} Îõ$WÅÃn36©ëý:ãèÓ—­ò©,²/^”>ÎG\¤îùMŒ !HV—B|¯¯ÜPP@úO±aþüù…Rê'?ù‰ñùØïkÙ÷oÙ²eðÊ+¯ .\¸`mN÷½v™8ÿºuëû÷ïOÎÞ°íÔpaÛ†–Ûªúœy‘¼Ü!/Â"ù_ †“­±´Bþ£ì6B‚ /¼ðÉ?5°®,^¼8ÉûÚÖg¨¾†0’þîc °eo¤¢$ˆ) µ«¾¦¦¦8QgÊsqPßRƒ² ”ÉLõ\6Æ5{öì"‘S Vˆ‹ìåË—³"ý}”(_›Z2>W„d÷îÝ…üŸ bÖ“… F{_˜˦£;ÛPô··•ó9ɬí9Éÿ«ÒwS6¤I‚¯¾Îž=ËI:SÞ˜K€mü-¢*s¥Vi×ûmË–ü?Æœu m:5b©ÁÜôz9c½‹ø^—µÅUÆÔ'Fy||¼ŸÐI$J!ùv f)«§B»¯]æ©S[>¨ÆÆÆ¬­)¬]B`kݳeã„äT0mËÆÐ\kk‘W‰Ä3‰ "u €Xg¨ ’È¿¨\ÔwíH}í‚]×T0WÒßö<Ä$Ô®mlôIW9¥tŽuÙœÂ)IÌ é ’´àOþäO¸û_ƒr]u¯{®òÞãœdún«ºüßfÎÄþË”ÿ3kß5.—å˜dŽÙÿC—ݶ½V×fkL þû÷ïç„Ld 8DÌvL÷µÌšbK=Pµ_TÖÝu@å<¾Ö®ùóçT”‡®Æ¬SФmëËÆnËï”3Ræ‘©‡ÐUìþ³Êh_1fÿw•S ­ü_.5˜ÛÚÀìûÎ)&íê"$/¿ü2'c"{TwÝb¸¯}†) @”1VÓsY»šÂr.a\÷<´$Ô>ûš˜˜àdœL:€%›u“F eKTÏ¥òÞ\äÿ:ñÿ]}¤VŽIvÌpø’݆TÊOö3SúOäŽë¯¿~°hÑ¢Áùóç½Ý×®Jù™ S€ àðáÃÁ­¡¬]HxèÐ!kö@ÌNêï. ¾ï¾P €ëq-À#·§øÁfñ»ÍÂ{«³ëý}Ç‘›ü_¥½ «­m,>Ë1©ŽÒ¹'N4^Çœ“vÕ½ïâÅ‹Eì?AïNùÙ³g[¿¯mÍM®Ãàm¡” x½n“'${Æ·S@ÅfÔ±Oc²±/\¸À‰83¤îø ¿âQ q_²mj ±/ìÄÄDÊ]µWãÿS6œúŒä×(çR~*cÚ½{÷P¸AdoˆÍšU„äPÊÏĘ7A8BYlž_õ‘€¤_.M§úšœœäDœ¤ C¬^½:úÉ̤A´!åÿ£è*ÿk fSc† ÷R~²c:}út.AÄ0 @ƒs>GUPŸ1õÍûÚ%;fäˆ]yhóœ¹ä¶RyÎD€y92êU«fnüÊûéÄ9©¶·½—òÿf\¹r¥Õø31Nq‘¶Æ @Î¥üTÆ´gÏNÂÑ€åË—Ž;–|)?yND5€PÖÐÖ®+VÌäÉž Á) ~G¾âîC͹…R€Õ Bb,¤ 3”åÿÕIDåy×ÄØ·/_ã¨^Êÿ¯µw)ºúñU–ÏŘÅnv²[]EÃÑ£G‹ÄAÔC$dÖÿî÷‹0€Ö×®r€Ø«é”0îjË!€ìg`€¼¬à«_ýê#üzGQ–ÍÅ^¶Äd_!ÔÍ qFì9¾Ý§á¤Û—1‹ä¶H}*ñ½ˆùß¿?'`‚èr '@ Éø|;Úò„Dú}¬]pÀIâ’”û¶WL”=Ö!Ó®ˆº-»•ˆ|ø$™¡ºÓÃ ñÿ±,r.ÏéÒ%-#$„6Ç\v˜6œ›¾£ ãããÒ¿%‚ÈsæÌ™Ù½eÖÿö1­Y³&ˆu Ôµ«Z ÇM õ7ÃÞ}>55Å 8§µ&ÕÆøÿz ¾'Å8§®÷wõUö”Sþ­½-)ŒïÌ.j3·µ:ujèú¸ª]÷þ¶suÉv|/®ÑÁƒ9ù„$–.]ZÄãBÕ7FÞVN‘¶9ÄôÜÔ5¦… Љ3gÎx[B^» +»{ê›uÀ}G›­üT®llÓ}a­ÖÙ|Kà“ÛSûPTd†º©x0»&ƶçÕ€)“zTwm}gè·µ[Òç‘ýŸYÿÛÕ`Ù?‚P1ÌfÍ*œ]sˆ©y Äð#Ùù²®€Ëu äµ €Iy(í:6¤J{,6öÄÄ'ߜ֙„?ÛýüzGQ®àŠ\‡Þ’.ÅDÊ]ŽOT é}%ír”ݪîþ„:°³]ÞÙ·Eê}‡é~†j"ÀÜIåÐFæ8T!Ù²¡8ˆ|ødÊ!Ëø›4.âÆ½l‰j(@ÝûgÏž)wÕò_]$]•6ò-ïïzýâÅ‹ƒ³gÏμ–S)?•÷‹Ý¡¨à€£Ñf¨OŸûÚT)?sJ'BÁ‡õÊõ:úÚ™;c½Š”»<õ÷ÔÇþÔµmCì *€jn b$ŸLY°…¿Ùa !LÉMEÅ™ ©Wˆo÷¹ë³ÙÞ­©{]ìþçVÊOeL þuu¨ ‚´:KR,ågjLåjªszêk—j"@Ÿ¤ÜW»Žýi²¯ll:ëóá“tdæ!ĦÈv,%Pê”ÿ¿+ßNÁp²1æjù?UÃYÆH·i8»p4=z´5‰$Aí€:­®ž{n9Eº åKß²ÿÐÖ.(?)ÿEUÝhrÓ)浓'Or⥀HÕRÙ@Ïøp»H»ádc̨ j¤Ú&õ¡9ûOú€ÄÝ7©ÝÑ@ФßĘ«¿ŸIyHãcž,"u$™àÏÿüÏáWÛì7z åýtâœdÛ›’¦HêUpùòe©º2çRG嘚Úû/v¶s)å§ß‹ÝÄÒ ð”HƒšçÂ… Å÷Çîmü/™cD,5žã”Fm"„;à{ÀÚ-rŽØº¯CÈ)ÒôZטPüÆ]­±¬]u ’XI¹Éör‰Möh,66rpÝ®ç•ÿðÿ°"z€ËÉÌçÄØ5¾1‘rWãa(Kär'ýeˆøÿ˜’ñ¹v4À@¸ÇùóçSSSÅ_Ô‘Ù/“ü2鯾‚Y× 1p &}Þ¼y¼ÐŽ’€ø>CNÆçÛÑÀ믿®½˜LâÂÚ…D€p"5…cå¼ÉQýéÚ£ªöj¨66‘RuláW;йsç&‘éßd_"þŸžñáöºøÿ §>còfý¯?H'viH¸®õäädñ»¬þ&Ò/ã7ß|³Psàhƒ`åÊ•ƒµk×¶ª§sX°`Á‰‹Qd{n*;¸v N<8®c å.Ç'~;&ɵ B´‹±žµH®@’€é35Xµj•Ñ (–¾Úú†ä5R¯ÿOÒ?z ˆe·Ícãdk¸??^< 礽Jޅ©쫶£Ü΋D˜p ‚x­^½šÊë7”5±ª‚lÏ—"@,¤ßô:ØÖ׊+FòÖ„JÊ]¶CåX§Íq3L<‡“‘ÎûZl›~|“"vI6“Y×5¨:è·‹ §Ñc “¢ì¶yLˆ!$ìò~AüÛvùMìüË´ã^8räHAL…#@¦Ú ¡¡¶È!ü¨Ï|)“ ×µ«É9—ó&GõxŸùlÙë}ûÂ=„{‰H©:îçW; ÔÉí;!¥â ­v°(ÿmG€-Ã)„xɾÆ^YþßF´s‘ÝV_1­þv} ¦ÿþý3qàe2Þ‡¸ë: êÚpo@f Ö:ÌÕjD.€TÂLÏ—uyr_»ðzÙÀMŽáD€¶ˆºJ{h66yðÊTËø[UŸ L“ëú%s õ*@Ì/ §z@›áœ›ì¶ú~îþ›œ) þÛÛÚÅ7Ñ^€ñøÚk¯’õõë×¹g3@,7T ©„™ž/EÕ ®]ï# Rîº=–D}.D¼2Õü©VP·“cœSôŒ¶·%Ì‘ô—Û°ûV÷z®²Ûòûà4b !s€´þÀƒ·ß~[‹˜»¨kG2©sçÎN„fÖñj2ÀÐUA. My¸v½ST(«³(ÿgDé÷ÕÖq$y%ÒÆ¬D?×6~µõ€êb¬ú\çØPú*£I)wÙÞT.¨zœxȼîò[cÆu ­ò5­{­îÚ—Ûdßßv®®15}÷ºŸ»ÿf€¤~/¾øb!eIªÊÄZÄý—m¯W«´å èr´9 êÚñ»8vìXñY/€0³–»¼¯ÛÎeznÒ/…€k×h[ùw2)wÙ^çp2mêØ§¾ll:ñóà•©:`hÒBî MljÇÐÞ…&CÝ…T~=ÃI JþC"õ*cÒ5þ›Æ¢Gè1ô/¼ðBñ[«#Þm¤¾ìÛnïr ” B  ôP•¹Û¼¯eæÐ u;—¹¯]xÞ·dgêJ¡pµé*é/a\Dú¼r¿Ó<°iÓ¦(& W}Rš"Ð)yÆ!9öe8ÉöåÒpQþ/DRï{L(K‡DuDŒvïÞ=³ëor߆3 îõ¶vüf>\ä3 úak¢zMèª ކeË–qíªy!¹z{ª*›—EJ›aÕ6:ò@r9þò/ÿr ¿Öæ›;–ìü.ú*Ëÿû,8©.¢M }ÇKöù,&Ï/âÿs(åWw޶øÞÉÉIN°=!ý!f^5ឯv¼øœøÌ6lÐÁÊs‹{.Ôœ"ms˜Íä¥PH´9r\»Äu‰…”»l×Iè˶µm¯«:røåßýÝß§òyRTÐPƒºLÌ¡y]÷ÕT7ÆEÌä"\NŒã;^²k¬¶wkʯCÆLÙmý¹(ÿïOþ_}õÕ‚WwÎÛv÷»Bdòè´ë*p/A “„‹E™Ë5ü¨ú¿K@,kPV¤bϘh¯¾'•|:çE¥"}~É€L€’L±u—}٠رyÆ!çÑpêcirÌ¢ e·Ãü¿ùßµkW¡¸qE¼eS PmÇsäA¥:Ô1þü¥†oRïÊÑ ;_6)r^»”ÌÔ÷±§\’kø²‹eAñ#¹ÊVä®Qjrþ>}-\¸ÐÛ‚ê"Z.ÔÕ ‰d(å˜ÿ_÷~ÊnŠÙÿ{y6ïòo«,_è¡xÀЙôMï®v¡â'@ÛŽ-1 (lÞ×>sŠèŽI„píRË£ü¿Íñ˜siÀ¦rÐD„H±l‰N_(â‚åsL—/_öfœèœÇv æj ÀT gÕ÷£®{ÕiD4ãСCE5 “ÄÛV»ª"A%9a];œ"¢ÒÑ TP@.÷uìÉK›’$æ¸v•__´hQ¤Üe{Õàrˤ]첄6‘˜ 3âÏ8'}Äèí¿Îj\¤ËrLÈZ^~ÉØØ¦òz®Kùõù $lòÀµ‚Z¢Ž÷ñW=ÆV¾SíPÚ :‹ ¶D;@è07™¾¯Ûæ¥ütçË®ü>.Êõ…²vÅHÊ]·§”ÛÊT_Pe‘O¥ä×: QÀµ§Ðg_]cµ`ŒÒ6çÄ.œhs±#á"3²îØQ0–¬ÿªïï;&Æ ÊrJìþ›Î¤_%ÖºÙÿCP$ÀQBU‰¼ÀÆ}Ý4w˜˜›\Ì—ª•tׇ׮òë¢DbФ^Ç^Â|ãË–U=—«qqmOŸ_2 Ì;Wk‰14 ë½OƸ`¹ §á×AHb©íZvK#A¨y/v*uåó¦ö…Vb%7‰v ©[L9E\Η"Ib*k—«œ¡r—í&J¦˜€HtdŠ“þ™˜ÜbT¨ߥÈÑp*—M ½¶KG~+Õ²‘Ä(?ÒöЉwWòA䄪Ÿ¿+TÞ ÚG¶pðÇSÄå˜D@*k—‰óWs¤TÂØD;ódÑ ˜ s'@ 1ü:Ÿ¡©/$LeA3Ù§ªôÖE\¤ï\ pÕ÷…\[gL*ñ½çÏŸç$Ú8&&&¤ãþŸÏöPòÀ€P-\¢P ykõ¾u‘S¤mñ9_8qâDÖkWµ­« @¬NÝñÁî×&”|T¾ódÁiM>E@lXƯuuemO@¡MfÕ¶j ÀØ,‹´,ùÏÍp»)!'ãóáh ü¿ ÿH¬i#¡Ÿï„}¶“pÔe.'®¡š01¤d|>ç˲“?gÒobÌ}ÂCw´)ë|m†©¶Û´×Eéc"]~™¢`£öH~*Ub_°lBþoÛ ˆ­ª€PļfcLT´‰#Ën*뿪>x@AÇ$UÍX°`A2YÿM~Q 0絫® ‰á¼M­„±N»LL¾«Í°ìu"m~É"Ë(©z›9h8*BØ ÅÑÀ‚vÀqäkßG(€­Ï ǤJ€ºA¡.H®Ú!ë6¹#ÑgL¾“$ÉŒ;ô¬ÿ6ÔÕ÷1`3pmÊDÖE&ý®öXò´}îH5CÈÝCÎ)âc¾äÚ5z bÝCÞäða‰R­!Ú²:ö¼ÉqCûŠ”‡à°é*^²ïç4ÛÔ¯XZñ½Üýo#}cémgү뫩*@W{ß¼ºí„š@unŠ9ë¿Êœ×µ¤°véæ°A cp ÄRµÊŸΜ9É5a0 qlܸQÉS¨ê@ˆU%2iï»`ªL2ã u·D¶¯ò5‰}7Ì”z€»ÿõ€ŒTÄ’êîÒ§X5ÀTŸD³ιܳþ×͹9®]¦ÎŸ£R ÔLÿªíºãB$‚"bä ç×t)ÿG)±[.†ÊÝ…œŒÏµ£¬ˆÿ-19a[»‰ù6ET•:÷uÈáG*cZ°`Apk—iB«zž¥K—’ô÷°)ct莋  *¢Kè{ C™mõ%+%Í]þOÃéš<…Ý0Sê8EˆQà·û.} É –¬'v¸7sÎú_=Ç¢E‹Hú=’ò˜œÕß“mrK_äUt‰;r* X•L™´‡DúM4®ÆœÊnX›A®¢ êÑ•ý?vâ‚“Aü&éhžÃ|«‚Bª’Ò•×%õµË7)I)ðÖ[oT5韮=oêX‚"ÒïSj䲯ØH¹ëv’þfƒ1µ¬ÿ}>Ñì('Ñ|wÓç 1T€hžëR+å§ó¸v©-·MŽê1±Ø²]ï·5.‚€P±…_éèïÊSK_ºÉRmW­Åªádóü¡Î.ÔL8 ÈÿcÛ¥·•WÀÅXgÏž]$\$®A(ÛR+å§;_špĺv¹"ý1ÚS*d:T¬i»˜¤?/ž™Z: Of±NŒ}&3ÊÿIú«mHì&k‡ »u¡  Ù1”:ñÉÉ@ cÞ¼yÁæñ5_’ô7¿ÎGölêT6Öª÷2A‘€ /©OÅ )wÙ›DÒ…áTNªZ2>“¤^ÅÑÀ]‚Q”åÿ¡dÒ­Ä Êg…€yºR¹%/­¾oÍš5N”m±þ˜ì×ö”ªZ6”Í0{Þ„Z– €ˆÜ!‚ÓÔ8èçnISvàJùé:ˆú¹'Vâmc—Þög%Ôœ®H}ˆŽ’~»öNJöT¬¹­Tœ  ’tÐ0h¿&±uÓ}¥JÚuû÷‘pȵ¤Ú—«¸ýe·Ä0l$ß 1a_É ¡ šI¿Mb(¤^vL¦±­]©r×íÌ“E^E‘¬CÀ–Ô(¶‰‘òÿkí—.]"éï0ªSØ 3áh š#>3íçTbpΚ.²N€¾sMŒYÿÛvüs'ýåc.\8¸páBT¤Ý¥=•Bn+›aD¤¤ß”ƒ –‰Q%®)WÏ7âiC%ý¾2#»4Rc’ÝõsLS€B||VBn¾êº¯SËú_7¦×®¶c„ò9»0¶ÜV¦ìw‚"q‡@Ìr~1S”ÿ‡'‘ ÉpJi7Ì„£¨Ÿoº!h¡]í:Ÿ•%Ûç+•û:¥¬ÿ]áJ9“~Ù¾˜É>Q©4 A@4FQMl&þˆ1ΉòÿQy¤«ÃP '™¾rÌúO@7@NË¥S,»Úg!ê穜²þËÌ—\»â'ý®ÆŸãft™8bÈ:ê+f*gÏw5©–É]‡” §³þëÓ¹9Zs Þ¡$/$ú9+M’zWŽù’k×èëo½õåÿâßCMú§kÏt8B™Ì\:R"õ¦áùóçGIúm9…Ý0ÓŽ¢~^ñ)9T Ïg!ÔɬáG:Ÿ!×µ«íõjÀTì!öKtDb„j×$Ų%*_ȤQx0MõÕTCš¤?Ò/Ûׂ §Nòj8‡æhX¸p!'Ô†ßMe÷\„ô%ö&>+¤îÄ(Ξ=+5‡Øt †¦j’~3öJŠöŽ€˜×RsuU2›  (’Kô»&6˃„ì Q `«»óçÏGAú])æÏŸo|ç=vÙ-QŸüä'ÑíÒǨXÉîˆæy,¥ð#ùUL䶉qí’qÅNÚmÛS©o†u½—9è "ÆåË—½L@*žÅм¡¹‡äNú›Þ›kÖÿꘪRIâš l41À¼âê-†Ô£¬Œˆ1üÈÆ|ɵkô™ò„9fÿ7iC†Þ—lßk×®åÄJ+ÊòåÈu(ÞЬäÿ&õsîYÿ«ç  o¿ýö`Μ9É•Ý ¥j@U¡D\Ûo¾Eø‘Ëù²‰ìæ²vÙ| öLßÏ—CÈl×û :¢¥*#A.ÞЕ¶a’þá÷/]º´ÑpµIê}Î]ê”d6öQ`‡a#¡îÒÇ^5à7Þà¬","Ôd|¾æË .XY‹c$ýuI)ÿÏ‹ô«ÚØäTt :\M@¡N²"^7§€©vììªæHÑp29fìæú õ® 羟¿:ê@•І¸Ëš³ ë³âÚBæN£´Þj)?G#ª¡^©¬]MmP)ÅBÊ]öìÙÚ‚7Öˆ´1+±Ï3ίTÞ! ó¼ï{uûR1þÚŽ-“—Ð,W‹àܹsgÚdâ«ýµÉ-ëÚLc{ÌÕÿ«¯U«¾¯éºwõÛ&_USݱªŸ¡üÿ¼yó8‰6yW‰Åß:B+Ó^~O][Ûë.ÚÛÆÜDðu>ëÔÔ\ 8wûºm®i{MgnÒS×ûs_»ª¯ UDè¤Üe»p¸´‹CéKµH‡g&åø›¿ù: ’þú291Æ´`Ù:§/Ò_~=$ÃiÕªUNŒÔØ 2;&9;êH~•-ZÔø~;.vKúŒ¹LvcÞ 39&Vh‡ˆU—‘í› mw¥HPU,p÷¿?D€ÂdçKWëP¨kWÝ먂½Z{ r~“v2ýt‰#™’Éqa‡.ÕÍDŸ©N}ŽAVwÛ†s¤^eLHŽÈ0€f€|@–-#™x÷³L»ìy³,b܉Q 9¢¨ÐE´S?’}Õi”ãÚUwŒHTªcOÄ.§M¬r~“›tDÚ`@F$?…²%¶J Ä¯fÚ) Z39T‰¤Éó—+Tßr)¿ºcMÊna4µí&唬ƒó(¤Lú6ClU ¨*؈aœ={¶v.K!üHg¾ì"á9¬]}Öô¾í)¨)S•óëK¤‹;øµÖßÄ¡xUû¶5®Ø,Ó‹ôâÅ‹‡Þç3IR×çr©NX²dÉÐóº÷”¯m.²[Q5‚¨Ø™µ½Kß7TÀ´"ÁTòÂò1ˆýçî· öð#óåÉ“'³\»ÚÆ 49mc.al²=ÅLÿ6í÷Ì¿LÑÀZA” ¨P& O£q!QW* –ÉEÚEi£Ø 'Ä»çžõ¿­l$Ñ !C¶™)ßdÕÓ%û8DŸ˜£>ÌQ0öð#ÛóeNkWÞ~ûm-{!v§@TÂÙR¬¦U‡uëÖqrMœ_2@fŸ¤?¤|Ø‹™´Ûê_,„®ü™4œl•c €\ g™s¬Ð X„¸&Þ.véM'/¬ŽåÈ‘#CY܉zˆ€P“ñùš/Oœ8‘ýÚUâÿC·g|Œ©šÔ6‡}ªæÈu7zqN>ûÒ]p|/X¶ÚAêšbJUÏã".ÒE¼&®‰ËXÚ¦×êÞ¯3¦ê¹T?Œ&8Œl|)TØ(—Ô‰¥ïOo#®ßV;æ Äþs=ï&tBÒmê¾V™kB(}Úôšpòç¼vU±%ÿ÷‘3Àd{õ·§k¦Ô‘.¨ÈØ ‚×QÇ+©3®Ð$íuï·½[C)A$rK1ë¿ õ@µBQ‰‰‰âz™Î¤¯¢0 à"Tª‰}ûöñG#:ùì¥üLÍ—È‘ûÚeÚÉaÓÞðaã ѯªýiÒÆ±/–¤ F<Á¯uÔH‰ôÛL(Ûw×î@¨¤Üöù‘Ð%é·ét0i8-]º4ªØ® HÏ7$÷•Ç÷Mèg:ÀV‰Áògyíµ×ZË´£k{Œ9ElΗ(ɵkôõ®ª-)”0îÓ.!ÙžûZ±b'ØÄù%@6Ž2¦oçC®òÿ>E.†“ØéŽ¥¶+Gò8þü`jj*(â­›œP'yaݘ!û¤–w˜º¯SI^Š{k×èë‰ô»¶±r ý:ö:‘&˜ 3„›¤ÛwŸc±–“Þ¥Lêe¯{9Þ]wO©3Çz_È5°]Å÷B&(dÛD7Pš Õð{*_ Mno»½o ¿É>Af!ýç.¬_"ÁdÓ}ê2§ˆì\ck¾,¿j®]£m(Kj‚”ǘ3 ‘Í™cÔþ µ¯>ö:çâ´A@¨*Bõ:ê8súŒ«\'dRîòüår8¦cc®Á\®P½~¹Ën.\ÈIVG-$îmRS™ô}… ¨* ÙÞ½{7 ÉÐTA¶Ç$Cñ{âÚ5ÚV§ÅÞñ ÿŸ[hÀÚµk9ÉÒ¶ókvVb‘ó›GŸd„¹Ëÿ… ÃIå<¶ '‘0Æض óæÍã$«¨%ÆÆÆ—.]òN¼uö™HN²¶cÇŽVrBŒbrr2Šd|>æK„pí}½ºû&‡é1ÅbÛºê‹H›_2 #äR¶D¶/œ0Sþ e@Ÿ>]I'MŽMæüPÈÊhs’Ýâ9ÈrOÈê£×_}pë­·•Ô-øè òÿ£ý¨SEŒ¢ªˆ5üÈÆ|‰P®]£mp¤¾É¡ vN¥É¥ÒC2A]"ÀX¼Ž¶ÆÕ·œ£ü_ IÒí*á‘‹Ý’>ç¯Vhº¦9Én…¡À’AýœˆyJ“™ôMîÞÛR$€ü?ÿüóÜùïÄþ£²DLáG®æK$ÚäÚ5zL[€79úö™S¦ÿ¦ç¬@@¬ç×: ÙR€¡fç·1®ê®SîòÑ.“À·áä£3J$Ú&õ±Ênŵ!Ô({wöìY«Ä»M’ßÕn#Š‘çž{Žä¿':lø‘̹lΗBþϵkøuU{'öMÙcêœ×)ÊùUúB¢Z"}~™œà¯þê¯èМ|‘~×#DÊÿG!äî!N6Ï/«ˆÙpn{­Ïg€Œèe1ú®J öMNxðàÁÁÎ;Iþ5P­Hbë¾–qL†–¼ôÌ™3V×XK ŠÒˆ>IyˆöŽ}ê²1C±‹]õE¤Ï/ç¤ø%ñG=¨üU®_n%PB_¤\ž¿ªPíÇEÉ£¾çѳ¨ ·_yízõµêøtKù™ˆïE&eì¤@–Lôˆ1æé­[·®»î:oåølµÃÑñÒK/»ÿ\£ûòÿªœ;ÅR~}çKÿϵëGcФ^מª+hÂþŒ9Àºuë8Gg€TsLñ«mwÄâÁT=—Ê{Ë;P”ÿïæš*mä»”`Ÿcš^_¹r%e·-»‹-âD« ì^‚$Ÿ;w®S–/»Kß&÷7 ÓŽÏõýï¨>;ÑUù¿©ûºí5¹Éõ|Ù¥ˆeí2=æ²Ó(÷MŽr{› ‡LÿTäË+SuìàoÕ-Qw™ÀägÔÉ⛪g¼,ç6MÆc4œÊ@€Oùé»õ-»Å_”J$ôqùòåÁ+¯¼2/víL'ìsYbãßµk×à™gž\¼x‘_®;v,úœ"¶Æ„€"áqìk—é1×%‚•”»jó–)‚œJhùyðJVÈGÕ&Û¡x0MNŒÕ8TzÆß)<â> '_I’d€OÃÙ©7åhÀï†ÉƒÌ½;vtæ0±K/“ÐOÕ‰päÈ‘Á÷¾÷½Â‘A˜ûM z‚®³.Õä¥b÷Ÿk—œ wù¿Hè# uÈ66y Õ h™ bŒMÒí»éX”¤ü´;݈5m;ÞEc—ÇÈô%òTÛBªí3¾†ÃéÓ§9áÔ{öì)œ7ÝtÓ`ùòå#Äh“ówµ›Î+€ïÿÕW_-ÂTV¢ÛÐ5‡˜šd皦9ÌÆÜTwlùýp¸Xb[»Ê! Üä¸Ö^N˜bn+ݾˆ!$Ç+ç$úEíœ~|Œ¿×khKKÒ?Õv™qAPW†žñë{ÕÖM‘ô—!ò„šŒÏ·£á#á±F´<¦¯)Ôplذ¡x„’ðO¼~øðá">ÑF˜l"Q¤ Rß6‡…ìh€£Œ¤ôÊÿßi´sd‘rÒ¿ês$$jy%D|»1±Of&'hŒ½+VÌ8rݪª/^L€e€lÜ«p`צÍÐEìe87êÐ#£ÿ©S§f~G4íb÷îݵsT áGM¤Þ¤£A¦ü_®kW5oDȤÜe;òÖèi“D=»ö çòZ$—0U5€±¶~ýúèâœtûnCT™žñw .¤áÔІ0ìxš&õ*†sÈêÙ³g ]Ù)!¨»'`ïÞ½…úbÕªUÅoy<ðЕúƒðcí8{öìÌßr;aµª#—÷uèê8¤Tùå²véÌÅ)ÛCBéÈͰkP ‹È Ì@¤…X'³®÷Ëö%ôŒzÆñ¨VIpeù6œÚÎQΣáìB=€h:ÜCHò‘_tü^aÔ gþ_¶lÙñDZBÆ’{„_|¿2%³;@ì̪ Ž¡pµIJvÁÆ©ÎÅÜäxgfN³a7›´¹]÷Å ù IÀ_üÅ_lÿû¿ÿ{~» † €T<˜¦&FºØµ ”»n‡  o%€ÔHS€e·.Âp°3Íd€þ!’òa‡´ºs_¨k#á÷È·8µ*ȶ£áÈAÒ_”»jÇ¥CêSU ÐÐÌ+éˆ4\Ú¯IÊLÕ¾Úêž§FêUaÄ×U¡N.“4‰<¹ËnÛ HÕä£A¨aÿþý÷«î}{òÒòîÉúBZ»tò±¤l E“Ï$Ô!:à ʳþlãüz‡QÎ"Üå$©¶©>wÕ—ê¹êÚ°{ )wÙ^΀÷ˆGõغ×MÓ6v篾.ªװü·©¦÷µ9§ÚÎÕô~Wcjz?vXúJ, ‚x7{;vÿMÝ×Ms¾î< ;&[ó%B^|¬1¬]”ÿ×_ŽÿW±1MÙ²¡öE@>|’€Ì*é7EêûôÕ§@ꋨHhÛp*¿:é/¿¾víZk†s¤ÞĘ@þ*AD?`÷_8¨m:ëLÏ5® H’ècˆaíºtéåÿ5íåRÇ®7|ØØ²}ÑŸL9 àe,Ã@馺?9¿OÉ“lœrNò±@ŠD€®2#÷ùl>²9£œ&B$,M´ç&»•“È•@„@ü÷íÛW;…œŒÏuøÂÔ s÷ëâÚ…Í 8b!å.ÛÛÔi©äèc¯£Œ/1ò[šJñs%«˜þ1ïä϶ùÆWy®s¬«¾tú™îM/î6H¹ëv8•>»mcs±[Ów̨»^÷þòuMYv+3&ÜgT„:@þáHIdzL"û¿‰9=ŵ«Jþ)ÿgȶ Áþ É^Gh#‘Ÿd€ffyB•óëô¥Ú^F“ À‡S ¤v”KÁp²1f8r–ÝÊ:`hQEò»ÿ.u±:ÿ2é7í|V9¦M")wÕecÌDÝV_(K䃔ÛùõŽB¶6w¬“YßϤ’ F§@ßñÁ£á$3fHåè.ôd|¾ @µäAÍùkujª “s%* k—¯cÊÿë>ö¨j»ÛV¥/T7"òá“,˜PzóæÍ3×(…²%&úB€ð ›Zpb—ÿ‹D€]ïwQçØå1*}A2wøða¯5°cˆï…àòåËÚ÷A¤äÌxíµ×¤î×®ûº©D§œ"uc²çDìþû^B]»Ê%)ÿ®P£Â%r) ¹S>HVðgögÛùõŽâüùó­Ž’J ¨ö Ô)l,H±-²pŠˆjÕ÷¥¶[Òg̨À¬ÿÝcb.‚î]»fbÿ™õ¿}¾4]þ/¥µ ’.ec®%ŽçÍ›§e¦PB»îy5¯‘6Ÿd€ 9Lf]ﯶ¹ªã",T$ý£¯cÁÊ‘d·.H½ê˜PUböìÙœ„ ¢o¼ñÆàÀQÝ×¶ 2çª*b#ý6ÇÜ·úJ%Žà{ÓÉ”l²/æÈ ©;¶ó+Æ©S§’%ý:c›§ÜA-`N†“ê˜ËÉ}î†ù2þUÆDA4cçÎÙeýï;_–wÿUÖ”Ö.›c.ÇÿSþ?ZâØ´ýÙõþllæÈ‹GÎIù[c,Ë( -lºV¶ë‹†Þœb‡2wÒ_†¨ÐçXßñ’&ÇÜÔ†0€C‡EKÛ5&S¹ –Àî‹(½IÄ»8zôè`bbÂjþަ×tïk×9EÊÙÿ]¯±¬]åøÿH¹«öºò¦âîMÚ²®ó€ü“3å…ÔOð+ÅñãÇk$)†¨œ+Äx¹aÄËUcæD›Ï ý.vxd”p”ÃR,ågr—‘e bpÌïØ±ÃÈ}mb]=€ëÕUþÏÖ:ÃÚ[¦O€\äÿ}mD3Ö¾(ÿÏG2@†8wî\t¤_gb”E]€¥m>Æ$Æf8¹sS2@&íîÏ:‡AäŠW_}µˆÙα”_Ÿ1ü#É]hë@(kWßøÿI½êø±ö„²é’Í€ù!õ€íÓþ–_ó0º¤aÕI"9¿ ù”%‡.ó±È¢ÜÝää¤Ô1¾%’>Ê1añD9@ñzª²[SeȰۀ]<Ù䛑*¦¦¦fÊþ©ÜC©”òë~T'ÿaeí*;l”0޹Äq9þß–=ÚõþmìÅ‹S™Wí©~°ÔSüíŽB„”'ç1ô%Ó·ÏD€6i“‹°Èà;Á_ÛX}V€ \[8å¤]¦ TÄ`ðÜsÏõ¾‡LÞ×MëBháGp"_Bˆë@(k—nü,6PŸör€åü¶lìE‹q2ÎŒG&íøÓ?ýÓüíŽâòåËYÆ9uµc(ïHÆ(}³Y7WxÎmN*Ÿ5¤R‚pØ6œC õ¦Æ„„›ÕßAäHÿ¡ᾎÅÑPW&1ÒÂÚ6žiÛ!¨íø:ù¿-ré/?g@~<2‡TTpúôé ' }uMÐ]ÙÉC—ÆÙ\„E9@Seù|N¦K nÚ´)ªd|!8 *oDNñ‡ g]Hކññqïë@ÈkW9Ç“ošÓ ÎáìsÓÉ–Ã@µ/Èÿ‰üøãœÔ¿½é:¼7ðw<êe?|ÆÝ‡ÖªYbS¬‘Û§ÏeË– …˜Ž—ì3V%œdǶdÉ’âqöìÙ‘EV5F>ÅøÞ¦saWÆdÒ*‚ˆÏ>ûlã}¥r_‡S¤é5Óczã7F!Äú‡´vuÍ¥>ÂCiag.íÏ.b‚] ù?ãÿk‘´Š<À8Ãõ€¦IDåy×äb_m}‹’þQ¬ZµÊª„^µ/›ÙœûŽmË–-ÙgýW}?î?†9açΑ¥*HM= äÿ¡……´v]¼xѹmŠÓu|[ü ئ¾(ÿÏ“?æà8Àßð(Ο?ŸìdÖÇA ÚÛBbÏŒ«Û'¤ÚÕD1® '›Ç˜ò@A’šìÖ6!™3gNñ ˆÔvÈú{2>Ss“Š£AÈÿc$ý.Ö.Äþ#I¢ {"ÆœåD½]pµé¤Ú—5&Ì“?æ°}ÀR€#¨«šœ¿¯4 a³fÍ bÁ m‘F@9ÆÐÖ¹b-Ç»fÍš¢LU*²[Wa pœ°, ‘2@Îê²þ‡T¢ÓU)?ÕÏpðàÁrëríˆiíò!ÿ×…+háÂ…^íÏ®÷û´‹Јí)8&ÌP¤˜éßD_¶†(“=aÕ×SÙé7uþ›nº‰I»zŒ ÷’Dªxê©§W®\Iö¾–9WßÏù¿ïD¯¡—ô!ÿ÷¡ès¼3 9 µ¯q­_¿ž“s†ü1yÀÿñ³`ƒ jˆ¤ç$3!£½n2vù¿©ñC€P€Ô '“NdÔE2ÀJù™&$¸ÿ @¤ÄýŸgYCÙkÙ¾ œÈ“?ÎÊä{¤ H˜Š7T§¯*ë"êb‘®ªLN1–cjjC2À6¢›KÒ®>c‚ƒI„àD @ìúÞ½{“rÖ¹t4 gBȤ?„µ+tù¿ïœÕ€6|Ž‹ñÿùòÆ,¶Z¦è hp û§Ë2&:Ǻê«mQN]þ/ÓÿòåËGrHtŸ[9¦75¾³šR)¿ºcmÄ(C€P1§áÈö¿cÇŽÖû/§R~*cÂ_Ì¡HœØr`sˆeíºpá‚W‚íÞ‘íùeàXn;g*ùTíuQœºSÿ€¹l³<Áßr½ <´M:Ïcè« ¡ˆ”»n/+\•6ò½Óß§/¡ˆUvÛôpµË( 6‚ˆ ¯O?ýtñ—¥üú)öíÛ7”ÙÞFΗXÖ®¶1Ç,ÿ·é$êš¶Cé‹ñÿät cœ¿åv@cW_M€QvìÎ"k0·€IÃÙµìÖ7!¿5‚ˆȱ³}ûö¡Ùu¶ åä&IŒkWÓ1—.]j­ »òP7g€Jü¿¯M'_ãb€|y#t71†— Î»ü¿ÜÞ¤ˆÍp²y j—]D;åøÞ¾„¤X¤˜€ˆHúùJÉø\;@þ˱í¡$z míj*Ͳ½âR Ðÿï+·•j»éq!þŸ•wèH_ùÊW¶ãfàcôqâĉìI]_ð¦Ë,æ¹ÉÿV¯^MÒ/1ær2@Ÿ¤Þ•£Á!sAÄ‚gŸ}¶Hü—Z2>×êýû÷›è5¤µK¨Lr”ÿwñÿ ¹¡îÆ›‡ê¸Dü?£ðF:èÍIu•l{Cï«ìHq5±Ï›7¯(w'kФPƒ¹Ï˜q41—ø^[„„" c}ùgÖÿAçgœ,>HLkBM05TRîÛ^­âƒ\ÇÐ×Ê•+9agÌé €cÃ{M&LqF‰Ôk0›ó­·ÞêÔp6mü‡BH¨ B$ëÈøŸj‰N—ê]»vy#ý1­]9ÊÿUÚ—,YbÄfÔµGUàj\°áˆ|ùb6–¦ôÈèø×õ€PKòÙ.ÒöÈÇb"å.Û€ÚÖ©•c2=f(ð8sæŒR¹¬ji®®÷W_«#Щ”!£#€‘ü?÷Üs#¿×ºßnÌ%:û”òSý … ¥uÀÖ˜)ÿo?¾Zç>T[¶ëý6Æ×ÒZdQ9.'Àþ¦GRRž$ª“Œ‚ƒEé¹­¾LªD€”Q“‹0¤uÕÅUôa{·ÄUŒ§©1Cs2¾ÐÂlÄŠ„ùGÜ.%:mÝ×âÿ={ö$¹˜3åÿííMñÿ¡'¡v1.&$_d18~üx𣯾êœ!“r×ç5dc¬ÁìrÌPˆr;©%íòAHdîK‚pbXŒ‘ÿJtÚt4`ç×Óc¦ü¿½½šý?D¢î«/Æÿ“/fãøò—¿L@ª•B!ê!L²uåC'å.ÛE5UÃɦáfËØÓ=ÿ-·Ü}2¾ p´Õ¾&_ä?‡¶ Øý÷•è5¶µK”H¤ü¿[þ˦“ê¹úŽƒñÿä‹srúR§üøR·ñç=Œr€˜$|ÅÝëk£¯rÊÿGZ÷Ètß´á*.³O_}®ƒÎ˜¡ÀCTÞ°#_í7¤øÞ®1µ}Öê9àÀóÙ³gs"'œ“óï*÷…Î}í2§ˆÊ}]~ÿ©S§fbÿS]L™òÿîvÕøÿPóذ±ÿ߈l6‹gñ‹%êJæé_¦¯®]‚œåÿ¢]„T¯™¯Ý’ëFCPý]1;¸Þg€“®I©C6°oß¾‘„>î¡ÔTA»wï6V–Ï÷:`{ÌçÏŸ’”»jÇæ„jü¿® i«/v1䉹9vò·]¿à‘bœ“‰¾ªä‚òÿáö 6De8ù4ö @>#Ý”ñª£Á$!Á=Ú¶F¦É?Jýåä¬sq_‹Øó³uÀö˜)ÿo?¾Mþo›\‡î@¨nÚyòD*ˆuyrLúW÷<†D€>á9sæ Ö¬YcÀ§fì‰\ÌnvL¸Oé láÇ?þqAþ!ýÏÍYçbL"ößç:ËÚòOù{{]…¢ÐˆyW_ªí²ã ‰‰¼ybŽ9ˆ Ä$„¸ûÐújJ4FùÿµöU«V5&“tU·Ùd_6)çˆ1¾7„ÜM¯A €çuÒO‚Ð!ÿO<ñÄà7Þð#Ÿê}}ìØ±¡ÝÿÖ1_¼x1JRî²}éÒ¥IØŸ]$¿Ï¸ àúH@V €?üÃ?œ°`-Êä-‡(ª} 'åÿõ퀠ü¾wúCÈæ ÜsÏ=#ï-__fïÿp¯^¾|™#˜šš|ûÛß.þªÞC9–èì£xå•W²\úŒNNÿOùýñ ÿºv_Ê XÆÿ7bü*O¤€Þ|€ÝHd•Í}bljk#\„‡K’ôw Š6nܨm8“4¿'C8p`ðä“O.\¸´³Î÷}­ó^ýõâú’ôËõÕµûOùÿ;Òñÿº6¤«¾Tûnª6A!GÎÉíÛ¾Qàácüå×®]Û8áä,§ª:(ÿmß¼yóàèÑ£­ÇëTTP9&Yçí·ß^(oÊ$5•R~uïs]† J€¹sçr‚'”ðâ‹/Ùþë l–è4¦€¹oïÞ½Q¬¡¬]gÏž’”»l €”lÙ®÷Ëö…ÝÊÿ‘U¢øÛù¯G5†;E9_•€ªG?ÇE^÷yóæÙEé‡ËR‚¶vx2qã72;¸á1UûCü6vÍtï_"ˆxÿ×^{%:-«ø×;†u „µ \¯쉾öÔuU‡o*ªUv1+æì`@Ž?®<©¤8É6õUWkœ‹ððñ ´!N®²9뎉7a°0;¸]Gî]ÈŒ@´ ¦ÿüÏÿLLL°D§å1!“=äÿ\äÇ|îܹ(I¹Ëv!ÿÏ©TµJ_Œÿ'?ÌÖð¥/}‰‰ДÅ=4¦¯¾Ú ".Âïqí!Nº}¹óm·ÝÖj8Ëé©cå³.]ºÄÉž$ÿO?ýt‘ ‡%:íiÇŽJóiêë€Ìù1ÅHÊ]¶¯\¹²—ÝË–ê¹Ê@ü[yÄÌ1~•fƒ99~ËÓ7Èöé?Ÿåï½Þ Д <ÁäXP'«x.‹0dí¨€4UGFqû>ƼfÍšÁòåË‹¢ÝEŒ|®eÈDrÀ  fÍšÅI?s ´ßóÏ??[ÍfKt–ß;ãÔ©S\Žù—­F”«üöìÙżžzy?E¾Ãø9lÏíçjýìäo½ÙÐ4‰¨<×96ä¾ÊN.ÂÍ%eû!3³êóßu×]Ifuç!Óö©§M¤ƒÝ»w¾óïN€˜äô.ï!Óª İ¿úê«\•(b³\¶/[¶LŠ÷µc·‹ÿO^Hó(;\NŒ!÷Õ¥à"üÎ`ÅŠE\{¨¤¿MVêk̸^7ß|³Bì’¸r4ôý p€ü17@^˜šš*ˆ¿ ¢¹'ãséh@rE‘”“ë€Ü1pXB¹£=à²]dÿÏ¡TuŸ¾ÿO^˜½à‹_üâvÜ |Œ>Nžî¡*gغ¯qŸy«ÔÃ:P÷ºJ鿜åÿe@lÙùûô¥ÒŽØä Ï©€Ò¶ˆZ´9r$ý&œ¹,ˆkG>Ÿeù|{}Æ|÷ÝwgŸÜ—£»’ÈÃÐg§ÈKò½ï}o°ÿ~¯÷P.÷uݱp¾Ør䦴”_‡ê°œ¸´íû Õp%ÿÏIίú™¸ûO>HÀ50  ‡Òš(}yC]õ%cLØX¤cr*€üà ³±§r$,—R$!qëh€»mØfX@À®óÿüÏÿ žyæ™Z•+g¸qÖåZˆeð]‰ŽÉ> ˆsSŠÝÿœKU·½—ñÿäƒt\6yt¤F©O²M‹1Æ0{êc«†¸w4 ²”ƒ°À)@ÄdMÿÑ~TÈý'''™ŒÏ£³$±ÿ&æt×ë€ï1w%ÿKÉÞÐ?äí&ì>»7”¾dú¦€|°Š9¹~ÛWK5Àî à믿ÞXÙ’PË©ôí«®¼Q*NSãCb;¨DH‰«N&ûrQBªz Ô·ÝvÛ`çÎ,åg© ™ì˜@\°páÂ"†’eÃâüg©?þ­”ŸïûÚô=@úï‚ë€Ú˜!ý/; m¬í©Èÿ‘À‡ýJ_mïGbæ& Q K>˜­5óû¿ÿûãÓÆù»¯‡L2ÀœË©è@‰ÆBõìoÞ¼9ë™qÕgõêÕ3ås/åç{犔 „2 ûÈq 7Äeýþû¿ÿ»ø[&œÌ}áï‚ôjîô«Y&1©pÄÐÚ:ÇRÕÍàî+ƯòA:2ó4@äP È%4 q‘¾Ö^. HÒ¯Ö×­·ÞZ *!ñíhh{M8àøñãÅ_:Â%þÌ}†³aûöíSžkcYlŽ9H Ä샜”‡åìÿ,U]ßãÿÉéÅüí×£¬0‹”Ê$ëcAŒ1ÛïÖ­[“7öL‘þòë¸ë®»’#$±ï|‚ø#7À±cÇŠp)æð„g¼ôÒKƒoûÛƒ={öÌ%&ã ÇY‡ Â!ã"Šï’²&Ç\ý÷½ö‡è4@;vÿËò;/… ¬ºv‘X˜ ,cNÎß:ó4‹Jbar“Hj1S&úR-£S@·Rv$€Ân‹Ïm2.Óô÷¡zÜ7ÜpÃŒ"'Äø^cŠ1nÄ!x ?BíBØä䇪VÃÜvî¡¶ÏÚ•9êê×ÛÌŸâz}°5fÌ-pp…¸+jöÿÔìÑ.R/{,äÿ:›x [˜µà _øCZ “ j€É>×96”¾|.±-Ò7n¬}íÓYýUÇeb̹¬»¾ÌúÆÎçùóç‹ÐSüÏð³À.2ÿw¾óÁSO=58xð ·ïºî÷ÇÊÃïñ/Kÿ}ïôûÿR=NæÿÃû~&ìüëÆÿ›´eC´‹‘‡‰ ¤€Þ%À˜U™ørŒ¿ê»sâ"mÓ°À"I»édy!&–²a ÞyçÅõóIHb.CæÊÑ¢:11Q$>Ã_“%¼rœ*;vìü×ýWQ*"†¤„íh@ìú /¼à4ijŒ‰^›^‡óÙÿ}Û> ªíB¡ê‹\‡Ü—’ÿ5aNîßþô „øGxŒ ´×]wÝЄCi@W}U%‘\¤ëÛñÚ²eKm-h•>s-!€¸~,C‡ÄZ„à·ïoÉ’%3I‰f`÷øÈ‘#EÕÈ «s0CRÂS@"Fñ½ÙZ»B•÷›8¿pr…ž”/{cÕªU­¶ŽÝgÒ¶õÕÖ•+WrQiFÖyàæðû/<@ËËÐìØ´iSò5Tu&YŸ‹pLN¨°3*Ês‘ô«ƒûy9&''­’j{ì„Ä·£¿w|oH(œK—.¥3 †ôc½)“þJ.ï¡Ð øñˆ•ôû3vÿÛr儺¶û°qæÎÛYÛ>§|TuÏ™ý_Šÿe f†˜Æ?ýÓ?½Ã«P›o¾yððÃk—½ë’Uö}B_U@SŸ}ÚëÎg²ÿ®PÓçܵkWá éïw äµÏ>ûìŒD´N(^«þ•}Óku}ÈœCõý¦Çdâ3茩éý³fÍ* Ø… N„xàõêC¼¿úÇ7µ™îÀûÚú‘='úÁïdÿôéÓÅ_<7u]Cü®mŒ)´ûj—çž{®ÖÁKÒ/w È¿ Ùè:Þ…³víÚÆìö±Ù¶úúЇ>Ä-øüç?Ÿ5¦àšè^†Q@†©ê¡ÌÁ³Z~.c@„˜©ßÇ9!c³n¸¥Dú‡&ìi’xï½÷~øÃF›œa ïþE¦o”Ä€"@8ð·šó!f€àC! ‹Mso®J‘úîkþ—_~Yšü»"ð¡’þ¦õXìþ‡.ÿAyØÛž¢œ¿O_$ÿ¼/kÐ0`€6`Aåsˆ™Òé+´E8ÄðTè’‰¦DúMäI¡¦`²t êÀeîðÚõ×__”Ä÷½`Á‚âÿœ ¨„€Â@öë+¹ÆÈ‡àh0}íÙ³gÄ©£ƒÕç:PNpéÈ)§æC„0Us_Ølaù¿V<‘û àš'ˆy²&²­º"×±NØ¡/Â!8PÖ®Za"dÒbÝhì~À1‡,éÜùL3AÛ•+WŠ¢F/"d@Âx¸HýåË— â5ȾpbTç̺k“cŒ|Š÷J2=z4yÒosÌø¿š81{–½!vÿsRšªöÕA ñ¾¬A÷ÐUüó?ÿ3ó4äÿW~åW'hæ0g*O¥½ë\6Îùâ‹/N’þþc†¬%Ò°ÓZ%Zu†B!ëóþ®c7í'‚pà5Tíx]$lŠÏ¯k¹ÇC<¡ ‚øó»'÷…¯|pú<ÿüó$ýšÇ`÷¿Nþ‹=з½ïgzðÁ³gϦýÙòüÑG-ÅD=>÷¹ÏeÏ©¸¶ Áô¯Ä(°È#1 ¤¨ªJ‰ëždh@èòß9 Àîu9f4´rL®I¿j_ؾûÄ[ØåÎgÞùaÊrl›ä37¥ˆïï:¤08‚vîÜIÒ¯yLÓîèö€m{§é˜Õ«WÏ[,G•JÿuUHÈÛy ƒY¼3x‚— "f»É€l‹5êzoŠ}å¾Hwµ#ž1j"‰b“ÃA6Éb×û›Ú\ckÌØÙݶm›”š¤ÜWù¯ÌÎL×±uç”}¿Î˜Ú^Óù ºc²q]ëÞçò»áºæò]»¼‡ú|×PAÅ®Í9µüºÊyTç[Ÿc†#%”$½¾í ™ïOä£Rµ¿B°!MŽ« Ø`!Zñ-^:Êø&/A3PªÉ×ä«!…EØfÝß›nº©¨‹.c8…JúC3”9·ß~;É'Égä3¥ï:VgÝÞ½{‡T&¶æT]«u@u¾/ç̈ݰݎp¦r>*ä:ûsýúõ$-íØÎK@À >ûÙÏî˜þ3Å+QÄk#!•ÊĨÚâ„ݧ¯ÔaSNÿ² @×  ÁØó5f$EBu’O’ÏÔÉgJßuŒÎº×_}pìØ1£»ö¾I¿¯1ƒüÿä'?IÚ0Ùù¿)û3UÕ*âþW¬XAÒÒŒ©«|/{0ÀðͯÐÇx%ê0ìÚúг!þªiòÎi‘V1\ð{ë¬ͺÑÝ}ÝrË-…4÷ĉÙ•!c&xÆÈ‡ð]§žÄóµí95‡D¯ÈÛÒûŸ»ü¿-þ_ÅVë²ítì>“¶­É¾Xþ¯Ûy ÞÃ`\H‡ 6o¨­¾º&ì”a“ç‡ à¶Ûnk<Þ§DÓ÷NŸ¾àÉ:¹óÉ|ü®©15&HþwíÚemNÕ ¥òµ茹Jþ)ÿoo‡ô!¹ÉùUûbü?yô ÂÄN­Ž‡1&9ŸcÛŽK]þßçóÁc¤€²FX,¤ßǘ‘ù¾ûî›q|’|ò»ŽÃòw òÿ /DŸ45”1CöÊÜí¾ò’þú¾(ÿ'Ï£ '>ó™ÏŒOÿç•hw˜ õ)«êä•\ÄÛ€/Ã-ÔÄR}Ay@\O8H>I>ù]‡åÀ‰í»†Óÿ¥—^ª ÓŠ1ijcFYåœ×{Õã±ó¯BlsÍGµyóf’”vŒ_åyµ7Õ7q#ñQÿ(—Œ9QŸí¾ºÎA¹ßpû¦M›ŠÚµ$ýfÆŒ(à ù$ùäwíÞ“Âw Ò¿cÇŽ™Lõ¦UM1~ÓcFžXí€V<ÁKÐ 8Ê;”bÕ÷5kÖ¬äaÛFF]ìZu£m¢¸ë®»H> S%Lßµ»{ÈÄw½sçÎBþsþ”Ð"öŸòuù*DÝF>*ÊÿÉïèÐÇv^‚n'@ßÉLu²‹y†€òùv( È­n´MCtÉ’%CI#Oò«‡J·ÎºÝ»wä?FÒê˜/_¾\dÿÏu½ïãÔù‡’­mÖ…”òQQþO~G€&>ýéOO¡ ¥2ra¦'ÕP'Ù>}…Z°Ï"ìªd•R'ý.ǼfÍš!uÉ'Égèä“ßµ_gÝž={ÇwJ SOôŠ¿"”‚ö€|ûúõënît½_ÇfôÙÖxò“ÖÇvð;²\:ºÀ2-€ ÃF)V»€ò¹Ï·`Á‚ÁM7Ý$éwe Ús€ä“ä3Dò™ËwíòRvþAþJeöüØýoûr²dÛ¡`m\—qöaCöäÿPPäut胉":€j¬ÇÚÝW].€ÜqÕv8à0M c¬­ë¨(N€­[·’|’|K>’â÷».“’~sçGÙ?8r^ïû85°f…HúC³e)ÿ'¯£À~ï÷~o|Àr€­מUÛcœüQŠ-öEØu;Bî¾ûnÖ¶à¨hs|’|ò»ŽÃc㻆ìÿĉÁ“þ½ÖIÿi´·£ô_Õ`’\«Ú&ˆº­¾ê(Ôå*¯#J˜ÃKÐxSÂ[ôU^‰zLLLµl…<«<9•'õ®ç]²J_m}ûì N€jÈDl¤Üµ‘²?´MNN½^Mm&és=\ŽI•ðwÿþý#ï¿Ýòo¸üZµ¯¦÷õyÕ¸ÑS9ü&¤1é^׺15}VŸ!÷ïºz.›×ÕÕw½wïÞ‚ü›œ»\Í©¡k9ñåÿrí‚üÛ´Õ97Û¶ ‹/¦ü¿Üý¯Í`¹ˆˆd€©•S1ÝWUÓ"®Ó¾mÛ6%£(ÕºÑ6ŽquË-·4~/Œ‘g>~×ÝŸ5…ïZ$ücþócÆß+W®d¿ž«:5õÉÿ\Ûj1Ú²PKästħ>õ)xŒ˜1²" @—\«Nœ1NþpPî§ÖŽ<·ß~»rÝh[c†N’O’Ïœ¿k—œÐ¾k±óo›@Ûtp†I>™Œ/Íïúµ×^œI>™!ï é^yå•!òRþ”ØI¿8¦Mú#)wÙ¾víÚ¤ì>›}QþOG€%üîïþ.ôíÛy%šJªN‡@J6þΚ%Ëå.ÿ/·#ÑM…¤ßܘçÏŸ?¸óÎ;óU|’|¦îÀIù»äÿ7Þ`ÒT‹cã*ý7”K—.-¾:ö§ÍqÕ‹Ýÿ믿ž$¤Û¯ò8‚€^Ã:p˜œMNС…´©rYäû´#!Ð<@ÒoyÌÈ·pï½÷#Ÿùl»ù]»!õ¶¾k8êAþÏŸ?Ϥ©–ÇvùòåÎû‰›õÇ×Åþ÷±ÍrÈG…ÝòÊÿé° ÊG:€<UwnR,ÙçPTU”ÿ˵¯[·nDèÛØ‹Ñ@í3v É)]σ|2L!nNÓwýæ›o^}õÕ `‹À§”4UgN…Ê¢,ýï³öåjˆÝÿl5‡€¾øòò7:,ãw~çwƧÿìà•hÇ‘#GXšEò3µ•·‰”»62î¹çžBEb © TÙó a«V­"ù$ùäw©R±þØù1]¡úœ*¤ÿ6ÖΔp8Ú†ýIò/…WùA€þ/A;UØô$«ÚËä_§Èe‘×mÇ®ôí·ß ŽÉ@í3æ›nºi°aÃ’O’O~ב)EŽ?>Ø¿ÿ ù‘ôÛ<ÆôœÚFþuæ1®×*ãŸ7oÞŒº/”ÍÕs¹žÃ9O·éb/ÜΫÐ$ššš,[¶¬˜ š‡j[×ó® Y¥/“ãÒí *€¦XA_‹p,í(YwìØ±Áää¤öõh{cÎä1}ÆmcÌp ,àСCƒ·ß~»x½j”ˆ×ÊË¿ý¶÷WßW~­:–êûÄ{ªçèê×Ô˜ªçïódÇÔt.×UeL)~×!\WïÄbbÂۜۜª{~Èþ17ú&رÚÕØÿPlHEžàd\ëׯ,^¼˜¤£äm @Ÿüä'0Î+ÑŽ}ûö5Nf:ÏMR_P4õOùwûOÿôOÏ„RÄXBJgÌ>bv å…È:Ì]n3Ÿù˜ÁäuÅnÿK/½4DþcÍEârNÕ99ëˆkoèöÂܹs‹ü>¶lµÔòQmݺ•d£ãWyA€0™DÀ¹V8c™ü˹(ïWkUr!ý¾Æ\Â/ =D"’O’OæCë»F²¿—_~¹ø›J.’¾Ž —sjWÜ¿‡yL›"ž=T[-$gð(ÿG¯™Cäñÿ¦oƯò24»šÐMÉæ»Þ¯ÒW(¡HfwåÊ•ÞËåÿe@ ‡ÂTw!E5½[‚|Ê(pâĉl%Ö Sˆë»N=$áP‘¡›ž7úÌ]¡†˜®w9ë,<”õ¼ûßÇÔ±ÕTúRm·5®-[¶hmžå‚éëÉø P †È€êä×61ª<ïšdcì ò·”H¹k#ã=ïyÏL¹:Ñî³,Ÿï²W®Æ¶iÓ¦ÂÉ,¹Ë=ú¬Üå6w]ù]¿ûÿØØXñ(“ÿú˜·L®ø¿zÍc[›}IÔ²·e3†jö“ÿIò:¬€²’ ö C'ê¡ÈÍPn­®"@JN›íåP_eùB5Pmõ+W®ÜvÛmÅ.É' Spû]#‰ì«¯¾:“ 5‡\$ºó–É17UWÙaî✲ý·eþÑVóÝ׊+ŠAžF€PV"QÐÆÄ¨:qÆ0ù‹Äj&i߆…Kà êP€ª}Ò_m›?~á€aBòIGC œ¾kTÜù¿páBv¹H|œ¿ÚÙ¿­Ð=í>ÎÙVË>TE§Žý©;.îþ“§™ƒIñõ¯}lúÏ^‰f`WöWõW‹÷.C¯ïsce P×}]¼xq¦ÄšŒQ(k4ö=¾O»¬Qoëó}÷»ßQŸ°ì•¹±uÿôéӃÇÅÄÖDâµr[Ýkºïï:¶ïûMÉÄgñºv}V~×êcœ''Ožô2oqN.ù§»¶u­§>×f›Ÿ »ÿ=ôP”¶Z×oÅÆ¸°Iô©O}Šä¢ã=öØM¼ r €Þ%ã@VÜ£GRÖ¥p,&øKü¸l‡AçS®»R*㲡4€ àŽ;î(Œ;f‚ç.w×gåw­6&8‰÷îÝ;DþsÏEâcÌUòoÒ)ÒÚjó3!‘lÌv_lôÅÌÿägt„Çy ºy¢Í Ûä¤Â8 Ó nФ¿ Hxï½÷’ô{4á€q‡ºÎ$ŸþH½+GƒKNÎß5Hÿ®]» 's‘øs]•…œî&ú\¶lYñ…\Ç`RþO~F@xì±ÇƧÿ0ÃdP‹ mN²ªí¾²}‰Š1fû Åépã7 ÔPHÝ1Hî„Üp|êÉ%©Ï=BÛœãú»F™XäÔAÙÍÐI¿®³ÒÇœÚçÚ¤â0×é_gL]¥ìbQtªž«ï8àL_´hIE7v\åg„$æð¨cúæ„Ìd¯D;P—xõêÕJuOmÖrÕéÛE_P€0Áèó½HÇÜ’d!€ï¸ù>Çij[÷ºHxâĉg`¬uä›^3=&_uä«ç¬ŽÉÆu õ»¶q]û|×gΜ9rdd×™¹HÜï)ç6I]þoKyXÝýÁVÓ±!yC¯qa÷_'QaF ü_TôËLHàÀ… jÕMŒ:ÏMB_åŠ)Öýua8Á‰òàƒŽ$¡í.k]›Ø•RWHc†SkÆ E•†.5@õÆÈ3FÞÔu黆x||¼p —ãÍS KÒŸ|Œ¹-ëêu“öÆÖ­[ƒ³ÕBV`ç¿­ZA^F€c<úè£ãÓ¶óJÈ9l“kÕ¾CžügÍšÕZ0Äœ!:–.]Z8b5P]“~Ûc^¸pa‘ÈhåÊ•$Ÿt40L¡á\PÊ ÑŸP/1©ÿ1—wþSt˜»:?¤ì‹/NލÛtFÜsÏ=$rØ~•— `@’ ¹É#¼íØ¿ÿàÎ;ÜlɺºÞ¯Ò—ïÐä(‡ÄØ'Äöõë×;ÏûöíÓú¼¹—½25f¨ð,_¾¼(xéÒ¥däô9…)¨Œ‰a rcº|ùrqOœ?>Èù!ÖR‚ªãns ¥ì0·ÝŽ×nºé&)ÛMǾòÕ—j»Ì¸°§9åÿR ü¿¨èÊM$€’€2–'7'‹ÒóTúÂC$t½H‡lXô1œî»ï¾ÁªU«ßϲWîÇŒ2‚bGŠ&ã““‰Ï{2¾Ô”"È‘±{÷n%òï;Yžê¸|ŒY7ij×÷—:i7¹6ƒücÞ7aOåNŠçþ·©A ò1:<áŸøÄÔ€%'¤€òE.&l“¸ïE #ÛÙÆ1¡.?üpQ"¤?¬1#Ž! %ù¤£Áöu 黾páÂ`Ïž=…Àƽc.’98Ìm´#Ï 7Ü$é·Ù×<@ò ‡Ç¯ò1‚§ø/A7prrÒÉ$«: ‡¼À BÝ_ßíH>÷ÐC)%$éw3fab·ßÉgºŽ—œ¿k„wA766V[ñÅÎ-iˆ¤?µµU¦»ÿ˜çsPtêØŸe ”1Kÿ‘‡ÙƒK4ño|ãÌôŸe¼í€ ûø@ëbÑe«<×9Öæ¸Tû‚,ô­·Þ’&mí]Ç÷iwuNYâÒÖ£ûùçŸwRvªå*f7ä1Ÿ>}ºp"ûy±$^+·Õ½¦ûþ®cc“­ÏÐu®Ô¯«Ê˜ð›Æï‰þúÜ›ÌEâ&‹õÒVÿ¡­Íý¿ÿýïÖ¾²Õ—ìwÐôü×~í׊9¢SÿøÇ—ó2ôúxœ— 0ê/^¼Øh€µg}ž§Ò—ˆ›‹)Û¯«sª¶Ã«Ž¤€Õ÷„XöªÏ1)ŒyÅŠÅw„¿Œ‘77&†)øý®§¦¦Šd¤uäŸaIîÇÜ•ìò3íwÝuW–rþ6t‹Ð8’ò/:â³OJ¹R(ÍârÎ5%‚ax€zû½÷Þ[d¢½Öu,¤ßƘ‘ûbÍš5…#2H’O¿Ž†¦{‹ùº?Âß@ü=Z(HúÃsê¤ÜU;ª½,[Ö-ŽÍ5ÙsÓó»ï¾›düË `ßøÆ7^˜¾·ñJtã—ù—óçÏo]8B’bÙ—J_¨C\® ÝöY}ÈÿUȉ/ùù5T¦xòÉ'g®©)ƒ.ƲW}ÎãzÌ"‡HUAT6œlɾ]ÊÄëÞÇ0…8¿küfO:Uü i~u~ò=æêwHù¿þÚü3?ó3C™ÿc•óëôÕõû«ö‡÷£>J¢ wÿïøøÇ?ÎL‰ À„å§~Š^(I ;æÒ,>úÂŽhS ]bê¢=´1!Ù*¨$l;ï]11ûJ.¦2fTp@¢ÀM›65:¹ËÍ0…¾k8©:T<@þ}'Ëë3wå8ærÅÊÿõÛo¾ù摹:V»O§/EÁÝò.:"Äã¼rØ¿±›Ãäo²/,¦!)}ŒŒ 'ÊŸû¹Ÿ›É<é7Yë:GE›# ¶yWކH½«1ÉÌ;6¿kýÇÄåý˜×#ž1c]eösíØ¬eÿr-ãܧ/„zÞzë­$ ä]Î0›—@ÿò/ÿré±ÇÛ2ý/Ã:9ûìÙ³‹ª®&Õ¾C]HpÝ._¾­‘šáCÄçêœÇwVÿÜÆ §Í’%K ‡œ‰¢JFùž¡ta .¾kìøŸñZõÜ}߯3&ñžê9t?ƒì˜ªç·}]›^3}]û|×—.]šùÍ‘ôÇ9æ:òOù¿^;’þ­^½ºõ½:6P¬}É´Ãq¢B¾ÅK * áë_ÿúîÇ{ €e¼í€ »wK—.Í>ã«j_pÀøLÙÈpý™PrÞ¾IS"ý1޹/^˜À,˜”B{öìq>a§°(Áh©&×I͈ða8Áp Úî;Y^ÛØ}–49æ>ç©{}îܹEù@|(AUÞEÎ=F>Ô|1”òƒÃ„ l!÷&æõˆ3i*æ…r>ÔI¹«õ¶œ¬˜¤_¾¯`2{ò,:bÇã¼rÀŽ+&¹ž°UÏÊBRÔu^v’~½öûï¿¿P¥°>wÜŽ ÜpÀ€\#›‰•|ÆæhhºÏb¬¦¢ÝþÌìø»J–*ŽÑQQ}Òÿ\ÖKWçǦæ[*:Õ€c±û_Ι@g¹N ã_§1ýçc¼Ý‘ýÅ_üÅV£±ËÀëû\çØjÌ"á$ë2¿ÉvYƒÛD{B£û™àÉ'ŸLMMIG¥õ¹ýIŽ6sîܹBÂÍd| Shz¿ÈèߊȵŸ4r‘à;n*ýšÓzi¢½útpºú´‰b꫌O|âtÈ㛿1 ^3 À<(O‘DU@‰˜|_È B(G4×'®+Ê %@õîô‡9æ®q!<j€ï¹jèæ¸ËÍ0…kŽ?dò?räHñ»ÿ)‡ËÄ4fŸ³‹üç´^š^o‘ô¯LþSµÕÚз¯­[·’ü“_yð¯ÿú¯cÓ¶ðJt£ª1²û>W]øB÷<ã/2Q#FUÆx7ÑÞõyBÞ9Q9O<ñDcÅß°û“Ú˜û|–r¾[ÔlÇ÷“ñ™ÿ ²çð‘xñí·ß.²øãû‡¢ŠjŸtÕ Âá×wmÉq½ìrü§øÀ> å\Éag_Õþäî¿Æã7~ã&^s`@K^ªiãoyº *€n¸¡ÞCå¹4Kßq¸è ¯#û¹`6ãwŒ}&( €@Ô÷&éO«” HÊVáy„ ”å>R(/è²”_ݱ¾¯+øŽñe#IúÓsù·9çĺ^ª¶#ñ_S>"_å’cé ±ÿ°ßéû…»ÿ†Á ˜¾ÑçUÇÞ½{G&J•禎Õíˇt Î oNÙÈpm¸‰vÃ~ðƒ…cBŽÞvŒï¬þ!Yu\}΃pÈX×®][üÅ=Åd|ýÇÔôY}$^„CáfPK;v¬ø‹ç ñI{Ì‚ü7­¥±%© m=Å<¹yóf%*ûʤÝ×·¯»ï¾›Æ?y•WÌæ%0¯}íkS¿ýÛ¿½eúßm¼ÝÀ+jx/Y²$›Éßd_p”w³˜ÍØœá"¸nݺB¥"ábÇÌw}îÆÜ糘J&òk`wFˆêwO9½û0…®y°ü~Èû±Ë¤PHa~DÿÐ~·Üé·7f¬‹ªÚm¨ÌRTæÁ)ŽÒum–í+ß›;ëׯÜwß}4þåñøÇ>ö1* ƒ {àU{öìñ6ù«öÒB"þvÅ‘å(ÿ7eLB €p™Ò‹â8߉ºtJuÅ’\ÌŘQ×á kÖ¬¬X±¢pTÂèe2>{꾊8’Aø'''‹ò}ÈãQ'ó7ù{ÒýÝêÃ1ƒõ°Lþ}ð×K$SIˆS&ê¶úz衇hô“Oy“ZÄ·¾õ-&TÀ¶mÛ›6mj]ˆ\•fÑíËGb¼Hl–Z‰!Óý«’-ñ¿H (rÈþ–BÝéçîcÿ1c‡÷²Å‹{ŽÉøÜªðà^ÄßC9ªûÉÕocn?¦ºóÃÚÓz eÔÃ?œ¼=e«/ÄþÿìÏþ, ~yŒô£eò?  À.þ7/< w9¿N_X˜»ŽÍ]þ¯«@N€r 9Ÿñ¯m;imŸ…qÆúcFökì€A€2XB ÈGL1ò2ïA=‚/dýˆãÇãìÙ³Å.ùÏ%GÇ|í5ܳfÍŠnm‰i½±ë©çW²ÕB'ò(:ÒÇ7§S¼ r@b&ÄZûš°Mu‹H HHj¤<$§„¨ÐTö(õdy9“þ¶cð{€CyLV®\Y8‹Pâ9$p_振íµ>ŸAÄñ£LÔ7gΜ)È¿ˆçÏ9\Æ5é}ÌBö_%ÿ1V¦ ¹ý–[nÊ\O9¿Z_ØýgÙ?%L]åQ„0  E|ík_»ôÉO~rÝô¿ójÈ;:(-ãkÂV=WhÎìNC[—ð*'ÒnÓ©¸p‘$Eåø\ês÷[JcS¤¿þíßþí_§ÿ|ŒWBØ)û…_ø…‘lÛu‹–­.]‹eèIj°{ɬdF*ǧžhÒäíÛ·$Ì%YžÉ±qÌ×ÚÊN±C.ÚeËVÿozŸIõ@UÎ_ŽßïºIú9f•óòÿ\’ØúúLwÜqG‘ù?{*ûªÏ±ŸøÄ'(ÿWÃ7ý×ý7xì w^,:$25666¸í¶Û¼y|UûÖ9ÖF_ˆ=†qE…ªÁFù¿š‰¡€|™¤Ÿ¤ßÄ1BÎ,"ñdù¡ð©:êˆRÕÈïÚ©¯ö'^k:O›D?”ëì‚@Ç8æXeÙŠkK(Ÿ N7oÞ<òÞØl"Û}µ½÷®»î"ùïÇ›‹ Àþýßÿ%ƒ÷çþç•U]Ïs* £\„ÄX’Ïdÿ¶wN ¶¨–ÌôS&Í1“ôsÌ.Ç b…„›u1ÿT±™='ì¯÷¿ÿýÅõ6aÇt}×)– Ä5|ôÑGû¯†ñ|ä#,ýg¬à,e¡©ñññ™Èkå0ãk«÷,ðL´0–/_nÔ ×YÜSnGÞ…_ú¥_*1eȵ” Çþ˜}e›×¹Ÿ8æ°ªŽT_Çš†ê]¥þrT±Ù8ç½÷Þ[\oSvL×ûC±ÕLö…²‰$ÿäKtdŒ|ä#XP {÷î‘°çž=¶o_XxÊ¥)ÿ·gDÁPB8œ±~F}.Ž Ž™e&9fsŽŠ.òŸ{[Ó}®]»v°fÍšhl¢7d`Á@(aê*_"èH Œiéáð=ù«ž+´E µÉ«1Ä4œì´ã:à %€-ƒßôîŸ bã˜st®Ä2f’þ¼Æ,ÈSÒÉÖÙv}BòÝvLꤿÜöÐCq÷Ÿ<)X0  CLO ÿ8ýçoy%äqäÈ‘Á 7ÜP$¢©›d]•yéz¿¯qÉö…]éÉÉÉθŜ 'Síp àÙgŸ c‘=žqÆ3ÏÅ—#ƒc¶7f($üãÚân½~Ï{Þ3’Édr=Õv›ÈW_(ù‡Ò„2þ‘—À ¨pˆøÃxœWB ¯½öÚÐ$[tÛžwMعô…ż«-åÿfÏÿ¾÷½o°eË–™6ÆÇgÌ1Ûs 928fûêÿr:®-æÆ×t H+Tƒª¶GNù•džc÷ŸPÆãWyA@’`r Eœ:ujpâÄ ï“¿ÉÏÇ¢„24åNöÛßûÞ÷_FuˆF=s,šcö—oÄ¿üSÅf~í…Ò²ºk³ßW_ëÖ­Üxã4ÞÉ‚CãÃþðøüÇ|sz’ø¯†$øªçÒW—ó¡O_¨ pòäÉÁ[o½EÃÉ‘a ¸råŠR”sÌ9ŒÙäØ8æ¸K6Š2uyk¸¶Ø[›q½!ý·e{˜°k\K·¯x@i3‰(~›ß?â•p*<`zb`’ E @S<µ˜UžwMþ}59.[¥W®\IÃÉñù7lØP$F-wú9æÜÇ,3._êדc®_§ T+'NãÚâ¦]ÄýÛ²=dí©ØU[·n¬_¿žF;yÄ(þ×ÿúÿì[w×™†«Fœ'q†æ æ$ÎÄ`#9ÄÇI ÷3ËâŒù†Ë¹2ù™¹s3“Y“5–'άL<‰åÄÆŽÁЀ16G挭©·è’›Fêîê®ÃÞ»žg­Z%©Õ¥]_—ªöûîoûõ~×O$¢qêÔ©'F®I7kîXzÈ«( §t_WÌ_{íµ§V`ž1mFôg³<&O=ikk êÔhϳ%Ýוö_=0f?&Š!`r»d\iô"Ó_ÖE€ p»"òðáÃ' fyózì8pqK£,W¢ãoÇSæKwww0-€yÆ´9抩¢ßÆ6Ûj®Ôk›î‹z&)CgKº¦†„8ʭ½wݺuÁu è!`’J†üÛ¿ýÛW$Ñ€ªµ,P+ßG}o­‡l–íjäX?üðCP\QÆJ­s­­¾^ï<ãúûõþVœ?Jü>ýôÓ`k¶óÇåt¥8²g;²pÄ5B 5mãè(æáõ$ã£tÍp©@FL›k3…çìYJÐÔëÖµ6GmWÔ¿¦üWŽ6×µ<[’{¶¨JýêÕ«ï{4ÒŸ2¥]ÌûoFÿ ¡˜Á¿üË¿Üûû¿ÿû þ—ÝD#ÿJ3œ1c†•8¥‘ÕWøþûïc=²]”§ýºFЖ/_,ÕxçÎFúis¬ÿYgGÐfw²P„ÌÊéÓ§7Mú¼¯Ë„Ù¶m[ÐG²µÅH£]ªÕ£ÔÐÿôÊ+¯ü†0dfA@“œ:uÊ»uë–1¥¨ÇŽóDZT P£QŠæI”§ýºŠ6i©@u<ªßÃH?m¶m)Á´³òÚæ¨íjµÍ'N ŒøZKü%a(ólõ¹±}ûöLŠþ¹z,[Ễ¦`ôß ¨`ÿñÿqØ£@S¨ã!§»úÈÒ€ÍKË^¼x1X&°™9ˆ®ÍÉú·’˜w:88è}ðÁÞíÛ·[îç}nt³ï1µÍÍü>mv«ÍYü} þiÓ¦â(­û0Ï–úÇ׊2ʰ±ïÑŒñ‘F»^|ñEoñâÅt¸›ãÈË/¿|˜0˜æA@“\»v-Xð)—‹Ôµ¦¥ÝÌ™3Svq½žõßOúuu´_zé¥' :væF»Q!¿V›£¶‹6'—Q‘U›³¼65]L«ÇDMùoæ>Húã¯k”:ÿ6ö=¢ö§Òè«)+ñß4Œþc@-^~ùeý“°>f“|ùå—AMR×â;– VÖWH¢Eú´˜…ë9kZ@ezgЏQxÎÑoc›ý¿GÏÍõ×V«Ð_šœgÇc–-[ö”Pu±“¦ù e,÷ìÙC'»y~YÖ7`c ‘È%ûGÿÔA(¢¡¢uŸ|òI Žt¯®L<ÚôÞï¶r¬¨+­vEù^£Îš : ˆ~sÎoöìÙÞ믿îýñô.\¸ÐÐû)ˆF7Úœ}±<›§žH Iø«FŒ‰÷á[ôÙ¬_¿>±~Œ)YQ_oµ]Ê€¬.À ^”˜3ú[V" Íñé§ŸSl}À™š7þüšs=ÍÉ®ã¹`Áïµ×^ ö¦ è,Ä‹­mnEðÙ" 1Wì›z¢¹þÁ”0Wî£.=;$þCØÅ¾G–õ•Hýo‰’Çè¿‘´3ùçþç{ÿðÿpÃÿr?шŽÄ¿*׫8‘)8¼úZK=i*@½jÌquÂlåi¿®Q9¥€*[C™0>¬û—Ò¤Ií¦Í.­Þ÷ÿ@3ïÑ=_#þ*(W=êoã}ØÅô‰þ;vÏfÓ„ºíÇRêÿÒ¥KéT7Ï¡—^zé„Á§p ˜2lYÎÏ–¥uýÿ⿈¼Â SúÙÏ~†{b(L0Ÿ#„ yNœ81âT€§œ°GöãlGV@)´•sÒBÎ…×[9u 7mÚäùà ïÒÜhæsç§Ú¼Kmn¤]&ÔÈ;vlp×Üg ýñlýuÍù—ø7¹¿`k}%¥þ#þÑ/®B€ÐZ'\3ÝW»ÞÃÞçþæÍ›Þ·ß~[÷8£½žÄÈIR#ñ¶g(@Ê  r{:mn¦m´Ù­6§qmÆù‰ÉêÑä42–l¸›vN›7oú7yéO»?¥¢Û·o§Ý<ŒþËÚÁA{04ǹsç‚9ÑázÅY,7Óê±ÓjWÔciY-½xåÊ•†;ÃŒædóúÊ•+ƒ"ŽO-h¢1Yð¥Õ6ÛŒè7Wô×:–ŠüiÄ_£ÿq~.ÝGMjÓš5kñoSÁ†cé5¥þ+{ZÖ-`0dXÂoû[ÝD¢9Ô¹Ù¹sçpçÆ»ÖÃÞ&§^YÊí³91mN~ç×ñU ðÃ?ônß¾èGôÓfKDmÖ3Qæ¸ Èå¡6Š ÏzݲeK.Fö³¨ðòË/{sçÎ¥ãÜ<ýûöíë! fC {`.M Ü»wÏ;}úôÈ.XN–²I²]sæÌ ªDÇÕ1Žãõ´Ž™æ9Åõº2b^}õÕ`”Cµ˜Ïíî|nWÛÜÌßÉËR‚´YsûUdÞ¼yOUw¹6ŠíÏúKü›Ô_0¥O…ÑŽ¥ÔÄ?z%`¿ýíoí±,`KèÁÙȪÕß'éb×ë(ØäÔóÍ7Ù#ý®‰£Ayázðà÷ñÇ{¥R©îõ™‡ÔîfÚfê|nÚÌJ#1yòä@ükô?ïµQlz¶È¬Ñr®ô’8V+ý)¥þÿüç?§ð_kß·oßÂ`>Ô°‹C…B >ûì³àªŽOÔyaQæ”E9VÔ¿•V»š9–*Gk‰@mÍqtÆ“êÌÛrNQ^WÀ¶mÛ¼+Võ4= o¢ŸåýyXþPSá$üµ7á>çb¦ARmRaFýs©¿Ä±Z9¶ªþk…#héâQ°ƒ6B`¿úÕ¯ß|óÍ¢ÿeÑh- ¨µëgΜ9|ó¯õàhåûf7îvEù;­K›¦hn¹ŠºÚñs±³+QP,çÒ¥KAf¢ÑŸW£ÂÑ/dx«ÀŸž{µŠü¹*ʳn_«ç¤gêîÝ»³6éþ‚­}V^]]] -Ñ·oß¾c„Á¨`r× Cóœ?Þ´úgò|>Í-U‘¢j'ÝFœÇ0Õxíµ×‚%ÂÂ`¦ÏçŽc>uÔvÑfsÛœVÛLo³îÇýºkÅ–¼Šr›WÐÈÔõèóÚ÷höœô?BÕÿ–,ë°2,ãW¿úÕ½7ß|s‚ÇŠ-¡4ç bÕ”œ+ÞêLe]ØÚñ4¥³˜EgV©ÂZ:PŸ¥ 3eÎä=µ»™¿C›Íms3m³¡Íz®©ÖгN˜0Qné³Eâ¿ÖÈ¿+ý…¬õÓŸþtÔÿh˜òãøÂ`Ô°ÿÆuÔß½éoE¢ÑJOW=€ 6 ? ’š¯Vï¡¥@”ce½&o˜ pîܹTkäi-è4:»ªŠ¬ÔÈ“'Oz_|ñ…÷ðáÃ\‰~ÚÌ’¶aem#‰!D¹=çŽüWNÙp¹¿Ä±9¶êß„SB¡iJþv”0ØrìØ1eÜðX %îܹ¸¾ªˆÜȃ#Ê÷q½·Õceí®§• @M€d_—°ÐÔ€eË–ymmmÞõë×kÖx@ŒÒfWE¿©mÖ}VË—©’yåýQnß³Eý’½{÷#ÿyê/$q¬Z¿¯ÿ—]»vÑnC/¾øâƒ]°  Åü×ý×{SZBîºæ:VÙÆ¥l’lW³ïU€2$]^vʦsje©+e(@Y•ˆQÚlº€¶q%„ZïÑÜ~ø«LOzéP×—FÍòÙ¢ÏQ#ÿ2tòÚ_HâXÕ¯©¦ÂßýÝß545é÷Åa°Pÿ«9R(0Z@‚ô“O> ÒÀGÌ¢Ô5›ÒóTpñâÅÞÙ³g­^ÀÅéÍ´_TM P™ÚFZ5 Y‘Dj7¢?Öï+#GQ©þõªú»|ouéü*Å¿Òÿ[‰‰‹éüqKµjÆ„†ÿïŽ;a €Å;v¬ÔÛÛ[ôX°%Bá¢ÎTøp¨õàhåûfפv5{,uT•žzëÖ­º£..u<]í¬¶6oÖ¬YÃSÂbˆ~ÚÌR‚ñþíŸ7o^0r©ïån˜Õâ?ïý…¸UÉòåˇë?AKô½øâ‹¿$ vB€ýÈ}S-€BÑ<¥Ri¸xÒH’(ÎsVmh—¦Z(@K1Ž”:ž—ާkç¤ÎëÚµkƒb_ýµ÷é§Ÿ56L£žCôÛÐfýIª²=á‡è¶ÏÔÐg»eË–`×3ݤþ‚)}"!MÓ>¡eËú,… Ë9vìØ`oo/ËÆÀ•+W¼ùóç·¼4àH%׎ՊS¯L-Õ…óØñt­³«,}¶2”í¡ÏøÞ½{ˆ~Úl…è7­ÍþZÊO#þ* åþŽ(·ãõ°Úÿĉí/˜Ò÷Zòyÿ±ðO===Ç ƒ½àGý›Ë¶ˆæ¦ÿíoóÖ­[7üà0Áú·ÒjW+Ç’P\²dIyQ-óÔñtÙèÐç«lË—/{§Nò.\¸KŒ\LíFô#ú+ÑÜdö‡¢0æaÞ^ÅÿóÏ?=ô’?–FþYò/J~|YöÏrXÀúûû5 à×D¢u4?láÂ…#>ȳ¬j×ß5霔 Â€2l®þÇëiSVUµ5%@ÅeúÔ*ˆèÏw›MYÒm–)*ᯚÕ‚°ÑûÕÿí©þ_)þ“î/ÄùÌ·µï±hÑ"¯§‡bõ1q »»›Ñ 0È`YÀ˜ØºuëpšK&{,™•™t<{¿­K]IüT'À4aÇtDm–œ={v þ+‹úaºkøJü¿ð 5ú ñK}9-ù§¥ÿ u©á‹œ` €[ò·CëHœÈÐ|uSÒàZ=vRíjõXù*‹OM ÅÕ¼´ß¸–ºªœ  mhD^D¿‹Î†iþÍþÏgqï2ñÞhËë•âŸþB:ÇÒÈ?â?V@€c¼ÿþûïø»·ˆDëh®XX`¤‡zV)uµ:6;õªÁ yâ7oÞ¬ûþÑ^ÏcŠ« #xZB&€¦´²zsÐý&·Y¢OÏ Ÿ&ݧHÿOþÙ"ãsÓ¦MÁÀBZÏVWû ~¯yÿZ¡báèÞ½{10ÀP@ëØñX0T`Á‚Æ=àâj‡‰q™×¯_§ã™`gÞd#寠i•KE"úíks֢߄6+­êÔ©ÁÜ~-ƒŠy˜ÏôeWBà.ÿýßÿ}Øß½M$â!¬\>ÒÃß…z¦ºþš  p ¬õwHÿoþülÁ«g úýI´9ýJó—èw}šYXÑŽ/ãZ)ÿóçÏw¶¿g»âl‡ê6=÷ÜstXããÈ /¼p˜0¸nsÔßÞô·"¡h‰ Í+SgS–ç‰óX¦ºþJ©Uñ¬Ó§O›Q;ÿ¼žþ_ÒÇ×ëÊ P‡O›¦ È(mš@ZbÔµyó¦Šþ´Û‰þʪý,šÎù¹–…ÕÕÕ Øø,u¡¿ ~óþcçÐóÏ?ÏÜ p…>ø@µº‰D|¬]»vx¹×SûL<–²Î;g(OS,$y~.)š" # Ü+c ‘ŠèO¾ÍJé×”­p”_µC0ã8'Í9ß´iS0úoÒ³5OýyJýmùMhŠþ={öô÷a @¾8äo†ø8yò¤·~ýúᢀÃÎZ†ióµpmj€Ìè:u*¨U`ðz²)´6ž“Ös×þ®2dܼysØiÚ¢?Û6k>;‰}Ý“k¥ô§ù@¥|óVhåïKük¾¿‰•þóÒ_Ðg€øOL'@  g|ðÁ‡ýÝÛD">ÔÑ”  ¨)y½ÎŒëûÖzíÁƒ5‹V~Í^úççÚ9É!ÖÐ׺ãÃ6®*¦èž˜öÚ4ºŸÕÿ™‹×¼‰çgÂ9©V„Ä¿¨©ÏC[û QŽõúë¯+GöìÙs˜0`€£üþ÷¿W@‘ˆ:É0©å¡îÂÔ€ï¿ÿ>X^sºMåiv¦M>?×ÎIf€ ¨pÚ€¶«W¯:-úÓh³D¾Ä½6Ýg%ö«ÍÖ¼ˆrÌÃlÏiÉ’%ÞŽ;œ|–ÚÔ_МÿåË—ÓñŒ—Ý»wo& ù)ùD)>ï†øÐ ÒÐW¬XaLÚ|½ßϪ]I+\!@•ݵ‘¾ïÞê&¿.aªé(Õ5AB3@÷M) ½¾wmUfÛ¬,*‰z‰}íõ}-¡oúuìúÿ©í÷‰fŽûsõYjKAu—ÿ‰éÈdä”ßÿþ÷Zà-"/2:;;0¥iK)Ú¥R)È ¨üFðÌ;¿<º*c@æ@h„ûÐT¬WkÀÑ/?yòäàëpÎt(ø+çéÛú6Òß"ý?ýóKêœtîٳǛ={¶Óuãî/ÄÙ®ðëE‹y{÷?GwïÞ3ÈÈ/Güm¿¿ E|( `üøñAª*ëûfw, U«V&@e÷f`ϼ>W>3e è~!*×±®®oqëÖ­àg*tY™9 ¯+‹_êçZ#)ѯ9·•?WÛÃö‡ó£GúºQçòÿ!™ñŸ_ÒmÒ5¬tóê"¿&=—óp,½¦Ïâ'?ù Ìø)•õä 2rÌÿüÏÿt{Lˆ<ûì³A§ù}ÙK2ºŒà±T˜©ŸY½¿ç߯6*Gém:¿<}fi^ó6Ÿ_\ç¤åý6oÞüoØúüs¥¿ Jÿû÷ï§â2ô<÷Üsý„!Œ!ù¥üO”HÄ‹:Ö_~ùe°—s=ªûVõZ½ïk:y-¼7Ëv%},¥k¾ RÁc©0>³Çh™<懛¾wñšsñÿŒ×“¿O¨ÐŸ6Uúoåõ½¦ˤþ‚DÿÏ~ö3Ä2Eüc@~QêO‰0ÄËíÛ·½'NÄú°´µ3a±T—aõêÕOÌ7F”ÓÙçu® þ1C”µ÷òË/{K—.UÄÚ~¬,Ÿñš‚Ár‰PòHýÏ5L€`*€Óe*@¨pF MIõ«× ²!±•÷jJÀÉ“'ƒ9գłô– 3áœ8¿Ö®yÒã9¿(ç´`Á‚áQ“Ÿyê/hÎ?ÿ“Á/©ÿ9‡ `*@‚\¾|9X›Þ×?êëiµ+­Ñe(`þüù5;õ:>Q_oàalõëYŸŸç—‡sâõd® ÍõW¥ÿZiæYŽ‚ç±¿ áøO Rÿ†a*@BhMz.v&l  Þ”×ݺæù?æü* SþµbŒÉB=oý…eË–Qñ?9J©ÿ€!þÍVeÒ‰dPQÀëׯçB\›ÐajäX*|¶qãÆ'  !°X* —¯óã3Ëßù…)ÿÿÕóËy.g{,}ˆÿD9PîïCΡ<Áþð‡Ãþîm"?mÖò€Zû{´Î Kfs¬¯¿þÚ»páó»Y*ÌÚsâüZ»æó^[#/µC4ÇݺuOúÛPÃÆõþ‚Äÿ¾}û¨øŸGvíÚu˜0Œf|äﺈD2&ÀÚµk½‰'Ñ!h´–‡NÏ;w‚÷ïßGàåP, ð0¢òl®åÁ<ìèè ýiÏóϬþ‚Œ™7ÞxñŸ¾øßL „)0ý¡«Ðk?ìÂå4ß´cÉ”Y¿~ý¨K‘žÏRa¶©äÔàš|ŒFü•ò?šøoõ9Ô½æ%ÑÏÈ*ýz ]»v x I 0þùç‘Lĵ eh¬\¹2Øô5iÎό׉™½¯KTöôô•þmy–æáXákú|~úÓŸŽj¼C,*÷ë~ü$0ÿû¿ÿûž¿ë&É ç5kÖñ:éÿùK%'ýŸTr—ÏÉÕó[¸p¡·sçNoìØ±<ÿ í/¼ð Áç‰Ñïÿô¨† ¨…V`*@BhÎù¹sçFwçRt꣗‘ööö ^Ã’%Kj.ØL‰×£½^G}³>'2 Èpõü4ŸüùçŸ÷öìÙ|õY@::ý…]»v!þ“…Õ½¢³sçNÝ<˜7” W®\ñΜ9c}gÂåcÍ;7X½AkF#€òs~. À¼fÔpÿõÎÎNï¿øÅSÂ’|³žËÿË–-£˜,Ëýx€§ÿo Ôãüã»þ®—H$ÇÌ™3½¥K—ŽÚ©I+Õ¯^çʆtÆ$Ûqþüy﫯¾õ÷HÿÏ_Z2éÿ,C÷5“æ9¹ò™i¤_E\£,ïçâóφþÂÖ­[½Õ«WÓñK–¾;v0€£B4Â!£€H‚\½z5X‹¾’AˆúzZí2edcÑ¢EÞÆk.ãX¯SÄëÑ^¯‡™¦Ÿ™ñ¿Îg–Üëõå•WQÙÊý=ê³$­çŽ©Íô4êøOœr¿šgÇŽLH2\êL¸85@SdÈ ¨..…Àôà3ãš'æé¼®Q¥’«Š|õ­8D}–âÚEóAâ_Ÿ$ÎÁr¿Z6pS@õš5lìØ|,Í1•0mÚ4#:ûˆ ³ãG̹æã€ÏlhøþûóŸÿü‰©s&<ÿ8ÖÈ¿«Ï ñŸ ‡Êýu€Úý^BQøðÃíïö‰d)‹A]€êKšy¬‹/+:OŸ™Ä¾–õÛ°aÏ?Ë–dä?=üÏàˆ/þ À€Tø¿ÿû¿÷ü]7‘ÈÆ @zÇŠúÞû÷ï{_|ñ…788ˆÀCà%?>3®y?3¥ùkÄ¿²º?Ï?;Ž…øO•þmÛ¶õˆÊXB- ©gü­ƒP$ËÙ³g½¶¶¶'*Î+ý®òÁ[ïûZ´òިNJ³]i«Ù÷j*€F¯4•ãôéÓÞÝ»w#Ç“ôRÉù̸æm¿&ýÌ$ø%;;;k7ê=¹•û{½ßϪ]i<â ñŸ*LÉ…¦¡4ͶmÛ¸ù¤l\»ví©q­ï£ü.ÇJîXÊÞèêê 29âè8#ðÀ|f\óI¼'«˜(Ý_f©Šü…â¿Õ{r=˱â}þ!þSç@¹¦@ËüéO:ì廓/~ªÚ¼ëó!]ZéÞ½{OL ˆ+…—ThRÉù̸æë½nâg&áXYàÏôùíyz†5ú=â?uŽlݺõ0a ÈÚ @†&@óÛóØÉ‰3^7nÜð>ÿüóÀ@à!ðl_SžÏÌŽø™ô™i¤_£þÚ»°Þ}œí²éù‡øO~_ü3ïZ‚)š P" é êò•Ól]0K#…¨žÃÎ;½åË—K6Ò¹lÒÿyÏŒkÞäûH8Ï_Kû…éþ¶¤ÍG!Ï?–úK’ÇÔ[ˆ2 6þô§?uù»ˆDzDɈs ^g*ÉÑ:Ç>ô.\¸à•J¥DF(u%ýŸÏŒk¾Þù%ý™=óÌ3ÞêÕ«ƒQ›ïï­<ÿ\zjä_&6¤Êæ­[·À£øóŸÿÜëïÞ%é±hÑ¢a€¥‘ìNÕt™ß|óMâb—?—”QÄgfoúZæa(ü5Ï?¦®ëÏ?Ä&ܲeKa 0ÕÐK$ì3¨^¼jýîwß}çj´Q˜ßÍüx>³|]óIܪß3gΜ@øk_ýz–ëÛÇy¬8Ÿ ¦žcõ÷ëׯ6H•r¿ 6È€DøóŸÿ\ôwù¢‘³fÍòæÏŸÿT‡‹¥‘ì^JJ™Ÿ}ö™w÷îÝšïwy©°8ÿ~½¿•Çôÿ(ןÙ!£ý¬Rø›rOæùϱ4ê¯ÑH?öJܼeË–Ñ °‚>ú¨Ûß½G$ÒeúôéÁ”긗:zñâEïÌ™3ÃK¦)xùx­žŸ™{éÿ£½®jþ7n®êŸAlóó/ê±vìØøÏ†žÍ›7÷ÀÛL€·üÝ;DÂ|À”ªÈ®t˜’ŒW¥€ÀCà™t~|fùÊÑt¥­[·z .Ìõý½Ñë4Ëslæ½Z¹AÓÑÿ™pÈýQÂ`« @QÀ ˜:uj`Œ3&•ŽIœ&@ „8â5’€ÀCà¥}~|fùËQQ?ø«È÷s7Ÿÿ===^G393 ÏÿýƒÄ  $ï2 Ì€[·ny§OŸ:hÕ&@Åg[q¡V×{m9VÔcļyó‚MF€>ëj# ‘ŽiÔ×Ó:fœÇçuû® šÙ~Íí—ð¯žãoK;ŸIKâÿÅ_DügEÿ ymF •»ÙÀ@Ñß}äo–FÊGêèÝ»w½/¿üÒ»té’÷èÑ£ÌÅóËóg–æ5åüÆÿ5kÖx'NLŤ´õX®=ÿŠÅb þ!3ú6mÚDÑ?ÀçM€÷ü]7‘°Ë €Ý©£ÿçÎó.\¸˜&‰!çÇ9es~å—è—ø¯ý¥¾K>ž¾ðôV­ZEÇ(;úýÏ ‡0@š° dÅ“ ÀÊ xûöíÀp¡¢>Õ›;ÖØ±cƒN¾6]špíÚµÈ×$^Ïâoò:« ˜pNYµOóúÃûÁH¯'yßÌê6ÄkûöíÁè?dÆ@¹? *d@f|üñÇ]þƒH&+dÄ”)S‚yÕËRÀ½z£}¯å"Ïž=µþvZ£Ö¤Çs~y8§4®‰ÑÎ/LóŸ>}zS÷ î£ÜÏ[;–2=º»»Yæ/[ýÏ¥gÓ¦Mý ÈùË_X cTpÉ’%-™.ÖÈ[ꨦÈPkz@bGúÎ)Éó«Ló×\껸·4`£Ç’è×È?â?s6oܸñ[ ×ce€LÑ 2ÚÛÛë˜ÄÕ©ÉK3Ëx©X ¦|ûí·ÆŠ!…ópN­¾¾hÑ¢@ôkO}êÌš5ËÛ½{7•þ³ç /þû`@ÞM€Ãþîm"‘­ 0oÞ¼`Z@“8E-KI¥Ó.e(+`¤¢T’'ýßS#Ùí_¾|y ü«—ñ3Ѥä~ž^¥ÿmÛ¶ÑÙÉž#¾ø?LÀç¯ý+Ë€ C…sCãî¨Dé1ŠdV¼” Œ€°VôSM¼fO„#ý .Lå¾ÐЍ¥¾Kºí’ð§ØŸômذåþ ÊP=VȘiÓ¦ÙItLí çUô›/Õ P*•¼›7o)†Hÿ'Ó ç$4;í×Üþ<›”6+íû¹RýŸ{î9oöìÙtl²gÀÿ› ˜Ë‚ih-T–̘7nx÷ïß÷/^ÌÛÒH&+ÎxÅq,-%¨å#µz„¦È!Nh¤Ó[—Ëúïs~C±ßM=§É“'Ïí©’š÷…(°ŒlºÏ?ùù§ØŸâ¿Ü¿02À8þú׿ýÝGþŒ§VÆHüËPq@RGYJªÖk×®]óΟ?LxðàÁS¿C%yÒÿãøÌ’ŽŸ©ç¤‘Ü0½_{“îW­ÜŸòxO#^2h%þìÈÿ3ôw›7lØP"€PƒO>ùDÊÀ0Àèìì FH¥@#ß+#@Û7ß|ã=|ø‡(·ÚÔÈòœBѯ4LÊdåÊý|ÅŠÞ¦M›è¼˜ÄÏúõëYî04öû»_ 3Pª©ŒêäsiÀfŽ%ñ/ 4xˆr[L,Ï©r¤_#¸Ô+¡¾K#ß+KDÂ_Kú‚1ðÅÿqÂÑL€^÷.‘0ƒ‰'©…Ê 0MÔ’:jö9Ê Ð4ÐÐ÷T’G”Ûdj$yN¶Š~ÛMJW⥠½­[·2ßß,úâ¿0@|úé§où»wˆ„h”A+¨.@¦V:AÔ°7"Ì Ð¾^Í*É#ÊM_³çÔêœ~LJîçÕóýuM1Z·nÝQ­™Êè%æ0gÎoêÔ©±t ¢t‚Eòf¶œ£–TÁ+W®_» ðåù55F;§I“& ~Ý?]½_¥u?'^ž·víÚ`£èóÅÿA˜N"@ë kJ©£¤ÚÆq,-'¨Ì™ÚÛ$ðHÿϯ©1Ú{B±¯½ LJîïqÄK£ý?ùÉO¼Y³fÑAü`€ó&ÀGþ®‹H˜ƒ¦(QëÃS€TÛ¸%àêÕ«!pãÆ c2éÿ˜bòäÉÁ(¿D¿¶p6LJîçqÅKóýwíÚÔä£ðÅÿfÂ60–€UŽU¡Ðã=^À4ûܹsAgW#\•ÿóªù}Ï:±÷ºp,Sâõ½Q5wîÜ`wîÜ Œm2ô}#é4^ÏâofqN._¯Kà‡#üZ%E@Ôøæá~eò=Æ„c5zl-ñ·qãF:Šë! `ž"`'NœèÀ0U VJ"©£¤Ú¦q¬Ð¸xñbPiÔú›IŽZ3Rîv¦R¯ÃÑ}mZ•ûUó¦ ñj,^ºîTå_xÁLñÿì³Ï ÀHÞ8#ÍI4ÌBS4b«)qˆZ:…¤ÚF5 ۷o!åöšÑ—±Y)øm¸_Q¯Äx‘òo4ýKÿ€ž ÐU(ÞÃ0TqÀ°èUÔS+F–$^á÷>6”! ½)Qn¦©Š} ýpZÿ˜”YÅkùòå¤ü,þýÏM#ÿ„0Rä³Ï>Ó4LCÑÈÅÌ™3›ê0Eé42ªD¼ýÝÐÐ~pp0Ø›^IžôÿdL ‰ûPìkÓ~þÿ’9– &Iší åß|ñïo=k×®Eü&T£"YêXkïâüvRmí— ™Ú4àòåË© dDy:¦†þŒ3ѯû‘¾¯wO2å~E½’|ÅKut”ò/ÿ˜V¢)ʘ2e ©£©¶6ÄKf€j(C@†€¾®¬)¤@&ý¿ùãkξæJkd__‡‚Ÿÿ?³L7DÿÈ߯Y³&Øñ€Пþy¯¿{—H˜‹:æª  %í0µÒi$Õ–TÛ¸S·e¨¶@8…@Ë`êgI dÒÿG~8‚/q/‘¦óóÿg¯é–çøèÙ¨QM›£9¸fÍš>˜­ ÇñãÇ'&ÒòÞÁlT\¯øâ%S ÌЦ¯õ³ëׯ{›–lV”ÇqNá×÷*ȧ4h¥îk¯ïÃQ}“ )þÿ¨—åûÅ‹{6l åñ€€ à6S§N :öÍtéD/Ûâ%S@õ”1 s@\ºt)x]?ÿî»ïj hDy\_^B^„éùá(¾DF÷¹ž0Ý\—®õ-[¶Pèñ€— P(0 G£|ª  }šjRm‰©©ÛaÆ€)PYw ²8¡öa¶AVéÿJ[–¯ü™}ø}¥˜¯üšÿ?þóeÁíܹ“Q ð?7Ä?`ØÂßþö·^L+Pj¯æ>’:Jª-ñjýXáÔƒ¸ÚŽÎge’p=aº¹/MS‘¿åË—óà·ƒƒ«W¯Fü&$j( ­­­éN5"–xÅ/âÃõD¼0Iâ:–Fý7oÞdÎâ¼ÇË*@ËæY¤‘ŠL¼L>&‰ýñ">éKiþ«V­bÔñ€&_|ñ&€E´··•.Y¯ÃˆÈ¨,âE¼¨/Áõ„é–þ±õ·Sü¯Zµ ñ˜6ÊÐJa6ókIµ%u›ë‰xa’dy_hôXõ_½zµ·lÙ2æˆ LˆBe6€"T[âåj¼0I¸ž¸žFõïêêbÔñ€€ Í¢le(#€ùÚ¤Ú/âÃõ„éfÚ9†£þK—.塸À0“'ObXH¸–x­µ“éDç+Õ6écE‰×ÿÄ+Ÿõ%´‚ £þöŠÿ•+W"þLfòäÉAF€2êuIµ%u›xa’˜dnq=¹s=ÉŒ–ðŸ;w.fÄ?&$I[[[  Q:Œy±ÌGf)7®'â…éß±”ê¯åýje¤âÀ\àB¡ÐA4ìcüøñ^GGÇSÙt¢IE&^Ìo'^Ô—ˆ;>ªE³~ýú íìÃÿ ýÝ!Ä?`äœS§Nuù»÷ü ÀBÂ"“&MBdºM¼¨/ÁõÄõ{»4ÒŽúƒµHü÷¬X±b€P`8€:hÓ¦MóÆG':B¼HÝæz"^˜$ž7gÎoݺuÞ„ xÐ"þ00À4T‰YišÊ  è©ÛÄ‹ùíyˆñ‰¿]üþ2ñ€à(_~ù%&€HükµM  ÍüvâE} ®'L·FWÙdÅb1Hù§ÈŸâùòåˆ €š&@GÙè"v£Î›²ª;q¤ÚÚ?™Ôm®'â…Iw»:;;I÷w‡²ø$˜9C9ehùÀ¼Š R·‰& õ%¸žFO÷ß´i“7cÆ ˜ˆ LLдÕд€B¡€ˆõ˜L¼ˆñÊ·é¦ì°+V)ÿ€øÀ€€Ó§O¿ëïz‰„( @&€F|Hµe)7R·™ßN¼òY_B¢åÊ•Ìów‹¾eË–$ ˜ðZ.PF@eçQ·ÚlR“‰WL®'·¯'Uõ_»v-óüÿP×xËß½C$Ü¢½½½éú¤Ú¯8ãE|ˆñJÎ$Ñü~¥û3ÏßIùâÿ(aÀˆ3gÎôú»w‰„{Œ?>0êÕ Õ–Ômâ…I’‡x¹ÝÛ•ê¿`ÁtnrpéÒ¥}„ I`Ùè ŽÝ}ñ¯Bê0êë< –(lF)‰Wœ& ×ñŠãz ü-Y²„‡›› –ÅÿqB€†  •ÞÃpÛ¨œ#Jªmþ2!HÝæz"^ö™$cÇŽ D¿ŠüékpVü÷øâ€P`¤iýݯ=– tÕ :& OR·‰óÛ‰ñ Òü׬Yƒðw‰þ¾ø/ €Ô)•JÊxÀmÆŒZ9 oòVD©ÉÄ‹ø¯$"á¿|ùr*ûçCü÷‹ÅAB€µÀ291ÔÁ 3òÒ!"BXÊ­v¼õ¶óz"^f áŸ+ú|áÏ2F™‡ýÝÛDÂ}45`Ò¤IÃi¦¤"“šL¼0I¸žÒ;Öüùóþùâˆ/þ M€ÞB¡À29A€²TmÚõyœ"„z,åÆõD¼š9#þùÃÿÜúâ¿H`ËÙ³gY! ghj€–¬¬ÀRnŒR/æ·¯xÞˈ. *ý/Y²„Jÿ֘ʠ8`ŽR·Õ%^f˜$\OvÆKÂÙ²eÿü!Ññ€`›   -ØM4òi¸:5 ®väE®'âíûyóæ!üóK¿¿ðÅ?•þ0ìäܹs¬×›l¡dhÓ×iv¢IE&^¶ “„úúZ5U|Ñç-^¼x¸À*äŽ>ÿó§Ò?€&€ ŠæØP6€ŒeºMª;ñ">\O¿Ö(¿Füþ¹ç  ô —LŠÂF€í¦–a)7RݹžˆW­ciš”Òü%þ!×Åþ|ñÏ| 'M€¢÷¸.ÅsŽFºd„#^¤"“ºM¼0Iòp=uttÂ_{È=ý|ñ_"ÎrþüyõzÞñ¨ Þã‚Êhkk³Rü´"BHuÏg&×S>ãöÓÈ?€OŸ¿Z´hÅþ0rc¼U6‚:aV@3³ìÜG!ŒâÖŽ£Þé]OÄ+ùs”Ø—ð÷Eóû¡ ÿ£„ &@·÷xJ¹0Œ²dhOê6©Û˜$Ô—°ízRzÿܹs™ßÕh´ÿ€/þû @žM€b¡P .<}“.gȈ#+ Iñ§¡ñáz²/^ºWÍš5Ë[ºt)iþ0þµ"ñ_"¹ç«¯¾¢.ÔD&€:ØÕ˦):HÝ&^i “ÄŽxMž<Ù[¸pa þIó‡Qèó·CþuÂ| ¨2d¼K$`4dÈ ¨U4ÔmRÝ1I¸ž’n—RüµQÍêpÐþ}„F74@SŠDj­fÄ-âjG^1ñáz²%^í_°`£ýÐ%;à‹ÿB€u¸páBGÙè&P÷f^( × kd)XZ!¤n/L³êK„sû%üe4@¿Ä¿Íò€€Ãþîm"¢l€pËR°D!Œê/âc^¼fΜÿ9sæpc…(ñ…ÿa€Í›ÝKB f@£Yq ˜Z"Ä•å×Huçzr)^“&M ¿Ä?•ü!"Á¾øï'к L ð…\7Ñ€VÌ€4Kœ¢–Ômâ…I’L¼$ô%ø;;;Iñ‡¦ð¯¥~” ˆŸ¯¿þú°Ç”håÆ_®WV@=ÁÒŠh£€›éü\OÙÇKóúg̘ŒöO›6#´Â‘ùóç& œ Ðí1%b6XÊTwê%¸¯PôkÓˆ?@‹)ÿ¾øï'¼ ñÿ®¿í'·!„`‰KìäEà/êKÄq¬PôKðkÇýí /þIùÀ€”€·|Áö‘€$Ìæ·»³”ñÉO¼é‡$ñ¯³C¾ð?J$0 #.^¼Øå=Îè"Bç¯iÁç±Hu'^˜$?~ßÞÞ~Íçg¤bÀßΛ7o€P`@ö&€¦( —h@š&óÛIu7Õ$q=>Z²oúôéà×× Òço‡|ñOÊ?f¨&€²(©ñÃ?4-j]i¤ºS/!‰c)µêÔ©è×^£þ #Á¯Qÿã„ å›o¾‘ø×*ÝDÒ",Ú‡[#‚ [ÿXÄ+¿&‰Fö+E?@ŠôûÛ¹sç2ꀖoy§dbToÍŠZR݉W^âÓÖÖÆ(?˜À!_øSè,4(F iõÌ–r#Õ=õ$ô;::‚ýĉ¹Y@–…þ|ñO¡? °Ü8\(Þ&`¡ Pi bÓ5¨Ý9N™2ex#­ º/ñ…ÿa"€Žðí·ß* @µŠDL5BSÑ__à¦Ù.âÓܱ”Ò¯QýJÑ`%;0gÎFý0ÀA@• ðÑ“ Í€pË“ˆeé;{ëŒ7.ùý“'O&¥LGóüøâŸBà¸Ðí=® P$`‹! õý÷ß“%Aàb’ÄÛ®ê×$òµM˜0!û2, äo}áßO(0 '\ºt‰l°–pÚ@hhG-S1Kf_/!ú¡Ø×ÀB‚QÿÎÎNFý0 §F@·G68b „f@õôRÝ©—Ðè±4oüøñÃb?Ü,§äo}áßO(0€lp–Êi=ÎpA×¹L ¨ {‰}¥îOš4)ؓƨ?`ÀˆF@·¿{ÇߺˆäŲ̃4l¨¨_KàæEä7ŸPÜ?óÌ3Á×á(?€ã¨²ÿ!FýjrùòåÃÞ㌀\a¶@e}}o¢ nÅpIôW { } ~}­Ÿä#³gÏ>L5” l€n¢ð˜‘2ª§d!ˆ£˜¦6¬õý˜1c†GìÃ¥õ½„? Óïo‡|ñ?@(š1T@ÙD >> ö¡9 ý Çýÿ­ƒ¾ø§È`@|\¹r¥ÛcÉ@ã¸ÿ~ä÷Ô›FPFë©`%;8kÖ¬~B”  ©á´HŸ#þvÔÿŒú¤b½ÇÙÝD ú½Ç£þ%B:W¯^íõ¯@‘@€dÐHÿ¡™3gö h–1„Z¥ÜYêoTˆ=_—"þ UÈ€X¹zõj—÷8 ›h´D¿÷xÔ€P˜lh¹Àw …B‘h4ÎÐÐP©,ü À+¸víZ¸ZÀ?zÔ¨‡æùÿÒߎΘ1ƒêþ€VEïñ’½D`Dúüíˆ/üK„0À# »lt €€þ²ðï'€ÎqýúõÞ²P$SJþÓ§Oï#€®›Ô€<2<ÏßÿÌó È e{‰8NŸ¿BøäÝ(–€ýDãxYø—`”ìö(nÐïoG:::ú `Ô6Þõ(öQò·ƒÀˆfôz¬öø÷ ÀhÁ( `¤ðBø@\ܸqƒ¥À$†—ô›6m•ý#þ€ðÀ¨ÏÍ›71 á?uêT„?``Â#þ‰™½þîíB¡P$P‹¡¡¡’¿;â‹þ>¢–rëÖ­Àð7Œ¨&þS¦LAø€CFÀ~ïñÔ€n¢{úýí—¾ð?N(À]# »lì'¹ãxYø÷ ÀÈP, šÐK4œ§ohhH©þ%B9å»ï¾cå7®è?yòd*ú _ô €<˜L€`´` „ÙÚï-]$2¥òö~Yè—|¡O‘>ÀHÑè®0d „Í Q?Xú¥²Ðï',€`®1  £P(È Xâý˜=ÐAtrÏ`YèKàŸ’ÀdD0ã‡~€îòö–÷ÝDÇúËû÷+¾3f "0`Ø è®2TŒP†AÑ£î€ ”Ê›Fò?®ü¾Àï'<I˜•5–TL7ˆF˜–ïU ûPì#î0Ìfhh¨è=™9Ð]õ+{«¾·µaX@¯’÷«¾¯ñ¥B¡Pâ À€ F0F£Ñß«¦TÞêþÂÀþ_€ ý9™ 5IEND®B`‚SuperCollider-3.6.3-Source-linux~repack/icons/sc_ide_24.png0000664000175000017500000000210712106676016021727 0ustar dandan‰PNG  IHDRàw=øtEXtSoftwareAdobe ImageReadyqÉe<éIDATxÚÄ•ÉJcQ†+qÐ8·óu5u¡ ЏÍ®ßÂWÈ+¸ì]ïz©¾AãNÅá*8ÇyÖ®¯È Bw‹.š¾p8É9çþÿ_U+òß{›ééé×××Q#:] &¶b>ŸÏÕ1¥còáá!þi‚@ yyyã'ÿóóóåùùYtÍæûû{ïhÜï÷Çãñȇjjjœ§§§ Ô–””HUU•ËÍÍ\__Ûð~_^^Êãã£(E•ššÞÞÞvÿJÐÒÒ⨺(ª»ºº¤¾¾Þ€JKK%33Sòòò tuuUÈfȈ*''Ç¢III -//'IRßdee¡<Ðßß/ÕÕÕBííí¢þËÅÅ…œŸŸ‘æ†H¥±±QfffÄu]#R!Ø FÈÃLñ~ôõõEÒÒÒ¾Jkk«©ïééM¢E€U644ØoHö÷÷%77×¢<;;3!EEE_ÇñmmmýL Ô¿ š944$ÒÙÙiþ ooo „$gddH]]¬¯¯Û$§§§RPP€•Aµû›ZxçOX3ªJÌw,èèèM´%—dssÓTÞÝÝYE!BË“ÈM€*7R¬ Ìd4A#Ì¨Ö Q«ì ª¢Ñ¨%"ÖÉ öÈ<==-MMMI»8Ǭ˜ß@œÊÊJS:ÔËáá¡YÀKråååf—ÚjöˆZA†Áž)þDAÊŒ½Ã,--ÉÉɉhÂŒ”j9::2PÀØã=šŽ}"ƒ50“Ê"ì¼ ~Àà?j{{{% ZnXóö9ËÞ%ÂììlϦd1€Ä¡†0ùO$$‘‡>ØÝݵ*"ÀÍJ8ÏHD{«d“rôüˆ‡5d¨;88°¼p""@%M¤ô‹Fã¾%àV¥h*®j~~ÞªfeeEöööäêêʹ2ˆjmm͈õ¢3AeeeVØ£SI‹Tù¤†'$ •^ÙR÷”$ÑA€z×ÈÜÜœE„•DÒÜÜlg¸ZÀ3I‡ã :”*÷^ XT^·"‚\hö±‘Æän …BfX`þv›ÎÎÎF5ô`mm­E±³³c] ©wÙ½§É¸ÑÝݘΡ?Þ¦ VeQ­ŽÓPøÍ5Aõ0“D.;º`rÀ¹¶¶6ÀãÚ áw?8Ž‚L XA#ýéƒ9VR=(×J ëõá~è“© Œ(ø˜Ù'ÓëTlax”P=®_½È§?úª«F•ˆ‹ËÑÙÚ_i"Wç)%° ”ÿõü`à||v ™Õ¬IEND®B`‚SuperCollider-3.6.3-Source-linux~repack/icons/sc_ide_512.png0000664000175000017500000010625312106676016022020 0ustar dandan‰PNG  IHDRôxÔútEXtSoftwareAdobe ImageReadyqÉe<ŒMIDATxÚì½i´å™ß»j3˜á4G#BâHLbfƸ‘ÛqÇIwÇÒʰú&+i³òáº?>Ýä“áSîýË+k¥ogXÆùÜNºcán;nƒAbŽ„Ð„„`@€[¿òyOJ¥Ú{×ðÏ[õ2©Ü{_|ñÅõ%oC¹Û’,H˜HƾkòñÎI°0‘Œ]ƒŠŠ•DInýõe?ÒÒŸ=‘»2Çã @×»BEE€ŠJkä‚ .Ë(úë3UΗ“LÂ.óøóÏ?Wæ@EE€ŠŠhEo¬÷Íɶdò±*z{À€íP²íàq &ô²¨¨(PQñ.^xáæŒU¿¹'Çߟ)[ðÙgŸíÐK¢¢¢@EŶ²™Tòwg¬|y²c’)x–Ç (P–@EE€ŠJy™>}zVáK_%>Ù9 R@ð›ßüFŠŠ•ó”>Šþ1Uø?NÀÀ½* TT:(¿ó;¿3šì¶LZù[ôŠtRž >ýôÓq½* TTZ*_úҗƾøâ‹o«•¯Ò˜6mÚ?ùäM=TQ ¢Ò¥ŸµòGõЍ”ñIvàÙ <£—CE€ŠJ$rÑE¡ì›Tú#zETÈÄ$øñǬ`@E€ŠŠ@¥¥ÿmµôU<0?LÀ€º T¨¨„’‹/¾E¿uRñ«ÒWñ žœ={v\/‡Š?Šß(ýÍz5TÈXl×K¡¢@EŲ\rÉ%PüÒS¿¾Š\1ñOôÑGê"PQ ¢ÒPñoTüš¶§“ìœÊ ¨(PQ)+—^zéè¤Òߪ־J X@ÀÓ~øá¸^**òå/yó_|ah~•¶É3Ó¦M{úƒ>Ø¡—BE€ŠÊoÿÖžÒü*Ý‘Ô=íz)T¨tN.»ì2¨ýïL–æÕ+¢ÒA§ôp²ê׿þµv*TQ Ò Å?iñ«_Eå·qO+PQ ÒJ¹üò˱ò¿×Ó4>•A@€4Â'ßÿýq½* TÚ¢ø·êÕPQ)-Û¨(P‰R®¸â Uü**–€À{ï½§@@E€ŠxÅo|üßÓ«¡¢bMžL¶§  1* TdÉ•W^©Á}**ne*XðÝwßU  ¢@E„òߚ쾯Š_EÅx<ÛõR¨(P "###[&ÿ¨^ ï2˜˜˜xF/…Š/2cÆŒ±/¾øÅ¿Y¯†ŠJpÙ1mÚ´ÇÏœ9£U¨8Sü#“ÿV½**âd;Œ@4>@E€Š=¹êª«Ld¿úùUTä ÊÿÉwÞyç)½* Tš*þÍ“V¿6êQQ‰Gp<žz)T¨T’«¯¾Zé~•øe;@àôéÓêPQ RJùoíiZŸX¹è¢‹z_úÒ—ÒÇ—^ziï /LñÅ”^N÷æ¹øâ‹Ó÷䟴?{ölïóÏ?Ÿzùì³ÏÒç|üñÇésæ1ïW)“ `»^ *…2sæÌÑd÷ƒžF÷“éÓ§§JÝìQÜì”{?…]E¹Ûg•~ÕÏD ù½J0Ù‘lÛN:5®—BE€JVù?ÑÓ*~Þ«üË_þrºaѳ]qÅ¥”® eßo_”Ÿ|òIºýæ7¿é}úé§é¦ìW6àé<¡—BE@ÇeÖ¬Yc“V¿ù9’‘‘‘)eâ7оŒÒõ©ì«€Ûã0ÀfÀŠ3!HpÛÛo¿­µ¨tQfÏžýD²øjÓË–= ÿ²Ë.›Rüu•neïj­_[ÊÔæxB‚aã2±CP[vÀ$@@ë(PiƒÌ;—®}?P«¿œ\rÉ%©ÂGñÏš5Ë›³•Šçb\ÒÆSf\l °åß«2 Øvüøqí2¨@%råOAŸïè•®ôçÌ™Ó[°`ÁÀ|ûÖo¥ëc\u@€„ëdâÔUPZžJ@Àãz¨D&óæÍÓô¾J¿Ÿ%éKÙ‡LÅk:ž˜ÆebÊ ”4]ðرcš.¨@%念§¥| åw~çwz .L·~–¾-åe[!¶u<¡ÇeÀ@¾ô±Ê”¤¥„°]/…¡2þ|màÓGæÎ›*},þaЧ‰rëB*^›¯Œ›º ðøÑ£G5@P€Š$Y°`Áh²€inF¨¡¿lÙ²TñcùÇžò&q\U”­´q {ÍeΑӦMûú[o½5®—B€Š å¯QþY¼xqoÑ¢Et5éwo[*ž«ë$e\ (˜’4K š% @%¤$Öí½ßöé´Їâgãq[ýîZ*8츔8GžYÅBYt5åÍÖ¸)Û6«èûlX€Ç:¤Á Tj*Á‘d!ùI¯CÁ~FñùË_Ö¸Z*¸5ã‚ è  hÐ=ããã ¨TT„jæCûÝ›nº©ê¯³h·¹$¯Ôqéu*>¦OŸÞ% 6J@€6R RF–.]ŠÒÇòo}¤ÿÈÈHoll¬7kÖ¬¡ ge¡¥‚ãò»Çr`^xa–4€{<¨ @€Ê忹×4?(þuëÖ¥”Jàj*žÆMÔ9€>LÓ°CWy*²lÙ²­½¤ù¡øW­Z5Õ §ì‚ZÅšôaÕ٠ţ×)¾qÁtl;pàÀv]íeÈ…z TùûºòmÞ¼™æESÔ§Yð-|ù×òŸé·t®ªû(Ú¹lŒ«îut®6^'‰ã¢ÙÐo~ó›©`ÁË–3f:s挺”PA–/_ÞjåÝ¿qãÆ¸JåÒ”7›p1®ã\|ñÅmÛÞxã e”è¼ò'Çÿ_µõ÷]wÝu½M›6õ®ºê*‘˜ ë·ŸnÛb iõÚ× ë$u\!î+€À'Ÿ|2Å´Ô-°%YFΜ9óª”褬X±«kÛœ9sR«ÆŒH1k2©ãÒë~\Ú[·8[`ûþýû·©6P@• äK_úRoÆ ½›o¾9]¸\Yse­*_Vf]«Sò¸\X¿m¼N.ÇøôÓO{Ÿþy(ØB6`쪫®}çw~¬ZA€NÈÊ•+[©ü±úo½õÖÔçïËz*²Ü4åMã&lŽKÊÿ‡òT“-ÐF&`ß¾}Ê( Ê?V«_?¥XOR¢àõ\òã¤Æ—äÏAl-L»úê«• P ½²jÕªÖ)ÿ¹sç¦Vÿe—]Ö¹îsýÎUg<6ÇKÓóÎ7oÞ¼Rß{ìØ±óÞsêÔ©Tùh©`ãBù3çp ´ Ø»w¯2 Ú%×\sMë”ÿúõë{×_½“EPSÞÎß“Ia”;{ÂsùÂJùïȽ z½èØì§OŸN³ÿøã{¿þõ¯{ï¿ÿ~ú8±âJÿFשK)‹]tQêhYÊàö={ö(PÐåOªßwÚò{P:÷Üsµ[ j?ÅÓxŒ‚GÙ_~ùåS{ð _¥ž— Ð``€Çì E,B‘²ÕRÁåï+XânZÆ<•€€ÇU{(ˆZV¯^Õßš"?Ë—/O»ö¡¨4•«Y©Ù¬¢‡ž7–}«<ÿzϸ ù½aŽ?žî @"c.a 0™7-‘m¯¿þúvÕ" TùŠPUÙ¶¹ûܰse¯ EŸWö®¬rô¿ æÀ€‚'NLmÒþ?)qÃÆÅ= lQ€ ‚ñɵ×^Ûå•zûí·§”Ùűë©\,ÄóçÏO7£ð¥Xå.”¸í1Μ9Ó{óÍ7ÓÇ6ÿǶ—z&àÊ+¯l“K`ÛîÝ»(ˆCÖ¬Y³9™Œ?iÃoY±bEZÔÇ仢Hm/¨!Æ…’_ºtiªðQü®l]Њþoò}'Ožœß÷U¿ÿHò}NÜÈ¥—^ÚE5mÚ=¯½öÚÕ. ¤+ÿ±d‡ò‰ý·ÜqÇ)ÐT®þûÑÑÑtCᛈ|‰AyÃr(ú¿Î÷3 8räHºù¸¯l€Ê㢩ÐW\Ñ—ÀD²´‹ ™²víÚ±IË?jå"»÷Þ{Sê_S¹Î÷±¥¥?ÈïÛJnª¥ÐÿU¾¬‚·Þzk pì꾪$Žà h‰K`&àÕW_U @œò™´üÇbþ(ý‡~¸/ås Ü&ß¿æškÒ½dKÞµB–>ƃ¦€€­k¥‚ËÄÀD.(@À„j"dݺu­PþÐýwÞyg'R¦Êì¡õW­Z•*ý¼¥/Ù’·=>IôÙkh˜}ûöõ&&&¢/±5.ÜÆU;xå•W4í`AfÏžýo’ÝC1ÿ?í{ST豎»sØ $–þý÷ßß»îºëÒÀ¾|+Ö~V—¯ã¼øþ>‰cÌcñŽŒŒô–-[Ö[²dIúÜÙ³gÓÎz]îÉ@Êåo~ó›ØëÌe;yò¤ö P ¬$J"ê*X¶øûñgÇTBÕv*Ö> ?Kñ·Í’·=¾Ù£Gööïßß{ûí·;Q*¸ß¹pñÍš5+öÂO½üòËZ-P€`Êk²ûW±ŽŸ‚!>ø`ÚÆ×–•’¿+‹§îg³Ç€Ÿ5kÖôî»ï¾Tùc1¶Ù’·=> ¿¡ê÷CÃV€rÅtדzŸ»¿F„^y†+"Ù”¬]‡Nž<©AÊø•õë×oîýÖï¥@m?òÈ#•ƒýÚ2…@áãßôû»bÉÛ_ll±°»wïî}øá‡Qǽԙ00€áˆåž—^zi‡j%¾”ÿh²{±iºÖÏÝwßÝHùǘ25sæL6SÅoKu•þ¯ú}1\Ãǧî²÷U ­„1ŒU>é%© ¸!ãª8•믿>ꈔß]wÝÕŠªeßK|à 7ÜpNu>‰ÕîÚbhP4ìöìÙSBÜç¾æ¬`ÄifÀ®]»43 ‚h @E™;wîŸ%»Í1Žë—ê~)òó­<yzˆX°`AÚ¶øÆoLã¤ùØÛ3à"› Ä5¤|î¢E‹RÆ·ÀG}Têž´«rþñ[ÙGZ+€Ì€Õ'NœøsÕRÊ8‘±±±'’Ý÷b;”?Ö[KòYüù̆X«ÝÅÂ4ÄР¨Î5<}útÊœ:uªï=Úä>w9ëŒ ð©<¹sçÎ'T[)°*6lØ’ì~Ôå/­E¯q@aÞzë­©âMww4Øü>‰×p¨ªl¥·È©|ýÅ_|FµÖpQ@9å?šìþ[²EÇmÞ¼y*è-5Ùï}6ÆÃzÅO1#ÇH·þ¯ó{¥]CŠçàÀEðî»ï¦uªÞçRç_þ=dGðû" |(1þüøñã  @3Ù¸qc´A(ÿ•+WŠ $mP¤ùq‘ºD\›Éhˆîn Óàëû$]CúìÝ»7­.èò>9ÿ`fÏžãҾ𠔨/ ’Œ²Ì¯±üc-É;l\ü6š-\¸ðœB&±•Õí:ÓPõû$]C G-^¼8-ªC¿Ûs§ +fkþ™ÒÁ2i¹àcÇŽi¹`eêÉ 7ܰ5Ùý ¶q?úè£iÊ›O ÃWj ~þM›6MøI)vÓK>Öëú¾÷Þ{i1!â†ÝçRçß sLlMd²íW¿úÕvÕfÊTUþPþ¤üEå÷Çò§ž}ñ»¶ðm”*ôYèþ[n¹% h„–TK^™ ×ßYåüÜŸ€nâÞyçÞçŸÝüt®ˆc6'ÿË_;vì¸jµóeº^‚¾“Ë?ªJ†ö/ZȘĦêW•}¿Â繨\Hñ"Ó’×–ÒQÐЮë!áð™¿þúëi;â¦s¦h˰ˆé‰ŒL²¸T«)PJn¼ñF:üm‰i̼¡í ´/¥UiÙsÑÅO›büü!¬@þûz„¸†Ô×\uÕU½3gΜ—-jÖ]²Ÿ31‘U œ›³‘£Gþ…j7妛nÚ’ÜðOqÓDz}å+_9Où—ì6™:çö>"ûù],¢Ò|µäã¾¾~îÜÆz–’"Xe]ȿ׀zDëä¦ ìJ@Àëªå2ÿ©^‚ÿ-7ß|3tÑÁ^DÔ?´?ÊßW žÙ»JM‚æ§=oQ_“/-þ£Å†Ý.ƒ!‰ xíµ×Ҳ’ç_•ýW\[` ©KùË_jj a«ôœ#?ŠIùSã~õêÕ¢,‹&ç"xñ[ßúÖ9%|CZJÿ·ûzø8§yn{‰‘ÞÛ!SmÎeŠ!áâˆHFz‘VsU€c¹å–[¾“ÜØ ¥…â¿ýöÛK/U'»¯ÅÁêç·ÜtÓMrú}DŽ+ýßîëáò7@}üç&S T€­uá׿þuZ„ wG$kçèÂ… ß}ë­·~¡ZO€Qþ£½ˆRþ ü ú«º@ [\/6E{òúyä‘sê÷ûT@>”˜‚†öÇ T9¦”0A‚|ðAïìÙ³ÁÙº¦ëÂû￟v¼è¢‹bYò7% àÏÐyW€¦þö&ކúGaÒÒ7æ´>³_³fMšÛ/MáuQ)«;¤9(¨2Fæõ×_ßO·Øçò±cÇR&/’VÂÆÐùÔÀÎ3›6mz"Ù}+†±BnÙ²e iK(É[gÏøa0Ö®]+Vᕵä»}=lœƒrÂlTäZ*؈Ét¸òÊ+Ïqã –¹ .œväÈ‘6~»üão½õVªý½ÃXQš¿û»¿›‚€%AëîÍcÒúî½÷Þ´¢XŒÍn4ú_³!†}_ÏV·sçÎÔ§îrþ¹^`æ þ×ÿú_;»ª»îˆ¦Îÿc=6¥ümÐvù÷û W¬X‘º/Ê,E¢¥MxÖº­ô}²0ø‹le‡Î=þôÓO{ûöí;,ÅR*˜=± +W®L™ÀdÛßüÍßlWÐ^åE­”>é~ùˆ—Ô_“Éžnùòå)sÑ%ÿî°ïâãÿ„ÁâweKWúƒ¾Ó¸ öïߟ¦Åµþ¯ú}Ùço¿ý¶s¥ïb]àÒ¦<WÀÒt¦@P§\Ó¦Mû~ ÔÿwÞÙ›5k–µ>àeh»²ß1ŒF¤¸ ›æÈ÷R¥OÅ7”>‹à %`[™JWúEßûƒ2×°‡NÁÀ  ô´ÜO¦hP:ßǺ0è\&3`ñâÅ1¸ÐÛº¢;S(Qª›“ÝSÒljòܸqã9“¨Î¾ßQæ3u‹¬Hu?©JÙÇ1‹4~oXE‹MEëû° ëº B*ý~ç…2c9r-aMè¤÷ᇊz¾ÎϽ; Š©T0à? `lÉ’%Ï&às\€öYÿ¢Šëß,1•½í¶ÛÒ…º‹Õîðs¢¬°öóŽÚ¤ôm°ub¸¦×^{mºá€`£/}[ï©~dž|ã7¢*ÌþèÑ£i`h ]щÚ`îºë®ï$»­’Dzÿ½ßû½Ze~mZUÏ ªøá‡{ ,M¥º8?w°ò±R æË<†¶ ¥(}Û1 ¸R¸×®»îºHh‚ÛÆ&õ”(®ÀyŸ´u¡è\¦˜c§3¢`™»dÉ’w:ÔúŽ­¼ûü£#Þ²e˼û°Q…÷À¤ºm%aû} ¿%”l–ªôCÄøf:/¼ðB3`ªÆÚäF™îÞ½»°V@ÈuaØ9(h•(Xéª# |öÙg[Øz`éÒ¥ÿ&A£›$÷¨Æï?66f uÛhö‘^P~FùÇnÉ—ù>˜™9sæ¤n0hÉ´y¥/%+ ì˜¹ 0£Z&ÿ >òÏ>ûLü=Õô|pÒIù½e ùXÊœƒXþ3ÁëòÅÉ6w||üÇ "•Í›7£UÿoÉcÄïõRÙW=W‘òo+ýÏo…æ§¶9AXÙk mÞF¥_ôØêOà hÅh¶ÐÿE W‹@€ƒ"¿‡µ1@Z°Œ%óþÇ 8® NëÿÏ’nT*ÊĪüêW¿š"á&hÜÕ¤î§üï¿ÿþF–¿tÐ`¢Ð‰æGñgƒ–bT¦RÇérÌÜŸd¤Ú𕛀ÁXÙ¨2L€6Ö…AkL“u*;þ÷ß? œ•ÌÎ&ÛêüP@drÏ=÷lIvß•J£øÛªô¥§Ú` °2YF ”wù}¦ d¶b K ¿ìëƒÞcbi‚e41$w% àuI¢Xÿ[r£HE–(J冦óËžÅxß}÷ lî3ý9oÞ¼)‹?F Ú‡Ò5¦ @IZÜUbbº‡ € l­ MÏ…+€1Æ f6ø Ë_"h ¸‹?Á‚¶©ŒÛÓ`@Á‚Jë¶å΂ܧN`W±P‚SG–.]z(;Û¦+[—xï½÷ŠOûÃïO§?)76R6mÚ4•¢Ø¦ÞîP5*i{Ý}éJßGLÖçOúÓÞ±cÇ¢½‡û¸‡C‡yI¶±NÂ…— NÓÿê¯þªUi­cE…ßÿ!ÁãëÝrË-•rH$ë­·žSŸ +hØøšb±¡ªZ6 Y•~·b~¸pœxðàe„Ê}÷Ý'Úúçæþö·¿=eq–AÌeе+–€žÐ¥±ZAE¯£ô³éG]j¶£J¿ÿy |å•WÒ‚BÒïá*ã3­–]³‡6Ö)ÖER8§¦,À_þå_¶†h ÝúÿÊW¾’RξSnê°XýºúÙb(!‹Õ´_.—šíH³O¥Ÿ=6ñÄ‚ÀP¬FÚ=\çØ”K¦Kö°î9³B\iŒ”Õ–Ì8p 5,@k€ûï¿tÒú)”Ž¥Ö]ô=aÛŽ C¦Dm°‚,¢o¿ºÚlGcŠÃ¼øâ‹­‰{¡y1®YÄ2LÀ°sÐô w€`Yú?þÇÿW@¬X±âû ª“Zðç±Ç;Ç¿u:'ô8Ê ƒÄõx‘®Ív4¦¡ÊwÂÀåÙ€lX“9†B{/½T0-Ÿ S*tIU+J·<ðÀXÿÛ¥ŽïÆoL)uÉå}|p÷Þ{oJ——Yl$ÓÿXý,"U|ý.-hIJ_cÊ=&nõêÕ)…ˆþÏ3ÇÉz15$§~úé§S E¨Œ-_¾ü‡ ˆ> @²õÏ™´?Uúê¢ñ²Ÿ¡Ê_vÒU]Ü$XADøc½ñ;´î~·cl][\bÜS¤Õá§Žµb î0@ÍÄÄ„Seßd2 @mê(   ¯<øàƒ¢­ÿG}tJ©úJ¹©3¹IMÄbnº8…´‚xb¡¨Òט›×71¢pM¬™lü_%Ä뜋`@Ò2RY€ÄðŒžˆ¬\¹R¬õOëXè©T›Š­[·ÎÙbäà "È¿ª /6kTâ˜m*}É1 XÐÉ¢Ÿ>Î |«ãâƒf'3@r©`b/^—^z©X`ÿþýQ³Q€‡zˆ|Úý^,ml }ík_› ü“–r“UœwÝu— ÅÅw˜°,Ò”~šíHPú¾ÇÌýF°ì‘#G¦Úø¶ä› ¿4ã„1Ο?_ª Máÿ“€€³ ÂXÿßMn–‡$¢C,€¦“¨.ÅVæ\ý=ðÀ…r.'Û ãg16”¿ke*É•Öl'$ÓbÌÄö€Ku ôþÐüî»ïÖîh3n©p0Y ¦~‡°íâdû8;x–GyëÿÏ$Zÿøü±þ]#æüû«ž Ë?ߊÓ÷âTwA#˜É”òÕf;ÓbÌPéd÷ D³u’éÿsÿdî˜rÁ’KS&˜¹N@ @[µjÕÿ³oß¾(Y€h€dë«j]r›ßµkצ­o¥,FUL@ lѵPŤ1 >ÇŒcOžèÿì1.Jîð·K]¯'Ù¤öJd’!~œ€(Y€é½H%¹ðß–8. Ïê??á¸aLn}ѹªžM¯Y³FôâÔï=(~‚‚TéûWúZÞ¸ÿã;î¸#íhGwÁèÿìñìÙ³S7F¾\°uªHé×9׉'ÒXë#LÐEO(àI¾úÕ¯nMv[%Ž ë?›Kï1—}ò£Ò~sé‹SVöË*µF5¦AÚ˜¹?QP4ßÁb Ũՙ—¤Ðâ ¨`{*z/ %PFV­Zuhß¾};•ðcýÿ‰ÄqAd&UÄì ußtÓMédVÃ[ÒâĸMQ2ãÖf;q+ý˜Ë›öÂÿõ¿þ×´‚ T†-ÌÜ‚¼¸\¯ú1˜eÎ@!ÞBh³ tÒveË£>º9Ù}WâØ¶lْٲìmûÕètfÚûú¦ë›f>à µFŸ‹ÿŸk™õ_rl¶ì±)ēҗTÞ˜U\tÊØž—°ƒ€6©¥‚\[2wÕªUÏîÝ»w\€ZÿøÔIU)ë»·P&€E‰ö¾!-ùªÇŒkªŸå¯Öh9EŸ]DË<Î>gj³›@,€©Y<.káv±¼1AÀ=ôPe& ô¼$€€@\lÆ4‰[2Bu@ú2u ›v(àH¾öµ¯ö~[øGâØÎéö 1÷{ß­·Þê<åÏæâĸYDó©?]·FQÀg-ôAÊ{Ð=T( ‰ /L7XîqÀ$n$b]ˆÉ€õ2µLa-oüÛTU\‚È„dØòÇÜüŸ’K“(”X}Í5×üpï޽єŽ ¬^½ú{ÉM°IZ*)u&ª^J­¬P¾”r¿hƲ–Vùw9GEò0[Qÿ÷Aÿ}•æ-ýžÏ†åÁÀáŸ@'›B.Y°ÒôÚÆVÞØ¸†IóÒ0nRKsOR0h$¦ïÙ³ç/8]ý¿=a…Xøyä‘t/¥ÍoöœXhþ™jÒéSõ+kùwIé³A¹³È±7´{þ5UêEÏ—ùŽ2ì÷šY Mæn bl^ç:ŠÝ7‹d˜×16ç%ëYQÓ£¬fÑžº &àZšš€­À²<öØc[“?þ[ÒÐÞúõë{«V­²Þš·é¹ŒlÚ´©0wV"ýŸUþ]ÈQ7Ç(xÓœg¾ål‹¼ŒR÷ÍÀÀ Àp/¢\Š~g›+ˆŠ˜©ó’ÿ‘ÿ ºÝ¥²¯ê20@X d.^½zõ¡D‘M Ô࿱±±snb[i}6εxñâ4}®nÊŸÏʼn1ãS.*íÛÆuö&âÚPäfɾ'»öM†9È.–ƒÞ?€åÇšS¿÷µhL(6\<€Jè² ±*ýüûøÍ?üpãÀ@_óæàf@@Ó å²©eÏ5>>ž¶ÿ(ѤFÁlÙ²-û„´qá÷¿öÚkÅÑc>Xÿ ^¥ÒŒYÅa”›•>‚¥O”5‹ªñ‡öçÛ¢þ«Ž¦ ÊýšÏ,ðý?¹PúùÇ®b\˜ èö<À³½^Õ9×ñ ¬8wõêÕ?~ýõ×+° ‰’ý¿’?}Lýÿè£Nåý×®&̇dšÑVF>Ï¿mÍvPú,¤T3Ë.üU”zlÔ b$^€ÍÔ¦okq&Ö \]ÄHž—YˆÿÃåzU÷œÌ©E‹‰ì€+° SDÿaýç#ÿ‡ÝÄ®sþ5*z­[·.ˆÅPõØDŒÇLíö{ÌÆEñCõK¶È% X Ø îaØ+Sž%iCÕ@~#–ëáÇEÎˬà²1µ|Ä-UY?³Âd4âƒÅ€ßû½ßügòþ]¢ÛºÀáæ›oNÇ&½/9V–AiK³?¾mCiÇf‘‡(ã0¨‰•hKËfØî ÛH¤ÿ³Ç¸kc®èü2-αÄ;IcÃõÐîÝ»EŠÉEü>hJÒ˜H?Ù°aƒÈr™ô#`2„²Ê£ü 2jS³©SgΜIÜÚ`‘ÛUΓ«† |¥ïêÞ"àwÞIÁ¢dwÌ 1,>XÍ*ç‚€MM&# ø¡€šòo|c4ùƒŸ’fýëøWõ6™<&m‡œÿ¦®AãÃçk[é‡LÄâg!'•oPô}›©—cÍ2("®w¬J?ÿ˜6·G²°%ÑÿyW׽迷©ì묟®£0]1ºfÍš& @le@Ñ ¹x[“ÝC’Æ„%rûí·×.ué1“‘@ãœBÙÅÉô%è§bk¶ƒÂ?}útJCfÓù$[ä¡F“±b‰Ü G™>1³H€”×o¼1UJYýŸ?6n­¥‚ûÝG¸ˆèc`≠n€_(¨!k×®ý³äÏ‘„êPþÜh>èü*ç‚N߸qcP‹¡Ì1>ÿ,Ckʪ«ŸE»mÁxÒÇÊBOC|Ó¸]úÅÄÂ"ñ{0.öïß/2À×;›¡á»Tð Ïp°6 cV¿öÚkO+¨(ßüæ7Iûû®¤?Ó”ý•vã#DýcI®1Î"7¨Ê_]eì»õ+–ç±cÇRë¿ëyh7…q sa(ôX[6›|öãÇ‹£ÿ³×-Û'À§¡3h “‚+TÞI Ù' @dM± ¹hÿg²Û$iLø× t]ê²ê¤a4)‰Ré¬þ~ô\,­_ñ=Ÿ8q"µü‡ùùc Æ‹ÝM[€9@ÿM¶ùt¥Ÿmîܹ)«DêhS¥ï 4 `y——„RÁŒ­_ý“€r6"‰-œü±[¤)«dÍÍW§Ôe¿¿n©à•+WŠo1šWþ±µ~źÄ23¹ü.KðVy¾å‚«\‹ìk¤ÕQkß¾}SQõRY¤AïÃÍÀµ!iga‰}iRÚÜE©`˜¹åË—KSè²Ç•()¿ÿû¿ÏûcIc⦺îºëDµù5Ö?À—%_çåkë×·ß~;ÍÕ.jk«yÏËXË^?\LøÙ£D¥±Heƒ3›£¡=XÓ­RB ”Ù3&Ó$HàØõꫯ¾® @9ëÿ1ic2yÿuQn]Ô; 1åÊ"¶X°Pd­=×JߦeÇbòÖ[o¥þå&VnW-ò:cµuýðSn÷•W^9'V#$‹Tøbè4ºk×®¡çô æ³Ç¸\ÈðÑ­Ê9I©¤¾‚0A§=#mPôdŠ(úº‹zÓMQnÙ×Ë"cRþ°¤Òÿ&mË,Öu¶üyË¼ßÆ¹(8C­v“ן?¿)O;ì{‡§ÌóÙR¸ùçÊœ§ÊX›Œ©ßû‹ÆÚôú•+ êÆoL@Ýû¡Ê}Wt®²Ÿ/ÚÆŸ]ˆû˜çøÛkÏGÐ_Ù׉)ê] :-À·¾õ­-ɺURô?éuÿÙ ´†¡Û*{ˆ¢‚:RèhX”©mW¾M|‰ƒ,ÛÔµRÿnÆ N`©šùÀºNáâ;tèÐyí’ËÞ÷®×®o¾ê¥Ë€çA÷IQOI¥×­[·ë•W^åÈÜ-m@ù¦?â°þóÑ®’èÿ<õ_Özªc1Y]u-»#GŽL¥a©EîÑp=Ö+V¤…²|²Hu™®ì¹™ãÄÙš£¶×X“vçkí+s.ܪۆ‹¸iÑÿÿ™²¿¶¢]«úÈŠÎÅ‚Ê÷W–þä÷aéú<”¿±f²ÿwþ÷´ÁG^Æ‚/;¦~ï—6V˜ QáW/*Þ$µTð5×\“ÔhÊ·=ïqµä{T]ãªÄ@•97ÿ/Á»¦h› 7€¨lQ.€¿ÿ÷ÿ¾¸â?ø‡Uþ«ƒrû½¯Ì¹°þ °¡ôm/6+ýùhýj”¿ Ó>ÕΓ›Àüåá·é:réâÂ@z£+ö®É:Û— tÙ2¸Êú S$¬?ÀÈu×]÷ã—_~YLQ Q ¹8¢ŠÿUþ Eie÷YV¯†Å:øVúÃl‚…(¿jê›»T>]kà#¸íÚhPº¾öÙÖÁ.ætÝu€ëÊòév*vŽŽŽž×-°œM€˜¢@¢\ÉŸ¶Yýï’ÒªsNR\$FWýÎPJßÊjÕ÷éBz\Ìc­Ký½Ÿytà 7ôžþù©‚;’«rŒ+àÀiÉ[Wl^Ýs`,Q,ËÔ¨“Òl3=ÚìIãQ:N ððüKÿJÔ?µysji»¤´ªR^,¦ÈEߟk ]ég•?”j–Ö>a,òºcmÊh˜ S§N¥L€ô¬Ó ÐêØ—ý µ3|2¤Ã¾ƒÿuñâÅ’ÔÊÜõë×ÿðå—_Ñ"X  -øÅoRÿ\ Ó:¥‚M•3)´_þõô~•A£ü‹*ûÅbå¶Í"ž0§èññË_þ2­ý`Ké»ÁÌÖ¥7ß|Ó){WÇxÀµÂÜÊ2j!Jgv‡Ø“.-ˆØ.a ’œ#¢R$ ÿ¥¥¶ÐRÔMÏ7ußïØVêSÝs•Iׂ¦Ü»wï9Qà]NÓâD¿­WqóÍ7§Ìš­TÀ:÷sÙù`Ú~KèXÔó#t™ôük4ð&b*ÝŠ0’¢ÿ×®][™Îor³–9w–Êr=ù«|Æee?›ùÿ(}þ )m+Ÿ*ÏkÍy@À°¥)ýìv饗NÕÝ(/Ä„0š“8IºEÛ-"àþè D¶J¢ÿï¸ãïþ ×ñý™rÄ’h?³ÈÖ¡I}º ðõïÙ³g`sõ‘Û«« …¦Ï÷+>vªÇQDfPŠ „¬ÖÀl .“ƒŸw¯…\?ÉNÀmBÁ")rýõ×?ûÒK/+ðÛ?ê1IÍ䨇¨ø×OŒõ/ñgŸË[X.k£7qàó‡þW‹<ê?ÄXqlÚ´©ô½Uå}6™/˜ ÃR†¢ÿû½ÞY*7€0@„@Š `³$ ¥C·ù;‡,_ô•€:c„(“Zv£È^ê#—ßÀGÂXôÙØ ({2‚¨ÂÊèw 8M ?na"Bçw|ûÛßIþ¤§¤ 3òƒIÿ³L«œ+ÿü¼yóÒ®>éÿ2ÇyúQBÅ´üg¨øFcMóGý·ÁM*›bAUîgßî.hí¬r“ÐÌ0ƒÆ à[Ù›t@\¨¦o€mîØØØÓ»ví:RÿOŒ¡øOö†òQ¼"¿(ß¿¤€Ÿ¼•&Å7šº¿ÑI-{m»”Ç¢GÀ#>Pö¼ÎžxóÝæ1Ô­‰âfÏfZ¾JNås• H59@d¥ï/]º´÷Ê+¯¤ã”@ÿ›cî›|uÍPë§yžÿqÙ²eÒX€g: zÂÒÿ²þ_7ë s]vÙeSe@%ÐÿÙúùÚý„ª˜f”é~]©Œ‡ Ƽg<{»ÙŒ¢Ï>Î>ÇFw¿÷yÀe€Bj$VZïÙgŸŠ‘ ôó‰øÛ¿ý[ôöâ0ë„zÃÖbš) wwHcˆ•p³ÁúàcùCJPúýÎKÄ?clKÁšüóü64b ©ùOòÊݦ=EÐàü,îøŸ€ãó•ŠlüצPÐŽ;D)ýìã%K–¤,@¶DpHúJ¹$×®¨4p¨RÁ2oe×}Ac¶mÛ6’ìž’DÿCûe“PÅ+Ìžæ,¸’è,Ì¢Ô¿ÐJß¼FÐ_¾ujÒãXLiqzøðá4«ßh,Sß>LB`Z²ïiCŒa<²e¤¹»±èÿìõ3÷E¨"jùçIŸ„U"s7lØðôÎ;ƒÅe$Zÿ%ÆìÍ5@ä¶òŸúŸ-_ï[’o¿?Ay+3fêËŽÅNpƺÏZÜÄÄ0V\V°(¥XØ—aì¾vêÐ7@ó•—, %Àܧ4Y?m• ÄT-H6‡t„vˆòÿç@è8z€K£ÿò—ÅBcüþ1QÿýÆJÐ4¿ Zß5€j `A·¡‡•ÿûÿïCç€/¥Ÿ àÕW_Aÿ›c[q¶ÖäÓ§OK›.AãB3cRþÒ~L®}¿(RŸqXþt*ë—S‚þ7Ö¿üüJ?ûåo*ýÅÜÀc|||ª¿º°~æ¥@†‹@#Pä{už¸pŒŸ:ü¿øÅ/Ä(ýìã•+W¦sÀDßK0ŒK({íCÄ!Ð@}å•WJ™&Au`h@Œ  (ø¯ßèêfÍ[ÿ|ö¸¨Äg•…Ì¥odoÐ}hê¿®ò!˜ÏT,ŒYñý‡,¼€GØ€¬û¢éõó àx (g¤¹ÁuçF áéÿ¬7€ï ¿A,€ T[aþÑ?úG›%•f4ô¿”Î###âèÿl^¯¤2©,.ôH÷]mÎV?”ã®]»z¿úկ΋än“p]`¸ŠJH×¹~!*6Þpà ©²-sßúšf#hX ý?¥dr@Öeµ2ŸHÒ=èÂÎ1’èÿ<`¡6=ÇÕW_-Á#øñ² R$åÿcñ ¢þ«Xö¾Ùúº“µÀµm‹Å_ Ôû)ɱ(- ­É|°9Ìcê5àÊ$`TŠñ`âW$Å‹§Aîèš àz)Wÿ?Û0ÊßG{ÊþJ‹þgÁnJõ»XðL„ü …BbÁ¬þ×^{­711U€ŸM1ÁaÃ\k2Ì}GZfè9‚’R‡¹Ç ³º®(²…¹‚é Àf)W¿LñŸ*–_Ó›ë_ý? ÔYðlGê?¦*~¤“¬Õ%«Ð}hŠÅ–¶¹zõês,m)™1€;wž7gCYૈڰÏÀàf"ÁtaÕçŸü“••²VAè8scJAðf!©âÍž³‰otPW@±œ‹©¥îË/¿œækgs£UÎW®1´O&P—6Ý!ç@¿÷$y`åb­sSÏAˆŒNêÄn0’ýÿƒiU¤Z™R¥*Ÿ7Á¸U&ѧ•ƒàû¥ ÿùçŸO«æu‘î/m‘LZŠR©ÿüû©Š+ lq,_Y2J$ÐÿùÿVB@ãÂeˆ¡ÿóþÿa¨²ìëu‘)~)Iô?45Ê«Èb)c‰Ôíu>ìÜHýèM-òº‘àU,JòŽþóŸ§ zT†³&Â^JÔÿ ÿš ;òïËÎ*ïk2·XÓ†ù¸C4²™)Õä\¦F… ¢C1K¤\u"fmšhŠL ”Dÿë¿®%RÇÊöy&/ÑóYËOj”?–¿úû« ¦èTSöÅuÅF:ˆf ðø˜eÃà" Mÿ[#m®ŸUÎE ­„HjEãæÿ÷L³¨] ýïÃÒ¯b%¡ü³ ›æá»ò;£üùË_žG«”cè%`‚}þ×UÙ @€Ï9P漦æ}hú¿ló+ßqdst†fÏž]+­¯*b-ƒL¥Ñÿ¦ò_¿½«ˆh”)ÝðWBÔ?tÿsÏ=7åóT©ˆ‡„U ”T3 _†×å(+@ùeÖRMCÓÿY ¥€°8€ :Ñ;ðOÿé?“X°2í÷¾º(W*ýßÔ·Y†A(kñë?t$ø ßc,ô·h(dÜ'>c7ª°ÃX›s J¼ n)ô¿vË¡ØVIºÝØÀ¨”ÅÅ4ÿquƒUÝgýQÒ¢ÿmQ›M¢:$šVÚß  Ø. $– †” hzH ÿ‡­•6ÖÏ:ç’–Øz€$ú߀ÁErùå—‹¢ÿ[–¦¬J_V¥I) 3ȪÝ=ޱ½ð SOT샀l¯iå‚ \jÆ#¡I–qdýÝ’*Ú¢óëž‹ë’5¸¼¶Áˆ)l2š¢Éª.ƒ¢×LðŸ”ÉIŠ]‹¥¬%bÃU@Õ?) |Š^Ãò7©‰*ö…’Á€dIÔþûW­Z%&0ËH¢ÿ«®›.]EñÅ»n ÁˆsØ@“Ã,„açÊZÿÒjÿ7µDªZúEïyçwÎS®¡ø¾úê«iàŸZþîAŲ  ­\0@Þ4ã hðú믧ÿ­“¡ú°¦š³Þucˆ,q.€Ð4”)Üj2æÉYÏF3ץˌ¯ìg¨¶ºO? ÁbÏø4ÏßÈý™½G¥t LWñÑÑÞ‰'‚4*:k îªP†f³Ù.”}ÕÚ¦™“iwà?ÿçÿ|TJÄ%‹)F6MšPZLPIµÿ‹’ªJ¶èLƃÿ?D¿at0ÕĨí¯âWPjÙs¡¨ÿ¢çýªº¨¢Yf®šöâ¡éÿ!ìp㵸ι aCG¶ô„e¸¸Áʾž} bZ¢J*þã[é÷{ÖuÈ>ƒ€Í}4âß¿dËfûø¯«¦˜|eÆ”y¿I1–@ÿç—*ŠÛpàUGN÷ÿß÷dÌ—)þS4®&®‚AÔ¦iù+úß½{·Vú °/(ÛAÿg“ÿºIuI¬JW•3ëvtiâ„uôª#;ËØ(T55°25.€~ÊÕõdÌŠÍô?©€Ç/Ì!öAý÷{?ÖˆüWê_†0HÁ¼JbŠˆ(V»®úà ”v†±è¸êºéŠ%  « €ï4@11Þõ»]ÑPEçB‰XF麚Œyj»Iu?›©€ÐÿùÜŸ z¿ñæ}»*áåF¦ˆíÿºIÍ‚¹ªÎ­:J?ûÚ°@@ߌc%ï+×'•ˆWÙIjÎW É°sÖñÿ»šœP˜YZÛ†õÑdÁ3Ö¿ë~îUØ”Œü‘'æ ùbŠÝ—¬5áñ©ôû}ž8Ò³Y+!Ž%Å @gØ®1Þ8ÌÇ|Lòâ²ñÄ ×™”u&Viýo£'yÓT@\7ð©’GN9b™2cÆ qóÅÆšÆÈ”™[ƒ>_o*àx²¯³67Y×%¥òúÔ•ÞIþÓØg¤?ëËÅæÄj‚àM ¦T¿ Ö€ yúôés,¹P•ÝŒ;v,Iêû—)P¸(8“5Òä¿¶U.˜µÆG¼LÙsã`^Ù6ê×Y7]±dG j ßV`zTkßGyß2ç2 €+J®Ê9L`(¥Ÿ}l)—©|Ué`ãcnƒdšÌpf[QÇ,Dº$u „Z¦4°m¥_Àƺa 4ø\‹û¹„ójTÈ}ð]p¢èÜ0®ƒqÊ~&›BégPõºÖµÒÊâ#$ú?F럌R°r(š½Mà)¿Åls/¢@¡ÒÍ›SC€¯¹—ëü×¶A%nÜY¡”~pÅ(V ܇¡ 0³g~ ŠëñÖØ'³Hô‹ë@“"`€ë`œ2bP°+¥_Å7h€êŸ× ÿc³ð:”^GZ£ä;ðû p,ð{¹7gΜÙ[´hÑyL•d¸0þA¢Eï‡è—åã;°*ãè )“ñT55°)p0[×ħ @\ PÿêNFhÜ<—Mÿ ¥ô³±V‹‚BPÿdF…ƒâß»woJƒg•{‘Â/zœ=6@ 눔¶%K–Dá*  û?údŠŠîKÖ›&–¾ÍT@(a]WÁÛœúh¹>hK&H–´H „"ô¥ì+›ÿïm›ÌXÿU)@W©€ƒüÿ!ta‹C¡R(òBœBY?ìµì1¬õè-?oÞ¼©nw…1CugËÞúbŠú}&àCéúÎ6$ ÝÏ8’„ò¶PÈu ûØù×øï°è$ÕÀÒ5U%C€Êìóý²~\ÕÓôZ>Ù÷:ä"°éšLPmתväý”¡âeøž|eJûŠ0 €„~î¤FJ³þˤúÕ è³4È5“hJmÛŠ'ir_6M´Éðå3\|Óÿe×Ù2ʾìZ=ÌHPÐr¤(|ºòþ ô¿¯B$ì~=|7uŒHÉÿ¤Á4-ôã:Pp+)„à’È/î¡SLC)ý d™ï3¬‘«–ëeÏÕEñÅŒJ¡û„œŒÙ¾•~þó&ê>t?wiÁ¸#Ь Ê?Làä°¾YÓê:duIª–®•~U"!ÀWŠ`×ÊOoө⎰‘Jâ¢àDˆÉد/¥_æ;|Rÿˆ4úŸñ¸.ók H³¦°'®˜¢²÷eÖÊõÙZ»èyÜ’èÿ¦Æ“Ës)°¤t¥,eýG®Ø‚üõŠÓš¬c14(ꢟ»$€òbL>sû› IBÜõ%\0EUïË&ô¾Í¬-Èm®S6ÙÖ²¯çÏ˦1-ÓšÓwç¿ÐÙÆacò‘Я€/ê?¯t¥þÿªô¿+¦ ì{¥þš{>KQZ!”~ö¸LUB_Çùëmƒm­Ã˜`h-fÊŒÕG@Q'5 ¾8ßJ?ûØøi]SÿeØI´ ñ©û´à›ž‡ëXÔˆ'„dnÈÆR< À” ÐdÞÖùW늷(u4T€€–K]êÈE€ú¿I£WþL¹Ùý^“Ä0¦&e} æ¥Ã„¤þ‹ÀHèT@)ô¿+¶µê¹»(c\§’Ô¹ÁBûâÊR‚®‡ùJ}6u‘LçHŸ¼)×°¨é–oê¿ p©ôósMé‚mí÷¾~çR .€ÿòç’DÿC17¡÷meä¥PVš¤û• H—ô¿ë BI’ú/ºÇC§J ÿó®_YWêè¨  Ì fƒ:rQÀÕdÌ×J• Xd•„°ÒÊ\{¯“ÔQË_×®6IqMAeB¿û²LÆMÝ9TeÞf{6„¦ÿ›0¶¶×dut€¨Â¸4‘’Šã£'y™OŠ•&I\Ðÿ>X)ó~³ä;Å´lÓ-_YRè×Ê^A€2V,{7kèÉGF‚‰L¡ôÍcÓ65$õ/Mùçýÿ!sû«~§ë1õ%l3EuîËÐJ?Ûv[ýï›mírÐ_ç€ÿÝ|*q…Púý˜ˆPÔ¿Äû5t4ÝÏ$Å„®.YÄ„J$îGýïƒm­r.e:ÈØ Žªiô¿¯@£a•Éʺ^г­[¥¸$–ý!øï£>:o®†¨.Yt‡J”Ô `Xƒ6%×5°£ @VÀE¥*)©8®4!©JFK‘lP$6`Ðû$5S2 4õŸïèP—™kRè×lk£N€ŽYÿ>;ÿå›Í\yå•"èÿ*ˬ€K.¹äêTUЮjŽWY°Ã‚ËRÿM­4I ãñ‘úgHHj¦”eBQÿFÞyç J??ߥDÿû¨¾:ì\tHT åàôéÓ½yóæÕºÁªº †Ký/!pP €Ï~î’bØÊ*X©Íc„ÚRæ= *pt*ûm_J¿,ãšþ÷ÅÜæ)­ÀŒ·Å5`ëf-èc2^vÙe½÷ß?x+`Sóžæ !­4Kõ°’;š®Ž’0Ò/À'¨¬ÚuÓeVÀ â_>é_ʾÌz.L¼èL_ €P†nò"(¡WÝÀ?ÛþL*”:u*¨•–NŒé²ÂcX°j>”xS qòäIq×.»È‡•HöºøVúù÷çˇ¢ÿm®£MÏ!,°= F‹¿ uTç\ùÞÓ’[ûÌ èçŽði¥¡u«¡C …l ‰îÏ£l‰³‘’ ˜÷¹»•ƒî˪}4 MÿgãmB×hé¢t² 49ì}ÃÎeªÞ…¦ÿ|'!ðòË/O€PÔöþÆLLL¤,@È–¿Ã^uÍ ýo›ú¯s_fÁHèTÀl–Fhú߀ÅPÙ²ÙÐr9zôhhãkÂ0¸*Tg2²pKHDð½ËÙvIýgÏC‰db#¤´-%›g̘$·Ø9Oœ8‘ZÿÒ‚~ËÖp]]2›"0+ù4Íô¿oeßoÕUW)àÈêžÄ„ºÁòû|}òP“±ÔQú6⮾úêóµoêßQÁÒ–$ë €«äÈ‘#⮉RªK–a\*}iÅ86M£\–÷­ eªûø/Žº?ýÓ?Ý)iQÈ*Š2ûAŸ-{Î"1qeбËɈ¥[ä«ìWoÐ{ú½Vö\ÐîƒÎm\'þsÐXóÏgÝ1ÙçMÔ½$a¬&˜ÌTäš™Çù㺯U9æZíß¿_Tóؼ÷Þ{µïì½6ì^*s_ÂÞ ›eçРï*s.Ãl…¦ÿM¶Mµ¸îz>h]—"¾t¦7€” lJ”ºJ%©‚L«Rd.'ã°  _ñX·ƒ>ë»S €ý:%†Šì?~¼7::¤`þøõ×_O¯‘´\£2=\SÿÙ[–¾ø)ôèÆlfû¨1-LÂP7X~Ÿ·˜š¦ë5™Œ(^¬¥: ‰íø3–PÔ–¾øâ‹Å î­·Þê-]ºÔKn¿c”?A›Ò”?Â¸Êøÿ]SÿìÏœ9\é›Ç†‰Mÿ#ù €Pk1{ t+ãÉ6*Íà«ËTÑ`#xÆÆd4T·ÏžäýS À“q›=l¡Ç="UŒRY¾|ya•@—E‚ ¼_~ù婌 ‰rìØ±Z=\” .Rº>•~öØV+`ëP8†ŒèZ ß €`¬97XUJËV.®Éˆ¢V§ÜW©`€¢ÀœýÜY ¸6’jÛg ´gÏžÞÊ•+ÓëæÃÀzõÕWEÒþYú?[k#$õŸk¡”~öq¶ `hú?›jº YB@@û€aÑryƒ Zòï5HÜÅĪú"Þ«ö ·©ô³B—ÄVZ? A©aAíµ×Ò˜€… :mtøðá©€?©Ê!Ý×Vc)5H‘,Û Ø¶« <¬U³OP¯µ2@R°62’~¸„8hT×h»ìgŠ@¥o#Ðäãú¶Òú éw’…|ðàÁ”’‡  É¦¯ ö¥—^JIÝ’,yú?õožÔaÑl)ýìóÀ/úáþ’°“е@ß À®dÛ"eq0Å€|t™è:§ì9ñ»ÛèTVGé}`¢¦CPÿÙ÷ó ¥,ð0†k×®]©Û‚Ø€¹sçÖf¸?¡Ò÷íÛâG`)LA"×A¢eîËl-WJ¿Ê¼àk-ê×v;D€°"@»ÚȈ²þëÜ$Un°aï3RT ÈGóŸ~“qP…0ŸYLH`ŠúÏ~†¼1#Œ·Qú°3gÎìÍš5+íyÞOás/bé¼È2Àjå÷gÛüÆ €AÿgYåm‹=0ôH¥o$ký»dË«»iËuÀAX# oâ“S ˆò 0®o°a ݦø«‰VóðÕ“|ÐkÙŠ€u¬4Û :ÿ)·‹ Ôqa8p`ÊŠÐð›*~üïFÙǨô¼ýöÛéÖO‡¨.Y¦  K¥Ÿ}< ÄúdŒÿßUËõ*ë:L™ ñ¦+;`¢ƒ%øžP(ýšÎø(„lítßJ?Ï„¦þóçVÏ×JˆUDd]mC‡÷¿†n,èçðÀ:àØ¼Nܑ봾*çÒÇ?JR1 _Ê~Øw4 ´ ŠâBf€ÊñA£X},èE>øàm'*Ôú?S”?l„ ·Z“Ï1>ÅaŸ)ÓmÓW Ö)ú)“7à öÿËù/Ÿ²Ëlöö™¢çërUÀÀvÍñ:›‘|6@Ù¾e?Ó¯@ÑûÍ{¹F*2…˜›ÿuÝÙc$5™6æWöóXÆC¿ufÐ{ÔuÖM×}B‹O]é»,Àˆ TÁ‰ì¹úù”}ƒÓˆ?w>çÝw* y~Μ9iÁ™²ÖX?ëÍ&{m‰•gnT ‘öÐÿùÅ=$õÏcÊ57™MXƒü1®ÏªåÇ])ä°]uuØ9ûµˆo³õüÃD°E €/4YôÞ2þA“±Ì±)ÂÓÄÒ¯ò¾¢óšcRïLU@[Ùl°ÊÈR}2Ee:xÙ¯`Ù9`ƒI3ç2Ö¿„€c“b›m­s.Im¿}ëÈéžœ˜@@jd#?}šô{Ýd„¤ÿŒßÝ–õÑÄÊY°`ÁT_WVZUö€…‹&iío»*TýÃ×îâ¿nR3`PðŸ-K¿J¬À  ß À(]›uUê2·‚J§,yk€žÇÃÄ”¶eá×@òn€ô¿cÝ6íIn+V7€”~îÙß;Ñżai›·sçN§ÿuÝûoïÞ½ÞâeÊœ;Û 4ã˜o²Õ$Žª)[ÐÕ"@f &! »x„¤ÿòÃóq!¡hÉN0éw¡›º˜ï‚ÂÄŠÉGx«ø•Ý»w¶…Šú7ÏS{!;®Ðùÿ°UÌi)ÇúŠðv.ÜŒÊø1™úŽè‡f •šþ7ÇEqM|úMãhpãÊJk P*“ʤâF ý)Sìâ¿®/`¶l=‚ºsÀfV•¥ÐÿËp½&g_Æ´:`\°…&›– Î/V¡''åb‰‘¨ ,\ÅP%ÀgÍXÉÛ*D´?÷Üsç”Ò¶ÝÀ§ {0>>n½IV“øIô¿‰¡ÉÎU[uUê°TÄxÕ‘^€ñ/þŸY¬CoY€m ¿Î9²e¡è#y oqTµD†1ÃÎ…• õ?(ÆébÑÐòüóÏOeòáϯ ü‰M°™Ó”‘³QÐ&ýßdýìǨÖ9Þ¤#JØÐ‘mvˆr˜¡h¨ì¹šæçÚ LPbB*ýükYšúÏŸ'›Ò¤âÁDJ,ùõ>Rùê€ÍAô¿ëTÀ¢yCeÊŸK ÿ t™ÖWå]¦ÿ½»ÌüMþ€1 W›LR]Õ¢®Bi…¨8è˜îqY¿¡ížäU©Ñ3f¤Á:fL¡©ÿüg`)bl›[õßï¿ $ +Q¶ùO“ùPÅU ‰þGL¦‘ͦjuÝ´’R“ñûþNï @r±Å¤ÅØ´ð«|ÆÐÉ¡és hš h“ÎdAý÷{?,€¦º”ë³Ï>ë5•¯*SDV‚ï Ù2€Rèl°­e_ô^üÿR$„nœàGŠqªãÚÂ/»7 Hѹ}Òÿ殀¢æ!6ƒ–ª¼7õÞ±´›ôs/k9Öaph³ û…ýóŸÿ|ªŸ½T¾ªìc4ô¿kK¿ìçS¿TÕ £Qþ¶ØÖ¦ì€°@ïº1D À¸”«MÅ;ŸAÃn´*€>| hQqY*xÉ’%AšºTùŒ²ö•ÿŽ;RÀ.í¿Î~ÿþýûòÕ™Cù ¡éÿ¢ÀqÂbÚïøgÿìŸí”qÉVTÀv IÙs ôàiáºSYÕ€¿=De·*ÊGÅžò‡öÇ÷/™ú‡™xã7¬€`›sKýOQ/ÛëhÕ5:»¾IÒEèÆ.0A¨Ž~b2\YøU>[§" KoÜ6”¾­å¿xñb¯M]êZ”Ú1°™ Tó–¿ÄÿAùçSÿ\gÆ ÛOÆe"þ7kŠ ¶µßû«ëH2f“q"2¤Æ„¦ÿÌš5«wøðáóÞ2+€T°,c")<û]Ä+˜¢'*Õ”ÿ_ÿõ_§–Ñ"/é¿æ?1@.3c†Å HŒþ·QDÍÖZl€.€P À!)W]R€a$Ðÿ渟 dV, @*\d‰©[ ¼ ¸ ý 8—Jý›mõïj”qË™VÄRè ŒùZGËì…1Atb(`G²ûž„«N “—jn®i•saÕš¢2!ésLî=´]Þ—hÓÊ©cñ(SÔâTZ¹`Ž¹Ç¨8F–€JÁâÇò4Õ±â}þצÅîž={‚ÌAßÇý&‘þwmá—]«YרÉŽÎèI‘ÒÄ,Z´È*ßä\U”« @7> ©€FIË—/ï½òÊ+â¨ÿ¢÷cAR‘  ¥ƒ‹…(ú—^z©¯uçšú/[ô)ûýFù‡˜ƒ>õ/‰þÇ FgÏìµsµ~–™Ó€“¤ƒ’qvÇðÇüÇ´<—BÑPƒŠ…¦ÿÌŸ?ßi§²ºY*J¢ƒ‡¹ÈÉ.ªËÞe19þ;wîlŒç¢ßC¿÷Ÿ:u* Ó/ýOý_5øÏu©`ÖA2>©;Ã7ÀVI  ÊôÁØ´ ð¹3a Ü›X9M»}~éÒ¥SCÓÁeÙ5ѻΠD_xá…óÖêZäu‹>Õù¯M‡ÊÐs ÿåßψEÿÓa´ì\ñQ HXàŽP_²™¹˜’À™8€¢›ÆÆMZå\¡ZZ,`ò@‚€ûÆd*„¤ƒ«(b=¤YºÖLˆù¶wïÞ4€® “Öï!ûýd¡”u‹ùPúÙÇÒ¢ÿ‰{TñÑÛ0Àú½nâšI0]’Ø)é ÇÂ… ½XøUã$ x"f³¥m[ Þ²eËzGjÆSeA¯¢Ô](Ó©ÍÔ\è‚ð_»¢ÊÞ÷>Øÿ5s`ß¾}ãuB¥,q3I2òÖ¿Ïë"‘æÿ﬋,$ùÿã¼CÒ?/$) 4‚7ÇÝIj4…b§Oï­Y³Æ[û_Û%d.ï¾ûnÊDõkÛÚá7áÿ‹_übªD­´´Í2ç¡Ű¢?¡R³<¥XÜ>Ëû;—0ÿP]Ò`â6Kaª¦’¸f ¤ xs<{öìTÙ%"°ß{è[À†OÙ7lËïŒRaü¸(™Ú–ø,}èþ7ß|³pމúg vHÕûÙæèwn“i"‰þ7nº¢5ÒÛš?Vÿ¿0I}ˆX_X%T«*›Jâ2 O†DðYK›ü{èOŸ ^Ù÷Àüìg?›rH¦þ)&n6“>›œ>}ºwäÈ‘t3¿YbÅÆ*Ô?iŠ®”~Óù`‚ÿ$€râ[ý>\Fèþ'ÌÿÔšx6Ù}G’²/dZæ³Rè#b͹^ðÊ.„Ùcšk¯½¶÷òË/{‹w©|dQ'6Õ4R‘,°CÌ#‚ä²t´tö¥Ìy¸¯òUC+ý<ðµÔþ÷e4õ;‡@ÿÿ³]fvHú3ˆrTu¸b ú;dà ¬Ñ LYu¾•þ°‹ƒ`NÆ õ_¦ÚÔ.鎆PúÐãìa`Ìõ‰}é÷²L`4¤)}sÌý‘Oý m<ȳu:B­£YFÿ3Æîºþá?ü‡ÿößþ[1²qeA€k–@ ýŸ=^±bÅ ôó.,è6(Ÿl™hRÏØ¸W €ð]b%ÿöÛo§×™±ä•~lìË ±ríÞ½ÛšÒw‘ ª”Bÿë¿ìúéšm¥!.LIô?:°Ë €  ÷PlXM Mؤ´¤ÐÿæÀԨ۩̶ÒÏ˺uëzÏ=÷\ª4cV>ýÆj2ˆ©'  Ü°í:ç(zÒË °2à*Oï»EM¯_UÇu¦Bah¥?èóXÿÙΘRèèöë¿7×*k–0úGèLpDÅH«à𠍻X¬\¹rŠfw¡ô›Ò¤(ÄÕ«W§ùæ±*Ÿ*cE °¡ Íûfãzð<{6ó[ÌcÓ@†Ç({6ÎÉ>?¾a¿M*õ_u¬»ví*,Ý,‰ù"`TBã°¬Á µQüÇÛºxñâž0y6ô¤0b«vãÆµ»L¹RÜ&À¤vIPúù÷ñKíªÍÙP꾕OSE‰âF¡gØÏçéúaÏ»f4ê^?—ŽlSfÚ†Õï‚ùâ?6Ö¿$úßXÿRâ©ÑÑQer¼7éÖ­[ñˆ© ˆ/–¤ÙÅ¥ˆâ,z¾è5[Å+¤ÐÿYÝhX@ õ š4ðôþa犵8‘ÍH6®Ÿï±;v,·¶îYóÁˆ†\úüWgýlºŽö;Æ€°º;'u_ç]¢âR˜6lØ+,ú_ŒÎ¾ýíoïÈû CnÕ` » }õBÐÿSR¢üa\Óûu”~VÈI¾îºë¦ª’)õ¯nŠüóÐéDü›b?!éýaçEù7 vµNpš¯QQuý´½ŽÒÈÌô#²¡óœ+ÏHúƒp”U̾âÑ«!i?è5ÜR|£Eçºdåj<Äù¯¡ôɤümÞ·M˜¯~ÿš®6@@Þú¯³~ÚŽ€¥”¤[ÐuR”®0YXŒ àÓÂ/s®lÏø“{Ðq¶Ÿš´h#5‰ýÜ]¥þÛè¦( 4PúXþ”.nÊNùpwõkÉmƒÊob<0§¸õÙù¯Ìú)þOÆ%Æå=]ÐE}_ÊxŒàÊ+¯,¼ÁB¥¶³]7íǥﴨ¶|7¾~çòY&5ÿ`yõÕWÓkSÁš*Ïû«äTÈüyòcåÿÇçŸM•,;B¤VòÍ®\—=óßë²)ÍuÖÀ*Ÿ…‘°]Ë‚ì21 Àþá¹ï”ô/á¨Je¹F¹Y@ ígŽÇÆÆÒr›!}£e¿Ó€s=Õ"o?õŸ+Ê”B?yåïêžmzn~?Ô¿k—^]ãaÑ¢E•YÍ*ëgu÷¤0Ù9©ë”(øcAF¢ÒQju öÔA·ÃPnŠÚ2,€O„?ì¥J@àž={¬YýM-¦Aï#+Àx)˜£éqá-r=ŠÆŠò‡*ª¡o£êŸMæËHöuÉæÕY7 þû¥þ…\?µøO$ À¤üPÒ`X$Ž=ê™69—¡Ù|Ó~e r˜ Xt^@ 1Ú°rÕ"—Ÿ¡€Åÿ«_ý*Ý7¹Ÿ\¶æÏàÏ·"vaé×Y'9sæ4^ûlOcý +þ#Nljð°3ùãÆ%El:t¨”‚.{Û0EÝßBÐ~Eǰ&Sû}7Àµ×^›6ÒÑô¸vg( ô±üñ£K¢÷‡ËPÿ!èÿaÇ~b¥š¬}U×Â2ë(Á’t º §`°<#i0d˜ ›ºñ.XãkIû Z–-[&2°ßgT4¢d¨Zä팇 }1E©~M¥KÁxù .-ù&ç3ж©¡Sfý,{.ÿÿyFÚ€¦KÐd:àw$‰XS÷>T3 ükX­&  8ì=¸XpM_¾Q[YÙÇÄ0à ¼– nO<ÄáÇ{ÇoÜfÚw|Šß Òè^Çò±Ò­Ïæú)°ô/ò¬´‰cþÞßû{ ¤ IÔÍþýûK#Óº–~sd#îCùþú}†8ú)4µô‡Y€ÃÎ[Dz# ‰â!,µÈ㎇ ÓÕæ>®Y$lÖ¿/K¾ÎqÖÊöUæ\*þ31©Û”Pž¢.5ŠòÛC— 6,@Ú¯ 3€u­.5pÐ"O<q¦Âa›©ÿ¶º)ˆð§º-}m”òSHÿcù³ÙVöU]ùÏHÌý—¦Óĺ&/•’¶JÁ€3gάLeÕ)^Q…&#ÊÕfe0Û‹ ®€“'ON¨Ð©€Uè\ Í¡pgÄNýwÉMqâĉsšz¹vÙv°$u^óº±þ]ÐùÃî¥AçZ»v­DúÿÇ=r¡ÄAý§ÿôŸ^ÿæ7¿ ‘2¦wß}7Í)E)„ ´ú‹ÍX >'•c€*¯à²bšÍEkF€r~Cö¿É/VEçí÷_V‰Žî÷¼ù®2ï—8Ö¢1•EïçÿÁeg[lJßH~NK£ÿ±ü³9ö¾Ëû þ»í¶Û¤©´ñ¿ûwÿîÿ!Q׊tÊDX GªÄB§¶íMI‹EVªÛ¸qcÐ<ê¦ùÞ ".ÀÔ8@§k†Â¹Ïp åOMÿ"·Žë{«é¹³ F*˜7Ç(W†NÝõ3ü'l{Fªž z &7@Õ¾ßûlNâ`&BÓ„ƒŽñËåãš*}—‹|Ñy‰¹`áƒúÌcÒrÁaÖ2™:è7÷ÕpªI¬@ö÷K¥ÿéûàÃÂ/ûºèÕe mÁ ÷ÿã<Ø”4¦n¸¡·xñâsŒ2û*ï-³Ï?‡ÕEmü†ƒàa–Kþ½UÞ?ìû~úÓŸžP)¹Tð Ïp½‰m8}úôyþï\ôoãç‹Ü>UÏŘªŒµÊù‰ëÏÿµš¥¸ŽªÞ[e®«y9è8¿ß´iÓ9¬c•uªî¾Ì{V¬XÑ»óÎ;ÅÑÿßüæ7—*POž–6 7Þxù«Î¹°N/ºè"qôþuYï’Þw]äÖKˆ‚G¦ŒpUk½­¹ "ü<˜¦÷å)sI®£ªlW¨yYöxáÂ…S÷{ˆò¾ƒöB­ÿ§%+Øé’'­E0B0 l6# Ÿ‚Õê"rpöìY/‹IÝc\€˜€|ms_ÍUlqqÍq àæ¾( ÞÊþ‡æóÚÀ§ÞX¹g¸ÎÙS±²Hùß(Ímwž²˜>=¼eïC›E€†#U<ŠXÿj8JÜøÿaâ÷ÿ÷7'ò¨¤ ù TF¹ýÞo‹%Èv:“b1£4‰ª'MK’ÒoBíB‰Ò¡n{³a{Ôݱbå“ÏOs.Ò^›DØûRúe?ßïºùž—ÃŽ—/_Þ›1c†7V³Êú õO€°â?;þÎßù;Ê4d Ø,iLÐŽ,BPa¡J]ö«-€rEå+ˆI ÿ³ÇóçÏO»ðÑ=V¥_$X!,’gΜI·| ÷X,ò¦yø¶ÆŠâÇÚgë3‹d yI§ÿì&öIÊšgÅ TwÉÖ¯½ä?ÿçÿ|&¹˜#’Æ´hÑ¢©Ô¶ì„)“Ÿd¶ƒi`(pUô;Ï€¡aïþùçÏÉ®hjÙ… â*²ZòÊZÃm Ƴ=V€÷0×.Ø*]éW¹·LWO‰ó2ÿ]¬u¦êŸÏà¿¢så¯çwÜ‘¦ÿI’dlßøÆ7fH×­â€ÉE?ÊVIc¢Y imä¸WE¹e_¯‹˜ñÕAI7©è‹9 «â“O>I©]_Jßµ?7ûŸÁ°½÷Þ{©23]|[ä±4ð½âZesùÛ¤ô³× ÛkB2ýum¨ÿþ õ“úÒ”Fg‰—XÀÓÒ²gÏž©†7uot›¥‚³01Òèÿüñ7ÞØ{öÙgϱ”¥)ý¦¬4% ŒtM¢Øµ\ðÿ~¿¹&ƒîYWJß7‹dúxHŸ—©‚HŒ Êy‡RöÃ>Ëú+°ì/"Ú÷oäÂùçþçÇ¿õ­omIΕ4.,\ÔãÏÓ˜ƒöýnü:ûAç`ò² ú¶ª.N,†¤[‘o,A\UÆÉ8 ð»qäË ý§eŸ/zMjà q*XúDõ£ü‹ÚÞJUúuï-ÃÐ…°äë€bÑÔ«é:å¢T0q óþ‘_ÿúןTÀ> ðiãÚ»woollÌIjKSÄ 01©ÒiFÒï¾ûîÞŽ;¦R¼bI¬3Nþ060ôw™4Byö  õ»„{2ë Î|³Hyå/þ‡öÏ×I xÚô'ë?½–½ˆä™gž9ÓÔ ÈÈ}÷Ý7U£NL~Ú ¢!€ «_…@CMšPYà[éûŠÔ €‚4™±òŸò[øMU#ùm*ý,RQ¹nß|U¾ ’¯øW´NÙ^¯Êž àüØcM±¯‚dbË–-âƒÿ¢c&—íÉî;Y€ë¯¿^Rî(Õ*½Æxž Èf2HVú6­QܸØmFy²e]’+@†=ãÉÈH`‘¸>Ü×!¶ªó’œS±sÐ:eÓ²¯r.|ÿ¦ò©0Ù“N LR+âtŠ«RÀç$B™`Uš5Òèÿ2î—Ô®TkÔ¸qŒ•c*á¡\Sj7õoÆabª´¦–”²éjÌXþ(*©E¹ŠŽ)hEuËa¼M:¿Ê^jälôt.ä¿ü—ÿò£d·EÚ¸„hB ¢ØšRm,ÒôHg‘–Jÿç_Ï»Bøsc°F³`Àü×,”†1hBýgÙìùMC$)àLb* Ê }Ð\‘FÿCýßvÛm›ý”Y§\º$æýOÊ3¿û»¿ûue#¬d1(kkX€º(w˜UÖ}ÓËžêtRéÿaL€/nlŠÉ”ôžAMiŠ>ÓPÅR§Á%PÉ*i Û c¢þóÔÙ:&>XM¬ÖY‰’Œ;*ë?½Ocp‚°v$»Ç–-k2M¦ß¹Xòë¤/NŠT§»Z,]à\õ¨Ï»ú}Æ0ýúÑ7sÕsUyŸ­{ é˜³×Ù¸}eÇsæÌ™êq"­Û©Ù˜(TvNꦨ$F@lJ ÍJØð¡ÕE¹u‘sÙsÀ˜t³X'vîÜÙjÙµ±0‹1û°ô%¦r¯´‡ÍqiÅ,ôæ´ö¸²ðË~†”Db¤2Ó1êÒ bô£>º=ÙKÛk¯½Öå–}½ú&ÊÜt­“Lÿ€›nºi*8)„e£5êsÌ>ÆÙ”‘©Ã¢”ýN‚5 ¸-RrƒÜ/ŽQþ̱*kLÙµÇ[`ª® ”ñIDÉLÞtZúž´q‘n÷Ö[oÓ.¸‰Eï¢T0J½(×^ââ”@ÀÌ™3{Ï=÷œZ£+Ú³T¦£ßù° ó9éÀo™ÿÄǼ$ Ž.–MŠ“¹f èD(±ãߤˆïú×*`RžJ¶ ‰Û¿J±ûì•]5¦€Bù ¥“ £££½[o½uª°ŠZ£þÆÜôÚúL™óJs~N˜frÒm]Ÿ ŠßDÔK(ïÛï\·Ür‹T=41©‹¢” cø¿ÿ÷ÿþìþá^’Ü›óÕÏBo(¢€¡Ú›ÜøU'UUàøðÃÏéY/½/¹9¦–>AK§OŸ>¯ÔqW­Q©–~[c˜ã܇ùÚþ¶çˆ«y €&åßÑd©«üË~êן´u~rû×_ýêWÿ?e”80Š©‰eßï}6& ñÐé±Ðÿù×éO¾yóæÞüùó;kºŠ°É¢ ² ci@éãF3]ý\_óŠˆú¬ß_bÜLåš5kÔúWp¾<òÈ#ô]Š {¯¿þºz¬É¹ð[æý’éÿü±±bÈ_nk* ¯1Û!Ý.~(ÿ~]]2Ãæ]ÙyIÑ22‚lÒù6Ù³‡úǽ"t³Þ‹_žLþˆ­vòäÉ´úÞ¬Y³ÄuÒÊ—Ö„­ €1ú¿è+6ãg?ûYZ.W Ót«ÙŽqš4Úli_ ìXÕÏÐz›Ê¥ƒÊ<û.ï[t®¹sçJNûc¬Q´üm³  ÷ðÃ÷7`€09÷M,üª.ƒªè`Pç/iôÑ1@+Aä)hƒ5êÃҵȂéðÅÈÀ4ÓS§®¿k¶¬Êw`h_¬jñ:×wÞ)YõlŸÔ=QKn˜HËúðáÃiw­¦–}þý¶Y‚Ù³g§)Œ¦ ­tú¿è˜…š¸:4¾øâ‹QY£ZÞXfËfüаdRoYf€TEÜeuÖœ*kL¿÷U9XJfžÛ ;/hÃxðÁE³o¼ñƽn»¼¯Ís Ld=û˜èÿ¢cR›xà4PP²5ªååÆ4è›|‡‰)¤5(èÏgZß =Š_pà_jýOê’X©Á€l{öì TSöâ{‹þ/:&Pëþûï/ ØT1…Pú.]m d¬:f,~ÜbMSü¤€hÿlàbèšþƒötûøgçVÈ…mù!ÿîßý»‰?ú£?â.Ú,Õú6©ÔRÁìYôë|ýßo|¸6H45ÚZN²{Ãå˜mŽ“û«ß”ôøæQþùʤ>”}ÙïÈÊŠ+¤[ÿO>ðÀÏ´EoNïµH’ŠœÌ?I¶‰ã;pà@ªŒŠ‚íld Ô=WÑ9¡áˆ@iÆFÿ¼`^}õÕ4>à“O>‰JéÇaSLƒ)êCÜ vÈ1_dÙ²ei]QùuÖ˜üû «ÿæ›o.Å€’èóþ[ËL²gÿÁ?ø—He¨¸G,€)\#1 »'hˆ ºÆn™c2Hƒ‚Ýxï½÷¼)Ó 4„šé¨ó=rî‹l«lÉ÷pÙcRýÈ÷—¼Æd÷tüÌ7*&ÿ:1"¢­ú×z €dÍ‘*çd=dÌ‚¥uÖúŸôZ(ù—¹5¹©~ u% TWÖVª²ÏOþ&ç*Ú³:tè&`X Z~1-ûþ¢Ï”ý|ѸËïÛ·/u ä ©ÒogLt?T?n¡6ÜÃùïâ·‘ ëc]hºN!Ä]|ãß8¯›¢$Iƺí¾ûîÛ® ù«¿ú«ƒÉnTêø°< B·1!]OêÏ>û,e.²At¾4— ®yLL@`P|€6Û‰?¦Hxæ^6À/ö{8»Gùß~ûíçd/„PöUÖ)ÒuMæ‘P¿÷Þ{—¶QONïµT’ þx²û‘X>ib¢wðàÁÞÒ¥K½æÔ)ãIÓh:Š ‹¤‘:Å !ú6`||Ü©2 ­ô»Ó€bDñ£¥Ðý¶ïa£üM›lëBÓs‘¢;oÞ<éêäñÖêÉ^‹åþÏÿù“žÐ€@#ç Ðˆ ô]ñ7Eð0€€>ú¨ô¿ïûõ¯Ý{íµ×¦€€ k4&Ú\¢« Ì8‰ì7ùüuÙ¡èÿ"åïs]¨r®, Šõ/™úOdÇW¾ò•{Úª#[ËdX€%ñ•W^éÝxãS TË>ÿ~,þS¬db² @ŠdëûäÁBà÷Æaߥo¨~"Êó…|b°äë¼Ê*ÿëB•sa̤þ©õ¯ €3ùÉO~B0àVÉcÄÿµzõj1ñeÞR‚ \|‚Ä'`z%t¡î~ˆqÖe:pSaUb Åï‚’t£ü©œWdùûŽª²‡ù\ —í÷Üs϶6ëÇV3`KOhZ râĉ4" ªPÕϲØÒªмˆ ðm¹>F¡#@¥²£G¦¬@6}°MJ?¶˜”yü¸ÒL >~é÷0ÊŸŽyyËßÕº`‹-€A^í™h»õ\Øö¸}ûö³[·ný8yøäq’goÚšI–Ý÷›ˆƒÞëºf7‹þrÓò8¦·Î÷|k”ŽùﺮôCÄ4ÐÌfjÇÇxOÕ9fÞÝu×]©ò—¶. : í¾ûîKç‘pùÓÍ›7ïh½Üëˆ<ûì³ÄŒI#“cýúõS“CJj`ê6Âï¼óÎÀÏÄJÿû>\0!¸DÈîˆ1+ „Ò¯óû©ÍòÏZû6ÿcéô?ÌÛ 7Üźß?úè£Ò«ý!;ï¾ûî ]ЋÓ{Ý‘ÇúÉ„R¦_ÀªU«œ¤Ü¸<ÍFxl@@LTª ÷ŒÀòåËS}øá‡¢-èX±rMþ¾)žÕ¶@¾²Ç(‚ScY²{ŠŸ‘‘!]’±¶žúï€üô§?ˆL Þ¦è» â·a à?uêÔP‹FBñ×ßgÀÀ±cÇ ãºÔl§ê8I #˜k¥+;dóž"hßyŒëà˜òÛÈö»îºk[Wtb×ÀH‚F©8"}¬T $-–RÁÙç`¨XuñlóoÀàˆÇ¡”¾äª4ãÁÒgã±´Ú!ï)¬~¬› Ú׺I¾:M“1/MÀ„€–Ê_ÿõ_Ãü@ú8±zèã-- ì{ Œ£`é‚UÏ.,ð¸Þ~ûí À˜ K+Œ¹îþ ÷¡(ÔÃFü Çeþ¯6°Ceï)ÜKXΜú*Íks]À}ƒòD Ûî¼óÎí]Ò‡ÈßüÍ߈¯ˆÀlLÈ&“½î€¢£Ü1µõ›,žm^àM§E{@×-v¥_ôy"õ¡õQøXøÙ.|Uÿ¯.Ðÿ\”?Œˆ+Eíz] )%Ä#wÜqÇ=]Ó…Ó{Ý|{öl+Ô_?«Ãµkÿ÷éÓ§­Z\m­îÖo|†`P{Á\ºvô;7Ö)ж ¥o¬üPÌKØ¡ÑÑÑTyú¬Îg{]X¶lY,AÈ“ ØzB@÷@€øÚFÖ­[wŽ•Øt²‡(в25õm-žmmîRu|€+ãv1lLÂ{ï½W8^{ÿý÷Óã¬6ÿ>òí³ý°HQø¦U *& ‡âølÑk{]à~zä‘GbQ;å¿¡«:°«.CaW€xÙ³gOš•C©à¢ýÌ™3S·5õ‹*J¥‚¥SÍùÕF™ûRx±Pë1Œ‘y åo—¯ö߶ׯÿý÷¬(L:Iý¹ Ë?þ¶ÛnÛ ýcÊÚJÞˆ¦Gq²7“-»ï7™½7DIPºë®»nŠÍp¡%.ðm+~Ûõ({ß„#E´|ðÁ‘ò¶KòºXÈâ€ö7e™¥o¬ý“:@@‡AÀÐ@1Œõã?îíÞ½{ 4Y †Y.(d‚çÏŸïuÁÍ*ì:HñÁì„#õ>L7?ŸÊÞöº€òÇò Ì¯‘“k§ezOùz²½˜ÜÈâ áߥ\0™!KÛ ±|`H<{ö¬…¢JRACh`ˆO1ˆò¥¼¯ÙS¨(埌wbrÍï¼\ — ×»õÖ[Ç“ùÉXÆ{æÌ™Ti6µ ªZ 6X‚ü¹k×®¢?]+ _–¥d%©î÷ÌÀ ã¥K—¦ÅqPþ¾-|ëB²~¦Qÿ±k=k¾j¾Žgäåoÿöo£(d„~ôÖ6 L,¥‚ûí)†CW= è³ú_ÛR»š áòz4#4? q`¾$ο:ëñÕüð‹»¸Ï%Ì¿X•2öí7Þx£ZÿD]%dï·±QÅ>|8ݲaˆM×€ü«ÔA n`@²ƒå­ôµc?tÿªU«R‹ß6Ÿÿ\¨ù°!ž!B‰’ÁU@ ¼ð £½ßv ‰mì‹-JA@Œ©eÇõÑG¥@àøñãQ§»iñŸ8®J?Öåâ~o2ÿlŒ Ë?RåßÃÆÇU{)°¢«P4¡"CR“E㚘˜H)•«ÂSú_.ýŸÿ†n˜*áê>÷1ÿˆöTù#_O”¿¦ü)°+/¾øâÉî{±‚€º WÑ"$¹T)@€†IìcTxZüGVñ?5)ØK-Éks\‘+ÿ'7lØð„j+®@,À–ÇŽÏœE¬î"$!¹Ê¸LÓ¤wÞy'z…§ô¿úŸùBÖIÝ9có~÷5ÿÆÆÆÒ¸†Hå™Dùk©ß ¢A€UÓ´iD•Žö" D(¨CÔ<t>öšœ£IP"a=0ìó‹i¨ã¼Hm[ò…ŸQüì³ 2æZeÎqÓM7¥~ÿH…T?øWÀös' Ê @Å8wîÜÞ…^XÉJ)c‰„p Wö1àèÑ£éÖ+Yé{ô?ÊoõêÕ給Žá>o2.2Pþ¦Ka„’ý«vRàEvíÚµ9Ùý$Öñ_|ñÅ©¯ï‚ .¨LE†\mŒ‹¬7Þx#­*˜­#«ÂSú¿Y?Qý¤ôÕSÜ‹qðû7oÞ<©Üsýõ×ïP­¤À7Ø:mÚ´Ä æÏŸß»è¢‹J/Xe¬ÖSq¡üßzë­´   M O£ÿÊ¥òG öS¶±Å½TÙ_y啽Ûo¿}*1FI~ǶDùoWm¤ ˆ¼ôÒKßOv߉uü¸–,YRl¤&Ù\]¦L(€h‹ÂSúÿüc²a ù³}Òîsãš9sfªü ø‰TžZ¿~½ûQV^~ùeX€­1ÿÚïb´¥TpÝsÁ(,ôá‡F¯ð”þÿ"µpQú´ç½ì²ËœÄ—ÄtŸøñùG.Û¯»î: úS à@#`,æßA± *¹Î6iM‰)Sï½÷ÞT…AÜmIwëýOy^>“4¾¼²•÷Rõ37Þxc ""þïIÀ„j"ä•W^iÀB"C (80ÖRÁ6Æ€xóÍ7[Yí®-ô¿QúìmÝW6@e踨þ»îº+ö`¿)å¿nÝ:Uþ Ä€±Iõ,#8h⤕* 28}út_f Æjw±ÒÿXúXø(|üû(º6•äµ1.\{·ÞzkïÒK/}‰˜TþÚÞW€LyõÕW[`fÍšÕ»âŠ+ZW*Øæx|ðÁâéÿªß'‘þǧ@Eé7±ô¥µèuqŸÓÚ¿’*ÿµkתòW lîE\# +P†6– ¶=.bN:Õ;vìXº½×½$ú……ϾNO i÷“ëqÁ„пÐAùïPí¢ yíµ×¶&»´á·à .`úôéL™ª»PuðÝwßMK¦ÿ«~Ÿk`C5>¨}>[¿\ý6Ä—Ø”?] Ù·D¶­Y³f»jÑ€˜ eŸ²ÕÒÚV*Øõxlo¿ývÚ©0? ‘þ/ š ”;V½Qø<Æ·ïû¾jCIl,~úpýÚ úQå¯ ZÙ½{wk˜«âꫯnu©`_ã¢Îì`P@¯‚|Pa%2(oØgPöX÷(zÀ$J¨”úÿ€ãkåŸZþ×^{­*qË믿uµÀ¼`]PIÌXm-b\Ÿ|òI Ø*4{¶˜¡ÔÙ°æÙ›ÎŒYË>æÿÏÆxl‹@ÝM›6µ!Ê?+O­^½Z«ü)h ˆ¾Z`Vp ° e TY¥¥LI Á›Çæ5ô¿¡ì;Çæ9cáwáÿ«l‹ ‡l-“íÉoÒ* Ú%{öìi@¨@lýÄË.ŽÒJ¨¶R6À ÿ<…ŒÊœ»¨r^Öz¹Ôslãéw®K.¹¤·qãÆ”‰k›ò¿æškTù+P@\‹’ ŠÔö‚Úöqéujw|‰i_y#Uþ º){÷îm0V ý Ðd±îz*—„qéu’Ÿ€ll¬VªüW­Z¥Ê_€‚€ØÙèâ|@RWJ·m\¾ÿ?›ãjÓuÂêOd­~Uþ º)ûöík%@(D0Ø…^X¸8j*—¦¼µm\.Æsùå—÷Ö­[—ºØZ*ÛW®\©Ê_@gAÀ÷§M›öVÞ\Ó¦¥ÝYÄB+‹®•0Öëw|yýK—.M}ým•äw>•(MõSÐmÙ¿?,ÀÚúû``êæ€·=•+†qéuòŸ@‘¤µk×NÕ¶T¶­X±b»®þ Tyã7Z R©@œ€ËÅ9–T®ØÆUF¹u¹ÔsÓë„Â_³fMÚw£å²mùòåªü¨t  ü Ä5ÐæT.MyÓ¸‰²ç‚îí­\¹² Ëœ**@ÀæiÓ¦ý(y8Òæß‰[€Ø€l9aßʵí%Œõ:ÉOX°`Aªø[N÷#Éoþz¢üwè*¯@e€8p`,Ùý¤í P+žô&MyÓ¸]¹NÔË „/.±ÈD²Ý³lÙ²ºº+P)!àëÂï%m €‹@KÇ™òÖ…q5q0´ëtDPúÛ–.]ªÊ_€JE02ÉŒuå7³@#ï- %p{­OÛÇeîë+VôæÏŸß¥% ¥O¢ü't5W RCÆÇÇ´ÞÚ¥ß #€_´# ¥‚ÃSðz†Ÿ‹{xùò婯¿c²=ÙUå¯@ÅhmÁ ¾7ç´iiŒ`À–k@KÇíwå:añwTñ§~ů~¨Ø”C‡Áü ‹¿ À¢êÓ5U"šò¦qeÎÅOÝþŽQýYÙ¶dÉ’íºZ+Pq:‘&ØOÈÄ´¹Ôlì)omà´ãŠ?MóK”ÿ]¥¨8”Ç&;@ÀXW¯ÅS`¨' ¥‚µTp¨ëD‰ëE‹õfÍšÕå%‰`¿¯/^¼x\Wg*~@ÀÈ´iÓpléòu€ €¸R<ƒ”ˆ¦âu³T0åzQü¦ÑU‡å™äšlK”¿û)Pñ-o¾ùæÉî{¿‘§MKŒ@Qœ€– ÖRÁMÏ…ë Å?oÞ¼”òWé=™€ 'ô2(P (GŽ€ Ñ«ñÛ2Ã0uû)ÊVKÇ9®‘‘‘Tñw IOYÁÚß¶páÂgôR(P‘F{ (ble€– öïw—z¸gPø¤ñ©µޤþþDùë¥P "HÞzë­N *#Ä ˜MSÞ´Tp¿s\}õÕ½9sæôfΜ©“æ|Ùžl' Hýý T…ƒÔ%ЇT±óJ¤Ë)om+L ”>› &U9,ML*þíz5¨D GíT3¡&`ÀÄ ”U•¾’6ó™?¾6óQ !è\ aKVÏP+2¤ÓRÁÕÏa”>øÔ¯_j<•(~-é«@%f9vì˜f 8šŠ'3>eÅW¤{µôKKå?oÞ<òW Ò02YBx³^ê@ »å•›– –Ÿ@uH>úØ«O¿²ì ¤o¢ü5ÐO€JÛäøñ㸾§l@3@ðùçŸ×V”m.ì{<¤ëQ …饗ê ZßêrîܹOé¥P Òb9qâÄhOkXeE @SñìÆ'½a>›*|+’æöÏ™3g\/…•î'zZFØ) øì³Ï4¯W?>öº—]vYºGáCñ«X•'Åÿ„^*”“'Ojº c1`À‚~   ©xƒÆƒ¢§ŸÊÞ(~§Vÿ¶Ù³gkzŸ'±þ¤§±Þ˜²À€Ç¶uàƒ- KeO:ÊžÇ*^_ÿÓ‰âÿÿÙ»³£¶’( Àºì;b{e`2@Œ30¸ ˆ prLwžÙľH ¹ }m¹lÏЮï«RɸütŠòùûtß¾Vý|sxxXŠÓ€²jôN£Ñxú®×ë_¿Có ÿš€ð«ЩfŸïˇÇîÂ!½ÐäÃÞ}øn}/]W «þT)øUØ.¸J¸o…‡„Ðpó ‡…ü0bë¤!ÿ7¿ÛÔÃíˆù~{kˆ«õÖyù³õaoߟò«|³Æ_Q þ×ÑÑ‘ Áà MÿÓúúºçúxq(g«Á„Áq­üCã¯*or||ì!èOú¬­­¹Ð€ö999±-ý«’}>­®®÷#б °ƒ@Y5 çª±ñ{¦€î8==}ƒ@I5 ëÒÐøWVV¼µ€žíœ€Î«ÅÆ_Q zÿ?R­š8(è6Aè\ãßÍ>‹EûüôgH’ÄK† MšÍæŽÆÀ@8;;+žÜV xµJöÙY^^N•€ q À Xõkü ¼óóó|"žpF~ÆûáDÿÎÒÒ’ÆÀp¹¸¸pX~lüO‡ûíñ#02AàCÁ=Œ¦°ÊßÓøY———Ûq"à…CŒ‚pcßîÂÂBE)à9”cx¯ ¡ýØø«J?quuUŠA Lœ`…Ñ~XéïÎÏϧʿBø˜$‰íF³Ù<ˆM¿¢ð×××›…oÛ¦ôëjÿiÌ?77çÍ|Ð0°$Ixz ¬ôj¶âßËš¾Õ>tÃÍÍM)NÂd ¤"tQZx~vvv6Uè‘ÛÛÛ°Eð!a€N5ý0âß›™™1âG€> !üYp^€·Ë÷õ?gM_9`@ÜÝÝ…°e2À+Vú_¦§§5}‚0o” nä{a¤_Í>{YÓ7ÞG€au_ŠA ß*`ô<öC㟚šJ•F3äa ìÒ¡á/ç «üÏYïªðz½^ŒÓ­‚í‚A–7ü/á{rrÒ÷@€—‚$I¶b(«J_ Íþ [ékø @g4|2ð.‚’ªtUþß¡éOLLT•èE S‚Í$IBø#†[íq?ÿd«ûjløV÷ @ÿzxxØŒÓ|ZP þ³Ñ§ùª>üy||Ü#y Àðx||,µ„b Å–Ÿ‡Q-6öZlòùÏ騨Xê·ó Pl™¼k y€èiüZš{¡¥Ùײo%ÐnÍfóg“ƒv„„Öæþu%Ÿ$‰†@ûü+À0m´6€èIEND®B`‚SuperCollider-3.6.3-Source-linux~repack/icons/sc_ide_256.png0000664000175000017500000003773712106676016022037 0ustar dandan‰PNG  IHDR\r¨ftEXtSoftwareAdobe ImageReadyqÉe<?IDATxÚìYUÕÙ÷ˆóÔNÑh3íÎÒà@Œ”I%U \˜›”áêK®¢wo®Ä«·¼¢¹ú¾/•ŠXïEb¥*6eŒåÜ È C "ŠS;!Ž|ûwržþ–Û=¬½Ö³‡Ó½žª]ût÷éuöÙ{=ÿõÆÕj $H A‚ $H A‚ $H A‚ $H A‚ $H A‚ $H AºI&…[0!¤ßñÿ†Â­ ¤©oÒ¤¾èÔc(ø²Î¹·shÊHç@61zìØ±áð4)I&OžÜ×Q辎’—¡àZ8#ß~ûm†AŠÈqÇ'+º(»¬òÝ(£0Púæ›oFÃSÄ)S¦¬ê(»(þx–áŽé°ù믿Þž~€ 'Ç<ô]”~Õ¿›: aÓW_}5fG€q)'žxb[é;öË °Ê;³ƒI“&m ¾øâ‹º[N:é$l÷µAéÁàÀàèÑ£Áo {ää“Of¥¿åwCE#0xüóÏ?>ƒÍ”SN9¥§£ð´š¢/‚Y+x0ÜŠ©rÎ9çôGŠÝï wc\ÊHï¿ÿ~ðøÿrî¹çv=Ý?å”S¨*lŸ;î¸öqòÉ'·"@k§vÚØk›ãÈ‘#c¯¿øâ‹Ö7ß|Óúúë¯[_}õUûÌÏÝn¼÷Þ{£&¸œwÞyTãmèºâ‰'¶•ùÔSOm'œpB[é‘" Îñí·ß~ïwEƃ/¿ü²åx÷Ýw7˜€òƒü §£ø.ÇÅ) ÏÊž¦yÊ›¤ð.ãdÅï….`àðáã&ˆL:µ±«þé§ŸÞ:묳`&m¥/ºª‹òÚ*» øŒÅÿrðsSÙÀ;ï¼³)À8—iÓ¦aëÿ®iJá…¶•þ¤“NrV´¢>k,­qâ×#h0¬ûí·×‡rþùç÷uVýFÔåŸqÆm¥L‘¶ÒU¸¬U¹ÈXZ㸌%ŽEyO„–e‡0Ndúôék[ÿñò×Jù?þøÖøÃÖŒ3Wú4…s¡àZce€ÖXŒÃ 4Äg€I°î­·Þïº1e¼Á .¸ vÊî¹ç¶.ºè¢öŠWSøÝ¤I“¾÷7~WT´ÆJGs,~7yòäö'§B¬ í ŽæÎ⃮ Ð…­´=Ñz¬UcÿÅ_Üš5kV›îg)½¯bU1–ë8.c Ô Èï"Ðî‹®eõFt‰D«mÊ=¸Þ:>¿···u饗¶ãóqÅÏSY%5Ëv¬<àð¹&Ÿ±ä}Eþ§ay9šS«÷ïß? á­º<0”¿§†ÏnÍŸ?ÿ;Šï²’&Mx×ÕÝf,×qªK Uczt<=ßÕo¼ñÆP€†J´ò®mýÇÓ_ùŠâ“zŸÈÝHÁë01Š€!DIw®Ø/ðdô¬FFF4Lf̘£ïá*?“ÞÒ¥K¿“sïJWµ”+Íf®óšÊø~>$²R1lˆæZϾ}ûÖhˆÌœ9“UmUŸGJîW\Ax1‘æç€­2Ø€‰íê®5–Ë8e}?þFÊ1NCj"8W$GsnñÞ½{Ô,³fͪTù.\Øš3gN{åÉòP›“Û‡‚Ç•Dk,Ÿ¹¬kr‹hÁçŸÞ~&AEõDxöìÙ3 &™={veÊ?uêÔÖµ×^›èÙo:mž(>ØfIV”FWÑlíÞ½»kAà¸n½ðK.¹dC4YÖ2aÊ<(¿…î_}õÕíÕÅÖæv] ˧®kªj,qrÊžÑÑwÎ9çô~ðÁP‘D¼’•ÿì³Ïnõ÷÷·m~3•µÈĵ yå•e/ÇÇ"ñˆžPb¾7_›?f:¯¼~ï½÷Ú%½¼~ÿý÷[Gm}òÉ'íÃÇסõýlÆ’rdž]l`-fá®]»ºŽ t]-Àܹs+Qþ¾¾¾Ö¢E‹¼+â´SiQrŽóÏ?¿­Ü¼æ,+yüWü¼ßs>ýôÓöùСC­håk+›oùqÒ÷Ó‹(4M)YwîÜ9 $™7o^éÊÏJ¹bÅŠvˆOVŸRX×ʺ¤q"ªÙŽ€’,X°€U¿Ô ?¼¹7ÜpƒÕ„ô¡¨æXiã`OŠâW­äYã¹ü¾„Ç·öîÝû=0(Z÷œƒ,€iÉ2°mÛ¶ÁžrÙe—õG§'ËüŒo¼± evÇÉ z}×¶Ò ©CÉËd€ °k×®ûtÔéKÁ/@ëµ’eùÖ­[‡8ÊÂ… û:Ê_JaTðÇ?þñ÷¼ãÝqlÆBÑYé 3²*%)P·)¹íïñD4¹õÖ[o¥:˸çæ_€6l%ú(!^¾eË–áeÑ¢E(ýË­’6é@án¹å–ö*PuwœwÐ|V|Óß§xÝFÿm®åýõ×[o¼ñFë³Ï>+­Óq°”艎Ë_}õÕFöhlÀ¤I“+Kù¡ÛwÜqGn:o\|Ó{+¯¼’$¦ï5Í4ÇL;ǯÅåìúÿ¾Ÿ›6 Hïعsg’î¹ë}Ïz~ä ࣠ӳ$`3——7QÏ™ Ø××÷pô ~ZFæí¹îºë®ÂÛ§3 Ÿ…ŸaùòåíÕF[ñÊVÖªÀ†&ú%bŸüñÇmåÔ’¼º @GvW*aÞõN›6­çí·ß~"@ŽDö0ÿÿ*Kùï¾ûî\å×J¥ås/^ܺùæ›Û+LŠ7˜tLÆ6'¤H£Ð²S¡+k¦OŸþFÓº 7 "zŒÓïG7ë$ípÁ´~äök¬îyé½8÷n»í¶¶W_vó©ZñšNÿ³Þ‡òÖè¢LôFP$UØõù᜔ôaí9IOD ðvð$?” e´òÂæ'Á‡¹ÌÆŒƒÓM7µ³õŠÚøÚŠW§9 õ¹("%Ø$BmÙ²¥]ö«Õ59Ixfl3¤ÅÂSd;ºËˆÉ’%K°ûW•MûË,ƒ%œ·lÙ²vÊi“íînd”øÒZ×~øa)ÏÏ|¦LG±òœœ±Ñž·Þzë‰Yºt)Š¿¾ å¿çž{¾gó»vÊM£’„õˆ*Ìœ93“î7QñšHÿ³þT^b÷}ôQ;„èû kk"x%b;&<\}õÕ=Ñ yRÛîGùW­Z•êð³éºk#„ôÈ'šî\+ËXu…Ä© ]Ç7à¥I› 0:€]~™F ptBû°û[Ê™~(=žwl¸²6ãà3hO!®ƒö×á3¨› Ü{”sûöí^!Ã,Ó!}Yœ¹%øVתu~øµ×^Ë6Ýi»fÍš¶ã¯¬ô^¼Ó‘EØ Ywfªsü¾Äïöµ4¡¢¯jX¥wìØÑ>k¦ ›‹ =KÕÏ<ó̦ ×_=[wíÓ^ýYùÉ*++½GTtímÚ¤||V'"ØÈ8Ì8Dñ“V×, þ{€€ðÇÛo¿Ý®ûhJ   Q‰fª°yÀ6ˆ(ËhÄ8f<ýôÓµ¤ ×i<¬ò#醴ҲÒ{ÙücÉ’%ß™˜u…ÙPx_‡tʳëó"iÇéÆç Ô/ð;@@€ÐH¡Ç ?s?æÍ›×.;&ŒçbÚåuM¦‚‘û¬\EˆÐ碖&"µ0€o¼±?ºÁª%¾$úàôs©³1Xõñò×Yt Eé9Xé‹*r‘÷&½/ `ƒÝ»w·óù¡âu2rû)0*k.àø•] }aËŸzê©¡ Á: ?ªN?Âp®›qä5·4•¿ê+«/}ÿ¤¯]Z!‘mÌ_KéÍ÷HW]uU»Ø N©ïÈȈ3p=ÃXx iÏ–ÛPn6ŠCpƸ.[¶ìAí„býqZ¦‘ŠOú0YhU‡»PvÒ`)ŽÁq'“-IA³lØ4¥ÏzŸï˜ø¸v|1ØÍ0‚#GŽT&•†€QÜ\s™ æç1߇ç¢8{z{{'U½ùh¥ÐßßOÌ_5ןPh¬-°Š[o½u Xª wacRG€³)i³Ñ*”^ë½’Ï?wîÜvj4NDñÔWj”F ˜'>yI"IH.iî1=ûG#ætt\@´šý7YPZ7 %! §¨³'/ŒòK³ªœZ(>±f¨~¼O¦‚Ú¼¯ Ð!£Ž¸½A<§,€PR›y P´Æ€ï!MF•æ4 ã´w°bÅŠÞèË j)?4êol¸lZ™$?úÑÚ¶ÌÕIÎ’ãoH¡© 6l  S é}&@ÏÍâž²V@€ OŠÎ…¼9EJ2>ÅLÁ¾h¡Ü¸oß¾Ñq3gÎ|ŒÆZpÝu×µW̬æBûØÿÉY†oŽ=Æ·ÀaV)–¥ôU›yïÙÂvðÚSóŸ¶Ó²Æà>Êóõ˜×(×Í‚¡i D°qÜ@D§û£/õ &õgó×>M®¹æš¶Ó­L_ÚR^q_Cé4•¾ ¦=>S:—å„mb~¸˜ˆi¦ ƒñµ:E ææ½{÷ŽŒ ` o­ÕŸ›œUäãâà!3 Å™X–sŠUŸ|¼Çy h« Eé}™÷àÅçBÞ=;ü¦…}™óG¼øE>oNáÜÄ£ÙF,€]+W®ìNj«?±fbò>¶[ü!Ã(Øý·Ì”—ωwvQЬ÷Ua ”Å4ðØÄØÕBÕóò\›gÁ†§xò‹°Æ¬9hñw¾ƒÌž={óž={Fº:Ûx«¬þЬ;ï¼³ÐË{ÀØnö° •âcÅ—TZõ]黉iàLƒ ÀðØZ,ï¾»6Q¨»°¢ 4¯`Þlñ?”a碠˜&ñ{ÌïÌX|™L£hÒ‘tÿ¤Þ_ƒ±ÉkLÆv©Hœ‹0ü Zu»víz¼kà®»î"çÿÿh­þìäS¤Es^Ë/ªû’bð¾ôŸ1ñQT•a—õÞxµ Ž" íÅD‘ƒ{Ëx1i93ùGX%ëŒ4H3Âmfn¿–ÖP$U€Ùª•-¨D  ^#PJ9ptÁkµÆºüòË¿ÓfÛõÁˆã‡ì3O“þ3Ì~³è§V ®ù;Vos7Wy^ËêflR‘ù @ùù_)xªŒ¢ÄË|m=ô¾¥Ê€7ßEêý5¶`s“–ã6}#³J‡¹?tRŠg•z:µ¾[àMÈKïµMüa…&ÙÇ%¦œõ~&+“BV¡ô„° ›¢ø¦Ò›J-ãúL@È{-žmù@À&Ç„’޼ÄëÅA—ÅJ|”>þ^"7šùRº ÐÙΩ$1iŽ‚/@I(ÔM€U‘D7ä7ÔgÁ‚j¥¾<¢iÔß5Ñ¥ˆ·ã*»Ø…Ãfe5å7'aÚ묿Å_Ûx¹—”û¢8(dZaO> ú ЊÌ×1ÿ=gîNì ¹G0C ?@Ä^_ÙAãÃ&@¤°ÿKËùgÚþ.齦`?J¡V,[ÚFù]=ýæ¢3ÙYqMúí«È6«ZÞk©»'¤ S@’Š{´Ã›\V± +ޤxáJÙŠìÂLá¾àPãà;`ª”•ÞŒ²;wîT åÊsp]sNÌÏãû+Fv¾öÚkÃM2ÿ¦ù~I(í·mVwÇ____nÌ¿3`Òåíèc `O³âÓÀ"+ÂQ¶"û ö4l€{…ÃÐ܈Ä×0ßÇ3注$ôÍ Ÿ1„Áøø$/_ ש‘À£€5kÖù÷_(]gâ¡Zi3BºûhxŒÅ^V± «E0L¾¦(²¯ã'ÏÓô_ø˜I÷”‚+òÒª]À€gÄ\S…a¡» G íÆmÛ¶©dNV ý­Òª÷ÇûŸõ3Äÿ½)R‚ë;âN"V²¬#¾šç½Ç\õ÷íÛ×^1ø»6þ?6¯mß—ôÚõ× °•˜€€OÅ|/ÏpÑl&jæøÌOL=%?À2 ÝU©ˆnŽ ¯÷Íø&!Î:_úŸ´qdMúߤ÷¢ü»víj¯Y¹ø¦jSÀ£™÷oóÐH«?È»>ùs€ÒìgŸ}v¬â0-÷¢HMT›ý ‰ øš\§lïk–Ñ×À\è|Xw#|¿øÅ/ ÿ?Õ ÿfì¿h¼Õ‰I;ú/«©oZ¯ù?Û·oOíJkþOSmxíëÃ9Æó§xÆÇþßg²ïØÈS#/€ùdã ÌKü©Ôè´xñâW"ÙQ+Т"Äë³6`ÈsŽÉ„dEáæÚäóçM ¡Æ¾«‘yfBŠؤ¹ Æ ¯“®ƒçp§Þ碌 G#«®¯ È5ñù`ë˜63€Ú A÷6Õ ýZôß5áǼɈh8„ªk–õ f2V­ÈÔ`n@±Iláo²šÉŽ9Øãü/:+2 *™kEÙ–ú'IމU¬Èœ±} ‡Ix‘ÕËì$‡˜9\ŸT™]ƒÀ@üyŠìÃ`‚äHÏ|™°€¢ ´pÈþ¾~@„ÔhЇnذa´Ð^ýmnní2qúÒÉÆsél“äôÃ!U6µfuÇŽ–pE‘9»ˆÔøÃ@@r4\®ÏÖ±‰Sphhè;w¸0.ùP|3…1åí%eº  ã)ê,`S]Чñ ¤R*«»Š í’öK¾ôŸ‘I¯AA9ÓÛEò±‘³ŠÂg`^ÄWw-‘:îô ,+BÐÌ™3§õꫯz·“…ÕÖÜ"Üõìã0ÿ@š5k–Æ£é«T€Ò0¡¨ÂÇDÕ ÿi+Ëj„MK•š†œô§¢TÁi+}šH¸›˜± Ç!Í[p–IE¤o[1XæsÏ=ç¿Ç®Y›¤}»þo‚#°Ux3ì3V“´7¶B޹ý—5-´T”ìSõǶǬ€YøÐ|‘•Ï.ñI2Ïßÿþw•^‚ôæÃ§¯îsY(â,ÀÅ `nW‡#Ð9ðþûïï‹hÕçHj—dN›ª?¡yô_šl&e˜ÉûlÓUñúã×®Ä#‡žÕŒ±› yYz®Y†˜0"éÕiÙƒ€”4èôÍ IÚW!oŽ&½ðÕt±r@cMû?+njcH?~ßÌŠïîëb H¶Ÿ¬‚ZÔŸm²H$*ÃÎ÷ZI £éؤ¢ÿ†ÉÊ\Mln"1>ÎaÓ‰éê«! d ‹ÃU€Šдÿ]o¦lláKÿY©$öŸ5™lL¼ñLZ[êo£(0ŠmÛ¶ÕB÷­&St]²?VÎ ‡âò½}M BšÒõ×— øúýÎŽ@ðvò@âö¿y3³6^ˆÛÿôûÐl[åcÿI«¡«ÌÊÍߤU?Ip JW]­œ`Ë–-^{ È™H‘F¿’mœ©0N@©.G`­&€l£œwòÒ+bÓÚôßgg”UVð6? ÐtåaBSëh¤ Ã,¨î4黫)P‚íCÿmÖ6!Bž’ú_8˜Ýiµÿ67Ò¼™0 ßðÏ ÿÙÚÿIÇf-²úgQè*ñðnrû±qÅ(Jýã÷‚0+·O(¡w  ÐhãÂè]Q8E~ûÛߪlü! ÀÕ‹*{Ø™}à|¼ÿqÏqZý–7š*i¬µû/¾øbnæY…gcî•èÛЄDÙÈ·—`ÜdtY8ÒV÷¢‡8}t²2À6E“„šVŽj»£6ý·Ý$í5I9¶qæQrõ5Õé—'²mšMõ£?„ÿøÎÀ.~3Í×od>Ç">ó3}º?Ǥ§Jè׸b@‘›—ô^V_úŸäL›DyÕÆ—úcJt»ð|˜ä’8ãŠT ¾ð ÞÉYE@^›ø¬*oqƒ-*:9Tx_­l•äêA!YÄ—þ3ÁÌ 1×Ýz¡sâüóÍûÇQõïÇ_ª}W˜!/_PäY3–tù)¢ôæ{a%Rùè³pÄÍU׫¥Â j@ô0¼C€Bÿ‹(|ÝÂþ÷¥ÿæf.N?y͆¦b»8»dõ‡¢v»ò›,€B¡ö>é°iŸîj È5Qgà³pølUo @ï9è Ë*€²€­ÕV…¤-§ŠÐšehôýcBiäý‹·» ‘Zt&¯Y ÙÃ_ r…T¢06áLWˆ¼³Ñ7Oƒïln½æÚ3ÂÖW•µ¸Á¦NÚ= @#˜Ô ¡¨#EÃû/Å?ö?•¾ÔŸU²^ma²Ã*pÈáœCñåŒÎƒ}Lz¶B‘ÊwÚ-ÍJ|Š¡> Ò6ÎgáÈJ .bÈŽAÝäôiŠè"f‹& êfv£u5LוúóågBhyþ¥‰(>÷,æYšŠÀ(ÄÑ2Cø~€«oéðãS²ÍüÓ ÿ¦#°(“5çŸTT‰øvÊÛ¡×ö›»ÀÚL¢¤÷ÑÆ*/ùGV¹¬Osõç{áL„Uˆâg)¿y†íß¿¿ÝcQ Œ0ûðÅøkØ#u.ö¿¼6[Ðù¦'ÍÏ"Ñ-ÅH@÷@ZÂOôÄþ×@q_û17øðÉû—Ým}E¶SÉFñã¿ãz6 ¶4˜€äløV JB«ýï¢äYÝ£ÒîMøöÀPafEÿá÷¿ÿ}¿ÒÖF™À`;†/гJÝz*é}ñí½\jãYµ²þ ñ¢ürPx•uN:˜ÜZ ÄXÔ øöD1|·jÃèKÿ‹ì ä3×mt³t …T¾ùÏñ$ WÏZ-lWqúF´|`ïCáQlºŸgˆªÁ`mò=];!§Ñ÷¢Ù›6åã6sÊ%ÈXVטZZÄNJ»™¦#ÇÅ%ße™¿Ãyæ[òK8RCpàÅi¿­íŸö?.Ûb%‰Dn|Ì®'o· "QŸª@ñàÛt®B¯J…„…ï|aßNÀY€aó€ã%ÀE”Þ|¯m kr›[„ûxý­Õ_ÎZѡロ ˜~›"Jo¾6³ }MIײvGK¯ºŠ”¥ðEQ¼èïâ¿— ߦŸUÏsú¹‚‚Ö$•ïë³ ©³ñ çà ŠÔ²¤éÁ„3´Æ-Ò¶)ËàÓdÂtdùôû—VU4»(í·yOZlÑH€m ´¬×æîÏ>¦@™MAŠø&¤À5dâ²ÊgýO<³¬¨) ^eߦŸY!¥"÷5‹þûøÄ×á5á:ãøn-.÷ÜÕþ÷Qú4`ÃdÓæù„€øÍ)Rà qpµÿ³Vÿ"«œÊ5öõ+ªèy Òú€8^5ö?ôÍÞ,Âm§kY{Ñ~ã–¸~ŽÓÊjä›âªy+½+h˜(’víÛ+PÆÐº°F@Ö\>€‚€}i[’ àºr°âÆ»¹¤¸bû†¯H (hD)d£­Å}CEŽ4%vi ŸçÁ°ôIç´íí–” \ÄMI\ûý›ÿã+æž}Ú>­<Wêo¾6kâæ˜-+Јä5±ç,~i¦ƒ«CG¼Ò>N¤,J[ÄÙEb“¯’ɤÒÎຠナA$)阜v/5ìÛ BŠ0s «LíD ?€Ä¼5Ì¥o)yü®)®ZUw8ꈓk®þÒDÓW¤ö†ú§ÝKÙoÀ×þ7wre•ÜåMÚopB1(›4ø„³ªøŠî àjÿ›-¦HLñIqeÕÖ²Y-a7«?JK­ƒF6 Ù2Ý5 ÷9í9iæsÅuIg7ÿ‡n@]S ø‡?üaH»ŠÉ¶šÊ¶„¸Èƒ”Þõ¾ýæ¡ïEúý'€ÖJ@à $­Ê/«Ð|×µcÇ•kbÅ•¬É"ûÄï%fD^õfÞnÁ8$5è¿M¥kÑ9îr ›¥3-`k÷dÙYiyEqÍ@H|S\©–Óp¶¡4l]rÉ%Îý¤›F‚böLôÙ6hD–Ïew'×9$]©|ô£«|Z“ýÚó¨R^!…/Š£¼BM‹(}| W-S€Õ{Á‚ms ˆíÏ*Ë–dš¾ Ì>ê/£¹¨möfÚ³“¦oÀÖÈZÜh˜Úm0ÒòØ ‘þù.€ÍUN ų²óì„fš¦mëçÆ”ÐtqXÅÙ‡qÆŒíVlY«?@H+0VkV}­*@¶8]"ñ{&Ý…}²7¥¼ÏÂÁYú%øø0µ`¸«€ Q”MÄS…óÚÛ>`‰$øšt˜Ùøn‡ šBÓRy4æ `,¬<(=á0>¿£’N¬)¬þÒ3¡((š÷,ÎÔŠ(½yާ4»Î!³HÊu“é˜ì)£U€Š  QF)›*ø 8‰ G’í^´¬]¶Q¯K\÷ŠNÔh³O&UV(°ÈÆK »˜Ø×ì꫱6¬ÛY€lqî“÷/cõ×°ÿYý5º±hø–µãéJì»pÄw·r© вÿ£Ïvr:AÏ<0¬‘¹dzÌ]²©\£I˜Üù¼Ì1›~ó8ð8l³ÜòÞ—”hÒ sù÷¿ÿí”™´w{&H °mßÿ´÷‘Ú¬áý;L]²û$À÷@'«d*¡@ª¯Õl/åJÿ&]beë*Ÿ"“‹/¾¸µeËïBåµ´Ñê&yî¹ç Qÿ¼ÎU—îÍqöFøOXUô߯`ާ”4R©@|‹&øšìˆ+f}úÍc@}ãնήøë:SE]•ŸP£õç>BÿmŸCšÉ†á¨AÿÉØôMeïvðâ€*šá?“FÒU}²»Rg}šLÈ™M5Ù›O£W`ŽÍ4ÆÀgÈâàÓìCÎyõÿ¶ GRåžK'`Eú¿¹6}4¾Ê#ж° ;ðI F‘@yJh]”>þ;êð9Õ‡ú§1Âd8S™ä\7ׯ]Õ'õü¤ö¢øi+½õg|)ª*ªôIÏÁtþùÒÿ¤UÛÅЀh¬ZÀÆ—¤÷õºj¤Ïž=»]Ú›µ²ØNL&öe—]Özá…¼©P0ɹfÀðeÒÃãÚ}slòþ_zé¥ïÔëûÚÿ6½ÿlé?ŒÎ5kþ_oo¯ª ~ýë_nذêóu$a£‘]e[R™F»´¶|æAsÀ\)¨ù^¨ãÌ™33s´r<Þ$½ð3ŸŸ€È¯y/à ,E—r]e¬˜˜<S©Ó\ñ)ãÃ0¤é§-øfÝ{¾‹4Wñe‡Ì‡¢žÿ¤9Ê3P2׆õ«_ÖÂ|Áé6gΜÄIQ;+)eÔ`°­¢d²ùШ·¥Ö(7 ¤ÈI¯ó^c”$vC«/zh4û”×fÞ¿/+$\V÷_$¨)«¿à„øw sd¤5wîÜÂ7³¨/ È™4Mª‹˜yÞh@`búÔÆk2†´ŒÃ2Ì”´k ðúk(½é·0ù>ìÄXTÖa¶Âh‚°mžúðË_þr“F5tSÒ4}z¥‹ÍíCÿÍóüùó÷(R5ïÂ… ۹侕‚¶¯}+ñ4ª³úýˆØý6½ü³î­óçd5æB$'iQ*zH/F A÷j€ÎP¼ÌEJ*Ó"I \ÑŸÆÃÏš˜y%¨ñ‰)NAiE¦¥¼u+²Ëõ¡ü/¿ürÛN·Ý”Å ˆ$Ä;*¹2|%IJkq¡RTiÓœMº«›5¾”tÒɲymX£:PÎôÕ—’\W¥\ìB˜@ÞêÖtEv¹>”ÿ•W^£é.JŸv%Š Aÿ§OŸÞ~þy»ú¤-Hæ!ô_áØ¬¡»SÀþãàý5£>~X–ýWdU`¬Å‹·ž}öYµÄ1UȤtï»–=_f¨QËßÀs–’iß?i=ÿµèZ’ZQ?þ$¥ì?>[…¨d‹üõ¯½÷Þ{WE7`šº%Uº&Ù@4kbº!" í¤óvŽqa¼ ”ÕÌUOJo¶ýîæ½*úÚõŠ\NÕíÛ·±‡¬{Uôž2f¼ŽÃ‡ ðlÒŠÕŠÎÏE‹‰ç~™Ã?ÿùÏÿÔ ³šmÔP~Â@E6PÌ¢].Ý‚³ÎK—.U7d,BC„ ë°á]} .f ÏWÊ{56eÿ]| ZôŸçbcrfý=îý÷=Ð5-½U+%ë8%¼Í(!yàäãçQ®<ä…n¢°ñD×U@¹üòË[Ï<óŒ·)ôwŠ5ÑG€UL+¯¾ ¡F¾ÍR%.ïÓÖ+íŠlk3XùIž²ebñLTs޲I«Ööï‘lÒH-aü/ùËèš5kTÌ&‹ ¯O¼U<¸€mã쉂2ždÚš¶´VÒM%6^Ôìi"õÇtÂÁ›–Þ[ÄdJ{oœ!øÒœ´yåÖ¶àpõÕWuö<†ò“ŸüIKoU‹É£‹{$:mðå"•5©íRÑTai¯íÓ >~&ŽOn<¹ .+}Þ{Y9Y}ð;'{ê••üScmÈÈ´ÚzåùT4¿„~‰Ð¤I &ÍOœD”äM¬ ›”Bc½õmí­¬ð Ô+žàë¼á†Cx¶-ªmÞK4„JBIAm‚ _i“Þ§;}¤!ÛÞƒ¼0hÚ{mž[–ǪO3›°žÍü$çCK/´âÿê&òç?ÿùhDOz£‹ìóý¢0’&’†õŽË˜y±á"à ‚¿Âl4aCWóL…øÏ-Ë‘´öX®4ÞÕ Hz(#•ˆ(?ŠŸõ|£'r¸ä{佇”t¹ß¾í¿ñƵ”ð¾ûîû¿š:«ÞO*ºÈÇ£ÓZ±è6ƒÓ-­P{%Lò*Êœ™$×\sMkóæÍ¥˜æßù®R¡H¾‡dºùäýkä p\OÒŽ;Z…TI÷ÉìyPÌÓî/t½È"“ÕÇ‚ù«ØÒýqu}m• =öؾèK÷jŒuË-·Œyb³@IGœ6Êæ’6ôÒæ÷B?ñÚÓW[éóì^)Û•œw›J¿¼ª?Û×’nËg›i¼E¿“«ýòËêŸö\’~Ÿ÷œ¯¿þúÌù–4NÚÃxÍš5Z‰?#«W¯ž¡­«¥t”Ĩ‘ˆ`G’…g“ø’ç aÒ`·K{¨¼$"Û3¦ “°™ìZ!0lU¥DNptrû^Ûq(I6˜!fú®Ò»°˜œvÿÎôkÇ_Úœ* Û¿‰Î¿²`P hFÆ''@Ï:+WZn€ëd2A@£—`Q ÜdOBjwØÙPÿxhMßÈ´L":²òkør䌭Nÿa>aO™g€¢ v ÜsÏ=£ÿó?ÿ3¨å  K i”i¦¨?€¾yĦÓ<È®Ì@@€6ÙZJïš#9éóÍIn*yžƒ®LóÆæ>@Íù^¶Î¼"1B»æ¼*:§âׯlûÞ}÷Ý£]ùK&–ÕFÉf#Ʊ/Ý¡Îx¬mWù" [yúé§SÓRËRz-­CéóþNH4oåw¥ÿ¬ü̇¤÷¹tªfõ—îVJòPYz:¹¬ï¼óÎiªqPlÛž—ê[t›:òýëý+Yý+cÈ?þñU@˜…’MÛ-Éöà àkgf­N€ÍÖ­[Ç|š j£ôMaØË€¯ü¬eã'Ý{”šî“Þ›4§.½ôÒv·(-aõ¿õÖ[—W¡—•m.?yòäè´Ok<òï ·å¡n‘TañââkàÐ3eub2Òùhxx¸áðQ¦*”^“i@÷Yõ¹ñFš~fT†äœ,ÖX@AÇÞõWNúa¬ªô²2€üóŸÿ¤YÈZ­ñX=–,Y’‹èEýÒ–Lšˆh{ “þŽ’qW¥¯:éÈtDñ…î—aãÇSÓKºûøØúñ^·ÝvÛXÓP%\±bEe0¥Jˆm]tZ…É­1•p´š¢}X¢ñHˆˆ•™±¥SoY«“ˆ$ Hî@y÷šcÖ#ÚwÞjÛøI+?~f3WŸ_“MÂà”cþ¤û®«R'«òÃ6nÜxt``àd|Z™RØëØL, *äìaòP9hî-¯éœJ:“ø0±ÈMäâyúy D´šmd͘² 1ß…Uß쯧©äYÊs.©©L‘¹$´®'¥˜ñÇñ§åË—ÿ½ÒE¹UƒlÞ¼_@¯‰&N˜¼!×ãÀí>eÑÿ¬ßã,$lˆ³PeU¦€ÓŒÉ{&˜¾4ÞåÿQ"EeÌeõêÕj!¿ŽŒD pFÕº8¥è89žÔrË–-ßqò¤!º‹³ï1c hÓÿ¬÷1Ù˜Ì\l0 ·>ÌGÓðUzü1¬¸(=ŠWÞ²XSÒµPuÕUWe¶Ns H´Jk‡üZt±U“<õÔSªA¡eTvi¤u&……°Ë‰ák8§|Š0®‡ UaUUøaª ôrHã2ÙÍ=$ëRêú]Bzys`!ì§,ƒ‘©R L© Ä!{´ÆD!X…p¨Ù†qЬŒËŠŒsÐf˱²™Þg@Ovĸ´éÂw¶wAQ¥—Ô\VvVx³47®ŒUÚøñ°*ʉ¿¡¨Ó×v.@D¡¦DŸW¹ã¯ yú駀Ǵǥyˆl0ª•*l}0÷ ÔZáË5 Hd­€’/á³*®Ý÷;sÍ(¿yíEÂz6sGówÜ¡®ÑØ«¯¿þúMgžyæ±NhP/´qÜqm¤²¨`Q0Ç"W€d$Ê”› äEÇ«ò³Ê¤ÿØû„ãÌ0ŸKCϬ¹€òSÚ­ìôC6]{íµ«ëÔ¿)­úe “"¬f ðñšÓ“-¾!Hý³Kä[“Ôaüfϼ:©°íxU~Vÿ‡2¢ø’b³H–ã/m.HýF N¿Ñè3êV¾Éu_@„€£D”ã©mº»cÇŽïmeÛñE~Ÿw`‡Ï›7oÌäh’’ku8*óÚ]άÈ+W®lWô™ÏÉåùeÍ@æÖ[omç0hÏOæ©Âi´’|Rˆ›Nÿ]šš4þúØefWÆó‹;YW¬XÑÞ(¤Y¿téÒuMлÆòüóÏ¿úÊ&ŽÙTÒÕ^¢ˆH’vêVrM»»n€"C²Wšs·ä=CV~”_ª•exÉ’%—7Eç¦4 Œ!Õ;O>ÿîÝ»Û6{šOÀ¶«p^x‰,8V(rúùL-ß@Ývw]ô_ªí.¸à‚T[¿ÈóË{†¬ü7ß|sYÊåh”ε&/¾øâÚ–ÂãIBAŠ€@)¢IU…˜A7Ñÿ*˜AÖßQDL7^Wñ¼01J\ùÛï+¯¼r0@޼ôÒKG(ý»2Æf…&¡#)sÍÇžÌ BȬ½n»ÙŒç{í8÷®¸âŠ\Å×|~(?)¾%Ùü|Æúè;­kš®5—_~YµƒP˜diL o¹vöîÝ;Ö°ƒ®`cóY4{Å|‚öûÜw0ÇhúûûËTþ¡ÈŒYÞD=›ÒTˆ”Ÿ‰—µv6…÷½Hz/tŸ~|vIÊ?Ò™ËÍÔ³Vƒå•W^é‹nžºSP€2šÍ(5R…ÓºÇÄüâ,$<ÐÛñP8V{ú:J[0{^äù‘:L–2üÆœ~Ñç,_¼xñpGÙ²eKK±t8I( ‰ï@ã›*\t,rôa%d Æý‡ÂÏ;·½òj¤g»¦÷RbM;¹’eùÂ… ‡š¬_dëÖ­¥ED°ÿˆ5ûvv±MããD(â1Á ”<éÿ0µP|Û^üeßs…PCP² D g°éºÕ€lÛ¶¨ÀÃe~6:l î4'¹ïQt¬C‡µ6-¡ú°è?É:”)‹â»Þ'…Ï B‹0Ù|¤DY·`Á‚õÝ W]Èk¯½¦ÞD$.¤ “ߟ´I…fª©k2õþ€g:5 ð(·¢øiô¾ªû”4-ÊØ 0©? ² Ο? [tª«Ù¾}{é &9‘m'¤æF“ycI}?­Ä)K 8—IÿQtž{#Ê/ÅÕú~E@ k,:ø”ÐÅ'QùçÍ›7ÐMúÔu€ìرcäI“Jòhe-…DIÒ•¢ÆÇò¡ºñ±`„ô+0_g}&¿3•š×¬š(}V“åuùŽ>ã`Ò±êW@ùù¼ÁdºM—º;wVÒœVXU¤£†CçÀáȪ_åo+ÿܹsºQ¦t+pÃwíÚÕª ÙTùaÀ'I"¸hŒ£9–k§Ü2Ç*2«>B°ù«nVþ®dΜ9$ÑTá€BckÓ7ox[e°i^i« Zc¹ŒSöX6ã`²°ê“UX¡ ^rÉ%ݬC] ÈìÙ³öìÙS  ØÖäôcH™Vª°æX>+rY×ä3VÈXfW¦*•Ö¬YÝ®?]"W¢ òpŸ‡ ‡š´ÉÎê;Ø ´¹¬±Ê61aì|µUJt-ë¢9·~<èΤÖ8’}ûöÁ6Tý¹D °=óú ”Õ¡¸¬ðY]×”—Þ+%Ý$Õ ‘©18^tf\222Òh5ÞS@”Ök@+U¸Ê±²·¬Tè´CúôéuL-ºù¬îííOú2îyã7ú: Ð[ÇçcÐݲS…««îkâ^R.\“â·×”ÿâ‹/oº2.Ù¿OúëºbЀAÄ•¡(U®b,Ÿq|Æ¢d˜MQ©Ï¨QXñW_tÑE£ãQOÆ-ˆ8p ´öb¶‚I@˜Š‚*S…}6B­óšH1Ƴ_V‡žξõ­Ïú1îyóÍ7q>¬¹©«5¨+UX+}Ys,˜N=°¬YñÛv^xá…ƒã]7& ¤»‚¾FÜøØn61]Ûž]w¨"$Áª!2Ì–] O½˜0 rèСRv RZyjéŽSE×] ¥‡Ú£ôeõáóõçŸþº‰¤: °ªÃzš Ò^;Oá\;—Ùu7>ÉR(=ç*=ÒÞ¨3RþMM&$ ï¼óʬjòuš`ðÍ7ßx‡ãÌ15Ɖ…:Ob ŸW7ÑAé¦N::õ`€ÈáÇWu€ §®W0@`"ßÅ.]wIÌ!ÔÉY²!Kì°«¾ê£ø‘)²i"Ïÿ ȻヒòãXÛ­ßÁd Òv\”–½ŠØñ(´é¬ceçà÷rîbŒŽuçwÞèDŸû yï½÷ú;l 7Üq)#¬úçž{îP¸Råý÷ß0:=Є¼ *f+ý#çœs΃án°’>ø mTÑq(H©ÊߦûgŸ}öh¸ ˇ~ˆ9°¡¬Jƒ”¦øÐü³Î:k$ÜÞ2::ÚÀ[5±’¡Hùêéé v~}ùè£4XñÏ<óÌ øÊ—O>ù@ÐÅŽ‡N?ýô øª—O?ý´·kÃݨTQüÓN;-Øøê—Ï>û¬§´BAY‚²?‚òŸzê©Á« ™räÈÒ‹ï ¬@uµü”SNÙnE€®‘Ï?ÿVTÔ;vl¸³Úo:ùä“Ãj »åèÑ£½0øeƒL¥ßˆÒŸtÒIÁ¶0>å‹/¾0XÁª ®ôÐúÍ(ý‰'ž”>ÀÄ“/¿ü’%ËZÿ )ŽwvÀ*OÌ~ó 'œlúALùꫯðôwÌ„e@èÖ¢¤ÑŽÂoîÐû¡ã?>Øó‚‘¯¿þè5@¡·Õ¼PãHçe™2eÊpxz‚”$ß~û­°ƒþί–uÎ=%˜¢à­ŽÍŽ ±ÊOž<9(z€ M•hEîwš“& …»$H A‚ $H A‚ $H A‚ $H A‚ $H A‚ $H A‚ Òù i¨ö}B(IEND®B`‚SuperCollider-3.6.3-Source-linux~repack/icons/sc_ide_64.png0000664000175000017500000000640112106676016021734 0ustar dandan‰PNG  IHDR@@ªiqÞtEXtSoftwareAdobe ImageReadyqÉe< £IDATxÚì›IoTÛǯ™ÌL3ÆÌ Æfa°0bPð‚g –†UvùàOðôvÉ g•%f…qd!$@Ð 1c°3fž!õ;éjUWßžl? G:êîë{Ï=Uõ¯Õ©sE?ÛÏöÝʾÅK Ô µ_¿~­ä3u™ÏDê{¯ôdê{²¬¬¬›Ï/_¾´ÿO* ¼¼ÁšDà_¤7AKm½¢ŒvéGä{Ûû÷ï{hŒ5ªJ>€ðý:§2P‚(£åõë×]?”‰D\zó7ñÛ²²VÑÛÛÛõÝ0qâăòñçb,>nܸhذa¡‹gõ>D?~ ŸE"â·'Ožü. ˜6m¤vÈZV1bD4eÊ”hòäÉј1c¢OŸ>Ýß½{‰Ï…È{òMÒÜuÿþý®o¦€ŠŠŠ¦”ð±VŸ4iR´páB\£$¡su”ðùóg Ÿ,÷ݾ}»­TY—ú@UUU³„µ¿K.=²]P­]»6Z²dI4räÈ÷}Ü„÷ 2$rïf.{EáÝ ÉRÆRÊÍóçÏoNY>£áÓ«W¯Ž*++ÓV¶¹ú„ ÂÄ­•…Ù£‡æ}Ž®hÀ½bqHæ]»v­uÀ]`ñâÅ0|–ðÓÐÐ&ä!«¿!¿yóæ>;vlø»’ý¤?xð ºsçNtõêÕèñãÇYcéø4xeèСqÓÝwéÒ¥ÖS@MM >Ø__°`A´fÍš´5íD¹†+Ì;7>|x†q‚Ç]{öìYÔÙÙ]¾|9¢U€¢ %Hþ*w?¾­ß°jÕª*æƒ.=Ò.ˆˆ6oÞ¾{–^¶lY´}ûöhÆŒÁ_­rìg¡k(qüøñÑìÙ³Ã5ñï0¾¾Ï7oÞÀ9v~òìåýÿ¼wïÞý~q€ vس= ¿iÓ¦0IëŸXbÆ ! ¨5ãâ=÷–r -ZÜM¬½zõ*ýNþ&¹@PQÇæg)—­ë³ ˆ0$|ˆÛ¹sgìâ¶mÛ1y8óÉdñîƒ4G&ÏóÄ{„xþüyÔÓÓݸq#ço߾Μ9Р.Á(J"Tà"×ZŽ?~°d±‘ÞžµÖgâ{÷îÍ <:/®­ýo>äý˜ùa=” “Í×¹çÊ•+Ñ©S§Ä)áúõë‘$?JÀ(ðnçr„ºööö®’8 ººúWð6Þ666†Xo>º~ýúðwë¿+ir4kÖ¬ ¸B‰Ž¿Fäö#~„·cãó/^¼H+™kú,ïµ9‚ -!¨:R´vìØñµZRˆ6nÜèWÑÖ­[³ÜûIaÿb„ͧ3}úô ÜÂBwÂmø­|.°¤(ó«•üào‚š¬åô ÄwÍÛŽðV!t²>>-|ù *hX ÿö¦–ƒÁµó¼Þóú<|ATA0Kð Êñóº{÷näçLE!`÷îÝ ÑØ_lØÃúë֭˸ø®áI×BÓ'.ô—/_ȶÔbz4Œ©åPŽZÛf–dš’ôêz(J Æ Ô(¦Jò’¿J‚ô./äÆ&ÑXÂ[Ÿé`ååå!úðŽJVj=ëæÍ›Á*L<Š >QŠ…Ì,"è¼ Ôñûn¢KÊÊéyÞºuË£ l]@&ð‹…%„ËÛÁIkuÚ5Ø ãŸ/^ LžKà\×à+Ve«B鸉–·†U](6beA¶‚‰ Ðà“Íö´ãwqÅ ÿáù®þm;h`²HXEÏ!lGGGPŠ^Çý’Éd\#Òè<¬%æÌ™“ÝórÀþýûD{²¡¯¾¾>@LC 9sfFÚ Ì5F«ÏúŒM;IŠarÊ jyµžMu¹†?ãF6:p˜ëÚ®Buù oØXWW÷ï³gÏvÅ"@4žUÝÑ%®²=Ö×—hÒBè±–cEG·–GÀsçÎ¥Wq¾1žr€O‹¹Wd•¨×taQ`Ý’k¸^ÌjÛc TÚß$1þ¼4Ø—¨õU|Êz<²t²:M‡ <œ×>!@Í$É0Y-ê\R$ž8”@Nbmš“<HBü€ø+0ÔIa+,h EµÖG!À=Îò9ò@‚Œ­Ö%3ÄV1\óhQ¢V¥`‡‚Úœ p9tð=«&å‰J –!ÜáÓöü×.Rp)”G dR^j¾‚Œõì8ä ,šô]>1Gõw·rKQËa­ÖüRUWmzUšõK G¶&Š2ƱËY¢ KÚßD¸\ÄϹ$<í`ÊÐÖÿ©ëÙIò÷¸"‚Û®é³mšáéXd‰ž[|gŽðˆ­8$Šv Kª¾{Èù i"cóßÔò¾“ئ‰•»P‘E]À" ÈR]5© °(ÀJvRð„WŠoD¯„¸û<Áâ:ö·nšÄ‘  V.¹Þ›í6[R°a&.[ÃíjÐû­/_“"WTT¤•Àó,wí^Â=zô(cíéÓ§ʆ_< l2•Ã’E#6· °1ØBÎ L¨óðU[ dƒZ&ó!2.— ò!×#ÚZ%Äš£tž­–}¶4 0ŸhÚ©ÔØZm#0þlQP`/sŸK" Y£Í%È,}Xô°ëýDr-/º-\‰¹~¡ÚÕß@Øæš¦"€w•b”€ð'OžÌr7YÇg½%Û¹èúßÂWs)ww>dí«á‡T‚ãÜ@}žT“…‰^Ób„E½?n#ŸGHÒ][!¢ã*ÝÝÝãÀ:Uó´  ~’y«Â­­­Ïl¬d9̺Ü×ët}ÎwHíèÑ£YËáÓ§O‡IM».ç7>é‘Ì0iø&î>žgá­:5,2¸héÒ¥á]1²_é2ÌÞæææñ…êœÉi²YÛÊ•+óòÄÔ .«««Cy;.yáﺫ£=.ÉbЯ6Oç ÏL:5Ëÿ©¸Ø^LAäˆU&ükUƒÚ… aaiîµ~Oi XûõA®Ý Kp+W]V+ü}v)×£"ý*=aCEQ‹ k…Â×p•cÇŽeYtà&U(•E±Üç>ŸÒ¨ú0[þ>’ÞV°&¸gÏž^”` Š03!È–ž!2ÍmÀÞ .Cm×ü«ð]‰%BhŒ‚ SMx|×ß*ƒ0§5KíT¬Pº+ж![Qû¢¹WL ‰‹-ŒÚú¿J Š¬ _ç×’¸F€1tií÷¸žÑwÙMÓšššŒ9ÑÕú®·ÄâŒ»ØØØØ%µZ IÑ*ØákXÆB’ì%`™¸Í‘8ëæº‡w0ž·>ïgK…ÛEQË[Y©¤íqy°%E†i.€”°º] aiJSlXXëpÏòåËCŸ¤ˆg=™åë¦K„*<瘋ú½¦Üp•ß•¿·ôi{¼££ã (á€ß$Þ*„5/ÀId€tÜi`Žƒ"à®…&ŽuQ$§rÄ;4žûS$©mûpÝdŒ-[¶žqÌßR__°O  8q⬠žQE!óÓj±U NÜ&I‰;#Pê ‹““à¶Ï8ªCÜwÂ'uý:!"VÙ' ø— ‹XOc¯º–Äz K³ߟS!¶ƒ 6HØ‘²»ÃòØ.‹Æß5 ‡¤’Éd“(àpÌáàÿvoÞžô$rÓôÅâ„K8„$ ˆûwp žq»?ª€]µµµm¢Ú… šå…‡bŽÆ‡44n‚Ú‰ë(ÿgq•OpÈ?Fð|ÇkQ–wç‚Tø}‚Ä;&§MòúX%àLºÐIí¬îˆùÖQ`±ç‰©$áq…„—P8ð%µuvvÆ*A«½°y>4Ä|,¶“Àžé­ðò÷ÖRäéÓaiñk8á%F_N×Õ]®“žöZ¡{¨:‘TÅ•ÎMž¿O"Sɇ¥û|\¾§§§ bô!2n¯/N8²Ô+ˆ‚#´¦Á9„OBx’ÿ»ãò®bþa"üF‡?Iæ3<ƒÅ µT˜ûMr’ïó¶ ˃†Ò›£oÐDøV2<á‚®þŽ5 ÿ4%)nU*un*% þi Á%Zt Ô¸¿Ë¿ÍIˆK¤”À™œ†¾*#%t{ª’Ó&¼ðcÿÛ\®&Ç^C­("ý“)òL˜[ú'S¥ë¤ðA{ô³ýl?ÛïÙþ#ÀLtåç¨8IEND®B`‚SuperCollider-3.6.3-Source-linux~repack/icons/sc_cube_32x32.png0000664000175000017500000000405511721141255022436 0ustar dandan‰PNG  IHDR szzôôIDATX…­—lO{Ç«EmbÏØQ‚kïØ{ÔÞ³ÔÞ{Ö¬½kïZZÅ#Ĩ-V$JQ3hòBžx’§¯Ï=ï|í_ODz““¶÷÷»÷|Ï÷û=çwëå•—ˆ¤I‰÷ül2ï{÷î~ñâ…ÿÛ·oÆÇÇG}øð!Vï‡jTIñ„#GŽôݱc‡ß±cǺ_½z5$&&æÚÓ§OÿT¢@äèÑ£²uëV¹yó¦¼~ýúã§OŸÂHÍ_N8~üøŒ&L¨°lÙ²À]»vm?qâDôµk×âŸýñþýûòòåKÑŠåÌ™3¢`dÅŠ¢À,ááÇåܹsrþüy¹|ù²\¼xQ<(«V­2`¡¡¡°òùÝ»w‘úþ?ðþý{GC´R«Hé–gÏžI\\œDDDHpp°U¸iÓ&QpréÒ%.{öì± !rˆµ;wÊüùóeýúõåª<¿)Æß ‰œ7oÞˆšIÂK” QíåÖ­[Æ‚JaÖ®]klDFFP’*{IkÛ·o7€>”;wîØÞÑ£G[0¤Æ=TIîÞ½ë(Ý.ÉR 5`F§¾gÏžR¯^=ñóó“0x¸mÛ¶v¤¢1AR† FdÒ€Š\P‹kÖ¬)f8*ÇpüÞ¢E [Á,€1e%9m—¯dúA)tb:ÆTÈBíÕHæ—5jØ=ôÇ/ýû÷·aC¿ÓÖ¬!!Œ1+PêäT[W?lÜB;ÕtíÚÕAc2¤x!k´)ÁTTF·ÐzÌ}&(÷+UªdV™ˆt‚I R9ªaûÐOõœˆ¾ÀçQúœM>>>aÞÞÞ1 $ªè Ž_>.`j>hÎ8fNÈÁá„/O;œ3f__ßÏdΜ¹×w.oÜ4¦)*Í}€0n©š±Ê 9ßIÀ ,ñ™N[B;ƒàÌ}ªÕ„ iÒ¤y6mÚ»ÛôoÞïû=ßÉ«ÑL#HADè „ã”ÓCbZ’ïXÑû®îWð¿ës1ú󼲡ïY¯1S£¯F%ô?ð­7 h´Ò˜£/ŒL—.]¬ù'}úôFköìÙ?k’¿Ô;qš(Z#J߯û×jÌÐè¯ÑT£¬Fž¯‰}~&ù·WjBþÁ 䈂x¬tÞÑd§4Bõ~ˆÆt~|ÿ—ñú"g:¯/K‘‹ÿ‚‹htÔÒ˜¢ÑG£¡†ŸFΔNøI&‘Ò_Nød0¿  $j·IEND®B`‚SuperCollider-3.6.3-Source-linux~repack/icons/sc_cube_48x48.png0000664000175000017500000000746011721141255022457 0ustar dandan‰PNG  IHDR00Wù‡÷IDAThíÚw´TU–ð‡ **¢(*fÅ„sŽ˜sVLˆ&´Q1'Œ˜1+b1Ì¡DÌ€ÌbDqt!:žÙ¿Í»½ì)V/»{zœ?¦ÖÚ«^UÝ{Îþ¾ýíp.44üÿkú¯RJ‹ &´ÿî»ï:Mž<¹×Ï?ÿÜ'¾ë6ÛŸíÛt_áØìï¿ÿ~‡Ñ£Gw3fLßO?ýôÕo¾ùfÒO?ýT~ûí·R½~ùå—7ã퀰YÿLg› 6¬õsÏ=·ö“O>yÔ /¼Ð/>|çw~üâ‹/ʤI“J8_Þ}÷ÝòÔSO•k®¹¦\vÙe%®+•2uêT@Þ‰uºþ¿ápÓûï¿¿íwÜÑñ¶Ûnëѯ_¿8æé§Ÿž:jÔ¨Â鯾úªŒ;¶ :´ 0 \z饥gÏžåøã/'Ÿ|r9á„ʱÇ[Î?ÿüòðÃçµ?üð #cýnasüO:Ü<XôÜsÏÝþì³Ï>ç /|õÕW~×]wý6dÈÜüË/¿LÇxæ™gJ€K§Ï8ãŒrúé§— .¸ \ýõ塇*òÄO”ë®»®œyæ™ ÆuîyõÕW«¨ŒŽ}»‡ÍùÏ:Ýêâ‹/ÞòÐCísÌ1Çü%˜špÓM7¥89nܸ2~üø|ë­·Ò¡[n¹¥Ä=嬳ÎJó·{xàòÊh¼üòË)W^y¥¼öÚkåÙgŸ-wß}w¹üòË3B§œrJJÌ>Ÿþy‰d7|9!l®@·`uêwÞY;ì°Ò§OŸòÉ'ŸIøí·ß¦D°uå•W&{§vZ2ÑI§ï»ï¾ùÎr~ðàÁ%dWn¿ýöüݺ>‡ì p?þx’ *'žxb9ï¼óR~Qì;&|êÖæˆRwbU)Èã†n(‰rÕUW%sŸ}öY24bĈy±!Ms³œç èDޤDú÷GÞ”o¼1ÁÜzë­%r´¶wŸ­%Oä ù‰ô?þøa¸Ô3l¾¿ à믿®M™2%+ˆ*áÅá¾}û–£Ž:ª\tÑE©õ÷Þ{ï¯ÚÇèµ×^›Q¨4AºÇ.{ä‘G2iEp×_qÅ)!$‰Ö›o¾Y¢ü–>ø <ÿüó äè£N­M†¡‚O#Òvº>üðÚª@ãüq¥Ç‚}›qÄ©uÎ ><¯0!/VÎù ›o¾9#Éq‰,*ÀIî·ß~»Œ92#A‚"uÎ9ç”nݺ•ÈÇrøá‡—SO=µ¼øâ‹éK4ƱQ®w­ ÕâÇ f_ýõÜ šÓß9Ò£G”ç1÷ÑGeŽ<öØc)‰*–ïz­‹¹p:œÈ\xôÑGóú¨vå¸ãŽKÇI>ø`^ µåòâžô¢¿IUSÎhxÑE-ûì³OnJô)Ì•´Ád×®]3Ì—\rI‚&‘ˆ£÷Þ{oB†ï!‡8Å {÷îi"K‚œ&#&Jƒ ÊM¹C†qÍÐ:¡ÅùHÄe—]¶,²È"¥]»ve÷ÝwOý“YN$Æ…,tP‚éÕ«W&.vubìo¼‘Dvé[ƒÃ:"î¹çž¿%ù+‡9«žtÒIe—]v)+¬°Bîd © ÔÈॗ^*«¬²JYuÕUÓ_|ñ²ÄK”í¶Û.7µ˜$4ºhQn9Ò¥K—²ß~û¥ƒæ'É@ÓÈP¹8ÊyïòBÄÔ:wî\6Ùd“$sÞyç-³Ï>{iÞ¼y–Û¸§@tÙš„úu×]·¬¾úêeƒ 6([l±EYýõ3ÀtìØ1dI¼ ¶£cçæ{ì±GÙwß}Ë‘G™R¡iê÷î±þk¬Q–_~ùÜsá….óÍ7_™gžyʬ³Îšy‰^ *EMrI\‹¬¶Újéà!‡RöÚk¯txóÍ7ÏEåÈ:묓à6Úh£t”~ýõ×-+0˜rÒaDŠ$±Ìi`wÝuײÕV[%Q+¯¼rF|þùç/­[·.sÍ5Wþ ¯LÔ$˜l'2²™*£v ]­VË„ó; òĆ+­´Rnºí¶Ûfây©ïV©ÜoNR•8n ÄpØÆôÜsÏN“Ì’K.™J@^‡Ê ,”Öðµ@Ôïù¨B)f¥OgåU‰%vÛm·²ÔRKåæµjÕªl¸á†åûï¿Ï„D€((£Æ›o¿ýö¹öb‹-VÚ´i“c¾ßzë­ËþûïŸ ÝÓ»w=Z´hQ<ð@>ÔÖ”.åRXåÆ4"Í…v•?šWU5Ye"!ÉÆ‘M7Ý4‡>:¯Jåšk®™ùÃa,c˜ 1OŠä£Ú)ë3¢ÅÉ ÀÅS äQÓ(äF%‘ lô«œIBì“„Ú®_dŠtÍ9¶ñÆgU"83çœs¦°¾Ì2ˤ$Ö^{íKŽdBRªTå¸rëoäÞÒK/:uê„”zQ-jäbƱ)ÖèÓœ·¸*£Lõ¨äe 0/-´ÐBn ñ=ç9ÁyŽcœ¤Šj¬¶®u c‹{[¢Ù°z¡­š®çhA 鲘¤cÍŠYX„0a3XòsD˜×[o½ü,i݇ß“ Rhû÷# _~Hjý‡,] ÀN;í”ÀØqÇ}_`Ï=÷¬‘‹–¯.Ó¦…É@2£Aq,Ñ£éÎBÞ¾}û.—ŒÚ"GòC¬é3°Ê!ÙpT5Úf›m22"(Y¹Æ`'Zr׉õB‹5ZWÃU%ì€H©¶l,¤dÄšÀoz‡C‰r*wT,-_WÅvUÛ×Zk­”"2±÷Þ{—vØ!û‰DerȤ‚@pðʨk>øàzqsME1"sZSÁB5Iª&`ÄßÇ–•_eÕÆJ¡ê°ffƨºîwUä §5N•H •°®L¤P•gŒ}ë;5š5 ™ß…rçwÎ:¬›šóéÓ%'ÌøÝPú§Ue—¶}'Ö’ÀÀ©ãrG9ËiºF–Ígª~`¯``¤q Öb0¤a:/ãP™XR”GN(c˜bX Eˆ…ŸäÔ~À mä¡ÂÙq”þÉKT±M×¾WŠEAªýkf²òˆèèÍéè5ÎÆFò8Ô&š…ó[Ì2Ë,OÇÇ_Mf‘êÑ îjê$-‡GHÃŸÇ ’ÞóÉݶmÛ”Ép@oÑ•±J¿Æ6 * ¦å•D¯šœëEütsd) 8bÆØ^@FÏÖn†fØ3¢qgפI“dT¸5¥êé³HBfzö=:ÁZu¨Á.¹9½‰”ˆÈªTgêª/§Íaã à æÉTô<™hÙ²¥óÅts EØ a]Âz7mÚ´ÿl³ÍöòL3Íô ˜•lj2I†$'-gc¸2ìé‰Ûšg$"r821Ò7G+‡ÉEE£:+Ë)²q( ÊÌ3Ï,ç`†0ÿ×.l«°îaW{âÆ!‘ññw2¬ÚDÙÄ®(xˆ%Ùl¤Š8ÃÊ%ù¢”ŠF+‡1íz×`Ùz˜V‰ª„}ëÅÞùL¨Ñ¦D$êÕ4¬eØRaÛ†Õ®$¦Á¡±Ø„fÍšåÙ¶zv$õ:µ¡f(§«'¤D†X'Lkh¢aò´Ž>á ¦ûÄû/Áú„Ø{x«V­.ŠèMöý+ þÝj™°ÂN »&rd@00 ›H*ú$Œ‘öÑWÌNX7UÎÓ<9’šªGÛœáXóçíÄpxlì1"*ö¼7ö¾2ìØ°MÂÚ4ú÷‡^ÍÂZ…µÛ)ìä°kcÑÁÔðØd¢ÐJ®ê1‰w³»jbÈSQ o¤ç\àZË­xŸ]6,Öߊ=ú‡ÝvYØéaG†í¶J˜~šáø=¡[>ÌóùSÃú†÷5™Ô˜`é Ý’YÄœUp‰ë±üS8üuü>:®Œ?Œßî»>ìÒ°ÓÂoÜgÃÆ=lÜæ„ýé½f k¶RØa½l #Â&…ƒ©ápì?àÄçqáð¨x)>?߈{ú5:|IØ)a‡…í¶~ôh/Ð0-ò•ÃMþ»#ÿÊ«I#¹Ã:„u ;3ìÆpðþˆÀ¨`}lÈè/ñù‘øž†o».ìâ°ža]¦Ir½°eÃüÓ‘œ›éßáðß{5›'lµ°}ÃÎj˜¦Ý[îÝ0-on˜V Öi˜Vü£]Ë?Ãáé½lȼak„í¶_Øvak…-Ý0Íaÿ­ røÿä«IH ’ø·h¸zýÁßw–ü¹uIEND®B`‚SuperCollider-3.6.3-Source-linux~repack/README_WINDOWS.txt0000664000175000017500000001057612106676016021274 0ustar dandan------------------------------------------------------------------------ Supercollider 3.6 for Windows ------------------------------------------------------------------------ This is the Windows version of James McCartney's SuperCollider synthesis engine (scsynth) and programming language (sclang). Supercollider's main homepage is at http://supercollider.sourceforge.net/ There is a lot of useful information and tutorials in the SuperCollider documentation which you can access online at http://doc.sccode.org To get further information on SuperCollider usage or development, you should subscribe to the mailing lists: http://www.beast.bham.ac.uk/research/sc_mailing_lists.shtml ------------------------------------------------------------------------ System Requirements ------------------------------------------------------------------------ ** Operating System ** Windows 7/Vista/XP/2000 ** Sound Card ** Most common sound cards will work fine - the sound card should be one that is supported by PortAudio (http://www.portaudio.com/). If you have issues with latency, consult http://www.portaudio.com/docs/latency.html for advice on how to tune your operating system to achieve the best results (in short: use ASIO drivers wherever possible). ------------------------------------------------------------------------ Installation ------------------------------------------------------------------------ Simply run the installer, and choose a path where all the application files will be unpacked. After installation, you can use SuperCollider in two ways, described below: * Using the provided SuperCollider IDE (recommended) * In command line mode NOTE: Location of extensions and configuration files has changed in 3.6.1. If you want to keep those from previous versions, please read the section about changed locations below. ------------------------------------------------------------------------ Using the SuperCollider IDE ------------------------------------------------------------------------ To start up the IDE, run the scide.exe program found within the installation folder. You can get more help on using the IDE via the Help menu. ------------------------------------------------------------------------ Using SuperCollider in command line mode ------------------------------------------------------------------------ 1. Open a Windows command line window (the cmd.exe program). 2. Navigate to the SuperCollider installation folder. 3. Start up the sclang.exe program, to enter the SuperCollider command line. 4. You can now type SuperCollider code and evaluate it by pressing the Enter (Return) key. You can browse the previous commands using the up and down arrow keys. 5. These are the handy keyboard shortcuts: - Ctrl+T : equivalent to CmdPeriod.run - Ctrl+X : to recompile the class library - Ctrl+D: to quit the SuperCollider command line ------------------------------------------------------------------------ NOTE: Changed location of extensions and configuration files ------------------------------------------------------------------------ The location of application-related user data has moved in accordance with Windows policies. This means that from version 3.6.1 on, SuperCollider will not pickup extensions, startup file, and configuration files from locations used by previous versions. To continue using extensions and configuration from versions prior to 3.6.1, please copy the contents of the old directory to the new one, given below: The new directory: Windows 7 / Vista: C:\Users\\AppData\Local\SuperCollider Windows XP: C:\Documents and Settings\\Local Settings\Application Data\SuperCollider The old directories: Between versions 3.6.0 and 3.6.1: Windows 7 / Vista: C:\Users\\AppData\Roaming\SuperCollider Windows XP: C:\Documents and Settings\\Application Data\SuperCollider Prior to version 3.6.0: Windows 7 / Vista: C:\Users\\SuperCollider Windows XP: C:\Documents and Settings\\SuperCollider ------------------------------------------------------------------------ Outro ------------------------------------------------------------------------ Thanks to James McCartney, for making this great piece of audio software publically and freely available. SuperCollider-3.6.3-Source-linux~repack/testsuite/0000775000175000017500000000000012110505246020373 5ustar dandanSuperCollider-3.6.3-Source-linux~repack/testsuite/supernova/0000775000175000017500000000000012110505246022415 5ustar dandanSuperCollider-3.6.3-Source-linux~repack/testsuite/supernova/sndfile_backend_test.cpp0000664000175000017500000000206012106676017027263 0ustar dandan#include #include #include "audio_backend/sndfile_backend.hpp" using namespace nova; namespace { aligned_storage_ptr data(nova::calloc_aligned(64)); struct engine_functor; struct engine_functor { void init_tick(void) {} void run_tick(void); }; sndfile_backend be; void engine_functor::run_tick(void) { float * data_ptr = data.get(); be.output_mapping(&data_ptr, &data_ptr + 1); } } BOOST_AUTO_TEST_CASE( sndfile_backend_test_1 ) { BOOST_REQUIRE(!be.audio_is_opened()); BOOST_REQUIRE(!be.audio_is_active()); be.open_client("", "./output.wav", 44100, SF_FORMAT_WAV | SF_FORMAT_PCM_16, 1, 64); BOOST_REQUIRE(be.audio_is_opened()); be.activate_audio(); BOOST_REQUIRE(be.audio_is_active()); boost::xtime xt; boost::xtime_get(&xt, boost::TIME_UTC_); xt.sec += 1; boost::thread::sleep(xt); be.deactivate_audio(); BOOST_REQUIRE(!be.audio_is_active()); be.close_client(); BOOST_REQUIRE(!be.audio_is_opened()); } SuperCollider-3.6.3-Source-linux~repack/testsuite/supernova/server_node_graph_test.cpp0000664000175000017500000002420612106676017027672 0ustar dandan#include #include "server/node_graph.hpp" #include "test_synth.hpp" using namespace nova; using namespace std; BOOST_AUTO_TEST_CASE( simple_synth_test_1 ) { rt_pool.init(1024 * 1024); node_graph n; node_position_constraint to_root = std::make_pair(n.root_group(), insert); { test_synth * s = new test_synth(1000, 0); n.add_node(s, to_root); BOOST_REQUIRE_EQUAL(n.synth_count(), 1u); BOOST_REQUIRE_EQUAL(n.find_synth(1000), s); n.remove_node(s); BOOST_REQUIRE_EQUAL(n.synth_count(), 0u); } BOOST_REQUIRE_EQUAL(n.group_count(), 1u); { test_synth * s = new test_synth(1000, 0); n.add_node(s/* , node_position_constraint() */); BOOST_REQUIRE_EQUAL(n.synth_count(), 1u); n.remove_node(s); BOOST_REQUIRE_EQUAL(n.synth_count(), 0u); } BOOST_REQUIRE_EQUAL(n.group_count(), 1u); } BOOST_AUTO_TEST_CASE( simple_synth_test_2 ) { node_graph n; group * g = new group(1); n.add_node(g); BOOST_REQUIRE_EQUAL(n.find_group(1), g); n.remove_node(g); } BOOST_AUTO_TEST_CASE( simple_synth_test_3 ) { node_graph n; group * g = new group(1); n.add_node(g); { node_position_constraint to_group = std::make_pair(g, insert); test_synth * s = new test_synth(1000, 0); n.add_node(s, to_group); n.remove_node(s); } n.remove_node(g); } BOOST_AUTO_TEST_CASE( simple_synth_test_4 ) { node_graph n; group * g = new group(1); n.add_node(g); test_synth * s = new test_synth(1000, 0); { node_position_constraint to_group = std::make_pair(g, insert); n.add_node(s, to_group); } n.remove_node(g); } BOOST_AUTO_TEST_CASE( simple_synth_test_5 ) { node_graph n; test_synth * s = new test_synth(1000, 0); test_synth * s2 = new test_synth(1001, 0); n.add_node(s); n.add_node(s2); n.remove_node(s); n.remove_node(s2); } BOOST_AUTO_TEST_CASE( simple_synth_test_6 ) { node_graph n; test_synth * s1 = new test_synth(1000, 0); n.add_node(s1); test_synth * s2 = new test_synth(1001, 0); { node_position_constraint to_group = std::make_pair(n.root_group(), insert); n.add_node(s2, to_group); } test_synth * s3 = new test_synth(1002, 0); { node_position_constraint position = std::make_pair(s1, after); n.add_node(s3, position); } test_synth * s4 = new test_synth(1003, 0); { node_position_constraint position = std::make_pair(s1, before); n.add_node(s4, position); } //n.dump("test.dot"); n.remove_node(s1); n.remove_node(s2); n.remove_node(s3); n.remove_node(s4); } BOOST_AUTO_TEST_CASE( free_all_test ) { node_graph n; group * g = new group(1); n.add_node(g); BOOST_REQUIRE_EQUAL(n.group_count(), 2u); node_position_constraint to_group = std::make_pair(g, insert); test_synth * s = new test_synth(1000, 0); n.add_node(s, to_group); test_synth * s2 = new test_synth(1001, 0); n.add_node(s2, to_group); group * g2 = new group(1002); n.add_node(g2, to_group); BOOST_REQUIRE_EQUAL(n.synth_count(), 2u); BOOST_REQUIRE_EQUAL(n.group_count(), 3u); BOOST_REQUIRE(n.find_node(s->id())); BOOST_REQUIRE(n.find_node(s2->id())); BOOST_REQUIRE(n.find_node(g2->id())); BOOST_REQUIRE(n.group_free_all(g)); BOOST_REQUIRE(!n.find_node(s->id())); BOOST_REQUIRE(!n.find_node(s2->id())); BOOST_REQUIRE(!n.find_node(g2->id())); BOOST_REQUIRE_EQUAL(n.synth_count(), 0u); BOOST_REQUIRE_EQUAL(n.group_count(), 2u); BOOST_REQUIRE(n.find_node(g->id())); n.remove_node(g); BOOST_REQUIRE(!n.find_node(g->id())); BOOST_REQUIRE_EQUAL(n.group_count(), 1u); } BOOST_AUTO_TEST_CASE( free_deep_test ) { node_graph n; group * g = new group(1); n.add_node(g); BOOST_REQUIRE_EQUAL(n.group_count(), 2u); node_position_constraint to_group = std::make_pair(g, insert); test_synth * s = new test_synth(1000, 0); n.add_node(s, to_group); test_synth * s2 = new test_synth(1001, 0); n.add_node(s2, to_group); group * g2 = new group(1002); n.add_node(g2, to_group); BOOST_REQUIRE_EQUAL(n.synth_count(), 2u); BOOST_REQUIRE_EQUAL(n.group_count(), 3u); BOOST_REQUIRE(n.find_node(s->id())); BOOST_REQUIRE(n.find_node(s2->id())); BOOST_REQUIRE(n.find_node(g2->id())); BOOST_REQUIRE(n.group_free_deep(g)); BOOST_REQUIRE(!n.find_node(s->id())); BOOST_REQUIRE(!n.find_node(s2->id())); BOOST_REQUIRE(n.find_node(g2->id())); BOOST_REQUIRE_EQUAL(n.synth_count(), 0u); BOOST_REQUIRE_EQUAL(n.group_count(), 3u); BOOST_REQUIRE(n.find_node(g2->id())); BOOST_REQUIRE(n.find_node(g->id())); n.remove_node(g); BOOST_REQUIRE(!n.find_node(g->id())); BOOST_REQUIRE(!n.find_node(g2->id())); BOOST_REQUIRE_EQUAL(n.group_count(), 1u); } BOOST_AUTO_TEST_CASE( queue_construction_test_1 ) { node_graph n; test_synth * s = new test_synth(1000, 0); test_synth * s2 = new test_synth(1001, 0); n.add_node(s); n.add_node(s2); unique_ptr q = n.generate_dsp_queue(); n.remove_node(s); n.remove_node(s2); } BOOST_AUTO_TEST_CASE( queue_construction_test_2 ) { node_graph n; group * g = new group(1); n.add_node(g); unique_ptr q = n.generate_dsp_queue(); BOOST_REQUIRE_EQUAL(q->get_total_node_count(), 0u); n.remove_node(g); } BOOST_AUTO_TEST_CASE( queue_construction_test_3 ) { node_graph n; test_synth * s = new test_synth(1000, 0); n.add_node(s); unique_ptr q1 = n.generate_dsp_queue(); BOOST_REQUIRE_EQUAL(q1->get_total_node_count(), 1u); test_synth * s2 = new test_synth(3, 0); n.add_node(s2); unique_ptr q2 = n.generate_dsp_queue(); BOOST_REQUIRE_EQUAL(q2->get_total_node_count(), 1u); n.remove_node(s); n.remove_node(s2); } BOOST_AUTO_TEST_CASE( pgroup_test_1 ) { node_graph n; parallel_group * g = new parallel_group(1); n.add_node(g); BOOST_REQUIRE_EQUAL(n.find_group(1), g); unique_ptr q = n.generate_dsp_queue(); BOOST_REQUIRE_EQUAL(q->get_total_node_count(), 0u); n.remove_node(g); } BOOST_AUTO_TEST_CASE( pgroup_test_2 ) { node_graph n; parallel_group * g = new parallel_group(1); n.add_node(g); { node_position_constraint to_group = std::make_pair(g, insert); test_synth * s = new test_synth(2, 0); n.add_node(s, to_group); n.remove_node(s); } n.remove_node(g); } BOOST_AUTO_TEST_CASE( pgroup_test_3 ) { node_graph n; parallel_group * g = new parallel_group(1); n.add_node(g); test_synth * s = new test_synth(2, 0); { node_position_constraint to_group = std::make_pair(g, insert); n.add_node(s, to_group); } n.remove_node(g); } BOOST_AUTO_TEST_CASE( pgroup_test_4 ) { node_graph n; parallel_group * g = new parallel_group(1); n.add_node(g); { node_position_constraint to_group = std::make_pair(g, insert); test_synth * s = new test_synth(2, 0); n.add_node(s, to_group); unique_ptr q = n.generate_dsp_queue(); BOOST_REQUIRE_EQUAL(q->get_total_node_count(), 1u); n.remove_node(s); } n.remove_node(g); } BOOST_AUTO_TEST_CASE( pgroup_test_5 ) { node_graph n; parallel_group * g = new parallel_group(1); n.add_node(g); { node_position_constraint to_group = std::make_pair(g, insert); test_synth * s1 = new test_synth(2, 0); test_synth * s2 = new test_synth(3, 0); n.add_node(s1, to_group); n.add_node(s2, to_group); unique_ptr q = n.generate_dsp_queue(); BOOST_REQUIRE_EQUAL(q->get_total_node_count(), 2u); n.remove_node(s1); n.remove_node(s2); } n.remove_node(g); } BOOST_AUTO_TEST_CASE( pgroup_test_6 ) { node_graph n; parallel_group * g = new parallel_group(1); n.add_node(g); { node_position_constraint to_group = std::make_pair(g, insert); test_synth * s1 = new test_synth(2, 0); test_synth * s2 = new test_synth(3, 0); test_synth * s3 = new test_synth(4, 0); n.add_node(s1, to_group); n.add_node(s2, to_group); n.add_node(s3, to_group); unique_ptr q = n.generate_dsp_queue(); BOOST_REQUIRE_EQUAL(q->get_total_node_count(), 3u); } n.remove_node(g); } BOOST_AUTO_TEST_CASE( pgroup_test_7 ) { node_graph n; parallel_group * g = new parallel_group(1); n.add_node(g); { node_position_constraint to_group = std::make_pair(g, insert); group * g1 = new group(2); group * g2 = new group(3); group * g3 = new group(4); n.add_node(g1, to_group); n.add_node(g2, to_group); n.add_node(g3, to_group); node_position_constraint to_g1 = std::make_pair(g1, insert); node_position_constraint to_g2 = std::make_pair(g2, insert); test_synth * s1 = new test_synth(1000, 0); test_synth * s2 = new test_synth(1001, 0); n.add_node(s1, to_g1); n.add_node(s2, to_g2); unique_ptr q = n.generate_dsp_queue(); BOOST_REQUIRE_EQUAL(q->get_total_node_count(), 2u); } n.remove_node(g); } BOOST_AUTO_TEST_CASE( noid_test ) { rt_pool.init(1024 * 1024); node_graph n; node_position_constraint to_root = std::make_pair(n.root_group(), insert); { test_synth * s = new test_synth(1000, 0); n.add_node(s, to_root); BOOST_REQUIRE(s->id() == 1000 ); n.synth_reassign_id(1000); BOOST_REQUIRE(s->id() != 1000 ); n.remove_node(s); } { test_synth * s = new test_synth(1000, 0); n.add_node(s/* , node_position_constraint() */); BOOST_REQUIRE(s->id() == 1000 ); n.synth_reassign_id(1000); BOOST_REQUIRE(s->id() != 1000 ); n.remove_node(s); } } SuperCollider-3.6.3-Source-linux~repack/testsuite/supernova/server_scheduler_test.cpp0000664000175000017500000000111212106676017027531 0ustar dandan#include #include #include #include "server/server_scheduler.hpp" using namespace nova; using namespace boost; BOOST_AUTO_TEST_CASE( scheduler_test_1 ) { scheduler<> sched(1); /* sched(); */ } namespace { boost::barrier barr(2); void thread_fn(scheduler<> * sched) { for (int i = 0; i != 1000; ++i) /* (*sched)() */; barr.wait(); } } BOOST_AUTO_TEST_CASE( scheduler_test_2 ) { scheduler<> sched(1); std::thread thrd(std::bind(thread_fn, &sched)); barr.wait(); thrd.join(); } SuperCollider-3.6.3-Source-linux~repack/testsuite/supernova/test_synth.hpp0000664000175000017500000000077712106676017025357 0ustar dandan#include "../server/supernova/server/synth.hpp" namespace nova { class test_synth: public abstract_synth { public: test_synth(int node_id, synth_definition_ptr const & prototype): abstract_synth(node_id, prototype) {} void run(void) {} virtual float get(slot_index_t slot_id) const { return 0.f; } virtual void set(slot_index_t slot_id, sample val) {} virtual void set_control_array(slot_index_t slot_id, size_t count, sample * val) {} }; } SuperCollider-3.6.3-Source-linux~repack/testsuite/supernova/server_synth_factory_test.cpp0000664000175000017500000000122612110501517030440 0ustar dandan#include #include "server/synth_factory.hpp" #include "test_synth.hpp" using namespace nova; using namespace std; namespace { struct test_synth_definition: public synth_definition { test_synth_definition(): synth_definition(c_string("foo")) {} abstract_synth * create_instance(int node_id) { return new test_synth(node_id, this); } }; } BOOST_AUTO_TEST_CASE( synth_factory_test_1 ) { rt_pool.init(1<<20); synth_factory sf; sf.register_definition(new test_synth_definition); unique_ptr s(sf.create_instance("foo", 1)); BOOST_REQUIRE(s.get() != 0); } SuperCollider-3.6.3-Source-linux~repack/testsuite/supernova/sc_synthdef_test.cpp0000644000175000017500000000041111562456103026472 0ustar dandan#include #include #include "sc/sc_synthdef.hpp" BOOST_AUTO_TEST_CASE( sc_synthdef_test ) { std::vector defs = nova::read_synthdef_file("testsuite/default.scsyndef"); std::cout << defs[0].dump(); } SuperCollider-3.6.3-Source-linux~repack/testsuite/supernova/static_pool_test.cpp0000644000175000017500000000113511562456103026505 0ustar dandan#include #include #include "utilities/static_pool.hpp" using namespace nova; using namespace std; namespace { struct foo { foo(void) {} int data[4]; }; } BOOST_AUTO_TEST_CASE( static_pool_test ) { static_pool<16*1024> pool; foo* f1 = static_cast(pool.malloc(sizeof(f1))); ::new(f1) foo(); f1->~foo(); pool.free(f1); } BOOST_AUTO_TEST_CASE( static_pool_test_locked ) { static_pool<16*1024> pool(true); foo* f1 = static_cast(pool.malloc(sizeof(f1))); ::new(f1) foo(); f1->~foo(); pool.free(f1); } SuperCollider-3.6.3-Source-linux~repack/testsuite/supernova/help_RecordBuf.scsyndef0000644000175000017500000000037411562456103027051 0ustar dandanSCgfhelp_RecordBuf CÈDz@€DúDH>?€@outbufnumControlXLineÿÿÿÿÿÿÿÿFormantÿÿÿÿ BinaryOpUGenÿÿ RecordBuf ÿÿÿÿÿÿÿÿÿÿÿÿÿÿSuperCollider-3.6.3-Source-linux~repack/testsuite/supernova/memory-pool_test.cpp0000644000175000017500000000123311562456103026443 0ustar dandan#include #include #include #include "server/memory_pool.hpp" namespace nova { simple_pool rt_pool; } /* namespace nova */ using namespace nova; BOOST_AUTO_TEST_CASE( init_pool ) { rt_pool.init(1024*1024); } BOOST_AUTO_TEST_CASE( vector_test ) { rt_pool.init(1024*1024); int size = 1024; std::vector > vec; for (int i = 0; i != size; ++i) vec.push_back(-i); } BOOST_AUTO_TEST_CASE( set_test ) { int size = 1024; std::set, nova::rt_pool_allocator > vec; for (int i = 0; i != size; ++i) vec.insert(-i); } SuperCollider-3.6.3-Source-linux~repack/testsuite/supernova/help_Demand.scsyndef0000644000175000017500000000077711562456103026375 0ustar dandanSCgf help_Demand@€?€@@@€@ BÈ¿€A`BªBŽBÊBÜBB‚BäBÂBòB¶B@BºBD ImpulseÿÿÿÿDseqÿÿÿÿÿÿÿÿÿÿÿÿ BinaryOpUGenÿÿDseqÿÿÿÿÿÿÿÿÿÿÿÿ BinaryOpUGenÿÿ BinaryOpUGenÿÿDemandÿÿPollÿÿÿÿ ÿÿ ÿÿ ÿÿ ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿPollÿÿÿÿ ÿÿ ÿÿ ÿÿ ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿSuperCollider-3.6.3-Source-linux~repack/testsuite/supernova/server_dsp_thread_queue_test.cpp0000664000175000017500000000701512106676017031104 0ustar dandan#include #include "dsp_thread_queue/dsp_thread_queue.hpp" namespace { struct dummy_runnable { dummy_runnable(void): i(0) {} void operator()(unsigned int dummy) { ++i; } int i; }; dummy_runnable dummy; } typedef nova::dsp_queue_interpreter dsp_queue_interpreter; typedef nova::dsp_thread_queue_item dsp_thread_queue_item; typedef nova::dsp_thread_queue dsp_thread_queue; BOOST_AUTO_TEST_CASE( dsp_thread_queue_test_1 ) { dsp_queue_interpreter interpreter(1); bool runnable = interpreter.init_tick(); BOOST_REQUIRE(!runnable); } BOOST_AUTO_TEST_CASE( dsp_thread_queue_test_2 ) { dsp_queue_interpreter interpreter(1); bool runnable = interpreter.init_tick(); if (runnable) interpreter.tick(0); } BOOST_AUTO_TEST_CASE( dsp_thread_queue_test_3 ) { dsp_queue_interpreter interpreter(1); std::unique_ptr q (new dsp_thread_queue(1)); dsp_thread_queue_item * item = q->allocate_queue_item(dummy, dsp_thread_queue_item::successor_list(), 0); q->add_initially_runnable(item); interpreter.reset_queue(std::move(q)); bool runnable = interpreter.init_tick(); BOOST_REQUIRE(runnable); interpreter.tick(0); BOOST_REQUIRE_EQUAL(item->get_job().i, 1); } BOOST_AUTO_TEST_CASE( dsp_thread_queue_test_4 ) { dsp_queue_interpreter interpreter(1); std::unique_ptr q (new dsp_thread_queue(2)); dsp_thread_queue_item * item1 = q->allocate_queue_item(dummy, dsp_thread_queue_item::successor_list(), 1); dsp_thread_queue_item::successor_list sl(1); sl[0] = item1; dsp_thread_queue_item * item2 = q->allocate_queue_item(dummy, sl, 0); q->add_initially_runnable(item2); interpreter.reset_queue(std::move(q)); bool runnable = interpreter.init_tick(); BOOST_REQUIRE(runnable); interpreter.tick(0); BOOST_REQUIRE_EQUAL(item1->get_job().i, 1); BOOST_REQUIRE_EQUAL(item2->get_job().i, 1); } BOOST_AUTO_TEST_CASE( dsp_thread_queue_test_5 ) { dsp_queue_interpreter interpreter(1); { std::unique_ptr q (new dsp_thread_queue(2)); dsp_thread_queue_item * item1 = q->allocate_queue_item(dummy, dsp_thread_queue_item::successor_list(), 1); dsp_thread_queue_item::successor_list sl(1); sl[0] = item1; dsp_thread_queue_item * item2 = q->allocate_queue_item(dummy, sl, 0); q->add_initially_runnable(item2); interpreter.reset_queue(std::move(q)); for (int i = 0; i != 2; ++i) { bool runnable = interpreter.init_tick(); BOOST_REQUIRE(runnable); interpreter.tick(0); } BOOST_REQUIRE_EQUAL(item1->get_job().i, 2); BOOST_REQUIRE_EQUAL(item2->get_job().i, 2); } { std::unique_ptr q (new dsp_thread_queue(2)); dsp_thread_queue_item * item1 = q->allocate_queue_item(dummy, dsp_thread_queue_item::successor_list(), 1); dsp_thread_queue_item::successor_list sl(1); sl[0] = item1; dsp_thread_queue_item * item2 = q->allocate_queue_item(dummy, sl, 0); q->add_initially_runnable(item2); interpreter.reset_queue(std::move(q)); for (int i = 0; i != 2; ++i) { bool runnable = interpreter.init_tick(); BOOST_REQUIRE(runnable); interpreter.tick(0); } BOOST_REQUIRE_EQUAL(item1->get_job().i, 2); BOOST_REQUIRE_EQUAL(item2->get_job().i, 2); } } SuperCollider-3.6.3-Source-linux~repack/testsuite/supernova/help_LocalIn.scsyndef0000644000175000017500000000053611562456103026517 0ustar dandanSCgf help_LocalIn>™™š=ÌÌÍ>LÌÍ?LÌÍ ImpulseÿÿÿÿDecayÿÿ WhiteNoise BinaryOpUGenÿÿLocalInDelayNÿÿÿÿ BinaryOpUGenÿÿMulAddDelayNÿÿÿÿ BinaryOpUGenÿÿLocalOut OutÿÿSuperCollider-3.6.3-Source-linux~repack/testsuite/supernova/buffer_manager_test.cpp0000644000175000017500000000050011562456103027123 0ustar dandan#include #include #include "server/buffer_manager.cpp" using namespace nova; BOOST_AUTO_TEST_CASE( buffer_manager_test ) { buffer_manager bm(1024); bm.allocate_buffer(0, 44100, 2); bm.zero_buffer(0); bm.fill_samples(0, 0, 882000, 0.2); bm.free_buffer(0); } SuperCollider-3.6.3-Source-linux~repack/testsuite/supernova/static_allocator_test.cpp0000644000175000017500000000400311562456103027511 0ustar dandan#include #include #include #include #include #include "utilities/static_allocator.hpp" using namespace nova; using namespace std; namespace { template void test_pool_instatiation(void) { static_allocator alloc; } struct initialized_struct { initialized_struct(int i): i(i), f(0.2) {} bool operator<(initialized_struct const & rhs) const { return i < rhs.i; } int i; double f; }; template void test_list(void) { list > vec; for (int i = 0; i != 8192; ++i) vec.push_back(T(i)); } template void test_vector(void) { vector > vec; for (int i = 0; i != 8192; ++i) vec.push_back(T(i)); } template void test_set(void) { set, static_allocator > set; for (int i = 0; i != 8192; ++i) set.insert(T(i)); } } BOOST_AUTO_TEST_CASE( static_alloc_test_1 ) { test_pool_instatiation<16, false>(); test_pool_instatiation<128, false>(); test_pool_instatiation<1024, false>(); test_pool_instatiation<4096, false>(); test_pool_instatiation<16, true>(); test_pool_instatiation<128, true>(); test_pool_instatiation<1024, true>(); test_pool_instatiation<4096, true>(); } #if 0 BOOST_AUTO_TEST_CASE( static_alloc_test_2 ) { test_list(); test_list(); test_list(); test_list(); } #endif BOOST_AUTO_TEST_CASE( static_alloc_test_3 ) { test_vector(); test_vector(); test_vector(); test_vector(); } #if 0 BOOST_AUTO_TEST_CASE( static_alloc_test_4 ) { test_set(); test_set(); test_set(); test_set(); } #endif SuperCollider-3.6.3-Source-linux~repack/testsuite/supernova/server_test.cpp0000664000175000017500000000405312110501517025465 0ustar dandan#include #include "server/server.hpp" #include "server/server_args.hpp" #include "test_synth.hpp" using namespace nova; using namespace boost; namespace { struct test_synth_definition: public synth_definition { test_synth_definition(void): synth_definition(c_string("foo")) {} abstract_synth * create_instance(int node_id) { return new test_synth(node_id, this); } }; } BOOST_AUTO_TEST_CASE( server_test_1 ) { rt_pool.init(1024 * 1024); { nova_server server(server_arguments::initialize(0, 0)); rt_pool.init(1024*1024); server.synth_factory::register_definition(new test_synth_definition()); node_position_constraint to_root = std::make_pair(server.root_group(), insert); abstract_synth * s = server.add_synth("foo", 1, to_root); server.free_node(s); } instance = 0; } BOOST_AUTO_TEST_CASE( server_test_2 ) { { nova_server server(server_arguments::initialize(0, 0)); server.synth_factory::register_definition(new test_synth_definition()); node_position_constraint to_root = std::make_pair(server.root_group(), insert); abstract_synth * s = server.add_synth("foo", 1, to_root); server(); server(); server(); server.free_node(s); } instance = 0; } BOOST_AUTO_TEST_CASE( server_test_3 ) { { nova_server server(server_arguments::initialize(0, 0)); server.synth_factory::register_definition(new test_synth_definition()); parallel_group * g = new parallel_group(1); server.add_node(g); node_position_constraint to_group = std::make_pair(g, insert); abstract_synth * s1 = server.add_synth("foo", 2, to_group); abstract_synth * s2 = server.add_synth("foo", 3, to_group); abstract_synth * s3 = server.add_synth("foo", 4, to_group); server(); server(); server(); server.free_node(s1); server.free_node(s2); server.free_node(s3); } instance = 0; } SuperCollider-3.6.3-Source-linux~repack/testsuite/supernova/tl_allocator_test.cpp0000644000175000017500000000241211562456103026643 0ustar dandan#include #include #include #include #include #include "utilities/tl_allocator.hpp" using namespace nova; using namespace std; namespace { struct initialized_struct { initialized_struct(int i): i(i), f(0.2) {} bool operator<(initialized_struct const & rhs) const { return i < rhs.i; } int i; double f; }; template void test_list(void) { list > vec; for (int i = 0; i != 8192; ++i) vec.push_back(T(i)); } template void test_vector(void) { vector > vec; for (int i = 0; i != 8192; ++i) vec.push_back(T(i)); } template void test_set(void) { set, tl_allocator > set; for (int i = 0; i != 8192; ++i) set.insert(T(i)); } } BOOST_AUTO_TEST_CASE( rt_alloc_test_1 ) { detail::tl_allocator<8 * 1024 * 1024> rt_alloc; } BOOST_AUTO_TEST_CASE( rt_alloc_test_2 ) { test_list(); test_list(); } BOOST_AUTO_TEST_CASE( rt_alloc_test_3 ) { test_vector(); test_vector(); } BOOST_AUTO_TEST_CASE( rt_alloc_test_4 ) { test_set(); test_set(); } SuperCollider-3.6.3-Source-linux~repack/testsuite/supernova/help_InFeedback.scsyndef0000644000175000017500000000032111562456103027141 0ustar dandanSCgfhelp_InFeedbackD¢€C–>ÌÌÍoutinControl InFeedbackMulAddÿÿÿÿSinOscÿÿ BinaryOpUGenÿÿOutSuperCollider-3.6.3-Source-linux~repack/testsuite/supernova/help_out2.scsyndef0000644000175000017500000000035411562456103026065 0ustar dandanSCgf help_out2?€=ÌÌÍCÜoutfreqControl BinaryOpUGenÿÿSinOscÿÿ BinaryOpUGenÿÿSinOscÿÿ BinaryOpUGenÿÿOutSuperCollider-3.6.3-Source-linux~repack/testsuite/supernova/audio_backend_test.cpp0000644000175000017500000000210011562456103026726 0ustar dandan#define BOOST_TEST_MAIN #include #include #define protected public #include "audio_backend/audio_backend.hpp" #include "audio_backend/portaudio.hpp" using namespace nova; namespace { void tick(void) {} } template void test_backend(void) { backend be; BOOST_REQUIRE(!be.audiostream_ready()); device_list devs = be.list_devices(); be.open_audio_stream(devs[0], devs[0].inchannels, devs[0], devs[0].outchannels, devs[0].defaultSampleRate); BOOST_REQUIRE(be.audiostream_ready()); BOOST_REQUIRE(!be.is_active()); be.activate(); BOOST_REQUIRE(be.is_active()); boost::xtime xt; boost::xtime_get(&xt, boost::TIME_UTC); xt.sec += 1; boost::thread::sleep(xt); be.deactivate(); BOOST_REQUIRE(!be.is_active()); be.close_audio_stream(); BOOST_REQUIRE(!be.audiostream_ready()); } BOOST_AUTO_TEST_CASE( dummy_test_1 ) { test_backend >(); } BOOST_AUTO_TEST_CASE( pa_test_1 ) { test_backend >(); } SuperCollider-3.6.3-Source-linux~repack/testsuite/supernova/server_dsp_thread_test.cpp0000664000175000017500000001237712106676017027707 0ustar dandan#include #include #include "dsp_thread_queue/dsp_thread.hpp" #include "server/memory_pool.hpp" namespace { volatile int gint; struct dummy_runnable { dummy_runnable(void): i(0) {} void operator()(uint dummy) { ++i; for (int j = 0; j != 1000; ++j) { int l = gint; l += 1; gint = l; } } int i; }; dummy_runnable dummy; } template void run_test_1(void) { nova::dsp_threads t(1); } BOOST_AUTO_TEST_CASE( dsp_thread_test_1 ) { nova::rt_pool.init(1024*1024*128); run_test_1 >(); run_test_1 >(); } template void run_test_2(void) { nova::dsp_threads t(5); t.start_threads(); t.terminate_threads(); } BOOST_AUTO_TEST_CASE( dsp_thread_test_2 ) { run_test_2 >(); run_test_2 >(); } template void run_test_3(void) { nova::dsp_threads t(2); t.start_threads(); t.run(); t.terminate_threads(); } BOOST_AUTO_TEST_CASE( dsp_thread_test_3 ) { run_test_3 >(); run_test_3 >(); } template void run_test_4(void) { typedef typename nova::dsp_thread_queue_item dsp_thread_queue_item; typedef typename nova::dsp_thread_queue dsp_thread_queue; typedef typename nova::dsp_threads dsp_threads; typedef std::unique_ptr dsp_thread_queue_ptr; dsp_threads t(1); t.start_threads(); dsp_thread_queue_ptr q (new dsp_thread_queue(2)); dsp_thread_queue_item * item1 = q->allocate_queue_item(dummy, typename dsp_thread_queue_item::successor_list(), 1); typename dsp_thread_queue_item::successor_list sl(1); sl[0] = item1; dsp_thread_queue_item * item2 = q->allocate_queue_item(dummy, sl, 0); q->add_initially_runnable(item2); t.reset_queue(std::move(q)); t.run(); t.terminate_threads(); BOOST_REQUIRE_EQUAL(item1->get_job().i, 1); BOOST_REQUIRE_EQUAL(item2->get_job().i, 1); } BOOST_AUTO_TEST_CASE( dsp_thread_test_4 ) { run_test_4 >(); run_test_4 >(); } template void run_test_5(void) { typedef nova::dsp_thread_queue_item dsp_thread_queue_item; typedef nova::dsp_thread_queue dsp_thread_queue; typedef nova::dsp_threads dsp_threads; typedef std::unique_ptr dsp_thread_queue_ptr; dsp_threads t(2); t.start_threads(); dsp_thread_queue_ptr q (new dsp_thread_queue(5)); dsp_thread_queue_item * item1 = q->allocate_queue_item(dummy, typename dsp_thread_queue_item::successor_list(), 4); typename dsp_thread_queue_item::successor_list sl(1); sl[0] = item1; dsp_thread_queue_item * item2 = q->allocate_queue_item(dummy, sl, 0); q->add_initially_runnable(item2); dsp_thread_queue_item * item3 = q->allocate_queue_item(dummy, sl, 0); q->add_initially_runnable(item3); dsp_thread_queue_item * item4 = q->allocate_queue_item(dummy, sl, 0); q->add_initially_runnable(item4); dsp_thread_queue_item * item5 = q->allocate_queue_item(dummy, sl, 0); q->add_initially_runnable(item5); t.reset_queue(std::move(q)); t.run(); t.terminate_threads(); BOOST_REQUIRE_EQUAL(item1->get_job().i, 1); BOOST_REQUIRE_EQUAL(item2->get_job().i, 1); BOOST_REQUIRE_EQUAL(item3->get_job().i, 1); BOOST_REQUIRE_EQUAL(item4->get_job().i, 1); BOOST_REQUIRE_EQUAL(item5->get_job().i, 1); } BOOST_AUTO_TEST_CASE( dsp_thread_test_5 ) { run_test_5 >(); run_test_5 >(); } template void run_test_6(void) { typedef nova::dsp_thread_queue_item dsp_thread_queue_item; typedef nova::dsp_thread_queue dsp_thread_queue; typedef nova::dsp_threads dsp_threads; typedef std::unique_ptr dsp_thread_queue_ptr; dsp_threads t(2); t.start_threads(); dsp_thread_queue_ptr q (new dsp_thread_queue(20)); std::vector items; for (int i = 0; i != 20; ++i) { items.push_back(q->allocate_queue_item(dummy, typename dsp_thread_queue_item::successor_list(), 0)); q->add_initially_runnable(items.back()); } t.reset_queue(std::move(q)); const int iterations = 10000; for (int i = 0; i != iterations; ++i) { for (int item = 0; item != 20; ++item) BOOST_REQUIRE_EQUAL(items[item]->get_job().i, i); t.run(); } t.terminate_threads(); for (int i = 0; i != 20; ++i) BOOST_REQUIRE_EQUAL(items[i]->get_job().i, iterations); } BOOST_AUTO_TEST_CASE( dsp_thread_test_6 ) { run_test_6 >(); run_test_6 >(); } SuperCollider-3.6.3-Source-linux~repack/testsuite/supernova/simple_pool_test.cpp0000644000175000017500000000141111562456103026504 0ustar dandan#include #include #include "utilities/simple_pool.hpp" using namespace nova; using namespace std; namespace { struct foo { foo(void) {} int data[4]; }; void run_simple_test(bool locked) { simple_pool<> pool(16*1024, locked); foo* f1 = static_cast(pool.malloc(sizeof(f1))); ::new(f1) foo(); f1->~foo(); pool.free(f1); } void run_simple_test_2(bool locked) { simple_pool<> pool; pool.init(16*1024, locked); foo* f1 = static_cast(pool.malloc(sizeof(f1))); ::new(f1) foo(); f1->~foo(); pool.free(f1); } } BOOST_AUTO_TEST_CASE( simple_pool_tests ) { run_simple_test(false); run_simple_test(true); run_simple_test_2(false); run_simple_test_2(true); } SuperCollider-3.6.3-Source-linux~repack/testsuite/supernova/help_LocalBuf.scsyndef0000644000175000017500000000072311562456103026663 0ustar dandanSCgf help_LocalBuf=ÌÌÍ@?€E?=áG® WhiteNoise BinaryOpUGenÿÿ WhiteNoise BinaryOpUGenÿÿ MaxLocalBufsÿÿLocalBufÿÿÿÿFFTÿÿÿÿÿÿÿÿLocalBufÿÿÿÿFFTÿÿÿÿÿÿÿÿSinOscÿÿÿÿ PV_BrickWall IFFT ÿÿÿÿSinOscÿÿÿÿ PV_BrickWall IFFT ÿÿÿÿSuperCollider-3.6.3-Source-linux~repack/testsuite/supernova/osc_dispatcher_test.cpp0000664000175000017500000000514312106676017027167 0ustar dandan#include #include "utilities/osc_dispatcher.hpp" #include using namespace nova; using namespace std; namespace { struct osc_test_responder: public osc_responder { osc_test_responder(void): i(0) {} void run(osc::ReceivedMessageArgumentIterator begin, osc::ReceivedMessageArgumentIterator const & end) { ++i; } int i; }; } BOOST_AUTO_TEST_CASE( osc_dispatcher_test_1 ) { osc_dispatcher dispatcher; unique_ptr resp (new osc_test_responder()); dispatcher.add_responder("foo", resp.get()); dispatcher.remove_responder("foo", resp.get()); } BOOST_AUTO_TEST_CASE( osc_pattern_test ) { BOOST_REQUIRE_EQUAL(osc_dispatcher::is_pattern("/abc?de"), true); BOOST_REQUIRE_EQUAL(osc_dispatcher::is_pattern("/abc*de"), true); BOOST_REQUIRE_EQUAL(osc_dispatcher::is_pattern("/ab*?de"), true); BOOST_REQUIRE_EQUAL(osc_dispatcher::is_pattern("/abcde"), false); BOOST_REQUIRE_EQUAL(osc_dispatcher::match_pattern("/abcde", "/abcde"), true); BOOST_REQUIRE_EQUAL(osc_dispatcher::match_pattern("/abcde", "/abcdef"), false); BOOST_REQUIRE_EQUAL(osc_dispatcher::match_pattern("/abcdef", "/abcde"), false); BOOST_REQUIRE_EQUAL(osc_dispatcher::match_pattern("/ab?de", "/abcde"), true); BOOST_REQUIRE_EQUAL(osc_dispatcher::match_pattern("/ab?de", "/abcdf"), false); BOOST_REQUIRE_EQUAL(osc_dispatcher::match_pattern("/ab?de", "/abcdef"), false); BOOST_REQUIRE_EQUAL(osc_dispatcher::match_pattern("/ab*de", "/abcde"), true); BOOST_REQUIRE_EQUAL(osc_dispatcher::match_pattern("/ab*de", "/ab"), false); BOOST_REQUIRE_EQUAL(osc_dispatcher::match_pattern("/ab*de", "/abxyz"), false); BOOST_REQUIRE_EQUAL(osc_dispatcher::match_pattern("/ab*de", "/abxdez"), false); BOOST_REQUIRE_EQUAL(osc_dispatcher::match_pattern("/ab*de*", "/abxdez"), true); BOOST_REQUIRE_EQUAL(osc_dispatcher::match_pattern("/ab*de*", "/abxedz"), false); BOOST_REQUIRE_EQUAL(osc_dispatcher::match_pattern("/*de*", "/abcdefghi"), true); BOOST_REQUIRE_EQUAL(osc_dispatcher::match_pattern("/*de*", "/abcedfghi"), false); } BOOST_AUTO_TEST_CASE( osc_dispatcher_test_2 ) { osc_dispatcher dispatcher; unique_ptr resp (new osc_test_responder()); dispatcher.add_responder("/foo", resp.get()); dispatcher.add_responder("/fpp", resp.get()); dispatcher.handle_packet("/foo\0\0\0", 8); dispatcher.handle_packet("/fo*\0\0\0", 8); BOOST_REQUIRE_EQUAL(resp->i, 2); dispatcher.remove_responder("/foo", resp.get()); dispatcher.remove_responder("/fpp", resp.get()); } SuperCollider-3.6.3-Source-linux~repack/testsuite/supernova/server_sc_osc_handler_test.cpp0000644000175000017500000000100111562456103030511 0ustar dandan#include #include #include "../../source/server/sc_osc_handler.hpp" using namespace nova; BOOST_AUTO_TEST_CASE( sc_osc_handler_1 ) { const_cast(server_arguments::initialize(0, 0)).udp_port = 54321; sc_osc_handler handler(server_arguments::instance()); } BOOST_AUTO_TEST_CASE( sc_osc_handler_2 ) { const_cast(server_arguments::initialize(0, 0)).tcp_port = 54321; sc_osc_handler handler(server_arguments::instance()); } SuperCollider-3.6.3-Source-linux~repack/testsuite/supernova/callback_interpreter_system.cpp0000644000175000017500000000204211576713046030716 0ustar dandan#include #include #include #include "utilities/callback_system.hpp" #include "utilities/callback_interpreter.hpp" #include "nova-tt/thread_priority.hpp" using namespace nova; namespace { int i = 0; struct dummy { void run(void) { ++i; } }; } BOOST_AUTO_TEST_CASE( callback_system_test ) { callback_system cbs; cbs.add_callback(new dummy()); cbs.run_callbacks(); BOOST_REQUIRE_EQUAL(i, 1); } BOOST_AUTO_TEST_CASE( threaded_callback_interpreter_test ) { threaded_callback_interpreter cbi; cbi.start_thread(); for (int j = 0; j != 20; ++j) cbi.add_callback(new dummy()); cbi.join_thread(); BOOST_REQUIRE_EQUAL(i, 21); } BOOST_AUTO_TEST_CASE( callback_interpreter_threadpool_test ) { { callback_interpreter_threadpool cbi(4, true, thread_priority_interval().first); for (int j = 0; j != 20; ++j) cbi.add_callback(new dummy()); } BOOST_REQUIRE_EQUAL(i, 41); } SuperCollider-3.6.3-Source-linux~repack/testsuite/supernova/help_RecordBuf_overdub.scsyndef0000644000175000017500000000026311562456103030574 0ustar dandanSCgfhelp_RecordBuf_overdub?€outbufnumControlPlayBufÿÿÿÿÿÿÿÿÿÿFreeSelfWhenDoneOutSuperCollider-3.6.3-Source-linux~repack/testsuite/supernova/help_out.scsyndef0000644000175000017500000000022211562456103025775 0ustar dandanSCgfhelp_out=ÌÌÍCÜoutfreqControlSinOscÿÿ BinaryOpUGenÿÿOutSuperCollider-3.6.3-Source-linux~repack/testsuite/supernova/audio_frontend_test.cpp0000644000175000017500000000321111562456103027162 0ustar dandan#include #include #define protected public #include "audio_backend/audio_backend.hpp" #include "audio_backend/portaudio.hpp" #include "audio_backend/audio_frontend.hpp" using namespace nova; namespace { void tick(void) {} } BOOST_AUTO_TEST_CASE( frontend_test_1 ) { audio_frontend<&tick> af; BOOST_REQUIRE(!af.audio_is_opened()); BOOST_REQUIRE(af.audio_is_ready()); BOOST_REQUIRE(af.audio_is_active()); BOOST_REQUIRE(!af.audio_is_opened()); } BOOST_AUTO_TEST_CASE( frontend_test_2 ) { audio_frontend<&tick> af; BOOST_REQUIRE(!af.audio_is_opened()); BOOST_REQUIRE(af.audio_is_ready()); BOOST_REQUIRE(af.audio_is_active()); af.open_portaudio_backend(); BOOST_REQUIRE(!af.audio_is_ready()); BOOST_REQUIRE(!af.audio_is_active()); device_list devs = af.list_devices(); af.open_audio_stream(devs[0], devs[0].inchannels, devs[0], devs[0].outchannels, devs[0].defaultSampleRate); BOOST_REQUIRE(af.audio_is_ready()); BOOST_REQUIRE(!af.audio_is_active()); af.activate_audio(); BOOST_REQUIRE(af.audio_is_ready()); BOOST_REQUIRE(af.audio_is_active()); boost::xtime xt; boost::xtime_get(&xt, boost::TIME_UTC); xt.sec += 1; boost::thread::sleep(xt); af.deactivate_audio(); BOOST_REQUIRE(af.audio_is_ready()); BOOST_REQUIRE(!af.audio_is_active()); af.close_audio_stream(); BOOST_REQUIRE(!af.audio_is_ready()); BOOST_REQUIRE(!af.audio_is_active()); af.close_audio_backend(); BOOST_REQUIRE(af.audio_is_ready()); BOOST_REQUIRE(af.audio_is_active()); BOOST_REQUIRE(!af.audio_is_opened()); } SuperCollider-3.6.3-Source-linux~repack/testsuite/supernova/timetag_test.cpp0000644000175000017500000000267311562456103025627 0ustar dandan#include #include "utilities/time_tag.hpp" #include "boost/date_time/posix_time/posix_time.hpp" using namespace nova; using namespace boost; BOOST_AUTO_TEST_CASE( time_tag_test_1 ) { { time_tag tt; BOOST_REQUIRE_EQUAL(tt.get_secs(), 0u); BOOST_REQUIRE_EQUAL(tt.get_fraction(), 0u); } { time_tag tt(100, 200); BOOST_REQUIRE_EQUAL(tt.get_secs(), 100u); BOOST_REQUIRE_EQUAL(tt.get_fraction(), 200u); } { time_tag t1(0, 0); time_tag t2(0, 1); time_tag t3(0, 1); BOOST_REQUIRE(t1 < t2); BOOST_REQUIRE(t1 != t2); BOOST_REQUIRE(t2 == t3); } { time_tag t1(0, 0); time_tag t2(1, 0); time_tag t3 = t1 + t2; BOOST_REQUIRE(t2 == t3); t3 += t2; BOOST_REQUIRE(t3 == time_tag(2, 0)); } } BOOST_AUTO_TEST_CASE( time_tag_test_2 ) { using namespace boost::posix_time; time_tag first = time_tag::from_ptime(ptime(microsec_clock::universal_time())); time_tag next = time_tag::from_ptime(ptime(microsec_clock::universal_time())); BOOST_REQUIRE(first <= next); } BOOST_AUTO_TEST_CASE( time_tag_test_3 ) { using namespace boost::posix_time; time_tag now = time_tag::from_ptime(ptime(microsec_clock::universal_time())); ptime pnow = now.to_ptime(); /* std::cout << now.get_secs() << std::endl; */ /* std::cout << pnow << std::endl; */ } SuperCollider-3.6.3-Source-linux~repack/testsuite/supernova/help_PlayBuf.scsyndef0000644000175000017500000000027511562456103026540 0ustar dandanSCgf help_PlayBuf@outbufnumControl BufRateScaleImpulseÿÿÿÿPlayBufÿÿÿÿÿÿOutSuperCollider-3.6.3-Source-linux~repack/testsuite/supernova/osc_server_test.cpp0000664000175000017500000000320112106676017026340 0ustar dandan#include #include "utilities/osc_server.hpp" #include "nova-tt/semaphore.hpp" using namespace nova; namespace { struct osc_test_responder: public osc_responder { osc_test_responder(void): i(0), sem(0) {} void run(osc::ReceivedMessageArgumentIterator begin, osc::ReceivedMessageArgumentIterator const & end) { ++i; sem.post(); } int i; semaphore sem; }; } BOOST_AUTO_TEST_CASE( network_thread_test ) { network_thread thread; } BOOST_AUTO_TEST_CASE( osc_server_test_1 ) { osc_server server(12321); } BOOST_AUTO_TEST_CASE( osc_server_test_2 ) { osc_server server(12321); std::unique_ptr resp (new osc_test_responder()); server.add_responder("/foo", resp.get()); server.remove_responder("/foo", resp.get()); } BOOST_AUTO_TEST_CASE( osc_server_test_3 ) { std::unique_ptr resp (new osc_test_responder()); { osc_server server(12321); server.add_responder("/foo", resp.get()); { using namespace boost::asio::ip; boost::asio::io_service io_service; udp::resolver resolver(io_service); udp::resolver::query query(udp::v4(), "localhost", "12321"); udp::endpoint receiver_endpoint = *resolver.resolve(query); udp::socket socket(io_service); socket.open(udp::v4()); socket.send_to(boost::asio::buffer("/foo\0\0\0", 8), receiver_endpoint); } resp->sem.wait(); server.remove_responder("/foo", resp.get()); } BOOST_REQUIRE_EQUAL(resp->i, 1); } SuperCollider-3.6.3-Source-linux~repack/testsuite/supernova/boost_test.cpp0000644000175000017500000000010511562456103025307 0ustar dandan#define BOOST_TEST_MAIN #include SuperCollider-3.6.3-Source-linux~repack/testsuite/supernova/sc_synth_prototype_test.cpp0000644000175000017500000000065611562456103030153 0ustar dandan#include #include "sc/sc_synth_prototype.hpp" #include "server/synth_factory.hpp" using namespace nova; using namespace std; BOOST_AUTO_TEST_CASE( sc_synth_factory ) { synth_factory factory; const char * home_ptr = getenv("HOME"); BOOST_REQUIRE (home_ptr != 0); path home(home_ptr); register_synthdefs(factory, sc_read_synthdefs_dir(home / "share/SuperCollider/synthdefs")); } SuperCollider-3.6.3-Source-linux~repack/testsuite/supernova/CMakeLists.txt0000664000175000017500000000566112106676017025177 0ustar dandanset(simple_tests buffer_manager_test.cpp callback_interpreter_system.cpp memory-pool_test.cpp osc_dispatcher_test.cpp osc_server_test.cpp server_dsp_thread_queue_test.cpp server_dsp_thread_test.cpp server_node_graph_test.cpp server_scheduler_test.cpp server_synth_factory_test.cpp server_test.cpp simple_pool_test.cpp sized_array_test.cpp sndfile_backend_test.cpp static_pool_test.cpp timetag_test.cpp ) if(!APPLE) set(simple_tests ${simple_tests} static_allocator_test.cpp tl_allocator_test.cpp ) endif() if (CMAKE_SYSTEM_NAME MATCHES "Linux") set(simple_tests ${simple_tests} perf_counter_test.cpp ) endif() if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_INTEL OR CMAKE_COMPILER_IS_CLANG) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x") else() message(FATAL_ERROR "unknown compiler. supernova testsuite cannot be compiled") endif() find_package(Sndfile REQUIRED) include_directories(${CMAKE_SOURCE_DIR}/include/common ${CMAKE_SOURCE_DIR}/include/plugin_interface ${CMAKE_SOURCE_DIR}/include/server ${CMAKE_SOURCE_DIR}/server/supernova ${CMAKE_SOURCE_DIR}/external_libraries/boost ${CMAKE_SOURCE_DIR}/external_libraries/boost_endian ${CMAKE_SOURCE_DIR}/external_libraries/boost-lockfree ${CMAKE_SOURCE_DIR}/external_libraries/oscpack ${CMAKE_SOURCE_DIR}/external_libraries/ ${CMAKE_SOURCE_DIR}/external_libraries/nova-tt ${CMAKE_SOURCE_DIR}/external_libraries/TLSF-2.4.6/src ${SNDFILE_INCLUDE_DIR} ) if (WIN32 OR APPLE) find_package(Portaudio) if(NOT PORTAUDIO_FOUND) message(FATAL_ERROR "Portaudio missing") endif() add_definitions(-DPORTAUDIO_BACKEND ${PORTAUDIO_DEFINITIONS}) include_directories(${PORTAUDIO_INCLUDE_DIRS}) else() find_library(JACK NAMES jack) if (JACK) add_definitions(-DJACK_BACKEND) include_directories(${JACK_INCLUDE_DIRS}) endif() endif() add_library(boost_test STATIC boost_test.cpp) # run simple tests foreach(test ${simple_tests}) string(REPLACE .cpp "" test_name ${test} ) add_executable(${test_name} ${test}) if (Boost_FOUND) target_link_libraries(${test_name} ${Boost_THREAD_LIBRARY} ${Boost_SYSTEM_LIBRARY} ${Boost_TEST_LIBRARY}) else() target_link_libraries(${test_name} boost_thread boost_system boost_test) endif() target_link_libraries(${test_name} oscpack tlsf) target_link_libraries(${test_name} ${PTHREADS_LIBRARY}) target_link_libraries(${test_name} ${SNDFILE_LIBRARIES}) target_link_libraries(${test_name} libsupernova) if(APPLE) target_link_libraries(${test_name} "-framework CoreAudio") endif() add_test(${test_name}_run ${EXECUTABLE_OUTPUT_PATH}/${test_name}) endforeach(test) SuperCollider-3.6.3-Source-linux~repack/testsuite/supernova/help-In.scsyndef0000644000175000017500000000014211562456103025453 0ustar dandanSCgfhelp-InoutinControlInOutSuperCollider-3.6.3-Source-linux~repack/testsuite/supernova/perf_counter_test.cpp0000644000175000017500000000036611562456103026665 0ustar dandan#include #include #include "../../external_libraries/nova-simd/benchmarks/perf_counter.hpp" BOOST_AUTO_TEST_CASE( perf_count_test ) { perf_counter pc; pc.start(); pc.stop(); pc.dump(); } SuperCollider-3.6.3-Source-linux~repack/testsuite/supernova/sc_plugin_loader_test.cpp0000644000175000017500000000616011562456103027501 0ustar dandan#include #include #include #include "sc/sc_ugen_factory.hpp" #include "server/memory_pool.hpp" #include "server/server_args.hpp" using namespace nova; using namespace std; boost::filesystem::path base_path ("/home/tim/workspace/nova-server/debug_plugins/"); BOOST_AUTO_TEST_CASE( ugen_factory_test_1 ) { server_arguments::initialize(0, 0); rt_pool.init(1024*1024); sc_factory.initialize(); sc_factory.load_plugin(base_path / "BinaryOpUGens.so"); sc_factory.load_plugin(base_path / "ChaosUGens.so"); sc_factory.load_plugin(base_path / "DelayUGens.so"); sc_factory.load_plugin(base_path / "DemandUGens.so"); sc_factory.load_plugin(base_path / "DiskIO_UGens.so"); sc_factory.load_plugin(base_path / "DynNoiseUGens.so"); sc_factory.load_plugin(base_path / "FFT_UGens.so"); sc_factory.load_plugin(base_path / "FilterUGens.so"); sc_factory.load_plugin(base_path / "GendynUGens.so"); sc_factory.load_plugin(base_path / "GrainUGens.so"); sc_factory.load_plugin(base_path / "IOUGens.so"); sc_factory.load_plugin(base_path / "KeyboardUGens.so"); sc_factory.load_plugin(base_path / "LFUGens.so"); sc_factory.load_plugin(base_path / "ML_UGens.so"); sc_factory.load_plugin(base_path / "MouseUGens.so"); sc_factory.load_plugin(base_path / "MulAddUGens.so"); sc_factory.load_plugin(base_path / "NoiseUGens.so"); sc_factory.load_plugin(base_path / "OscUGens.so"); sc_factory.load_plugin(base_path / "PanUGens.so"); sc_factory.load_plugin(base_path / "PhysicalModelingUGens.so"); sc_factory.load_plugin(base_path / "PV_ThirdParty.so"); sc_factory.load_plugin(base_path / "ReverbUGens.so"); sc_factory.load_plugin(base_path / "TestUGens.so"); sc_factory.load_plugin(base_path / "TriggerUGens.so"); sc_factory.load_plugin(base_path / "UnaryOpUGens.so"); sc_factory.load_plugin(base_path / "UnpackFFTUGens.so"); rt_pool.init(1024*1024*16, true); } const char * test_synthdefs[] = { "default.scsyndef", "help-In.scsyndef", "help_out.scsyndef", "help_out2.scsyndef", "help_InFeedback.scsyndef", "help_LocalIn.scsyndef", "help_PlayBuf.scsyndef", "help_RecordBuf.scsyndef", "help_RecordBuf_overdub.scsyndef", "help_LocalBuf.scsyndef", "help_Demand.scsyndef", }; #if 0 /* doesn't work anymore because of increased sanity checks */ BOOST_AUTO_TEST_CASE( ugen_construct_test_1 ) { for (int i = 0; i != sizeof(test_synthdefs)/sizeof(const char*); ++i) { const char * synthdef = test_synthdefs[i]; try { std::vector defs = nova::read_synthdef_file(base_path / ".." / "testsuite" / synthdef); sc_synth_prototype_ptr prtype(new sc_synth_prototype(defs[0])); sc_synth * s = new sc_synth(1000, prtype); dsp_context context(44100, 64, 0); for (int i = 0; i != 1000; ++i) s->run(context); delete s; } catch(std::runtime_error const & e) { std::cerr << e.what() << std::endl; } } } #endif SuperCollider-3.6.3-Source-linux~repack/testsuite/supernova/sized_array_test.cpp0000644000175000017500000000642011644337725026514 0ustar dandan#include "utilities/sized_array.hpp" #include "server/memory_pool.hpp" #include #include namespace nova { simple_pool rt_pool; } /* namespace nova */ using namespace nova; #ifdef BOOST_HAS_RVALUE_REFS using std::move; #else using boost::move; #endif BOOST_AUTO_TEST_CASE( sized_array_test_1 ) { sized_array array(5); array[0] = -1; array[1] = 3; array[4] = 44; BOOST_REQUIRE_EQUAL( array.size(), 5u ); BOOST_REQUIRE_EQUAL( array[1], 3 ); BOOST_REQUIRE_EQUAL( array[0], -1 ); BOOST_REQUIRE_EQUAL( *array.begin(), -1 ); BOOST_REQUIRE_EQUAL( array.front(), -1 ); BOOST_REQUIRE_EQUAL( array.back(), 44 ); BOOST_REQUIRE_EQUAL( *array.rbegin(), 44 ); BOOST_REQUIRE_EQUAL( *(array.rend()-1), -1 ); sized_array long_array(array); BOOST_REQUIRE_EQUAL( long_array.size(), 5u ); BOOST_REQUIRE_EQUAL( long_array[1], 3 ); BOOST_REQUIRE_EQUAL( long_array[0], -1 ); // move assignment sized_array array3(0); move(&array, &array+1, &array3); BOOST_REQUIRE_EQUAL( array3.size(), 5u ); BOOST_REQUIRE_EQUAL( array3[1], 3 ); BOOST_REQUIRE_EQUAL( array3[0], -1 ); BOOST_REQUIRE_EQUAL( array.size(), 0u ); // move assignment sized_array array4(move(array3)); BOOST_REQUIRE_EQUAL( array4.size(), 5u ); BOOST_REQUIRE_EQUAL( array4[1], 3 ); BOOST_REQUIRE_EQUAL( array4[0], -1 ); BOOST_REQUIRE_EQUAL( array3.size(), 0u ); } template void run_test_2(void) { int size = 1024; std::vector vec; for (int i = 0; i != size; ++i) vec.push_back(-i); sized_array array(vec); for (int i = 0; i != size; ++i) BOOST_REQUIRE_EQUAL( vec[i], array[i] ); } BOOST_AUTO_TEST_CASE( sized_array_test_2 ) { rt_pool.init(1024*1024); run_test_2, std::allocator >(); run_test_2, std::allocator >(); run_test_2, rt_pool_allocator >(); run_test_2, rt_pool_allocator >(); } BOOST_AUTO_TEST_CASE( sized_array_test_3 ) { sized_array array(5); array[0] = -1; array[1] = 3; array[4] = 44; BOOST_REQUIRE_EQUAL( array.size(), 5u ); BOOST_REQUIRE_EQUAL( array[0], -1 ); BOOST_REQUIRE_EQUAL( array[1], 3 ); BOOST_REQUIRE_EQUAL( *array.begin(), -1 ); array.resize(6, 444); BOOST_REQUIRE_EQUAL( array.size(), 6u ); BOOST_REQUIRE_EQUAL( array[0], -1 ); BOOST_REQUIRE_EQUAL( array[1], 3 ); BOOST_REQUIRE_EQUAL( array[5], 444 ); array.resize(2); BOOST_REQUIRE_EQUAL( array.size(), 2u ); BOOST_REQUIRE_EQUAL( array[0], -1 ); BOOST_REQUIRE_EQUAL( array[1], 3 ); } BOOST_AUTO_TEST_CASE( sized_array_test_4 ) { sized_array array0(int8_t(5)); sized_array array1(uint8_t(5)); sized_array array2(int16_t(5)); sized_array array3(uint16_t(5)); sized_array array4(int32_t(5)); sized_array array5(uint32_t(5)); sized_array array6(int64_t(5)); sized_array array7(uint64_t(5)); sized_array array8(size_t(5)); sized_array array9(short(5)); sized_array array10(int(5)); sized_array array11(long(5)); } SuperCollider-3.6.3-Source-linux~repack/testsuite/supernova/default.scsyndef0000644000175000017500000000114411562456103025606 0ustar dandanSCgfdefault ¾ÌÌÍ>ÌÌÍ>™™šEzEœ@E@EH?€<#× ?333@CÜ=ÌÌÍ?€outfreqamppangateControlControlVarSawÿÿÿÿLinenÿÿ ÿÿ ÿÿÿÿ Randÿÿÿÿ BinaryOpUGenVarSawÿÿÿÿ BinaryOpUGenRandÿÿÿÿ BinaryOpUGenVarSaw ÿÿÿÿ BinaryOpUGen RandÿÿÿÿRandÿÿÿÿXLine ÿÿÿÿLPF  BinaryOpUGenPan2 OffsetOutSuperCollider-3.6.3-Source-linux~repack/testsuite/CMakeLists.txt0000644000175000017500000000011711562456103023137 0ustar dandanif (SUPERNOVA) add_subdirectory(supernova) endif() add_subdirectory(sclang) SuperCollider-3.6.3-Source-linux~repack/testsuite/sclang/0000775000175000017500000000000012110505246021642 5ustar dandanSuperCollider-3.6.3-Source-linux~repack/testsuite/sclang/sclang_crash_1.scd0000644000175000017500000000013511644342054025210 0ustar dandanx = { 1+1 }.def; x.instVarSize.do { |i| i.debug("index"); x.instVarAt(i).postln }; 0.exit; SuperCollider-3.6.3-Source-linux~repack/testsuite/sclang/sclang_crash_deprecated.scd0000664000175000017500000000003412110501517027136 0ustar dandanb = { nil.deprecated}; b.() SuperCollider-3.6.3-Source-linux~repack/testsuite/sclang/sclang_crash_3.scd0000664000175000017500000000015711721141255025214 0ustar dandan~f = {|i| if (i == 0) { Exception("test").throw } { ~f.(i-1) }; }; try { ~f.(100000) } { }; 0.exit; SuperCollider-3.6.3-Source-linux~repack/testsuite/sclang/CMakeLists.txt0000644000175000017500000000036711562456103024415 0ustar dandanset(SCLANG ${CMAKE_CURRENT_BINARY_DIR}/../../lang/sclang${CMAKE_EXECUTABLE_SUFFIX} -l ${CMAKE_CURRENT_BINARY_DIR}/../../build_sclang.cfg) file(GLOB tests *.scd) foreach(test ${tests}) add_test(${test}_run ${SCLANG} ${test}) endforeach() SuperCollider-3.6.3-Source-linux~repack/testsuite/sclang/sclang_crash_2.scd0000664000175000017500000000004212106676017025213 0ustar dandan{ 1+1 }.def.instVarAt(1); 0.exit; SuperCollider-3.6.3-Source-linux~repack/README_LINUX.txt0000664000175000017500000002257412106676016021042 0ustar dandan-*-text-*--------------------------------------------------------------- supercollider 3 for linux ------------------------------------------------------------------------ ------------------------------------------------------------------------ intro ------------------------------------------------------------------------ SuperCollider is a synthesis engine (scsynth) and programming language (sclang), originally Mac-based but now very widely used on Linux (since Stefan Kersten ported the code in 2003). SuperCollider is free software under the GPL - its main homepage is at http://supercollider.sourceforge.net to get further information on supercollider usage or development, you might consider subscribing to the mailing lists http://www.beast.bham.ac.uk/research/sc_mailing_lists.shtml ------------------------------------------------------------------------ build requirements (most of these will be available in your linux distribution as packages ) ------------------------------------------------------------------------ * gcc >= 3.0 http://www.gnu.org/software/gcc/ gcc versions < 3.0 are missing some required c++ features * jack and libjack http://jackit.sourceforge.net/ jack audio connection kit * libsndfile >= 1.0 http://www.mega-nerd.com/libsndfile/ _the_ soundfile i/o library * pkg-config >= 0.14.0 http://www.freedesktop.org/software/pkgconfig/ facilitates checking for installed packages when compiling from source * cmake >= 2.8 http://www.cmake.org/ cross-platform build system * fftw >= 3.0 http://www.fftw.org/ fast FFT transform library (for frequency-domain analysis, phase-vocoder effects) * libxt http://www.X.org/ X toolkit intrinsics * libicu http://www.icu-project.org/ unicode libraries ------------------------------------------------------------------------ build requirements (optional features) (most of these will be available in your linux distribution as packages ) ------------------------------------------------------------------------ * Qt >= 4.7 (+ qtwebkit) http://qt-project.org/ cross-platform graphical user interface library, for Qt IDE and sclang's Qt GUI kit * alsa http://www.alsa-project.org/ advanced linux sound architecture drivers and library, for sclang's MIDI interface * libreadline >= 5 http://savannah.gnu.org/projects/readline provides convenient CLI interface for sclang * libavahi-client http://www.avahi.org/ a more powerful zeroconf service discovery implementation * libcwiid http://abstrakraft.org/cwiid/ library for wiimote support * linux kernel >= 2.6 http://www.kernel.org/ for sclang's linux input device (LID) interface * for scel: the Emacs interface see the README in the directory `editors/scel' * for sced: the gedit interface see the README in the directory `editors/sced' * for scvim: the vim interface see the README in the directory `editors/scvim' ------------------------------------------------------------------------ build requirements (debian users) ------------------------------------------------------------------------ on debian (unstable) you can install the following packages and be set for building supercollider: build-essential libqt4-dev libqtwebkit-dev libjack-dev or libjack-jackd2-dev libsndfile1-dev libasound2-dev libavahi-client-dev libicu-dev libreadline6-dev libfftw3-dev libxt-dev libcwiid-dev (for wiimote support) pkg-config cmake subversion (required by the Quarks class at run-time) ------------------------------------------------------------------------ building ------------------------------------------------------------------------ to build supercollider with cmake, it is suggested to do out-of-tree builds in a specific build directory: mkdir build cd build cmake .. to run the build process run: make the build process can be configured using the cmake program, cmake frontends like ccmake or cmake-gui, or by simply editing the build/CMakeCache.txt file. for example to enable a release build run the following in your build directory: cmake -DCMAKE_BUILD_TYPE=Release .. to install the whole program, run: make install for the above step you will probably need super-user privileges, e.g. using "sudo". also, please run "sudo ldconfig" after installing for the first time. to uninstall: make uninstall Qt GUI: ------- By default the experimental Qt GUI support will be built into sclang. If you want to build without it configure cmake like this: cmake -DSC_QT=OFF .. ------------------------------------------------------------------------ Building a Debian package ------------------------------------------------------------------------ The most up-to-date debian packaging rules are maintained by the Debian Multimedia team. Repository (with debian/ folder): http://anonscm.debian.org/gitweb/?p=pkg-multimedia/supercollider.git;a=summary At time of writing they support 3.4.x, but we expect updates once 3.5 is available. ------------------------------------------------------------------------ running scsynth (standalone) ------------------------------------------------------------------------ run scsynth without options to get an option summary. don't forget to start jackd before trying to use scsynth. if you want to add directories to supercollider's search path or assign default jack ports, set up your environment as described below. you can specify the number of jack input/output channels created with the options -i and -o, respectively. the -H option can be used to specify a jack server to connect to and to set the jack client identifier. the format is either : or just when connecting to the default server. ------------------------------------------------------------------------ running sclang ------------------------------------------------------------------------ it is recommended to use sclang in combination with your preferred text editor out of emacs/vim/gedit. see the README files in `linux/*' for installation and usage. as an alternative you can simply run the `sclang' executable which will provide a readline-based interface. sclang executes the startup file `~/.config/SuperCollider/startup.scd' after class library initialization. this file can contain statements to set up your supercollider environment, like setting default variables. an example can be found in `linux/examples/sclang.sc'. you _have_ to have a directory `~/.local/share/SuperCollider/'. This is where automatically a synthdefs directory is created. It is also the place to put Extensions to the class library, in a folder called Extensions. the runtime directory is either the current working directory or the path specified with the `-d' option. ------------------------------------------------------------------------ environment ------------------------------------------------------------------------ the jack audio driver interface is configured based on various environment variables: * SC_JACK_DEFAULT_INPUTS comma separated list of jack ports that scsynth's inputs should connect to by default $ export SC_JACK_DEFAULT_INPUTS="system:capture_1,system:capture_2" in order to connect the first ports of one jack client, it is possible to specify only the client name $ export SC_JACK_DEFAULT_INPUTS="system" * SC_JACK_DEFAULT_OUTPUTS comma separated list of jack ports that scsynth's outputs should be connected to by default. $ export SC_JACK_DEFAULT_OUTPUTS="system:playback_1,system:playback_2" in order to connect the first ports of one jack client, it is possible to specify only the client name $ export SC_JACK_DEFAULT_OUTPUTS="system" two additional environment variables substitute directories for the default search path for plugins and synth definitions, respectively. directory names are separated by ':' as in the unix PATH variable: * SC_PLUGIN_PATH, SC_SYNTHDEF_PATH $ export SC_SYNTHDEF_PATH="./synthdefs:/home/sk/SuperCollider/synthdefs" ------------------------------------------------------------------------ documentation ------------------------------------------------------------------------ apart from the sites listed above, some more documentation links ... a wiki for supercollider, set up by julian rohrhuber, is at http://swiki.hfbk-hamburg.de/MusicTechnology/6 linux specific information can be found at http://swiki.hfbk-hamburg.de/MusicTechnology/478 ------------------------------------------------------------------------ reporting bugs ------------------------------------------------------------------------ please report bugs either to the sc-users or sc-dev mailing lists. ------------------------------------------------------------------------ contributors to this document ------------------------------------------------------------------------ stefan kersten andi pieper maurizio umberto puxeddu rohan drape mario lang john yates nescivi (marije baalman) dan stowell tim blechmann ------------------------------------------------------------------------ outro ------------------------------------------------------------------------ thanks to james mccartney, for making this great piece of audio software publically and freely available. ------------------------------------------------------------------------ eof ------------------------------------------------------------------------ SuperCollider-3.6.3-Source-linux~repack/HelpSource/0000775000175000017500000000000012110505246020413 5ustar dandanSuperCollider-3.6.3-Source-linux~repack/HelpSource/Search.html0000664000175000017500000004711712057624166022535 0ustar dandan Search