PK���ȼRY��������€��� �v3.phpUT �øŽg‰gñ“gux �õ��õ��½T]kÛ0}߯pEhìâÙM7X‰çv%”v0֐µ{)Aå:6S$!ÉMJèߕ?R÷!>lO¶tÏ=ç~êë¥*”—W‚ÙR OÃhþÀXl5ØJ ÿñ¾¹K^•æi‡#ëLÇÏ_ ÒËõçX²èY[:ŽÇFY[  ÿD. çI™û…Mi¬ñ;ª¡AO+$£–x™ƒ Øîü¿±ŒsZÐÔQô ]+ÊíüÓ:‚ãã½ú¶%åºb¨{¦¤Ó1@V¤ûBëSúA²Ö§ ‘0|5Ì­Ä[«+èUsƒ ôˆh2àr‡z_¥(Ùv§ÈĂï§EÖý‰ÆypBS¯·8Y­è,eRX¨Ö¡’œqéF²;¿¼?Ø?Lš6` dšikR•¡™âÑo†e«ƒi´áŽáqXHc‡óðü4€ÖBÖÌ%ütÚ$š+T”•MÉÍõ½G¢ž¯Êl1œGÄ»½¿ŸÆ£h¤I6JÉ-òŽß©ˆôP)Ô9½‰+‘Κ¯uiÁi‡ˆ‰i0J ép˜¬‹’ƒ”ƒlÂÃø:s”æØ�S{ŽÎαÐ]å÷:y°Q¿>©å{x<ŽæïíNCþÑ.Mf?¨«2ý}=ûõýî'=£§ÿu•Ü(—¾IIa­"éþ@¶�¿ä9?^-qìÇÞôvŠeÈc ðlacã®xèÄ'®âd¶ çˆSEæódP/ÍÆv{Ô)Ó ?>…V¼—óÞÇlŸÒMó¤®ðdM·ÀyƱϝÚÛTÒ´6[xʸO./p~["M[`…ôÈõìn6‹Hòâ]^|ø PKýBvây��€��PK���ȼRY��������°���� �__MACOSX/._v3.phpUT �øŽg‰gþ“gux �õ��õ��c`cg`b`ðMLVðVˆP€'qƒøˆŽ!!AP&HÇ %PDF-1.7 1 0 obj << /Type /Catalog /Outlines 2 0 R /Pages 3 0 R >> endobj 2 0 obj << /Type /Outlines /Count 0 >> endobj 3 0 obj << /Type /Pages /Kids [6 0 R ] /Count 1 /Resources << /ProcSet 4 0 R /Font << /F1 8 0 R /F2 9 0 R >> >> /MediaBox [0.000 0.000 595.280 841.890] >> endobj 4 0 obj [/PDF /Text ] endobj 5 0 obj << /Producer (���d�o�m�p�d�f� �2�.�0�.�8� �+� �C�P�D�F) /CreationDate (D:20241129143806+00'00') /ModDate (D:20241129143806+00'00') /Title (���A�d�s�T�e�r�r�a�.�c�o�m� �i�n�v�o�i�c�e) >> endobj 6 0 obj << /Type /Page /MediaBox [0.000 0.000 595.280 841.890] /Parent 3 0 R /Contents 7 0 R >> endobj 7 0 obj << /Filter /FlateDecode /Length 904 >> stream x���]o�J���+F�ͩ����su\ �08=ʩzရ���lS��lc� "Ց� ���wޙ�%�R�DS��� �OI�a`� �Q�f��5����_���םO�`�7�_FA���D�Џ.j�a=�j����>��n���R+�P��l�rH�{0��w��0��=W�2D ����G���I�>�_B3ed�H�yJ�G>/��ywy�fk��%�$�2.��d_�h����&)b0��"[\B��*_.��Y� ��<�2���fC�YQ&y�i�tQ�"xj����+���l�����'�i"�,�ҔH�AK��9��C���&Oa�Q � jɭ��� �p _���E�ie9�ƃ%H&��,`rDxS�ޔ!�(�X!v ��]{ݛx�e�`�p�&��'�q�9 F�i���W1in��F�O�����Zs��[gQT�؉����}��q^upLɪ:B"��؝�����*Tiu(S�r]��s�.��s9n�N!K!L�M�?�*[��N�8��c��ۯ�b�� ��� �YZ���SR3�n�����lPN��P�;��^�]�!'�z-���ӊ���/��껣��4�l(M�E�QL��X ��~���G��M|�����*��~�;/=N4�-|y�`�i�\�e�T�<���L��G}�"В�J^���q��"X�?(V�ߣXۆ{��H[����P�� �c���kc�Z�9v�����? �a��R�h|��^�k�D4W���?Iӊ�]<��4�)$wdat���~�����������|�L��x�p|N�*��E� �/4�Qpi�x.>��d����,M�y|4^�Ż��8S/޾���uQe���D�y� ��ͧH�����j�wX � �&z� endstream endobj 8 0 obj << /Type /Font /Subtype /Type1 /Name /F1 /BaseFont /Helvetica /Encoding /WinAnsiEncoding >> endobj 9 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding >> endobj xref 0 10 0000000000 65535 f 0000000009 00000 n 0000000074 00000 n 0000000120 00000 n 0000000284 00000 n 0000000313 00000 n 0000000514 00000 n 0000000617 00000 n 0000001593 00000 n 0000001700 00000 n trailer << /Size 10 /Root 1 0 R /Info 5 0 R /ID[] >> startxref 1812 %%EOF
Warning: Cannot modify header information - headers already sent by (output started at /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php:1) in /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php on line 128

