diff --git a/NearBeach/decorators/check_user_permissions/gantt_chart_permissions.py b/NearBeach/decorators/check_user_permissions/gantt_chart_permissions.py new file mode 100644 index 000000000..765c72e0e --- /dev/null +++ b/NearBeach/decorators/check_user_permissions/gantt_chart_permissions.py @@ -0,0 +1,71 @@ +from django.core.exceptions import PermissionDenied +from django.db.models import Max +from functools import wraps + +from NearBeach.models import Sprint + +from NearBeach.decorators.check_user_permissions.object_permissions import FUNCTION_DICT + + +def check_gantt_chart_permissions_with_destination(min_permission_level): + """ + Checks the user's permission for the gantt chart, using the destination as + the object lookup. We will need to make sure the destination is either + a project or requirement, otherwise they will get permission denied. + We will then utilise the correct permission partials to determine if the + user should have access. + """ + def decorator(func): + @wraps(func) + def inner(request, *args, **kwargs): + # Obtain destination from args + # due to weird issue - we check the args length + if len(args) == 0: + destination = kwargs["destination"] + location_id = kwargs["location_id"] + else: + destination = args[0] + location_id = args[1] + + # TEMP FUNCTIONALITY -> At the moment, we are only focusing on sprint functionality + # In the near future, we'll open this up to OTHER objects + # For the initial proof of concept, we are only dealing with sprints + if not destination == "sprint": + raise PermissionDenied + + destination, location_id = get_sprint_parent_destination(location_id) + + # If user is admin - grant them all permissions + if request.user.is_superuser: + # Return the function with a user_level of 4 + return func(request, *args, **kwargs, user_level=4) + + # Fold the location id into the {destination}_id. This will be used in the partials + kwargs[F"{destination}_id"] = location_id + + # User the FUNCTION_DICT to determine which partial permissions we need + # to reference + passes, user_level = FUNCTION_DICT[destination](request, kwargs) + + if not passes: + raise PermissionDenied + + if user_level >= min_permission_level: + # Everything is fine - continue on + return func(request, *args, **kwargs, user_level=user_level) + + # Does not meet conditions + raise PermissionDenied + return inner + return decorator + + +def get_sprint_parent_destination(location_id): + # Get the sprint information + sprint_results = Sprint.objects.get(sprint_id=location_id) + + # If there is a project assigned to the sprint. The destination should be project + if sprint_results.project is not None: + return "project", sprint_results.project_id + else: + return "requirement", sprint_results.requirement_id diff --git a/NearBeach/decorators/check_user_permissions/partials/requirement_permissions.py b/NearBeach/decorators/check_user_permissions/partials/requirement_permissions.py index 2ddfedd4b..781b5c226 100644 --- a/NearBeach/decorators/check_user_permissions/partials/requirement_permissions.py +++ b/NearBeach/decorators/check_user_permissions/partials/requirement_permissions.py @@ -12,17 +12,12 @@ def requirement_permissions(request, kwargs): if len(kwargs) > 0: # Get the requirement groups user_group_results = user_group_results.filter( - Q( + is_deleted=False, + group_id__in=ObjectAssignment.objects.filter( is_deleted=False, - group_id__in=ObjectAssignment.objects.filter( - is_deleted=False, - group_id__isnull=False, - requirement_id=kwargs["requirement_id"], - ).values("group_id"), - ) - & Q( - username=request.user, - ) + group_id__isnull=False, + requirement_id=kwargs["requirement_id"], + ).values("group_id"), ) # Check to see if there are any groups associated diff --git a/NearBeach/fixtures/NearBeach_basic_setup.json b/NearBeach/fixtures/NearBeach_basic_setup.json index df91c717e..a75b99935 100644 --- a/NearBeach/fixtures/NearBeach_basic_setup.json +++ b/NearBeach/fixtures/NearBeach_basic_setup.json @@ -1986,6 +1986,114 @@ "is_deleted": false } }, +{ + "model": "NearBeach.objectassignment", + "pk": 35, + "fields": { + "assigned_user": 1, + "group_id": null, + "requirement": null, + "requirement_item": null, + "project": 1, + "task": null, + "kanban_board": null, + "kanban_card": null, + "request_for_change": null, + "customer": null, + "organisation": null, + "change_task": null, + "meta_object": null, + "meta_object_title": "", + "meta_object_status": "", + "link_relationship": "", + "parent_link": "", + "date_created": "2024-05-13T10:29:17.681Z", + "date_modified": "2024-05-13T10:29:17.681Z", + "change_user": 1, + "is_deleted": false + } +}, +{ + "model": "NearBeach.objectassignment", + "pk": 36, + "fields": { + "assigned_user": 5, + "group_id": null, + "requirement": null, + "requirement_item": null, + "project": null, + "task": 2, + "kanban_board": null, + "kanban_card": null, + "request_for_change": null, + "customer": null, + "organisation": null, + "change_task": null, + "meta_object": null, + "meta_object_title": "", + "meta_object_status": "", + "link_relationship": "", + "parent_link": "", + "date_created": "2024-05-13T10:30:40.078Z", + "date_modified": "2024-05-13T10:30:40.078Z", + "change_user": 1, + "is_deleted": false + } +}, +{ + "model": "NearBeach.objectassignment", + "pk": 37, + "fields": { + "assigned_user": 3, + "group_id": null, + "requirement": null, + "requirement_item": null, + "project": null, + "task": 2, + "kanban_board": null, + "kanban_card": null, + "request_for_change": null, + "customer": null, + "organisation": null, + "change_task": null, + "meta_object": null, + "meta_object_title": "", + "meta_object_status": "", + "link_relationship": "", + "parent_link": "", + "date_created": "2024-05-13T10:41:58.777Z", + "date_modified": "2024-05-13T10:41:58.777Z", + "change_user": 2, + "is_deleted": false + } +}, +{ + "model": "NearBeach.objectassignment", + "pk": 38, + "fields": { + "assigned_user": 2, + "group_id": null, + "requirement": null, + "requirement_item": null, + "project": null, + "task": 2, + "kanban_board": null, + "kanban_card": null, + "request_for_change": null, + "customer": null, + "organisation": null, + "change_task": null, + "meta_object": null, + "meta_object_title": "", + "meta_object_status": "", + "link_relationship": "", + "parent_link": "", + "date_created": "2024-05-13T10:42:14.120Z", + "date_modified": "2024-05-13T10:42:14.120Z", + "change_user": 2, + "is_deleted": false + } +}, { "model": "NearBeach.objectnote", "pk": 1, @@ -2962,6 +3070,54 @@ "is_deleted": false } }, +{ + "model": "NearBeach.userjob", + "pk": 1, + "fields": { + "username": 1, + "job_date": "2024-05-14", + "job_sort_number": 0, + "kanban_card": null, + "project": 1, + "task": null, + "date_created": "2024-05-13T10:29:27.540Z", + "date_modified": "2024-05-13T10:32:17.413Z", + "change_user": 1, + "is_deleted": false + } +}, +{ + "model": "NearBeach.userjob", + "pk": 2, + "fields": { + "username": 5, + "job_date": "2024-05-13", + "job_sort_number": 0, + "kanban_card": null, + "project": null, + "task": 2, + "date_created": "2024-05-13T10:30:51.400Z", + "date_modified": "2024-05-13T10:30:51.400Z", + "change_user": 5, + "is_deleted": false + } +}, +{ + "model": "NearBeach.userjob", + "pk": 3, + "fields": { + "username": 2, + "job_date": "2024-05-14", + "job_sort_number": 0, + "kanban_card": null, + "project": null, + "task": 2, + "date_created": "2024-05-13T10:42:21.906Z", + "date_modified": "2024-05-13T10:42:30.668Z", + "change_user": 2, + "is_deleted": false + } +}, { "model": "NearBeach.usersetting", "pk": 1, @@ -4862,8 +5018,8 @@ "model": "auth.user", "pk": 5, "fields": { - "password": "pbkdf2_sha256$390000$wSOIKxIzbfTVG7Z6TRKQ0n$QrhNVyNQ5C3RW8rSVkxleNmyCqECJX48uqenvvBTIdQ=", - "last_login": null, + "password": "pbkdf2_sha256$720000$lme60tWetgq1EdCCjo4iPZ$tGR4stCLa56Rt/LjtHYKCff2RDtJ0RJ4pFr4fC24TXo=", + "last_login": "2024-05-13T10:30:22.990Z", "is_superuser": false, "username": "read_only", "first_name": "Read", @@ -5312,6 +5468,14 @@ "model": "session" } }, +{ + "model": "sessions.session", + "pk": "1dxxe5glzsbvq94spcivlz28kvq8vazx", + "fields": { + "session_data": ".eJxVjEEOgyAQRe_CuiEoI4wuu-8ZyABjtTXagKya3r2SuGi3_73_3sJR2SdXMic3RzGITlx-N0_hyWsF8UHrfZNhW_c0e1kVedIsb1vk5Xq6f4GJ8nS8jUdq0IIhrbANYDmy5l5FGAMCtR1Y4xtkYgjYKd1Ab9AAe2DSBPqIztnl8uJUs2IYacn8-QK2uz9a:1s6Swp:5KDFXsDZsmVAprYtI7TP_dX-ddlKrYDYujwVQTCZbSU", + "expire_date": "2024-05-27T10:30:23.003Z" + } +}, { "model": "sessions.session", "pk": "4ihdjbrhcx7hokg3uisrpinxhca0e34d", @@ -5340,8 +5504,8 @@ "model": "sessions.session", "pk": "922i2920gbdv4xctpizrk8pypiaysael", "fields": { - "session_data": ".eJxVjEEOwiAQRe_C2hAYoNQu3XsGwgyDrZrWQFkZ726bdKHb_95_bxFiW8fQKpcwJTEILU6_G0Z68LyDdI_zbZG0zGuZUO6KPGiV1yXx83K4f4Ex1nF7O0Ai68FFdqlPkdH1nBUmC-SzNqAUeaMMGtuBBsAz6q7LtrfaGqdoi0411PbismfFsJbGny-LGT7k:1s6R9f:Bnve0zi8T7R8BLUIPjW7DFbBUFWSyOuRHKDjTJhqJKw", - "expire_date": "2024-05-27T08:35:31.102Z" + "session_data": ".eJxVjEEOwiAQRe_C2hAYoNQu3XsGwgyDrZrWQFkZ726bdKHb_95_bxFiW8fQKpcwJTEILU6_G0Z68LyDdI_zbZG0zGuZUO6KPGiV1yXx83K4f4Ex1nF7O0Ai68FFdqlPkdH1nBUmC-SzNqAUeaMMGtuBBsAz6q7LtrfaGqdoi0411PbismfFsJbGny-LGT7k:1s6Sva:uc1eEmvvEv9_L46aDGeLvGYfSLgwPVARk6sdNAHWLGk", + "expire_date": "2024-05-27T10:29:06.063Z" } }, { diff --git a/NearBeach/static/NearBeach/NearBeach.min.js b/NearBeach/static/NearBeach/NearBeach.min.js index 34bece9d0..baf568993 100644 --- a/NearBeach/static/NearBeach/NearBeach.min.js +++ b/NearBeach/static/NearBeach/NearBeach.min.js @@ -1,2 +1,2 @@ /*! For license information please see NearBeach.min.js.LICENSE.txt */ -(()=>{"use strict";var t,e,r={6795:(t,e,r)=>{r.d(e,{A:()=>o});const o=function(t){for(var e,r=0,o=0,n=t.length;n>=4;++o,n-=4)e=1540483477*(65535&(e=255&t.charCodeAt(o)|(255&t.charCodeAt(++o))<<8|(255&t.charCodeAt(++o))<<16|(255&t.charCodeAt(++o))<<24))+(59797*(e>>>16)<<16),r=1540483477*(65535&(e^=e>>>24))+(59797*(e>>>16)<<16)^1540483477*(65535&r)+(59797*(r>>>16)<<16);switch(n){case 3:r^=(255&t.charCodeAt(o+2))<<16;case 2:r^=(255&t.charCodeAt(o+1))<<8;case 1:r=1540483477*(65535&(r^=255&t.charCodeAt(o)))+(59797*(r>>>16)<<16)}return(((r=1540483477*(65535&(r^=r>>>13))+(59797*(r>>>16)<<16))^r>>>15)>>>0).toString(36)}},8764:(t,e,r)=>{r.r(e),r.d(e,{BASE_TRANSITION:()=>l,BindingTypes:()=>wo,CAMELIZE:()=>L,CAPITALIZE:()=>R,CREATE_BLOCK:()=>d,CREATE_COMMENT:()=>b,CREATE_ELEMENT_BLOCK:()=>p,CREATE_ELEMENT_VNODE:()=>m,CREATE_SLOTS:()=>E,CREATE_STATIC:()=>g,CREATE_TEXT:()=>f,CREATE_VNODE:()=>u,CompilerDeprecationTypes:()=>Et,ConstantTypes:()=>W,DOMDirectiveTransforms:()=>Xo,DOMErrorCodes:()=>Fo,DOMErrorMessages:()=>zo,DOMNodeTransforms:()=>qo,ElementTypes:()=>X,ErrorCodes:()=>Rt,FRAGMENT:()=>n,GUARD_REACTIVE_PROPS:()=>N,IS_MEMO_SAME:()=>U,IS_REF:()=>V,KEEP_ALIVE:()=>s,MERGE_PROPS:()=>T,NORMALIZE_CLASS:()=>O,NORMALIZE_PROPS:()=>C,NORMALIZE_STYLE:()=>A,Namespaces:()=>G,NodeTypes:()=>q,OPEN_BLOCK:()=>c,POP_SCOPE_ID:()=>j,PUSH_SCOPE_ID:()=>P,RENDER_LIST:()=>_,RENDER_SLOT:()=>k,RESOLVE_COMPONENT:()=>h,RESOLVE_DIRECTIVE:()=>y,RESOLVE_DYNAMIC_COMPONENT:()=>v,RESOLVE_FILTER:()=>x,SET_BLOCK_TRACKING:()=>D,SUSPENSE:()=>a,TELEPORT:()=>i,TO_DISPLAY_STRING:()=>S,TO_HANDLERS:()=>I,TO_HANDLER_KEY:()=>M,TRANSITION:()=>Io,TRANSITION_GROUP:()=>Lo,TS_NODE_TYPES:()=>Gt,UNREF:()=>z,V_MODEL_CHECKBOX:()=>Eo,V_MODEL_DYNAMIC:()=>Oo,V_MODEL_RADIO:()=>ko,V_MODEL_SELECT:()=>To,V_MODEL_TEXT:()=>So,V_ON_WITH_KEYS:()=>Co,V_ON_WITH_MODIFIERS:()=>Ao,V_SHOW:()=>No,WITH_CTX:()=>F,WITH_DIRECTIVES:()=>w,WITH_MEMO:()=>$,advancePositionWithClone:()=>oe,advancePositionWithMutation:()=>ne,assert:()=>ie,baseCompile:()=>xo,baseParse:()=>rr,buildDirectiveArgs:()=>Zr,buildProps:()=>Yr,buildSlots:()=>Ur,checkCompatEnabled:()=>At,compile:()=>Wo,convertToBlock:()=>gt,createArrayExpression:()=>Z,createAssignmentExpression:()=>pt,createBlockStatement:()=>lt,createCacheExpression:()=>st,createCallExpression:()=>nt,createCompilerError:()=>Lt,createCompoundExpression:()=>ot,createConditionalExpression:()=>at,createDOMCompilerError:()=>jo,createForLoopParams:()=>jr,createFunctionExpression:()=>it,createIfStatement:()=>dt,createInterpolation:()=>rt,createObjectExpression:()=>Q,createObjectProperty:()=>tt,createReturnStatement:()=>mt,createRoot:()=>K,createSequenceExpression:()=>ut,createSimpleExpression:()=>et,createStructuralDirectiveTransform:()=>fr,createTemplateLiteral:()=>ct,createTransformContext:()=>ur,createVNodeCall:()=>J,errorMessages:()=>Mt,extractIdentifiers:()=>$t,findDir:()=>ae,findProp:()=>se,forAliasRE:()=>we,generate:()=>vr,generateCodeFrame:()=>o.generateCodeFrame,getBaseTransformPreset:()=>yo,getConstantType:()=>ar,getMemoedVNodeCall:()=>xe,getVNodeBlockHelper:()=>ft,getVNodeHelper:()=>bt,hasDynamicKeyVBind:()=>ce,hasScopeRef:()=>ye,helperNameMap:()=>B,injectProp:()=>ge,isCoreComponent:()=>Wt,isFunctionType:()=>Ut,isInDestructureAssignment:()=>jt,isInNewExpression:()=>Ft,isMemberExpression:()=>re,isMemberExpressionBrowser:()=>te,isMemberExpressionNode:()=>ee,isReferencedIdentifier:()=>Pt,isSimpleIdentifier:()=>Kt,isSlotOutlet:()=>me,isStaticArgOf:()=>le,isStaticExp:()=>Xt,isStaticProperty:()=>Bt,isStaticPropertyKey:()=>Ht,isTemplateNode:()=>ue,isText:()=>de,isVSlot:()=>pe,locStub:()=>Y,noopDirectiveTransform:()=>_o,parse:()=>Yo,parserOptions:()=>Mo,processExpression:()=>Or,processFor:()=>Dr,processIf:()=>Nr,processSlotOutlet:()=>eo,registerRuntimeHelpers:()=>H,resolveComponentType:()=>Wr,stringifyExpression:()=>Ar,toValidAssetId:()=>ve,trackSlotScopes:()=>zr,trackVForSlotScopes:()=>Vr,transform:()=>mr,transformBind:()=>no,transformElement:()=>Xr,transformExpression:()=>Tr,transformModel:()=>co,transformOn:()=>oo,transformStyle:()=>Do,traverseNode:()=>br,unwrapTSNode:()=>qt,walkBlockDeclarations:()=>Vt,walkFunctionParams:()=>zt,walkIdentifiers:()=>Dt,warnDeprecation:()=>Ct});var o=r(33);const n=Symbol(""),i=Symbol(""),a=Symbol(""),s=Symbol(""),l=Symbol(""),c=Symbol(""),d=Symbol(""),p=Symbol(""),u=Symbol(""),m=Symbol(""),b=Symbol(""),f=Symbol(""),g=Symbol(""),h=Symbol(""),v=Symbol(""),y=Symbol(""),x=Symbol(""),w=Symbol(""),_=Symbol(""),k=Symbol(""),E=Symbol(""),S=Symbol(""),T=Symbol(""),O=Symbol(""),A=Symbol(""),C=Symbol(""),N=Symbol(""),I=Symbol(""),L=Symbol(""),R=Symbol(""),M=Symbol(""),D=Symbol(""),P=Symbol(""),j=Symbol(""),F=Symbol(""),z=Symbol(""),V=Symbol(""),$=Symbol(""),U=Symbol(""),B={[n]:"Fragment",[i]:"Teleport",[a]:"Suspense",[s]:"KeepAlive",[l]:"BaseTransition",[c]:"openBlock",[d]:"createBlock",[p]:"createElementBlock",[u]:"createVNode",[m]:"createElementVNode",[b]:"createCommentVNode",[f]:"createTextVNode",[g]:"createStaticVNode",[h]:"resolveComponent",[v]:"resolveDynamicComponent",[y]:"resolveDirective",[x]:"resolveFilter",[w]:"withDirectives",[_]:"renderList",[k]:"renderSlot",[E]:"createSlots",[S]:"toDisplayString",[T]:"mergeProps",[O]:"normalizeClass",[A]:"normalizeStyle",[C]:"normalizeProps",[N]:"guardReactiveProps",[I]:"toHandlers",[L]:"camelize",[R]:"capitalize",[M]:"toHandlerKey",[D]:"setBlockTracking",[P]:"pushScopeId",[j]:"popScopeId",[F]:"withCtx",[z]:"unref",[V]:"isRef",[$]:"withMemo",[U]:"isMemoSame"};function H(t){Object.getOwnPropertySymbols(t).forEach((e=>{B[e]=t[e]}))}const G={HTML:0,0:"HTML",SVG:1,1:"SVG",MATH_ML:2,2:"MATH_ML"},q={ROOT:0,0:"ROOT",ELEMENT:1,1:"ELEMENT",TEXT:2,2:"TEXT",COMMENT:3,3:"COMMENT",SIMPLE_EXPRESSION:4,4:"SIMPLE_EXPRESSION",INTERPOLATION:5,5:"INTERPOLATION",ATTRIBUTE:6,6:"ATTRIBUTE",DIRECTIVE:7,7:"DIRECTIVE",COMPOUND_EXPRESSION:8,8:"COMPOUND_EXPRESSION",IF:9,9:"IF",IF_BRANCH:10,10:"IF_BRANCH",FOR:11,11:"FOR",TEXT_CALL:12,12:"TEXT_CALL",VNODE_CALL:13,13:"VNODE_CALL",JS_CALL_EXPRESSION:14,14:"JS_CALL_EXPRESSION",JS_OBJECT_EXPRESSION:15,15:"JS_OBJECT_EXPRESSION",JS_PROPERTY:16,16:"JS_PROPERTY",JS_ARRAY_EXPRESSION:17,17:"JS_ARRAY_EXPRESSION",JS_FUNCTION_EXPRESSION:18,18:"JS_FUNCTION_EXPRESSION",JS_CONDITIONAL_EXPRESSION:19,19:"JS_CONDITIONAL_EXPRESSION",JS_CACHE_EXPRESSION:20,20:"JS_CACHE_EXPRESSION",JS_BLOCK_STATEMENT:21,21:"JS_BLOCK_STATEMENT",JS_TEMPLATE_LITERAL:22,22:"JS_TEMPLATE_LITERAL",JS_IF_STATEMENT:23,23:"JS_IF_STATEMENT",JS_ASSIGNMENT_EXPRESSION:24,24:"JS_ASSIGNMENT_EXPRESSION",JS_SEQUENCE_EXPRESSION:25,25:"JS_SEQUENCE_EXPRESSION",JS_RETURN_STATEMENT:26,26:"JS_RETURN_STATEMENT"},X={ELEMENT:0,0:"ELEMENT",COMPONENT:1,1:"COMPONENT",SLOT:2,2:"SLOT",TEMPLATE:3,3:"TEMPLATE"},W={NOT_CONSTANT:0,0:"NOT_CONSTANT",CAN_SKIP_PATCH:1,1:"CAN_SKIP_PATCH",CAN_HOIST:2,2:"CAN_HOIST",CAN_STRINGIFY:3,3:"CAN_STRINGIFY"},Y={start:{line:1,column:1,offset:0},end:{line:1,column:1,offset:0},source:""};function K(t,e=""){return{type:0,source:e,children:t,helpers:new Set,components:[],directives:[],hoists:[],imports:[],cached:0,temps:0,codegenNode:void 0,loc:Y}}function J(t,e,r,o,n,i,a,s=!1,l=!1,d=!1,p=Y){return t&&(s?(t.helper(c),t.helper(ft(t.inSSR,d))):t.helper(bt(t.inSSR,d)),a&&t.helper(w)),{type:13,tag:e,props:r,children:o,patchFlag:n,dynamicProps:i,directives:a,isBlock:s,disableTracking:l,isComponent:d,loc:p}}function Z(t,e=Y){return{type:17,loc:e,elements:t}}function Q(t,e=Y){return{type:15,loc:e,properties:t}}function tt(t,e){return{type:16,loc:Y,key:(0,o.isString)(t)?et(t,!0):t,value:e}}function et(t,e=!1,r=Y,o=0){return{type:4,loc:r,content:t,isStatic:e,constType:e?3:o}}function rt(t,e){return{type:5,loc:e,content:(0,o.isString)(t)?et(t,!1,e):t}}function ot(t,e=Y){return{type:8,loc:e,children:t}}function nt(t,e=[],r=Y){return{type:14,loc:r,callee:t,arguments:e}}function it(t,e=void 0,r=!1,o=!1,n=Y){return{type:18,params:t,returns:e,newline:r,isSlot:o,loc:n}}function at(t,e,r,o=!0){return{type:19,test:t,consequent:e,alternate:r,newline:o,loc:Y}}function st(t,e,r=!1){return{type:20,index:t,value:e,isVNode:r,loc:Y}}function lt(t){return{type:21,body:t,loc:Y}}function ct(t){return{type:22,elements:t,loc:Y}}function dt(t,e,r){return{type:23,test:t,consequent:e,alternate:r,loc:Y}}function pt(t,e){return{type:24,left:t,right:e,loc:Y}}function ut(t){return{type:25,expressions:t,loc:Y}}function mt(t){return{type:26,returns:t,loc:Y}}function bt(t,e){return t||e?u:m}function ft(t,e){return t||e?d:p}function gt(t,{helper:e,removeHelper:r,inSSR:o}){t.isBlock||(t.isBlock=!0,r(bt(o,t.isComponent)),e(c),e(ft(o,t.isComponent)))}const ht=new Uint8Array([123,123]),vt=new Uint8Array([125,125]);function yt(t){return t>=97&&t<=122||t>=65&&t<=90}function xt(t){return 32===t||10===t||9===t||12===t||13===t}function wt(t){return 47===t||62===t||xt(t)}function _t(t){const e=new Uint8Array(t.length);for(let r=0;r`.sync modifier for v-bind has been removed. Use v-model with argument instead. \`v-bind:${t}.sync\` should be changed to \`v-model:${t}\`.`,link:"https://v3-migration.vuejs.org/breaking-changes/v-model.html"},COMPILER_V_BIND_OBJECT_ORDER:{message:'v-bind="obj" usage is now order sensitive and behaves like JavaScript object spread: it will now overwrite an existing non-mergeable attribute that appears before v-bind in the case of conflict. To retain 2.x behavior, move v-bind to make it the first attribute. You can also suppress this warning if the usage is intended.',link:"https://v3-migration.vuejs.org/breaking-changes/v-bind.html"},COMPILER_V_ON_NATIVE:{message:".native modifier for v-on has been removed as is no longer necessary.",link:"https://v3-migration.vuejs.org/breaking-changes/v-on-native-modifier-removed.html"},COMPILER_V_IF_V_FOR_PRECEDENCE:{message:"v-if / v-for precedence when used on the same element has changed in Vue 3: v-if now takes higher precedence and will no longer have access to v-for scope variables. It is best to avoid the ambiguity with