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
package expression import ( "fmt" "sort" "strings" ) // operationMode specifies the types of update operations that the // updateBuilder is going to represent. The const is in a string to use the // const value as a map key and as a string when creating the formatted // expression for the exprNodes. type operationMode string const ( setOperation operationMode = "SET" removeOperation = "REMOVE" addOperation = "ADD" deleteOperation = "DELETE" ) // Implementing the Sort interface type modeList []operationMode func (ml modeList) Len() int { return len(ml) } func (ml modeList) Less(i, j int) bool { return string(ml[i]) < string(ml[j]) } func (ml modeList) Swap(i, j int) { ml[i], ml[j] = ml[j], ml[i] } // UpdateBuilder represents Update Expressions in DynamoDB. UpdateBuilders // are the building blocks of the Builder struct. Note that there are different // update operations in DynamoDB and an UpdateBuilder can represent multiple // update operations. // More Information at: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.UpdateExpressions.html type UpdateBuilder struct { operationList map[operationMode][]operationBuilder } // operationBuilder represents specific update actions (SET, REMOVE, ADD, // DELETE). The mode specifies what type of update action the // operationBuilder represents. type operationBuilder struct { name NameBuilder value OperandBuilder mode operationMode } // buildOperation builds an exprNode from an operationBuilder. buildOperation // is called recursively by buildTree in order to create a tree structure // of exprNodes representing the parent/child relationships between // UpdateBuilders and operationBuilders. func (ob operationBuilder) buildOperation() (exprNode, error) { pathChild, err := ob.name.BuildOperand() if err != nil { return exprNode{}, err } node := exprNode{ children: []exprNode{pathChild.exprNode}, fmtExpr: "$c", } if ob.mode == removeOperation { return node, nil } valueChild, err := ob.value.BuildOperand() if err != nil { return exprNode{}, err } node.children = append(node.children, valueChild.exprNode) switch ob.mode { case setOperation: node.fmtExpr += " = $c" case addOperation, deleteOperation: node.fmtExpr += " $c" default: return exprNode{}, fmt.Errorf("build update error: build operation error: unsupported mode: %v", ob.mode) } return node, nil } // Delete returns an UpdateBuilder representing one Delete operation for // DynamoDB Update Expressions. The argument name should specify the item // attribute and the argument value should specify the value to be deleted. The // resulting UpdateBuilder can be used as an argument to the WithUpdate() method // for the Builder struct. // // Example: // // // update represents the delete operation to delete the string value // // "subsetToDelete" from the item attribute "pathToList" // update := expression.Delete(expression.Name("pathToList"), expression.Value("subsetToDelete")) // // // Adding more update methods // anotherUpdate := update.Remove(expression.Name("someName")) // // Creating a Builder // builder := Update(update) // // Expression Equivalent: // // expression.Delete(expression.Name("pathToList"), expression.Value("subsetToDelete")) // // let :del be an ExpressionAttributeValue representing the value // // "subsetToDelete" // "DELETE pathToList :del" func Delete(name NameBuilder, value ValueBuilder) UpdateBuilder { emptyUpdateBuilder := UpdateBuilder{} return emptyUpdateBuilder.Delete(name, value) } // Delete adds a Delete operation to the argument UpdateBuilder. The // argument name should specify the item attribute and the argument value should // specify the value to be deleted. The resulting UpdateBuilder can be used as // an argument to the WithUpdate() method for the Builder struct. // // Example: // // // Let update represent an already existing update expression. Delete() // // adds the operation to delete the value "subsetToDelete" from the item // // attribute "pathToList" // update := update.Delete(expression.Name("pathToList"), expression.Value("subsetToDelete")) // // // Adding more update methods // anotherUpdate := update.Remove(expression.Name("someName")) // // Creating a Builder // builder := Update(update) // // Expression Equivalent: // // Delete(expression.Name("pathToList"), expression.Value("subsetToDelete")) // // let :del be an ExpressionAttributeValue representing the value // // "subsetToDelete" // "DELETE pathToList :del" func (ub UpdateBuilder) Delete(name NameBuilder, value ValueBuilder) UpdateBuilder { if ub.operationList == nil { ub.operationList = map[operationMode][]operationBuilder{} } ub.operationList[deleteOperation] = append(ub.operationList[deleteOperation], operationBuilder{ name: name, value: value, mode: deleteOperation, }) return ub } // Add returns an UpdateBuilder representing the Add operation for DynamoDB // Update Expressions. The argument name should specify the item attribute and // the argument value should specify the value to be added. The resulting // UpdateBuilder can be used as an argument to the WithUpdate() method for the // Builder struct. // // Example: // // // update represents the add operation to add the value 5 to the item // // attribute "aPath" // update := expression.Add(expression.Name("aPath"), expression.Value(5)) // // // Adding more update methods // anotherUpdate := update.Remove(expression.Name("someName")) // // Creating a Builder // builder := Update(update) // // Expression Equivalent: // // expression.Add(expression.Name("aPath"), expression.Value(5)) // // Let :five be an ExpressionAttributeValue representing the value 5 // "ADD aPath :5" func Add(name NameBuilder, value ValueBuilder) UpdateBuilder { emptyUpdateBuilder := UpdateBuilder{} return emptyUpdateBuilder.Add(name, value) } // Add adds an Add operation to the argument UpdateBuilder. The argument // name should specify the item attribute and the argument value should specify // the value to be added. The resulting UpdateBuilder can be used as an argument // to the WithUpdate() method for the Builder struct. // // Example: // // // Let update represent an already existing update expression. Add() adds // // the operation to add the value 5 to the item attribute "aPath" // update := update.Add(expression.Name("aPath"), expression.Value(5)) // // // Adding more update methods // anotherUpdate := update.Remove(expression.Name("someName")) // // Creating a Builder // builder := Update(update) // // Expression Equivalent: // // Add(expression.Name("aPath"), expression.Value(5)) // // Let :five be an ExpressionAttributeValue representing the value 5 // "ADD aPath :5" func (ub UpdateBuilder) Add(name NameBuilder, value ValueBuilder) UpdateBuilder { if ub.operationList == nil { ub.operationList = map[operationMode][]operationBuilder{} } ub.operationList[addOperation] = append(ub.operationList[addOperation], operationBuilder{ name: name, value: value, mode: addOperation, }) return ub } // Remove returns an UpdateBuilder representing the Remove operation for // DynamoDB Update Expressions. The argument name should specify the item // attribute to delete. The resulting UpdateBuilder can be used as an argument // to the WithUpdate() method for the Builder struct. // // Example: // // // update represents the remove operation to remove the item attribute // // "itemToRemove" // update := expression.Remove(expression.Name("itemToRemove")) // // // Adding more update methods // anotherUpdate := update.Remove(expression.Name("someName")) // // Creating a Builder // builder := Update(update) // // Expression Equivalent: // // expression.Remove(expression.Name("itemToRemove")) // "REMOVE itemToRemove" func Remove(name NameBuilder) UpdateBuilder { emptyUpdateBuilder := UpdateBuilder{} return emptyUpdateBuilder.Remove(name) } // Remove adds a Remove operation to the argument UpdateBuilder. The // argument name should specify the item attribute to delete. The resulting // UpdateBuilder can be used as an argument to the WithUpdate() method for the // Builder struct. // // Example: // // // Let update represent an already existing update expression. Remove() // // adds the operation to remove the item attribute "itemToRemove" // update := update.Remove(expression.Name("itemToRemove")) // // // Adding more update methods // anotherUpdate := update.Remove(expression.Name("someName")) // // Creating a Builder // builder := Update(update) // // Expression Equivalent: // // Remove(expression.Name("itemToRemove")) // "REMOVE itemToRemove" func (ub UpdateBuilder) Remove(name NameBuilder) UpdateBuilder { if ub.operationList == nil { ub.operationList = map[operationMode][]operationBuilder{} } ub.operationList[removeOperation] = append(ub.operationList[removeOperation], operationBuilder{ name: name, mode: removeOperation, }) return ub } // Set returns an UpdateBuilder representing the Set operation for DynamoDB // Update Expressions. The argument name should specify the item attribute to // modify. The argument OperandBuilder should specify the value to modify the // the item attribute to. The resulting UpdateBuilder can be used as an argument // to the WithUpdate() method for the Builder struct. // // Example: // // // update represents the set operation to set the item attribute // // "itemToSet" to the value "setValue" if the item attribute does not // // exist yet. (conditional write) // update := expression.Set(expression.Name("itemToSet"), expression.IfNotExists(expression.Name("itemToSet"), expression.Value("setValue"))) // // // Adding more update methods // anotherUpdate := update.Remove(expression.Name("someName")) // // Creating a Builder // builder := Update(update) // // Expression Equivalent: // // expression.Set(expression.Name("itemToSet"), expression.IfNotExists(expression.Name("itemToSet"), expression.Value("setValue"))) // // Let :val be an ExpressionAttributeValue representing the value // // "setValue" // "SET itemToSet = :val" func Set(name NameBuilder, operandBuilder OperandBuilder) UpdateBuilder { emptyUpdateBuilder := UpdateBuilder{} return emptyUpdateBuilder.Set(name, operandBuilder) } // Set adds a Set operation to the argument UpdateBuilder. The argument name // should specify the item attribute to modify. The argument OperandBuilder // should specify the value to modify the the item attribute to. The resulting // UpdateBuilder can be used as an argument to the WithUpdate() method for the // Builder struct. // // Example: // // // Let update represent an already existing update expression. Set() adds // // the operation to to set the item attribute "itemToSet" to the value // // "setValue" if the item attribute does not exist yet. (conditional // // write) // update := update.Set(expression.Name("itemToSet"), expression.IfNotExists(expression.Name("itemToSet"), expression.Value("setValue"))) // // // Adding more update methods // anotherUpdate := update.Remove(expression.Name("someName")) // // Creating a Builder // builder := Update(update) // // Expression Equivalent: // // Set(expression.Name("itemToSet"), expression.IfNotExists(expression.Name("itemToSet"), expression.Value("setValue"))) // // Let :val be an ExpressionAttributeValue representing the value // // "setValue" // "SET itemToSet = :val" func (ub UpdateBuilder) Set(name NameBuilder, operandBuilder OperandBuilder) UpdateBuilder { if ub.operationList == nil { ub.operationList = map[operationMode][]operationBuilder{} } ub.operationList[setOperation] = append(ub.operationList[setOperation], operationBuilder{ name: name, value: operandBuilder, mode: setOperation, }) return ub } // buildTree builds a tree structure of exprNodes based on the tree // structure of the input UpdateBuilder's child UpdateBuilders/Operands. // buildTree() satisfies the TreeBuilder interface so ProjectionBuilder can be a // part of Expression struct. func (ub UpdateBuilder) buildTree() (exprNode, error) { if ub.operationList == nil { return exprNode{}, newUnsetParameterError("buildTree", "UpdateBuilder") } ret := exprNode{ children: []exprNode{}, } modes := modeList{} for mode := range ub.operationList { modes = append(modes, mode) } sort.Sort(modes) for _, key := range modes { ret.fmtExpr += string(key) + " $c\n" childNode, err := buildChildNodes(ub.operationList[key]) if err != nil { return exprNode{}, err } ret.children = append(ret.children, childNode) } return ret, nil } // buildChildNodes creates the list of the child exprNodes. func buildChildNodes(operationBuilderList []operationBuilder) (exprNode, error) { if len(operationBuilderList) == 0 { return exprNode{}, fmt.Errorf("buildChildNodes error: operationBuilder list is empty") } node := exprNode{ children: make([]exprNode, 0, len(operationBuilderList)), fmtExpr: "$c" + strings.Repeat(", $c", len(operationBuilderList)-1), } for _, val := range operationBuilderList { valNode, err := val.buildOperation() if err != nil { return exprNode{}, err } node.children = append(node.children, valNode) } return node, nil }