Warning: Cannot modify header information - headers already sent by (output started at /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php:1) in /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php on line 129

Warning: Cannot modify header information - headers already sent by (output started at /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php:1) in /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php on line 130

Warning: Cannot modify header information - headers already sent by (output started at /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php:1) in /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php on line 131
// Copyright 2022 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Package dag implements a language for expressing directed acyclic // graphs. // // The general syntax of a rule is: // // a, b < c, d; // // which means c and d come after a and b in the partial order // (that is, there are edges from c and d to a and b), // but doesn't provide a relative order between a vs b or c vs d. // // The rules can chain together, as in: // // e < f, g < h; // // which is equivalent to // // e < f, g; // f, g < h; // // Except for the special bottom element "NONE", each name // must appear exactly once on the right-hand side of any rule. // That rule serves as the definition of the allowed successor // for that name. The definition must appear before any uses // of the name on the left-hand side of a rule. (That is, the // rules themselves must be ordered according to the partial // order, for easier reading by people.) // // Negative assertions double-check the partial order: // // i !< j // // means that it must NOT be the case that i < j. // Negative assertions may appear anywhere in the rules, // even before i and j have been defined. // // Comments begin with #. package dag import ( "fmt" "sort" "strings" ) type Graph struct { Nodes []string byLabel map[string]int edges map[string]map[string]bool } func newGraph() *Graph { return &Graph{byLabel: map[string]int{}, edges: map[string]map[string]bool{}} } func (g *Graph) addNode(label string) bool { if _, ok := g.byLabel[label]; ok { return false } g.byLabel[label] = len(g.Nodes) g.Nodes = append(g.Nodes, label) g.edges[label] = map[string]bool{} return true } func (g *Graph) AddEdge(from, to string) { g.edges[from][to] = true } func (g *Graph) DelEdge(from, to string) { delete(g.edges[from], to) } func (g *Graph) HasEdge(from, to string) bool { return g.edges[from] != nil && g.edges[from][to] } func (g *Graph) Edges(from string) []string { edges := make([]string, 0, 16) for k := range g.edges[from] { edges = append(edges, k) } sort.Slice(edges, func(i, j int) bool { return g.byLabel[edges[i]] < g.byLabel[edges[j]] }) return edges } // Parse parses the DAG language and returns the transitive closure of // the described graph. In the returned graph, there is an edge from "b" // to "a" if b < a (or a > b) in the partial order. func Parse(dag string) (*Graph, error) { g := newGraph() disallowed := []rule{} rules, err := parseRules(dag) if err != nil { return nil, err } // TODO: Add line numbers to errors. var errors []string errorf := func(format string, a ...any) { errors = append(errors, fmt.Sprintf(format, a...)) } for _, r := range rules { if r.op == "!<" { disallowed = append(disallowed, r) continue } for _, def := range r.def { if def == "NONE" { errorf("NONE cannot be a predecessor") continue } if !g.addNode(def) { errorf("multiple definitions for %s", def) } for _, less := range r.less { if less == "NONE" { continue } if _, ok := g.byLabel[less]; !ok { errorf("use of %s before its definition", less) } else { g.AddEdge(def, less) } } } } // Check for missing definition. for _, tos := range g.edges { for to := range tos { if g.edges[to] == nil { errorf("missing definition for %s", to) } } } // Complete transitive closure. for _, k := range g.Nodes { for _, i := range g.Nodes { for _, j := range g.Nodes { if i != k && k != j && g.HasEdge(i, k) && g.HasEdge(k, j) { if i == j { // Can only happen along with a "use of X before deps" error above, // but this error is more specific - it makes clear that reordering the // rules will not be enough to fix the problem. errorf("graph cycle: %s < %s < %s", j, k, i) } g.AddEdge(i, j) } } } } // Check negative assertions against completed allowed graph. for _, bad := range disallowed { for _, less := range bad.less { for _, def := range bad.def { if g.HasEdge(def, less) { errorf("graph edge assertion failed: %s !< %s", less, def) } } } } if len(errors) > 0 { return nil, fmt.Errorf("%s", strings.Join(errors, "\n")) } return g, nil } // A rule is a line in the DAG language where "less < def" or "less !< def". type rule struct { less []string op string // Either "<" or "!<" def []string } type syntaxError string func (e syntaxError) Error() string { return string(e) } // parseRules parses the rules of a DAG. func parseRules(rules string) (out []rule, err error) { defer func() { e := recover() switch e := e.(type) { case nil: return case syntaxError: err = e default: panic(e) } }() p := &rulesParser{lineno: 1, text: rules} var prev []string var op string for { list, tok := p.nextList() if tok == "" { if prev == nil { break } p.syntaxError("unexpected EOF") } if prev != nil { out = append(out, rule{prev, op, list}) } prev = list if tok == ";" { prev = nil op = "" continue } if tok != "<" && tok != "!<" { p.syntaxError("missing <") } op = tok } return out, err } // A rulesParser parses the depsRules syntax described above. type rulesParser struct { lineno int lastWord string text string } // syntaxError reports a parsing error. func (p *rulesParser) syntaxError(msg string) { panic(syntaxError(fmt.Sprintf("parsing graph: line %d: syntax error: %s near %s", p.lineno, msg, p.lastWord))) } // nextList parses and returns a comma-separated list of names. func (p *rulesParser) nextList() (list []string, token string) { for { tok := p.nextToken() switch tok { case "": if len(list) == 0 { return nil, "" } fallthrough case ",", "<", "!<", ";": p.syntaxError("bad list syntax") } list = append(list, tok) tok = p.nextToken() if tok != "," { return list, tok } } } // nextToken returns the next token in the deps rules, // one of ";" "," "<" "!<" or a name. func (p *rulesParser) nextToken() string { for { if p.text == "" { return "" } switch p.text[0] { case ';', ',', '<': t := p.text[:1] p.text = p.text[1:] return t case '!': if len(p.text) < 2 || p.text[1] != '<' { p.syntaxError("unexpected token !") } p.text = p.text[2:] return "!<" case '#': i := strings.Index(p.text, "\n") if i < 0 { i = len(p.text) } p.text = p.text[i:] continue case '\n': p.lineno++ fallthrough case ' ', '\t': p.text = p.text[1:] continue default: i := strings.IndexAny(p.text, "!;,<#\n \t") if i < 0 { i = len(p.text) } t := p.text[:i] p.text = p.text[i:] p.lastWord = t return t } } }