h*aR      !"#$%&'()*+,-./0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                                            !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!""""""""""""""""""""""""""""""""""""""""###$0.4.0.3$% Safe-Inferred"/19< C Safe-Inferred"/19< hscimAn attribute (e.g. username).ATTRNAME = ALPHA *(nameChar) NOTE: We use the FromJSONKey instance of Text. The default instances parses a list of key values instead of a maphscimAttribute name parser.hscimAttribute name renderer. Safe-Inferred"/19<    Safe-Inferred"/19<9   Safe-Inferred"/19<   Safe-Inferred"/19< Safe-Inferred"/19< Safe-Inferred"/19<\ Safe-Inferred"(/19<K!hscimTurn all keys in a JSON object to lowercase recursively. This is applied to the aeson  to be parsed;  " is applied to the keys passed to  etc. If an object contains two fields that only differ in casing, 2 is returned with a list of the offending fields./hscim1A very coarse description of what it means to be  I do not like it. We should handhold people using this library morehscim%PATH = attrPath / valuePath [subAttr]hscimThe  attribute value is a  containing an attribute path describing the target of the operation. It is OPTIONAL for s "add" and "replace", and is REQUIRED for "remove". See relevant operation sections below for details.TODO(arianvp): When value is an array, it needs special handling. e.g. primary fields need to be negated and whatnot. We currently do not do that :)NOTE: When the path contains a schema, this schema must be implicitly added to the list of schemas on the result typehscim%PATH = attrPath / valuePath [subAttr] Safe-Inferred"%&)*/169<A hscimA type used to indicate that the SCIM record doesn't have any extra data. Encoded as an empty map.hscim/SCIM user record, parametrized with type-level tag (see ).hscimApplies a JSON Patch to a SCIM Core User Only supports the core attributes. Evenmore, only some hand-picked ones currently. We'll have to think how patch is going to work in the presence of extensions. Also, we can probably make PatchOp type-safe to some extent (Read arianvp's thesis :))hscimSchemashscimuserNamehscim Extra data$ Safe-Inferred"/19<=Ghscim(Get all users, optionally filtered by a .hscimGet a single user by ID. Should throw notFound if the user doesn't exist.hscimCreate a new user. Should throw conflict( if uniqueness constraints are violated.hscimOverwrite an existing user. Should throw notFound if the user doesn't exist, and conflict) if uniqueness constraints are violated.hscimModify an existing user. Should throw notFound if the user doesn't exist, and conflict) if uniqueness constraints are violated. 1https://tools.ietf.org/html/rfc7644#section-3.5.2If the target location already contains the value specified, no changes SHOULD be made to the resource, and a success response SHOULD be returned. Unless other operations change the resource, this operation SHALL NOT change the modify timestamp of the resource.Given that PUT has the same constraints, we can implement PATCH in terms of some magic in this library, GET and PUT.SCIM's Patch semantics are hard to get right. So we advice using the library built-in implementation. we implement PATCH in terms of a GET followed by a PUT. GET will retrieve the entire record; we then modify this record by a series of PATCH operations, and then PUT the entire record.hscimDelete a user. Should throw notFound if the user doesn't exist.hscim PATCH payload Safe-Inferred"/19<Hhscim#A constraint indicating that monad m< supports operations with users and groups marked with tag t.  Safe-Inferred"/19<I! Safe-Inferred"/19<KhscimA simple ID type.#eitherDecode' @Id . encode $ (Id 3)Right (Id {unId = 3})=WARNING: {doctests don't work in our infrastructure](https:/ github.comzinfrabackend-issues7issues/1549), so this is duplicated in the unit tests.hscimTag used in the mock server.hscim*Check whether a user satisfies the filter.Returns  if the filter is constructed incorrectly (e.g. tries to compare a username with a boolean).TODO(arianvp): We need to generalise filtering at some point probably." Safe-Inferred"%&/19<QhscimA type-level tag for , =, etc. that allows picking any types we might need in tests.hscimA way to parse out a single value from a JSON object by specifying the field as a type-level string. Very useful when you don't want to create extra types.hscimsome acceptance tests match against a fully rendered response body, which will not work when running the test as a library user (since the response will have more and other information). if you leave this on  (default from ), the test will only check some invariants on the response instead that must hold in all cases.hscimre-implementation of  with better error reporting. FUTUREWORK: make this a PR upstream. (while we're at it, we can also patch  and  to keep track of the SRequest=, and add that to the error message here with the response.)hscimavoid multiple /. (kill at most one / at the end of first arg and beginning of second arg, resp., then add one during concatenation.<["a" "b", "a" "/b", "a/" "b", "a/" "/b"]["a/b","a/b","a/b","a/b"]=WARNING: {doctests don't work in our infrastructure](https:/ github.comzinfrabackend-issues7issues/1549), so this is duplicated in the unit tests.hscimA response matcher and quasiquoter that should be used instead of +,.# Safe-Inferred"%&/19<R--./0123456789:;<=>?@@ABBCDDEFGHIJKLMNOPQRSTUVWX Y Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~       [                                                           *FZ^ZZFZFZFZFZFF[                 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!""""""""""""""""""""""""""""""""""""""""###%%%%%%%%$hscim-0.4.0.3-1xz8CePoLRdDOrMXTV7j7mWeb.Scim.AttrName&Web.Scim.Capabilities.MetaSchema.Group-Web.Scim.Capabilities.MetaSchema.ResourceType)Web.Scim.Capabilities.MetaSchema.SPConfig'Web.Scim.Capabilities.MetaSchema.Schema%Web.Scim.Capabilities.MetaSchema.UserWeb.Scim.ContentTypeWeb.Scim.Schema.Common$Web.Scim.Schema.AuthenticationSchemeWeb.Scim.Schema.SchemaWeb.Scim.Schema.ResourceTypeWeb.Scim.Schema.MetaWeb.Scim.Schema.ListResponseWeb.Scim.Schema.ErrorWeb.Scim.HandlerWeb.Scim.Class.AuthWeb.Scim.Class.GroupWeb.Scim.Filter Web.Scim.Capabilities.MetaSchemaWeb.Scim.Schema.User.Address Web.Scim.Schema.User.CertificateWeb.Scim.Schema.User.EmailWeb.Scim.Schema.User.IMWeb.Scim.Schema.User.NameWeb.Scim.Schema.User.PhoneWeb.Scim.Schema.User.PhotoWeb.Scim.Schema.UserTypesWeb.Scim.Schema.PatchOpWeb.Scim.Schema.UserWeb.Scim.Class.UserWeb.Scim.ServerWeb.Scim.ClientWeb.Scim.Server.MockWeb.Scim.Test.UtilWeb.Scim.Test.Acceptancehscim Paths_hscim Data.ChartoLowerData.CaseInsensitivefoldCase unauthorizedTest.Hspec.Wai.JSONjsonAttrName pAttrName rAttrName$fIsStringAttrName$fHashableAttrName $fOrdAttrName $fEqAttrName$fShowAttrName$fFromJSONKeyAttrName$fToJSONKeyAttrName groupSchemaresourceSchemaspConfigSchema metaSchema userSchemaSCIM$fMimeUnrenderTYPESCIMa$fMimeRenderTYPESCIMa$fAcceptTYPESCIMScimBool unScimBoolURIunURIWithIdidvalue toKeywordserializeOptions parseOptions jsonLowerlowerKey$fFromJSONWithId$fToJSONWithId $fToJSONURI $fFromJSONURI$fFromJSONScimBool $fEqScimBool$fShowScimBool $fOrdScimBool$fToJSONScimBool $fShowURI$fEqURI $fEqWithId $fShowWithIdAuthenticationSchemeEncodingtypname descriptionspecUridocumentationUriAuthenticationScheme AuthOAuth AuthOAuth2AuthOAuthBearerToken AuthHttpBasicAuthHttpDigestauthHttpBasicEncoding&$fFromJSONAuthenticationSchemeEncoding$$fToJSONAuthenticationSchemeEncoding"$fShowAuthenticationSchemeEncoding $fEqAuthenticationSchemeEncoding%$fGenericAuthenticationSchemeEncoding$fEqAuthenticationScheme$fShowAuthenticationScheme$fEnumAuthenticationScheme$fBoundedAuthenticationScheme$fOrdAuthenticationSchemeSchemaUser20ServiceProviderConfig20Group20Schema20ResourceType20ListResponse20Error20 PatchOp20 CustomSchemafakeEnumSchema getSchemaUripSchema fromSchemaUri getSchema$fToJSONSchema$fFromJSONSchema $fShowSchema $fEqSchemaResourceendpointschema ResourceType UserResource GroupResource usersResourcegroupsResource$fFromJSONResourceType$fToJSONResourceType$fFromJSONResource$fToJSONResource$fShowResource $fEqResource$fGenericResource$fShowResourceType$fEqResourceType$fEnumResourceType$fBoundedResourceTypeWithMetametathingMeta resourceTypecreated lastModifiedversionlocationETagWeakStrong$fFromJSONETag $fToJSONETag$fFromJSONMeta $fToJSONMeta$fFromJSONWithMeta$fToJSONWithMeta $fEqWithMeta$fShowWithMeta$fGenericWithMeta$fEqMeta $fShowMeta $fGenericMeta$fEqETag $fShowETag ListResponseschemas totalResults itemsPerPage startIndex resourcesfromList$fToJSONListResponse$fFromJSONListResponse$fShowListResponse$fEqListResponse$fGenericListResponse ScimErrorstatusscimTypedetailStatusunStatus ScimErrorType InvalidFilterTooMany Uniqueness Mutability InvalidSyntax InvalidPathNoTarget InvalidValue InvalidVers Sensitive badRequest forbiddennotFoundconflict serverErrorscimToServerError$fToJSONScimErrorType$fToJSONStatus$fExceptionScimError$fToJSONScimError$fShowScimError $fEqScimError$fGenericScimError $fShowStatus $fEqStatus$fGenericStatus$fShowScimErrorType$fEqScimErrorType$fGenericScimErrorType ScimHandler throwScimfromScimHandlerAuthDB authCheck AuthTypesAuthDataAuthInfoGroupDB getGroupsgetGroup postGroupputGroup patchGroup deleteGroup GroupSite gsGetGroups gsGetGroup gsPostGroup gsPutGroup gsPatchGroup gsDeleteGroup StoredGroupGroup displayNamemembersMemberref GroupTypesGroupId groupServer$fToJSONMember$fFromJSONMember $fToJSONGroup$fFromJSONGroup$fGenericGroupSite $fShowGroup $fEqGroup$fGenericGroup $fShowMember $fEqMember$fGenericMemberAttrPathSubAttr ValuePathFilterFilterAttrCompare CompareOpOpEqOpNeOpCoOpSwOpEwOpGtOpGeOpLtOpLe CompValueValNullValBool ValNumber ValStringtopLevelAttrPath parseFilter pAttrPathpSubAttr pValuePathpFilter renderFilter rAttrPathrSubAttr rValuePath rCompareOp compareStr$fToHttpApiDataFilter$fFromHttpApiDataFilter $fEqValuePath$fShowValuePath $fEqFilter $fShowFilter $fEqAttrPath$fShowAttrPath $fEqSubAttr $fShowSubAttr$fIsStringSubAttr $fEqCompareOp$fOrdCompareOp$fShowCompareOp$fEnumCompareOp$fBoundedCompareOp $fEqCompValue$fOrdCompValue$fShowCompValue ConfigSite ConfigurationpatchbulkfilterchangePasswordsortetagauthenticationSchemes FilterConfig maxResults BulkConfig maxOperationsmaxPayloadSize Supported supported subConfigempty configServer$fFromJSONSupported$fToJSONSupported$fFromJSONBulkConfig$fToJSONBulkConfig$fFromJSONFilterConfig$fToJSONFilterConfig$fFromJSONConfiguration$fToJSONConfiguration$fGenericConfigSite$fShowConfiguration$fEqConfiguration$fGenericConfiguration$fShowFilterConfig$fEqFilterConfig$fGenericFilterConfig$fShowBulkConfig$fEqBulkConfig$fGenericBulkConfig$fShowSupported $fEqSupported$fGenericSupportedAddress formatted streetAddresslocalityregion postalCodecountryprimary$fToJSONAddress$fFromJSONAddress $fShowAddress $fEqAddress$fGenericAddress Certificate$fToJSONCertificate$fFromJSONCertificate$fShowCertificate$fEqCertificate$fGenericCertificateEmail EmailAddressunEmailAddressemailToEmailAddressscimEmailsToEmailAddress$fToJSONEmailAddress$fFromJSONEmailAddress $fToJSONEmail$fFromJSONEmail $fShowEmail $fEqEmail$fGenericEmail$fShowEmailAddress$fEqEmailAddressIM $fToJSONIM $fFromJSONIM$fShowIM$fEqIM $fGenericIMName familyName givenName middleNamehonorificPrefixhonorificSuffix emptyName $fToJSONName$fFromJSONName $fShowName$fEqName $fGenericNamePhone $fToJSONPhone$fFromJSONPhone $fShowPhone $fEqPhone $fOrdPhone$fGenericPhonePhoto $fToJSONPhoto$fFromJSONPhoto $fShowPhoto $fEqPhoto$fGenericPhoto UserTypesUserId UserExtrasupportedSchemas PatchableapplyOperationPath NormalPath IntoValuePathOpAddReplaceRemove OperationoppathPatchOp getOperations parsePathpPathrPathoperationFromJSON pathFromJSON $fToJSONOp $fFromJSONOp $fToJSONPath$fToJSONOperation$fToJSONPatchOp$fFromJSONPatchOp$fPatchableKeyMap $fEqPatchOp $fShowPatchOp $fEqOperation$fShowOperation$fEqPath $fShowPath$fEqOp$fShowOp$fEnumOp $fBoundedOp NoUserExtraUseruserName externalIdnickName profileUrltitleuserTypepreferredLanguagelocaleactivepasswordemails phoneNumbersimsphotos addresses entitlementsrolesx509Certificatesextra applyPatchresultToScimError isUserSchema$fPatchableUser $fToJSONUser$fFromJSONUser$fPatchableNoUserExtra$fToJSONNoUserExtra$fFromJSONNoUserExtra$fEqNoUserExtra$fShowNoUserExtra $fGenericUser$fEqUser $fShowUserUserDBgetUsersgetUserpostUserputUser patchUser deleteUserUserSite usGetUsers usGetUser usPostUser usPutUser usPatchUser usDeleteUser StoredUser userServer$fGenericUserSiteAppSiteconfigusersgroupsSiteAPIGroupAPIUserAPI ConfigAPI siteServermkappapp $fGenericSite HasScimClient scimClientsspConfig getSchemas resourceTypes TestServer TestStorageuserDBgroupDB GroupStorage UserStorageIdunIdMockemptyTestStorageliftSTMhoistSTMassertMutabilitytestDate createMetant filterUser$fAuthTypesMock$fGroupTypesMock$fUserTypesMock $fFromJSONId $fToJSONId$fAuthDBMockReaderT$fGroupDBMockReaderT$fUserDBMockReaderT$fEqId$fShowId$fOrdId $fHashableId$fToHttpApiDataId$fFromHttpApiDataIdTestTagFieldAcceptanceQueryConfigscimPathPrefix scimAuthTokenAcceptanceConfigscimAppAndConfig genUserNameresponsesFullyKnownshouldRespondWithshouldEventuallyRespondWithdefAcceptanceConfigdefAcceptanceQueryConfigpostputget'post'put'patch'delete'scimgetField$fFromValueValue$fFromValueByteString$fFromValueResponseMatcher $fToJSONField$fFromJSONField$fAuthTypesTestTag$fGroupTypesTestTag$fUserTypesTestTag $fEqField $fOrdField $fShowField $fReadField$fFunctorFieldignoremicrosoftAzure sampleUser1 getBinDir getLibDir getDynLibDir getDataDir getLibexecDirgetDataFileName getSysconfDir$aeson-2.1.2.1-1P7HoHEdTZoEgMrtth12YRData.Aeson.Types.InternalValueData.Aeson.Types.FromJSON.:base Data.EitherLeft reasonPhrasetransformers-0.6.1.0Control.Monad.Trans.ExceptExceptT mtl-2.3.1Control.Monad.Error.Class MonadError pCompValue pCompareOp skipSpace1 rCompValueDBghc-prim GHC.TypesFalse'hspec-wai-0.11.1-7Hv5SOzBqXqFABu05lTduVTest.Hspec.Wai.Internal WaiSessionTest.Hspec.Wairequest