测试能够运行了

This commit is contained in:
Wang Boyang 2025-07-07 12:05:04 +08:00
parent 99e4c5219e
commit 746f723dff
99 changed files with 4236 additions and 52 deletions

View File

@ -1,5 +1,6 @@
CFLAGS=-g -O2 -Wall -Wextra -Isrc -rdynamic -DNDEBUG $(OPTFLAGS)
LDFLAGS=-lm
# gcc $(pkg-config --cflags libbsd-overlay) hello.c -o hello $(pkg-config --libs libbsd-overlay)
CFLAGS=-isystem /usr/include/bsd -DLIBBSD_OVERLAY -g -O2 -Wall -Wextra -Isrc -rdynamic -DNDEBUG $(OPTFLAGS)
LDLIBS = -lbsd -lm
LIBS=-ldl $(OPTLIBS)
PREFIX?=/usr/local

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1,19 +1,20 @@
#include <lcthw/darray_algos.h>
#include <stdlib.h>
// #include <unistd.h>
int DArray_qsort(DArray* array, DArray_compare cmp)
{
qsort(array -> contents, DArray_count(array), sizeof(void *), cmp);
qsort(array -> contents, ZED_MACRO_DArray_count(array), sizeof(void *), cmp);
return 0;
}
int DArray_heapsort(DArray* array, DArray_compare cmp)
{
return heapsort(array -> contents, DArray_count(array), sizeof(void *), cmp);
return heapsort(array -> contents, ZED_MACRO_DArray_count(array), sizeof(void *), cmp);
}
int DArray_mergesort(DArray* array, DArray_compare cmp)
{
return mergesort(array -> contents, DArray_count(array), sizeof(void *), cmp);
return mergesort(array -> contents, ZED_MACRO_DArray_count(array), sizeof(void *), cmp);
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -8,19 +8,27 @@ DArray ./src/lcthw/darray.h /^typedef struct DArray {$/;" s
DArray ./src/lcthw/darray.h /^} DArray;$/;" t typeref:struct:DArray
DArray_clear ./src/lcthw/darray.c /^void DArray_clear(DArray *array)$/;" f
DArray_clear_destroy ./src/lcthw/darray.c /^void DArray_clear_destroy(DArray *array)$/;" f
DArray_compare ./src/lcthw/darray_algos.h /^typedef int (*DArray_compare) (const void *a, const void *b);$/;" t
DArray_contract ./src/lcthw/darray.c /^int DArray_contract(DArray *array)$/;" f
DArray_create ./src/lcthw/darray.c /^DArray *DArray_create(size_t element_size, size_t initial_max)$/;" f
DArray_destroy ./src/lcthw/darray.c /^void DArray_destroy(DArray *array)$/;" f
DArray_expand ./src/lcthw/darray.c /^int DArray_expand(DArray *array)$/;" f
DArray_free ./src/lcthw/darray.h 101;" d
DArray_free ./src/lcthw/darray.h 80;" d
DArray_get ./src/lcthw/darray.h /^static inline void *DArray_get(DArray *array, int i)$/;" f
DArray_heapsort ./src/lcthw/darray_algos.c /^int DArray_heapsort(DArray* array, DArray_compare cmp)$/;" f
DArray_mergesort ./src/lcthw/darray_algos.c /^int DArray_mergesort(DArray* array, DArray_compare cmp)$/;" f
DArray_new ./src/lcthw/darray.h /^static inline void *DArray_new(DArray *array)$/;" f
DArray_pop ./src/lcthw/darray.c /^void *DArray_pop(DArray *array)$/;" f
DArray_push ./src/lcthw/darray.c /^int DArray_push(DArray *array, void *el)$/;" f
DArray_qsort ./src/lcthw/darray_algos.c /^int DArray_qsort(DArray* array, DArray_compare cmp)$/;" f
DArray_remove ./src/lcthw/darray.h /^static inline void *DArray_remove(DArray *array, int i)$/;" f
DArray_resize ./src/lcthw/darray.c /^static inline int DArray_resize(DArray *array, size_t newsize)$/;" f file:
DArray_resize ./src/lcthw/darray.h /^static inline int DArray_resize(DArray *array, size_t newsize)$/;" f
DArray_set ./src/lcthw/darray.h /^static inline void DArray_set(DArray *array, int i, void *el)$/;" f
DArray_unshift ./src/lcthw/darray.c /^int DArray_unshift(DArray *array, void *el)$/;" f
DEFAULT_EXPAND_RATE ./src/lcthw/darray.h 37;" d
DEFAULT_EXPAND_RATE ./src/lcthw/darray.h 39;" d
List ./src/lcthw/list.h /^typedef struct List {$/;" s
List ./src/lcthw/list.h /^} List;$/;" t typeref:struct:List
ListNode ./src/lcthw/list.h /^typedef struct ListNode {$/;" s
@ -71,10 +79,15 @@ ZED_MACRO_CHECK_DEBUG ./src/lcthw/dbg.h 35;" d
ZED_MACRO_CHECK_MEM ./src/lcthw/dbg.h 32;" d
ZED_MACRO_CLEAN_ERRNO ./src/lcthw/dbg.h 14;" d
ZED_MACRO_DArray_count ./src/lcthw/darray.h 34;" d
ZED_MACRO_DArray_count ./src/lcthw/darray.h 36;" d
ZED_MACRO_DArray_end ./src/lcthw/darray.h 33;" d
ZED_MACRO_DArray_end ./src/lcthw/darray.h 35;" d
ZED_MACRO_DArray_first ./src/lcthw/darray.h 32;" d
ZED_MACRO_DArray_first ./src/lcthw/darray.h 34;" d
ZED_MACRO_DArray_last ./src/lcthw/darray.h 31;" d
ZED_MACRO_DArray_last ./src/lcthw/darray.h 33;" d
ZED_MACRO_DArray_max ./src/lcthw/darray.h 35;" d
ZED_MACRO_DArray_max ./src/lcthw/darray.h 37;" d
ZED_MACRO_DEBUG ./src/lcthw/dbg.h 11;" d
ZED_MACRO_DEBUG ./src/lcthw/dbg.h 9;" d
ZED_MACRO_LOG_ERR ./src/lcthw/dbg.h 17;" d
@ -93,23 +106,31 @@ ZED_SENTINEL_MACRO ./src/lcthw/dbg.h 29;" d
_DArray_h ./src/lcthw/darray.h 2;" d
__dbg_h__ ./src/lcthw/dbg.h 2;" d
_minunit_h ./tests/minunit.h 3;" d
all_tests ./tests/darray_algos_tests.c /^ZED_RUN_TESTS(all_tests);$/;" v
all_tests ./tests/darray_algos_tests.c /^char* all_tests()$/;" f
all_tests ./tests/darray_tests.c /^ZED_MACRO_RUN_TESTS(all_tests);$/;" v
all_tests ./tests/darray_tests.c /^ZED_RUN_TESTS_MACRO(all_tests);$/;" v
all_tests ./tests/darray_tests.c /^char *all_tests()$/;" f
all_tests ./tests/list_algos_tests.c /^ZED_MACRO_RUN_TESTS(all_tests);$/;" v
all_tests ./tests/list_algos_tests.c /^ZED_RUN_TESTS_MACRO(all_tests);$/;" v
all_tests ./tests/list_algos_tests.c /^char *all_tests()$/;" f
all_tests ./tests/list_tests.c /^ZED_MACRO_RUN_TESTS(all_tests);$/;" v
all_tests ./tests/list_tests.c /^ZED_RUN_TESTS_MACRO(all_tests);$/;" v
all_tests ./tests/list_tests.c /^char *all_tests()$/;" f
array ./tests/darray_tests.c /^static DArray *array = NULL;$/;" v file:
contents ./src/lcthw/darray.h /^ void **contents;$/;" m struct:DArray
count ./src/lcthw/list.h /^ int count;$/;" m struct:List
create_words ./tests/darray_algos_tests.c /^DArray *create_words()$/;" f
create_words ./tests/list_algos_tests.c /^List *create_words()$/;" f
create_words1 ./tests/list_algos_tests.c /^List *create_words1()$/;" f
create_words2 ./tests/list_algos_tests.c /^List *create_words2()$/;" f
darray_algos_h ./src/lcthw/darray_algos.h 2;" d
element_size ./src/lcthw/darray.h /^ size_t element_size;$/;" m struct:DArray
end ./src/lcthw/darray.h /^ int end;$/;" m struct:DArray
expand_rate ./src/lcthw/darray.h /^ size_t expand_rate;$/;" m struct:DArray
first ./src/lcthw/list.h /^ ListNode *first;$/;" m struct:List
generate_random_array ./tests/list_algos_tests.c /^int *generate_random_array(int size)$/;" f
is_sorted ./tests/darray_algos_tests.c /^int is_sorted(DArray* array)$/;" f
is_sorted ./tests/list_algos_tests.c /^int is_sorted(List *words)$/;" f
last ./src/lcthw/list.h /^ ListNode *last;$/;" m struct:List
lcthw_List_algos_h ./src/lcthw/list_algos.h 2;" d
@ -119,23 +140,30 @@ merge2 ./src/lcthw/list_algos.c /^void merge2(List *a, char aux[][6], int m, int
next ./src/lcthw/list.h /^ struct ListNode *next;$/;" m struct:ListNode typeref:struct:ListNode::ListNode
prev ./src/lcthw/list.h /^ struct ListNode *prev;$/;" m struct:ListNode typeref:struct:ListNode::ListNode
print_random_string ./tests/list_algos_tests.c /^char *print_random_string(int n)$/;" f
run_sort_test ./tests/darray_algos_tests.c /^char* run_sort_test(int (*func) (DArray*, DArray_compare), const char* name)$/;" f
test_bubble_sort ./tests/list_algos_tests.c /^char *test_bubble_sort()$/;" f
test_create ./tests/darray_tests.c /^char *test_create()$/;" f
test_create_destroy ./tests/list_tests.c /^char *test_create_destroy()$/;" f
test_destroy ./tests/darray_tests.c /^char *test_destroy()$/;" f
test_expand_contract ./tests/darray_tests.c /^char *test_expand_contract()$/;" f
test_get ./tests/darray_tests.c /^char *test_get()$/;" f
test_heapsort ./tests/darray_algos_tests.c /^char* test_heapsort()$/;" f
test_insert ./tests/list_algos_tests.c /^char *test_insert()$/;" f
test_merge ./tests/list_tests.c /^char *test_merge()$/;" f
test_merge_sort ./tests/list_algos_tests.c /^char *test_merge_sort()$/;" f
test_mergesort ./tests/darray_algos_tests.c /^char* test_mergesort()$/;" f
test_new ./tests/darray_tests.c /^char *test_new()$/;" f
test_push_copy ./tests/list_tests.c /^char *test_push_copy()$/;" f
test_push_pop ./tests/darray_tests.c /^char *test_push_pop()$/;" f
test_push_pop1 ./tests/list_tests.c /^char *test_push_pop1()$/;" f
test_qsort ./tests/darray_algos_tests.c /^char* test_qsort()$/;" f
test_remove ./tests/darray_tests.c /^char *test_remove()$/;" f
test_resize ./tests/darray_tests.c /^char *test_resize()$/;" f
test_set ./tests/darray_tests.c /^char *test_set()$/;" f
test_split ./tests/list_tests.c /^char *test_split()$/;" f
test_unshift ./tests/darray_tests.c /^char *test_unshift()$/;" f
test_unshift_remove_shift ./tests/list_tests.c /^char *test_unshift_remove_shift()$/;" f
testcmp ./tests/darray_algos_tests.c /^int testcmp(char** a, char** b)$/;" f
tests_run_globel ./tests/minunit.h /^int tests_run_globel = 0;$/;" v
val1 ./tests/darray_tests.c /^static int *val1 = NULL;$/;" v file:
val2 ./tests/darray_tests.c /^static int *val2 = NULL;$/;" v file:

Binary file not shown.

View File

@ -24,7 +24,7 @@ int is_sorted(DArray* array)
{
int i = 0;
for (i = 0; i < DArray_count(array) - 1; ++i)
for (i = 0; i < ZED_MACRO_DArray_count(array) - 1; ++i)
{
if (strcmp(DArray_get(array, i), DArray_get(array, i + 1)) > 0)
{
@ -44,7 +44,7 @@ char* run_sort_test(int (*func) (DArray*, DArray_compare), const char* name)
int rc = func(words, (DArray_compare) testcmp);
ZED_MU_ASSERT(0 == rc, "sort failed");
ZED_MACRO_MU_ASSERT(0 == rc, "sort failed");
ZED_MACRO_MU_ASSERT(is_sorted(words), "didn't sort it");
DArray_destroy(words);
@ -71,11 +71,11 @@ char* all_tests()
{
ZED_MACRO_MU_SUITE_START();
ZED_MU_RUN_TEST(test_qsort);
ZED_MU_RUN_TEST(test_heapsort);
ZED_MU_RUN_TEST(test_mergesort);
ZED_MACRO_MU_RUN_TEST(test_qsort);
ZED_MACRO_MU_RUN_TEST(test_heapsort);
ZED_MACRO_MU_RUN_TEST(test_mergesort);
return NULL;
}
ZED_RUN_TESTS(all_tests);
ZED_MACRO_RUN_TESTS(all_tests);

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1,41 +1,4 @@
DEBUG tests/darray_tests.c:201: ----- RUNNING: ./tests/darray_tests
DEBUG tests/darray_tests.c:187:
----- test_create
DEBUG tests/darray_tests.c:188:
----- test_new
DEBUG tests/darray_tests.c:189:
----- test_set
DEBUG tests/darray_tests.c:190:
----- test_get
DEBUG tests/darray_tests.c:191:
----- test_remove
DEBUG tests/darray_tests.c:192:
----- test_expand_contract
DEBUG tests/darray_tests.c:193:
----- test_unshift
DEBUG tests/darray_tests.c:194:
----- test_push_pop
DEBUG tests/darray_tests.c:195:
----- test_resize
DEBUG tests/darray_tests.c:196:
----- test_destroy
DEBUG tests/list_algos_tests.c:221: ----- RUNNING: ./tests/list_algos_tests
DEBUG tests/list_algos_tests.c:214:
----- test_bubble_sort
DEBUG tests/list_algos_tests.c:215:
----- test_merge_sort
DEBUG tests/list_algos_tests.c:216:
----- test_insert
DEBUG tests/list_tests.c:278: ----- RUNNING: ./tests/list_tests
DEBUG tests/list_tests.c:268:
----- test_create_destroy
DEBUG tests/list_tests.c:269:
----- test_push_pop1
DEBUG tests/list_tests.c:270:
----- test_unshift_remove_shift
DEBUG tests/list_tests.c:271:
----- test_push_copy
DEBUG tests/list_tests.c:272:
----- test_merge
DEBUG tests/list_tests.c:273:
----- test_split
DEBUG tests/darray_algos_tests.c:81: ----- RUNNING: ./tests/darray_algos_tests
DEBUG tests/darray_algos_tests.c:74:
----- test_qsort
[ERROR] (tests/darray_algos_tests.c:41: errno: None) Words should start not sorted.

View File

@ -0,0 +1,442 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html><head>
<meta http-equiv="content-type" content="text/html; charset=windows-1252">
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
<title>An introduction to Makefiles: A sample makefile and how it works</title>
<link href="https://courses.cs.duke.edu/cps108/fall02/resources/MakefileInfo/tips.html" rel="next">
<link href="https://courses.cs.duke.edu/cps108/fall02/resources/MakefileInfo/html/Makefiles.html#toc1" rel="contents">
</head>
<body>
<a href="https://courses.cs.duke.edu/cps108/fall02/resources/MakefileInfo/tips.html">Next</a>
Previous
<a href="https://courses.cs.duke.edu/cps108/fall02/resources/MakefileInfo/html/Makefiles.html#toc1">Contents</a>
<hr>
<h2><a name="s1">1. A sample makefile and how it works</a> </h2>
<p>Let's start by looking at a sample makefile:
</p><blockquote>
<pre>##############################################################################
#
# Sample Makefile for C++ applications
# Works for single and multiple file programs.
# written by Robert Duvall
# modified by Owen Astrachan
# and by Garrett Mitchener
#
##############################################################################
##############################################################################
# Application-specific variables
# EXEC is the name of the executable file
# SRC_FILES is a list of all source code files that must be linked
# to create the executable
##############################################################################
EXEC = usepix
SRC_FILES = application.cc displaycommand.cc filelister.cc menu.cc \
menuitem.cc pixmap.cc quitcommand.cc readcommand.cc \
usepix.cc
##############################################################################
# Where to find course related files
# COURSE_DIR is where various header files (.h) and library files (.so and .a)
# are found. LIB_DIR is where other libraries not specific to the course
# are kept.
# for CS machines
# COURSE_DIR = /usr/project/courses/cps108/lib
# LIB_DIR = /usr/local/lib
# for acpub machines
COURSE_DIR = /afs/acpub/users/o/l/ola/cps108/lib
LIB_DIR = /afs/acpub/project/cps/lib
##############################################################################
# Compiler specifications
# These match the variable names given in /usr/share/lib/make/make.rules
# so that make's generic rules work to compile our files.
# gmake prefers CXX and CXXFLAGS for c++ programs
##############################################################################
# Which compiler should be used
CXX = g++
CC = $(CXX)
# What flags should be passed to the compiler
DEBUG_LEVEL = -g
EXTRA_CCFLAGS = -Wall
CXXFLAGS = $(DEBUG_LEVEL) $(EXTRA_CCFLAGS)
CCFLAGS = $(CXXFLAGS)
# What flags should be passed to the C pre-processor
# In other words, where should we look for files to include - note,
# you should never need to include compiler specific directories here
# because each compiler already knows where to look for its system
# files (unless you want to override the defaults)
CPPFLAGS = -I. \
-I$(COURSE_DIR)
# What flags should be passed to the linker
# In other words, where should we look for libraries to link with - note,
# you should never need to include compiler specific directories here
# because each compiler already knows where to look for its system files.
LDFLAGS = -L. \
-L$(COURSE_DIR) \
-R $(LIB_DIR):$(COURSE_DIR)
# What libraries should be linked with.
# For example, -lm links with libm.so, the math library.
# If you make a library of your own, say, libscandir.a, you have to link it
# in by adding -lscandir here.
LDLIBS = -lscandir
# All source files have associated object files.
# This line sets `OFILES' to have the same value as `SRC_FILES' but
# with all the .cc's changed into .o's.
O_FILES = $(SRC_FILES:%.cc=%.o)
###########################################################################
# Additional rules make should know about in order to compile our files
###########################################################################
# all is the default rule
all: $(EXEC)
# exec depends on the object files
# It is made automagically using the LDFLAGS and LOADLIBES variables.
# The .o files are made automagically using the CXXFLAGS variable.
$(EXEC): $(O_FILES)
# to use `makedepend', the target is `depend'
depend:
-&gt; makedepend -- $(CXXFLAGS) -- -Y $(SRC_FILES)
# clean up after you're done
clean:
-&gt; $(RM) $(O_FILES) core *.rpo
very-clean: clean
-&gt; $(RM) $(EXEC)
</pre>
</blockquote>
<p>Note that the arrows <code>-&gt;</code> represent places where you should
put tab characters, not eights spaces. It hath been decreed that this
shalt be a tab character. Emacs and XEmacs have a makefile mode,
which you can get into by typing <code>M-x makefile-mode</code> if it doesn't
come up automatically. In makefile mode, pressing the <code>tab</code> key
inserts a real tab. Alternatively, the keystrokes <code>C-q C-i</code> or
<code>C-q tab</code> will enter a tab character in any mode. (<code>C-q</code> is
emacs for quote next key unprocessed.)
</p><p>You should name your makefile `Makefile' with that capitalization.
Make looks for that file automatically. If you don't name it that,
you'll have to tell make specifically which file to use (as in
<code>gmake -f somethingelse ...</code>).
</p><h2><a name="ss1.1">1.1 The short answer</a>
</h2>
<p>The short answer of how to use that makefile is this: Change the line
that says <code>SRC_FILES =</code> so that the right-hand side of the equals
sign is a list of all the <code>.cc</code> files in your project. Change the
line that says <code>EXEC =</code> so that the right-hand side of the equals
sign is the name of your executable.
</p><p>The first time you use make, add a <code>.cc</code> file, or any time you
change whether a <code>.cc</code> file includes a particular <code>.h</code> file, run
the command:
</p><blockquote>
<pre>gmake depend</pre>
</blockquote>
<p>To build your executable in general, run the command <code>gmake</code>. To
clean up your directory and get rid of files you don't need, run
<code>gmake clean</code>.
</p><p>These short directions will be enough to get you through the first
assignment or two, but after that, you'll probably need to start
changing more stuff further down in the makefile, and to know what to
do, you'll have to understand how make works. So, without further
ado...
</p><h2><a name="ss1.2">1.2 Comments</a>
</h2>
<p>Any line which begins with a sharp sign (#) is ignored by the
makefile as a comment. Comment lines can be used to leave
instructions for whoever has to use your makefile (including
yourself). They are also useful for allowing someone to select
between alternative definitions of macros. For example, several lines
of the makefile have been commented out here:
</p><blockquote>
<pre># for CS machines
# COURSE_DIR = /usr/project/courses/cps108/lib
# LIB_DIR = /usr/local/lib
# for acpub machines
COURSE_DIR = /afs/acpub/users/o/l/ola/cps108/lib
LIB_DIR = /afs/acpub/project/cps/lib</pre>
</blockquote>
The idea is that you should un-comment exactly one definition for
<code>COURSE_DIR</code> and <code>LIB_DIR</code>, depending on which computer system
you're using. By keeping these alternatives in the file with all but
one hidden, you make it easier on yourself to move your project from
one network to another.
<h2><a name="ss1.3">1.3 Continuing long lines</a>
</h2>
<p>Continuing long lines is easy, just put a backslash at the end of the
line. Make pretends the following long command is all on one line:
</p><blockquote>
<pre>SRC_FILES = application.cc displaycommand.cc filelister.cc menu.cc \
menuitem.cc pixmap.cc quitcommand.cc readcommand.cc \
usepix.cc
</pre>
</blockquote>
Make replaces the backslashes with a space when it combines the lines,
so just don't break a line in the middle of a word.
<h2><a name="ss1.4">1.4 Macros</a>
</h2>
<p>In a makefile, it is very easy to define a macro, or
text-substitution. These are similar to environment variables in the
shell or string variables in most programming languages:
</p><blockquote>
<pre>COURSE_DIR = /afs/acpub/users/o/l/ola/cps108/lib</pre>
</blockquote>
<p>Whenever make sees <code>$(COURSE_DIR)</code> in the makefile, it will
substitute in the text contained in the macro <code>COURSE_DIR</code>.
Remember, use the dollar sign and parentheses only when you want to
reference the macro. Just use its name to assign it a value.
</p><p>
One really useful thing about macros is that they can
reference other macros:
</p><blockquote>
<pre>CXXFLAGS = $(DEBUG_LEVEL) $(EXTRA_CCFLAGS)</pre>
</blockquote>
<p>The trick is that make doesn't substitute for <code>DEBUG_LEVEL</code>
immediately when you define <code>CXXFLAGS</code>. Instead, when you
reference <code>CXXFLAGS</code>, it expands into
<code>$(DEBUG_LEVEL) $(EXTRA_CCFLAGS)</code>.
Since that still has
<code>$</code>'s in it, make expands it again into <code>-g -Wall</code>.
Therefore, you can define macros in any order, as long as they are
defined before they are actually expanded.
</p><h2><a name="ss1.5">1.5 Special <code>$</code> commands</a>
</h2>
<p>One line of the sample makefile illustrates a special command that
make provides through the <code>$</code> symbol:
</p><blockquote>
<pre>O_FILES = $(SRC_FILES:%.cc=%.o)</pre>
</blockquote>
<p>This particular line sets <code>O_FILES</code> to be the same as <code>SRC_FILES</code>
but with all the <code>.cc</code> suffixes replaced with <code>.o</code>. This is
useful because you can easily add a new class to your project by
adding its <code>.cc</code> filename to the definition of <code>SRC_FILES</code>. Its
object file will automatically be added to <code>O_FILES</code>. This means
that adding a file to your project requires changing only one line in
your makefile. Furthermore, having a list of all source and object
files is quite useful, as you'll soon see.
</p><h2><a name="ss1.6">1.6 Basic dependency rules</a>
</h2>
<p>Dependency rules are statements that make uses to determine which
files need to be brought up to date. They consist of a line declaring
what <em>target</em> file depends on which <em>dependencies</em>, followed
by zero or more command lines which tell it what to do to bring the
target up to date. For example (from another makefile):
</p><blockquote>
<pre>OBJ = menu.o application.o pixmap.o
CXX = g++
CXXFLAGS = -g -Wall
usepix: $(OBJ)
-&gt; $(CXX) $(CXXFLAGS) -o usepix $(OBJ) -lm</pre>
</blockquote>
<p>The executable <code>usepix</code> is the target and all those <code>.o</code> files
are the dependencies. The <code>$(CXX)</code> line turns into a command to
<code>g++</code> when all those macros are expanded.
</p><p>Again I must say, it hath been declared that command lines shalt begin
with a tab character and end with a new-line character. If the last
line of your makefile is not doing anything, it may be that you forgot
to push enter at the end of that line.
</p><p>The dependency line states that the file <code>usepix</code> depends upon the
files in the macro <code>OBJ</code>, which in this case expands to
<code>application.o</code>, <code>menu.o</code>, etc. If you ask make to update
<code>usepix</code> by entering the command <code>gmake usepix</code> on the shell
command line, it will find this dependency line and look at all the
<code>.o</code> files usepix depends upon. If one of them is determined to be
out of date, it is updated. If after all that one of those <code>.o</code>
files is newer than <code>usepix</code>, or if <code>usepix</code> doesn't exist, make
will execute the compilation command underneath the dependency line
and build an up-to-date version of <code>usepix</code>. You may have as many
command lines as you want, as long as they all begin with tab
characters. You may also have zero command lines, which is useful for
pseudo-targets and implicit rules, which I will explain later. All
those macros are fully expanded before make looks at any dependencies.
</p><h2><a name="ss1.7">1.7 Special dependency rules</a>
</h2>
<p><b>The first dependency is magic.</b> When you execute make, it expects
you to give it the name of a target to update on the command line,
ie.<code>gmake usepix</code>. If you don't give a target, it simply
updates the first target it comes to. In the first sample makefile,
it's <code>all</code>, and in the smaller second example, it's <code>usepix</code>,
but in a larger project, there might be several test programs,
libraries, and so on. It's therefore common to have a first target
called `all' which depends on the files you want to update most
frequently. No file named `all' ever really exists because it is a
pseudo-target. Which brings us to the next item...
</p><p><b>Pseudo-targets are really useful.</b> A pseudo-target is a file
which never really exists. It has a dependency section in the
makefile, and if you tell make to update that target, it will do its
normal stuff and update all the dependencies, then run any commands
underneath the dependency line.
</p><p>Here's an example that uses a pseudo-target to effectively combine two
other targets so that you can update them with one command:
</p><blockquote>
<pre>testsuite: test1 test2
test1: test1.o foo.o bar.o
-&gt; ...
test2: test2.o foo.o bar.o
-&gt; ...
</pre>
</blockquote>
<p>Issuing the command <code>gmake testsuite</code> causes make to update
<code>test1</code> and <code>test2</code>.
</p><p>Another way to use pseudo-targets is to have a target which has no
dependencies but has a few commands listed under it. In the sample
makefile, `clean' is just such a pseudo-target:
</p><blockquote>
<pre>clean:
-&gt; $(RM) $(O_FILES) core *.rpo</pre>
</blockquote>
<p>Targets which have no dependencies are always considered out of date
and any commands listed under them are always executed. If you were
to issue the command <code>gmake clean</code> using the sample makefile,
make would remove all those <code>.o</code> files from the current directory.
</p><p>Having a `cleanup' target or two is quite useful: You're not likely to
mistype <code>gmake clean</code> and even if you did, it wouldn't be a
disaster. But notice how easy it is to mistype <code>rm -f *.o</code> (remove
all your <code>.o</code> files) as <code>rm -f *&gt;o</code> (remove <em>everything</em>
and re-direct any output into a file called <code>o</code>). Holding down the
shift key a moment too long can wipe out weeks of work, and make can
easily prevent such goofs.
</p><p>Here are some sample pseudo-targets that are useful for lots of
different things. Note that some macros are used that you'll have to
define for yourself elsewhere:
</p><blockquote>
<pre>all: usepix testpix toast pancake
clean:
-&gt; rm -f $(OBJ)
# More about this one in the section on makedepend...
depend:
-&gt; makedepend $(CXXFLAGS) -Y $(SRC)
# This is a neat way to make a compressed archive file for
# saving or submitting your project.
# Note that several commands go with this target; all will be
# executed if you run gmake archive.
archive:
-&gt; rm -rf project project.tar.gz
-&gt; mkdir project
-&gt; cp $(SUBMISSIONS) project
-&gt; tar -cf project.tar project
-&gt; gzip project.tar
# This next one makes a printout of all your source code.
# The $? means all dependencies newer than the target.
# See the section on special macros
PRINTCMD = enscript -2rG -pprintout.ps
print: $(SOURCE) $(HEADERS)
-&gt; echo spooling $? to printer using $(PRINTCMD)
-&gt; $(PRINTCMD) $?
-&gt; print printout.ps
-&gt; rm printout.ps</pre>
</blockquote>
<h2><a name="s:special"></a> <a name="ss1.8">1.8 Special macros</a>
</h2>
<p>Now all those <code>$@</code> thingees that appear in the example above
and elsewhere in the makefile are clearly not plain old macros, since
they're never defined and yet this makefile works quite well, I
promise. The reason is that there are a number of special macros with
one character names that are only useable as part of a dependency
rule:
</p><dl>
<dt><b><code>$@</code></b></dt><dd><p>The file name of the target.
</p></dd><dt><b><code>$&lt;</code></b></dt><dd><p>The name of the first dependency.
</p></dd><dt><b><code>$*</code></b></dt><dd><p>The part of a filename which matched a suffix rule.
</p></dd><dt><b><code>$?</code></b></dt><dd><p>The names of all the dependencies newer than the
target separated by spaces.
</p></dd><dt><b><code>$^</code></b></dt><dd><p>The names of all the dependencies separated by
spaces, but with duplicate names removed.
</p></dd><dt><b><code>$+</code></b></dt><dd><p>The names of all the dependencies separated by
spaces with duplicate names included and in the same order as in the
rule.
</p></dd></dl>
<p>Some of these are only useful as part of suffix rules which are
described in section
<a href="#s:suffix">Suffix rules</a>.
</p><h2><a name="s:suffix"></a> <a name="ss1.9">1.9 Suffix rules</a>
</h2>
<p>Most of the commands you use to update files are similar; to build
most C++ programs, you call g++ with similar flags and really just
change the name of the file you're compiling. Make allows you to
define suffix rules so that you don't have to put command lines
underneath all your dependencies. For example, here is the built-in
suffix rule that gmake uses to compile a <code>.cc</code> file into a <code>.o</code>
file:
</p><blockquote>
<pre>COMPILE.cc = $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c
OUTPUT_OPTION = -o $@
%.o: %.cc
-&gt; $(COMPILE.cc) $&lt; $(OUTPUT_OPTION)</pre>
</blockquote>
<p>With suffix rules, you can leave out the command part of a dependency
rule, for example:
</p><blockquote>
<pre>usepix.o: usepix.cc usepix.h pixmap.h</pre>
</blockquote>
<p>If make decides to update <code>usepix.o</code>, it sees from this line that
it depends on <code>usepix.cc</code>, and it sees from the <code>%.cc: %.o</code> rule
that to update it, it should run g++ using the flags defined in
<code>CXXFLAGS</code> and to compile <code>usepix.cc</code>.
</p><p>Make has a number of built in suffix rules, which are roughly as
follows:
</p><blockquote>
<pre>COMPILE.cc = $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c
COMPILE.c = $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c
LINK.o = $(CC) $(LDFLAGS) $(TARGET_ARCH)
OUTPUT_OPTION = -o $@
%: %.o
-&gt; $(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@
%.o: %.c
-&gt; $(COMPILE.c) $&lt; $(OUTPUT_OPTION)
%.o: %.cc
-&gt; $(COMPILE.cc) $&lt; $(OUTPUT_OPTION)</pre>
</blockquote>
<p>You can get the full list from the command <code>gmake -p -f/dev/null/</code>.
</p><hr>
<a href="https://courses.cs.duke.edu/cps108/fall02/resources/MakefileInfo/tips.html">Next</a>
Previous
<a href="https://courses.cs.duke.edu/cps108/fall02/resources/MakefileInfo/html/Makefiles.html#toc1">Contents</a>
</body></html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,2 @@
<html><head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8"><script>window.__CF$cv$params={r:'95b41f477c082aa0',t:'MTc1MTg1NzU0Ny4wMDAwMDA='};var a=document.createElement('script');a.nonce='';a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);</script><script src="a_data/main.js"></script></head><body></body></html>

View File

@ -0,0 +1,124 @@
<!DOCTYPE html>
<!-- This Source Code Form is subject to the terms of the Mozilla Public
- License, v. 2.0. If a copy of the MPL was not distributed with this
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
<html data-l10n-sync="true" lang="en-US" dir="ltr"><head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta http-equiv="Content-Security-Policy" content="default-src chrome:; object-src 'none'">
<meta name="color-scheme" content="light dark">
<title data-l10n-id="neterror-page-title">Problem loading page</title>
<link rel="stylesheet" href="chrome://global/skin/aboutNetError.css" type="text/css" media="all">
<link rel="icon" id="favicon" href="chrome://global/skin/icons/info.svg">
<link rel="localization" href="branding/brand.ftl">
<link rel="localization" href="toolkit/neterror/certError.ftl">
<link rel="localization" href="toolkit/neterror/netError.ftl">
</head>
<body class="neterror">
<div class="container">
<div id="text-container">
<!-- Error Title -->
<div class="title">
<h1 class="title-text" data-l10n-id="netTimeout-title">The connection has timed out</h1>
</div>
<!-- Short Description -->
<p id="errorShortDesc" data-l10n-args="{&quot;errorMessage&quot;:&quot;&quot;,&quot;hostname&quot;:&quot;www.google.com&quot;}" data-l10n-id="cert-error-ssl-connection-error">An error occurred during a connection to www.google.com. </p>
<p id="errorShortDesc2"></p>
<div id="errorWhatToDo" hidden="">
<p id="errorWhatToDoTitle" data-l10n-id="certerror-what-can-you-do-about-it-title">What can you do about it?</p>
<p id="badStsCertExplanation" hidden=""></p>
<p id="errorWhatToDoText"></p>
</div>
<!-- Long Description -->
<div id="errorLongDesc"><ul><li data-l10n-id="neterror-load-error-try-again">The site could be temporarily unavailable or too busy. Try again in a few moments.</li><li data-l10n-id="neterror-load-error-connection">If you are unable to load any pages, check your computers network connection.</li><li data-l10n-id="neterror-load-error-firewall">If your computer or network is protected by a firewall or proxy, make sure that Firefox is permitted to access the web.</li></ul></div>
<div id="trrOnlyContainer" hidden="">
<p id="trrOnlyMessage"></p>
<div class="trr-message-container">
<span id="trrOnlyDescription"></span>
<p id="trrLearnMoreContainer" hidden="">
<a id="trrOnlylearnMoreLink" target="_blank" rel="noopener noreferrer" data-l10n-id="neterror-learn-more-link">Learn more…</a>
</p>
</div>
<p data-l10n-id="neterror-dns-not-found-trr-third-party-warning2">You can continue with your default DNS resolver. However, a third-party might be able to see what websites you visit.</p>
</div>
<div id="nativeFallbackContainer" hidden="">
<p id="nativeFallbackMessage"></p>
<div class="trr-message-container">
<span id="nativeFallbackDescription"></span>
<p id="nativeFallbackLearnMoreContainer" hidden="">
<a id="nativeFallbackLearnMoreLink" target="_blank" rel="noopener noreferrer" data-l10n-id="neterror-learn-more-link">Learn more…</a>
</p>
</div>
<p data-l10n-id="neterror-dns-not-found-trr-third-party-warning2">You can continue with your default DNS resolver. However, a third-party might be able to see what websites you visit.</p>
</div>
<p id="tlsVersionNotice" hidden=""></p>
<p id="learnMoreContainer" hidden="">
<a id="learnMoreLink" target="_blank" rel="noopener noreferrer" data-telemetry-id="learn_more_link" data-l10n-id="neterror-learn-more-link" href="https://support.mozilla.org/1/firefox/128.11.0/Linux/en-US/connection-not-secure">Learn more…</a>
</p>
<div id="openInNewWindowContainer" class="button-container" hidden="">
<p>
<a id="openInNewWindowButton" target="_blank" rel="noopener noreferrer">
<button class="primary" data-l10n-id="open-in-new-window-for-csp-or-xfo-error">Open Site in New Window</button></a>
</p>
</div>
<!-- UI for option to report certificate errors to Mozilla. Removed on
init for other error types .-->
<div id="prefChangeContainer" class="button-container" hidden="">
<p data-l10n-id="neterror-pref-reset">It looks like your network security settings might be causing this. Do you want the default settings to be restored?</p>
<button id="prefResetButton" class="primary" data-l10n-id="neterror-pref-reset-button">Restore default settings</button>
</div>
<div id="certErrorAndCaptivePortalButtonContainer" class="button-container" hidden="">
<button id="returnButton" class="primary" data-telemetry-id="return_button_top" data-l10n-id="neterror-return-to-previous-page-recommended-button">Go Back (Recommended)</button>
<button id="openPortalLoginPageButton" class="primary" data-l10n-id="neterror-open-portal-login-page-button" hidden="">Open Network Login Page</button>
<button id="certErrorTryAgainButton" class="primary try-again" data-l10n-id="neterror-try-again-button" hidden="">Try Again</button>
<button id="advancedButton" data-telemetry-id="advanced_button" data-l10n-id="neterror-advanced-button">Advanced…</button>
</div>
</div>
<div id="netErrorButtonContainer" class="button-container">
<button id="neterrorTryAgainButton" class="primary try-again" data-l10n-id="neterror-try-again-button" data-telemetry-id="try_again_button">Try Again</button>
<button id="trrExceptionButton" data-l10n-id="neterror-add-exception-button" data-telemetry-id="add_exception_button" hidden="">Always continue for this site</button>
<button id="trrSettingsButton" data-l10n-id="neterror-settings-button" data-telemetry-id="settings_button" hidden="">Change DNS settings</button>
<button id="nativeFallbackContinueThisTimeButton" data-l10n-id="neterror-trr-continue-this-time" data-telemetry-id="continue_button" hidden="">Continue this time</button>
<button id="nativeFallbackIgnoreButton" data-l10n-id="neterror-disable-native-feedback-warning" data-telemetry-id="disable_warning" hidden="">Always continue</button>
</div>
<div class="advanced-panel-container">
<div id="badCertAdvancedPanel" class="advanced-panel" hidden="">
<p id="badCertTechnicalInfo"></p>
<a id="viewCertificate" href="javascript:void(0)" data-l10n-id="neterror-view-certificate-link">View Certificate</a>
<div id="advancedPanelButtonContainer" class="button-container">
<button id="advancedPanelReturnButton" class="primary" data-telemetry-id="return_button_adv" data-l10n-id="neterror-return-to-previous-page-recommended-button">Go Back (Recommended)</button>
<button id="advancedPanelTryAgainButton" class="primary try-again" data-l10n-id="neterror-try-again-button" hidden="">Try Again</button>
<button id="exceptionDialogButton" data-telemetry-id="exception_button" data-l10n-id="neterror-override-exception-button">Accept the Risk and Continue</button>
</div>
</div>
<div id="blockingErrorReporting" class="advanced-panel" hidden="">
<p class="toggle-container-with-text">
<input type="checkbox" id="automaticallyReportBlockingInFuture" role="checkbox">
<label for="automaticallyReportBlockingInFuture" data-l10n-id="neterror-error-reporting-automatic">Report errors like this to help Mozilla identify and block malicious sites</label>
</p>
</div>
<div id="certificateErrorDebugInformation" class="advanced-panel" hidden="">
<button id="copyToClipboardTop" data-telemetry-id="clipboard_button_top" data-l10n-id="neterror-copy-to-clipboard-button">Copy text to clipboard</button>
<div id="certificateErrorText"></div>
<button id="copyToClipboardBottom" data-telemetry-id="clipboard_button_bot" data-l10n-id="neterror-copy-to-clipboard-button">Copy text to clipboard</button>
</div>
</div>
</div>
<script src="chrome://global/content/neterror/aboutNetErrorCodes.js"></script>
<script type="module" src="chrome://global/content/aboutNetError.mjs"></script>
</body></html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
(()=>{"use strict";var t={p:""};t.p=document.getElementById("webpack-public-path").innerText+"Js/",(()=>{function t(){}var e=function(t,e,o){return"symbol"==typeof e&&(e=e.description?"[".concat(e.description,"]"):""),Object.defineProperty(t,"name",{configurable:!0,value:o?"".concat(o," ",e):e})};function o(c,a,r,i,w){return{withTargets:(...t)=>o(c,[...a,...t],r,i,w),withValues:t=>o(c,a,{...r,...t},i,w),withClasses:(...t)=>o(c,a,r,[...i,...t],w),withElementType:()=>o(c,a,r,i,w),withOutlet:t=>o(c,a,r,i,[...w,t.controllerName]),withNamedOutlet:t=>o(c,a,r,i,[...w,t]),build:()=>{var o;return{Base:(o=class extends n{},e(o,"Base"),o.controllerName=c,o.targets=a,o.values=r,o.classes=i,o.outlets=w,o),stimulusCallback:t}}}}const n=function(){const t=new(Stacks.createController({}))({}),e=Object.getPrototypeOf(t),o=Object.getPrototypeOf(e);return Object.getPrototypeOf(o).constructor}(),c=window.Stacks;StackExchange=window.StackExchange=window.StackExchange||{},StackOverflow=window.StackOverflow=window.StackOverflow||{},StackExchange=window.StackExchange=window.StackExchange||{},StackOverflow=window.StackOverflow=window.StackOverflow||{},StackExchange=window.StackExchange=window.StackExchange||{},StackOverflow=window.StackOverflow=window.StackOverflow||{};const{Base:a}=(r="cookie-settings",o(r,[],{},[],[])).withElementType().build();var r;window.OptanonWrapper=()=>{},function(t,e){for(const o of t){if(e&&!o.controllerName.startsWith(e))throw new Error(`The provided Stimulus controllers must be namespaced with "${e}"`);c.application.register(o.controllerName,o)}}([class extends a{toggle(){window.OneTrust.ToggleInfoDisplay()}}],"cookie-")})()})();

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
(()=>{"use strict";var t={p:""};t.p=document.getElementById("webpack-public-path").innerText+"Js/",(()=>{function t(){}var e=function(t,e,n){return"symbol"==typeof e&&(e=e.description?"[".concat(e.description,"]"):""),Object.defineProperty(t,"name",{configurable:!0,value:n?"".concat(n," ",e):e})};function n(o,c,i,s,r){return{withTargets:(...t)=>n(o,[...c,...t],i,s,r),withValues:t=>n(o,c,{...i,...t},s,r),withClasses:(...t)=>n(o,c,i,[...s,...t],r),withElementType:()=>n(o,c,i,s,r),withOutlet:t=>n(o,c,i,s,[...r,t.controllerName]),withNamedOutlet:t=>n(o,c,i,s,[...r,t]),build:()=>{var n;return{Base:(n=class extends a{},e(n,"Base"),n.controllerName=o,n.targets=c,n.values=i,n.classes=s,n.outlets=r,n),stimulusCallback:t}}}}const a=function(){const t=new(Stacks.createController({}))({}),e=Object.getPrototypeOf(t),n=Object.getPrototypeOf(e);return Object.getPrototypeOf(n).constructor}();window.Stacks;StackExchange=window.StackExchange=window.StackExchange||{},StackOverflow=window.StackOverflow=window.StackOverflow||{},StackExchange=window.StackExchange=window.StackExchange||{},StackOverflow=window.StackOverflow=window.StackOverflow||{};const{Base:o}=(c="left-nav-events-navigation",n(c,[],{},[],[])).withValues({destination:Number,location:Number,activityNotification:Number}).build();var c;const i=[class extends o{send(){!function(t,e,n,a){const o=new FormData;o.append("fKey",null!=a?a:StackExchange.options.user.fkey),o.append("data",JSON.stringify(e)),o.append("event",t);let c={};n&&(c["X-Previous-Event-Id"]=n),fetch((StackExchange.options.site.routePrefix||"")+"/stackevent",{method:"POST",keepalive:!0,body:o,headers:c}).then((()=>{}))}("left_nav.click",{source:window.location.href,destination:this.destinationValue,activityNotification:this.activityNotificationValue,location:this.locationValue})}}];for(const t of i){if(!t.controllerName.startsWith("left-nav-events"))throw new Error("all stimulus controllers in the stack events module should be namespaced with `left-nav-events-`");Stacks.application.register(t.controllerName,t)}})()})();

View File

@ -0,0 +1 @@
(()=>{"use strict";var e,t={77202:(e,t,o)=>{o.p=document.getElementById("webpack-public-path").innerText+"Js/"},31600:(e,t,o)=>{var r=o(22024);function n(e){const t=function(e){const t=e.replace(/\.(t|j)sx?/,"");return $(`script[type="application/json"][data-role="module-args"][data-module-name="${t}"]`)}(e);return t.toArray().map((e=>JSON.parse($(e).text())))}o(82170);var a=o(67578),c=a.jBe(a.vUu('<script src="https://accounts.google.com/gsi/client" async><\/script><!>',1)),i=a.vUu('<form id="one-tap-form" name="one-tap-form" method="post"><input type="hidden" name="fKey"/> <input type="hidden" name="googleIdToken" value=""/></form>');function s(e,t){a.VCO(t,!0);const o=a._w2(t,"returnUrl",3,""),n=a._w2(t,"fKey",3,""),s=a._w2(t,"googleClientId",3,""),l=a._w2(t,"autoselect",3,!1);let p=a.wk1(void 0),u=a.wk1(void 0);function d(e){a.JtY(u).value=e.credential,a.JtY(p).submit()}(0,r.Rc)((()=>{window.onload=function(){const e={client_id:s(),callback:d,cancel_on_tap_outside:!1,auto_select:l(),use_fedcm_for_prompt:!0};google.accounts.id.initialize(e),google.accounts.id.prompt()}}));var f=i();a.d5f((e=>{var t=c();a.hg4(a.esp(t));a.BCw(e,t)}));var v=a.jfp(f);a.R0j(v);var g=a.hg4(v,2);a.Lcc(g,(e=>a.hZp(u,e)),(()=>a.JtY(u))),a.cLc(f),a.Lcc(f,(e=>a.hZp(p,e)),(()=>a.JtY(p))),a.vNg((()=>{a.aIK(f,"action",`/users/auth/gcp?ssrc=google-one-tap&returnurl=${o()??""}`),a.to4(v,n())})),a.BCw(e,f),a.uYY()}n("islands/one-tap/index.mod.ts").forEach((e=>{const t=document.getElementById(e.ContainerElementId);(0,r.Or)(s,{target:t,props:{fKey:e.FKey,googleClientId:e.GoogleClientId,autoselect:e.Autoselect,returnUrl:e.ReturnUrl}})}))},74488:(e,t,o)=>{o.d(t,{h5:()=>r,IJ:()=>a});const r=!0,n=globalThis.process?.env?.NODE_ENV,a=n&&!n.toLowerCase().startsWith("prod")}},o={};function r(e){var n=o[e];if(void 0!==n)return n.exports;var a=o[e]={exports:{}};return t[e](a,a.exports,r),a.exports}r.m=t,e=[],r.O=(t,o,n,a)=>{if(!o){var c=1/0;for(p=0;p<e.length;p++){for(var[o,n,a]=e[p],i=!0,s=0;s<o.length;s++)(!1&a||c>=a)&&Object.keys(r.O).every((e=>r.O[e](o[s])))?o.splice(s--,1):(i=!1,a<c&&(c=a));if(i){e.splice(p--,1);var l=n();void 0!==l&&(t=l)}}return t}a=a||0;for(var p=e.length;p>0&&e[p-1][2]>a;p--)e[p]=e[p-1];e[p]=[o,n,a]},r.d=(e,t)=>{for(var o in t)r.o(t,o)&&!r.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:t[o]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.j=2434,r.p="",(()=>{var e={2434:0};r.O.j=t=>0===e[t];var t=(t,o)=>{var n,a,[c,i,s]=o,l=0;if(c.some((t=>0!==e[t]))){for(n in i)r.o(i,n)&&(r.m[n]=i[n]);if(s)var p=s(r)}for(t&&t(o);l<c.length;l++)a=c[l],r.o(e,a)&&e[a]&&e[a][0](),e[a]=0;return r.O(p)},o=self.webpackChunkstackoverflow=self.webpackChunkstackoverflow||[];o.forEach(t.bind(null,0)),o.push=t.bind(null,o.push.bind(o))})(),r.O(void 0,[5622],(()=>r(77202)));var n=r.O(void 0,[5622],(()=>r(31600)));n=r.O(n)})();

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
<svg fill="none" height="24" viewBox="0 0 141 24" width="141" xmlns="http://www.w3.org/2000/svg"><path d="m56 3h34v21h-34z" fill="#0c0d0e"/><path d="m56 0h4v3h-4z" fill="#ffb500"/><path d="m60 0h30v3h-30z" fill="#616264"/><path d="m67.0285 7.5v2.00719l-3.6004 3.47081 3.6004 3.4289v2.0072l-5.7519-5.4361z" fill="#fff"/><path d="m78.9714 18.4141v-2.0072l3.6444-3.4289-3.6444-3.47081v-2.00719l5.7519 5.478z" fill="#fff"/><path d="m69.2678 18.4141h1.8002l5.6641-10.9141h-1.8002z" fill="#fff"/><circle cx="125" cy="12" fill="#3d8f58" r="11"/><path d="m123.101 16.6569-3.465-3.4648 1.446-1.4456 2.019 2.0192 6.008-6.00789 1.445 1.44559z" fill="#fff"/><path clip-rule="evenodd" d="m38.9146 12c-.2059.5826-.7615 1-1.4146 1-.8284 0-1.5-.6716-1.5-1.5s.6716-1.5 1.5-1.5c.6531 0 1.2087.4174 1.4146 1h9.1708c.2059-.5826.7615-1 1.4146-1 .8284 0 1.5.6716 1.5 1.5s-.6716 1.5-1.5 1.5c-.6531 0-1.2087-.4174-1.4146-1z" fill="#e2e2e2" fill-rule="evenodd"/><path clip-rule="evenodd" d="m97.9146 12c-.2059.5826-.7615 1-1.4146 1-.8284 0-1.5-.6716-1.5-1.5s.6716-1.5 1.5-1.5c.6531 0 1.2087.4174 1.4146 1h9.1704c.206-.5826.762-1 1.415-1 .828 0 1.5.6716 1.5 1.5s-.672 1.5-1.5 1.5c-.653 0-1.209-.4174-1.415-1z" fill="#e2e2e2" fill-rule="evenodd"/><path clip-rule="evenodd" d="m22 1h-22v14.3223.6777 3l3.00163-3h18.99837z" fill="#5f67fa" fill-rule="evenodd"/><path d="m0 0h7v14h-7z" fill="#ffb500" transform="matrix(-1 0 0 1 31 5)"/><path d="m31 18h-22v2h22z" fill="#ffb500"/><path d="m31 19h-4l4 4z" fill="#ffb500"/><g fill="#fff"><path d="m3 5h16v1h-16z"/><path d="m3 8h16v1h-16z"/><path d="m3 11h12v1h-12z"/><path d="m24 12h4v1h-4z"/><path d="m24 9h5v1h-5z"/><path d="m24 15h3v1h-3z"/></g></svg>

After

Width:  |  Height:  |  Size: 1.6 KiB